У меня следующий скрипт пропадает при раскомментировании строки с "// o->flags += 33554432;"
sub EnumerateNodes(rootObject)
{
//trace(1, " will disable " . rootObject->name);
// Walk all child objects
foreach(o : GetObjectChildren(rootObject))
{
if (classof(o) == "Node")
{
// Process node object
// trace(1, " + " . o->name);
if (o->name != "localhost") {
if (o->flags < 33554432) {
// Error if next will be uncommented
// o->flags += 33554432;
trace(1, " disabled " . o->name . " " . o->flags);
}
} else {
// trace(1, " IS SERVER " . o->name);
}
}
else if (classof(o) == "NetObj")
{
// For all other objects, go down the tree
// There can be additional checks for object class, like
// if (o->type == 5)
EnumerateNodes(o);
}
}
}
EnumerateNodes(FindObject(1));
Ошибка:
$ nxadm -c "exec DisableAgent"
ERROR: Script "DisableAgent" not found
Не могу понять в чем проблема... :(
Как временное решение - через БД (при остановленном netxmsd):
select NODE_FLAGS from nodes
where NODE_FLAGS < 33554432
and PRIMARY_IP != '127.0.0.1';
update nodes set NODE_FLAGS = NODE_FLAGS + 33554432
where NODE_FLAGS < 33554432 and PRIMARY_IP != '127.0.0.1';
commit;
Строка
o->flags += 33554432;
дает ошибку компиляции, а поскольку команда exec ищет только скомпилированные скрипты, то выдается несколько нелогичное сообщение "script not found".
Ошибка компиляции на самом деле из-за бага в интерпретаторе NXSL - он не понимает += для аттрибутов объектов.
o->flags = o->flags + 33554432;
скомпилируется без ошибок. Кстати, дла выставления и проверки флагов надо использовать битовые операции:
o->flags = o->flags | 33554432;
тогда можно не проверять на текущее значение flags.
Однако главная проблема в том, что сейчас флаги объекта из скриптов менять нельзя (и вообще ничего нельзя) - в NXSL класс Node read-only. Я могу это поменять, но это уже будет в следующем релизе (ну или со снапшота собрать можно будет).
Наверное не стоит открывать классы на запись, так как ошибок подобных этой вылезет сразу очень много. А если и открывать, то необходимо проверить приведение типов к классам + проверка ошибок при компиляции скриптов...
Возникает вопрос, как наиболее правильно добавлять подобный функционал? Через API?
Можно добавить функции или методы в NXSL класс для изменения конкретных флажков или аттрибутов (как сделано например сейчас с ManageObject или RenameObject).
Было бы замечательно.
Добавил новые методы в класс Node: enableAgent, enableConfigurationPoll, enableIcmp, enableSnmp, enableStatusPoll, enableTopologyPoll.
Теперь в скрипте можно написать
o->enableAgent(false);