Отключение агентов

Started by andrey--k, March 25, 2014, 11:20:57 AM

Previous topic - Next topic

andrey--k

У меня следующий скрипт пропадает при раскомментировании строки с "//   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;

Victor Kirhenshtein

Строка

o->flags += 33554432;

дает ошибку компиляции, а поскольку команда exec ищет только скомпилированные скрипты, то выдается несколько нелогичное сообщение "script not found".

Ошибка компиляции на самом деле из-за бага в интерпретаторе NXSL - он не понимает += для аттрибутов объектов.

o->flags = o->flags + 33554432;

скомпилируется без ошибок. Кстати, дла выставления и проверки флагов надо использовать битовые операции:

o->flags = o->flags | 33554432;

тогда можно не проверять на текущее значение flags.

Однако главная проблема в том, что сейчас флаги объекта из скриптов менять нельзя (и вообще ничего нельзя) - в NXSL класс Node read-only. Я могу это поменять, но это уже будет в следующем релизе (ну или со снапшота собрать можно будет).

andrey--k

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

Victor Kirhenshtein

Можно добавить функции или методы в NXSL класс для изменения конкретных флажков или аттрибутов (как сделано например сейчас с ManageObject или RenameObject).

andrey--k

Было бы замечательно.

Victor Kirhenshtein

Добавил новые методы в класс Node: enableAgent, enableConfigurationPoll, enableIcmp, enableSnmp, enableStatusPoll, enableTopologyPoll.
Теперь в скрипте можно написать

o->enableAgent(false);