Движок правил падает при обращении к несуществующему свойству в PersistentStorage


#1

Здравствуйте! Столкнулся с проблемой, похоже на баг.

Если я создаю свеженькое хранилище, то я сколько угодно могу обращаться к несуществующим свойствам:

var globalSettings = new PersistentStorage("globalSettings", {global: true});
log(globalSettings['foo']);
log(globalSettings['bar']);
log(globalSettings['foobar']);

В консоли получаю трижды undefined.

Сохраняю какое-нибудь значение:

var globalSettings = new PersistentStorage("globalSettings", {global: true});
globalSettings['foo'] = 100;

Запускаю снова первый кусок кода. В консоли получаю 100 для свойства foo после чего обращение к несуществующему свойству bar приводит к падению демона wb_rules. В непустом хранилище у меня любое обращение к несуществующему свойству хранилища валит движок правил.

Первым делом, конечно, надо подтвердить баг, или, если это by design, то как мне определять установлено ли значение?

Во-вторых, есть ли возможность видеть ошибки на уровне движка? Тот же парсинг файлов с правилами в процессе разработки постоянно ломается из-за синтаксических ошибок в этих файлах, но я не вижу сами эти ошибки, и искать ошибку приходится методом тыка.

Ну и третье. Где хранятся сами файлы персистент-хранилищ? Или правильнее, как мне хранилище грохнуть? Я пока искал проблему насоздавал их изрядно.


#2

Добрый день.

Постараюсь ответить на ваши вопросы.

Первым делом, конечно, надо подтвердить баг, или, если это by design, то как мне определять установлено ли значение?

Это баг. В готовящейся сейчас к релизу версии wb-rules v2.2 эта проблема не воспроизводится. Создан таск для бекпортирования исправления в ветку 1.7.

Во-вторых, есть ли возможность видеть ошибки на уровне движка? Тот же парсинг файлов с правилами в процессе разработки постоянно ломается из-за синтаксических ошибок в этих файлах, но я не вижу сами эти ошибки, и искать ошибку приходится методом тыка.

При редактировании через веб-интерфейс при синтаксических ошибках должно появляться сообщение об ошибке.
YiYCnj3V
Также, в логах при изначальной загрузке файла скрипта появляется запись вида:

Dec  9 23:28:47 wirenboard-XXXXXXXX daemon.info wb-rules[24292]: WARNING: couldn't load /etc/wb-rules/test2.js: ReferenceError: identifier 'setings' undefined 	duk_js_var.c:1232 	anon /etc/wb-rules/test2.js:2 preventsyield

Ну и третье. Где хранятся сами файлы персистент-хранилищ? Или правильнее, как мне хранилище грохнуть? Я пока искал проблему насоздавал их изрядно.

Путь к файлу PersistentStorage задаётся через параметр -pdb. Значение по умолчанию: /var/lib/wirenboard/wbrules-persistent.db. Его можно как удалить целиком (если нужных данных в нём нет), так и отредактировать, удалив ненужные хранилища. Этот файл является хранилищем БД bolt. И его можно отредактировать, например, утилитой boltbrowser. Единственное, условие – с файлом может работать только одно приложение, перед открытием его на редактирование нужно остановить демон wb-rules (service wb-rules stop) и аналогично перед стартом wb-rules нужно закрыть файл в других приложениях.