Есть ли возможность использования своих скриптов на стороне сервера? Задача такая. На голосовой Cisco есть trunk-group-а. Хотелось бы получать по ней статистику активных звонков. К сожалению найти SNMP OID под это дело у меня не получилось, именно поэтому смотрю в сторону скриптов. Если есть возможность, то как его можно прикрутить к DCI?
Это можно сделать через ExternalParameter в агенте. В конфиге агента пишем
ExternalParameter = MyParameterName:my_script
После чего можем определить DCI для параметра MyParameterName на ноде где стоит агент. При каждом запросе параметра будет вызываться скрипт. Значением будет первая строчка выданная скриптом на stdout.
У меня есть Cisco с SIP. К сожалению подсчет кол-ва одновременных звонков как на терминацию, так и на оригинацию стандартными средствами сделать не получается по причине не существования в природе такого MIB для SNMP. Был написан скрипт на Perl. Как его прикрутить к NetXMS, чтоб можно было вызывать этот скрипт с параметром? В качестве параметра должен быть host. Т.е. к примеру:
"/usr/bin/perl /usr/local/bin/myscript.pl hostname"
Этот скрипт возвращает всего одну цифру.
Quote from: Victor Kirhenshtein on August 09, 2007, 06:15:29 PMExternalParameter = MyParameterName:my_script
попробуйте использовать MyParameterName($1), где в качестве первого аргумента укажите hostname
ExternalParameter = MyParameterName(*):/usr/bin/perl /usr/local/bin/myscript.pl $1
Из nxagentd.conf:
#
# ExternalParameter
#
# Add parameter handled by external command. To add multiple parameters, you
# should use multiple ExternalParameter entries. Please note that on Windows
# agent uses system process execution API for execution of specified
# command, so you cannot use pipes or shell commands. If you need to
# execute command via shell, use ExternalParameterShellExec instead.
#
# Syntax:
# ExternalParameter = <parameter_name>:<command_line>
# If you specify parameter name as "name(*)", then you can use $1 .. $9 in
# command line to substitute actual arguments passed from server.
#
# Examples:
# ExternalParameter = Test:echo test
# ExternalParameter = LineCount(*):cat $1 | wc -l
# ExternalParameter = Test2(*):myprog $1 $2
добавил в FAQ/ЧаВо
в конфиги прописал выполнение скрипта. а где, как и что прописать в DCI? сорри, но реально не могу понять :(
точно также как и для NXAGENT и NXSNMP
И...а....о... Может я как-то не так выразился...
Объясняю ситуацию:
Cisco (на неё поставить nxagent ну никак не представляется возможным)
Сервер (на нем запущены nxagentd и netxmsd).
Задача.
При снятии статистики с этой конкретного Cisco устройства, нужно чтобы NetXMS вызывал скрипт на стороне сервера для этого конкретно устройства.
Вопрос можно ли использовать как "InternalShellExeс"?
T.e. nuzno chtobi script ispolnjalsja na hoste A no znachenie shlo v DCI dlja hosta B? Esli tak, to normal'nogo reshenija poka net. Edinstvenno chto mogu predlozit' - eto ispol'zovat' push DCI i ne vizivat' script s servera, a zapuskat' ego po cron'u i ispol'zovat' nxpush dlja peredachi novogo znachenija DCI na server monitoringa.
Появится ли такая возможность в будущем? Если да, то когда?
Uze pochti pojavilas' :) Ja sdelal novij attribut u DCI - "proxy node" - t.e. DCI konfiguritsja na odnoj node a znachenie real'no sprashivaetsja u nodi vistavlennoj kak proxy. Protestiruju i vilozu promezutochnij reliz - mozno budet probovat'.
Vilozil promezutochnij reliz 0.2.20-dev2 na https://www.netxms.org/download/rc/ . Nado delat' upgrade i serveru, i consoli. VNIMANIE: esli posle upgrade'a redaktirovat' DCI konsol'ju ot versii 0.2.19, to nastroiki "proxy node" budut sbrosheni v znachenie po umolchaniju.
В nxagentd.conf прописал следующее:
ExternalParameter = SipOrig(*):/usr/bin/perl /root/scripts/sip_stat/originate.pl $1
Что и как в DCI я должен выставить?
Что в качестве Data Parameter, Data Origin я должен выставить? При использовании в качестве Origin NetXMS Agent и Data Parameter SipOrigin 192.168.100.22.
При этом не работает ничего. Скрипт на стороне сервера даже не вызывается.
В качестве ProxyNode используется хост, на котором установлен NetXMS с параметрами:
./configure --with-server --with-mysql --with-agent --with-nxhttpd
Esli ExternalParameter opredelen kak SipOrig(*), to v Parameter nado pisat'
SipOrig(192.168.100.22)
Ostal'noe vrode vse pravil'no. Dolzen rabotat.
Mozno eshe zapustit' agenta s kljuchom -D i posmotret' na kakoj parametr prihodjat zaprosi.
[07-Nov-2007 18:33:36] NetXMS Agent started
Agent running. Press Ctrl+C to shutdown.
[07-Nov-2007 18:33:41] Debug: Incoming connection from netxms_ip
[07-Nov-2007 18:33:41] Debug: Connection from netxms_ip rejected
[07-Nov-2007 18:33:47] Debug: Incoming connection from netxms_ip
[07-Nov-2007 18:33:47] Debug: Connection from netxms_ip rejected
и так далее.
Znachit netxms_ip ne propisan v parametre Servers. Nado ego tam propisat' (zelatel'no kak MasterServers).
Точно. Так заработало.. Кстати, а можно к примеру создать template с подобного рода DCI и в качестве host_ip указывать к примеру маску %1 где %1 будет IP адрес хоста?
Poka nel'zja. No misl' horoshaja, objazatel'no sdelaju.
Это было бы жутко удобно. Не нужно будет править все хосты, на которых используется тот или иной ExternalParametr, а так подправил в темплейтах и усе, применилось ко всем хостам аналогично другим DCI.
После апгрейда заметил что перестали работать скрипты вызываемые через ExternalParameter. В DCI collection status становится Not Supported, хотя никакие настройки не менялись, кроме того что сделал upgrade.
У меня настроенно так:
В nxagentd.conf
ExternalParameter = SipOrig(*):/usr/bin/perl /root/scripts/myscript.pl $1
В Data Collection Item:
Data Parametr SipOrig(живой_ip_address)
Origin: NetXMS Agent
Proxy_node: сервер, на котором стоит скрипт (он же NetXMS сервер).
В скрипте указал что создавать файлик для теста, в плане отрабатывается скрипт или нет из под netxms и нифига.. Такое впечатление что он почему-то не хочет вызывать внешний скрипт. Что-то поменялось в отношении ExternalParameter????
Поменялось только в отношении proxy node - смотри этот пост про trusted nodes:
https://www.netxms.org/forum/index.php/topic,244.msg1200.html#msg1200 (https://www.netxms.org/forum/index.php/topic,244.msg1200.html#msg1200)
С этим все нормально выставлено?
Тьфу ты черт. Виктор спасибо что стукнули носом в прописные истины, которые я прочел и забыл до этого :( Надо быть внимательнее мне.. ::)
Вылезла новая проблема.
Скрипт последний раз отработал 3-го марта. Сегодня 2-ое апреля. Скрипт выполняется каждые 60 секунд и заносит данные в базу. В History Collected Data вижу все значения. Но при запуске Graph никаких графиков нет. В чем может быть фишка и куда копать?
Я не очень понял - если скрипт работал последний раз 3 марта - то что за значения в collected data?
В плане 3-го числа он отработал и все. Следующие данные только за сегодня, после того как я добавил трастед ноду в параметрах ноды.
Поэтому и графиков нет. Графики строятся за определенный период времени - если в этот период никаких собранных значений нет, то и графиков нет. А collected data показывает 1000 последних значений, без фильтрации по времени сбора.
Ок. А когда в таком случае появятся графики? После 1000 новых строк?
Kogda budut dannie. Delo ne v kolichestve, a vo vremennom intervale. T.e. esli ja hochu grafik za poslednij chas, u menja dolzni bit' hot' kakie-to dannie, sobrannie v poslednij chas. T.e. esli proshel chas i dannie sobiralis' normal'no, to grafik za poslednij chas budet.
Да Виктор, Вы были правы. Ща все вижу прекрасно.
Спасибо.
У меня вот тоже проблемка - скрипт нормально отрабатывает, на stdout выдает данные, но в DCI пусто - ничего не приходит. Т.е. так и стоит с датой 1970 года. Сделано все аналогично.
Проверяй формат ответа с DCI. Возможно у тебя параметры Data Type не верны. Покажи вывод скрипта сюда, и параметры DCI-я.
да там параметры на выходе 1 или 0
Parameter e1_ms(10.159.20.194)
добавлен proxy node
proxy добавлен в trusted
Origin Agent
Data type Integer
ExternalParameter = e1_ms(*):/bin/sh /usr/local/sbin/e1_ms.sh $1
Daty Type какой?
Пробовал сделать правило активным?
А в nxagentd.conf добавил MasterServers??
Правило активно
В конфиге все прописано
что дебаг говорит?
ничего такого особенного вроде не говорит
Debug: {1} Received message CMD_GET_PARAMETER
[03-Apr-2008 15:34:57] Debug: {1} Requesting parameter "e1_ms(10.159.20.194)"
[03-Apr-2008 15:34:59] Debug: {1} Sending message CMD_REQUEST_COMPLETED
[03-Apr-2008 15:34:59] Debug: {1} Session with 10.159.100.55 closed
А должно быть что-то вроде этого
[26-Feb-2008 13:21:36] DEBUG: Node(monitor-2)->GetItemFromAgent(SipOrig(my_ip)): dwError=0 dwResult=0
чего-то действительно с выводом данных из скрипта... в $1 значений просто нет.
Символ "перевода строки" в конце вывода есть?
срабатывает только вариант с записью полученного значения в файл кроном и потом выводом в dci. В одном скрипте echo cразу из переменной в dci не берется.
Надо смотреть скрипт. Если не трудно, дай его сюда плз....
/bin/ping -c 5 $1 &>/dev/null
if [ $? -ne 0 ]; then
echo "0"
else
echo "1"
fi;
все предельно просто вроде бы
Я нашел ошибку вывода...
Вот вывод Вашего скрипта
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.032 ms
1
Как видишь под условия integer это не подходит.
Вот вывод моего скрипта:
Quote
host#./ping.sh
1
host#
все дело в самом скрипте.. попробуй написать так:
/bin/ping -c 5 $1 >/dev/null
if [ $? -ne 0 ]; then
echo "0"
else
echo "1"
fi;
т.е. просто убрать знак & перед перенаправлением вывода.
на самом деле вывод с & и без совершенно одинаковый(по крайней мере в линухе) - одна цифра. Без & результат тот же - в dci пусто.
Проблема в том, что этот скрипт долго работает. На моем компе это выглядит так:
victor@stone:~/netxms$ date && /usr/local/sbin/e1_ms.sh 10.0.0.2 && date
Thu Apr 10 10:12:18 EEST 2008
1
Thu Apr 10 10:12:22 EEST 2008
victor@stone:~/netxms$
У агента есть тайм-аут на выполнение внешних команд, по умолчанию 2 секунды. Если команда не успевает завершиться за это время, то агент возвращает ошибку. Это время можно увеличить, изменив значение параметра ExecTimeout в конфиге агента (значения в миллисекундах). Кроме того, у сервера тоже есть тайм-аут на ожидание ответа на запрос к агенту - те-же 2 секунды по умолчанию. Меняется настройкой параметра сервера AgentCommandTimeout.
Причина, по которой эти тайм-ауты по умолчанию такие маленькие - параметры с агента собираются последовательно, и если сбор какого-то параметра требует 30 секунд, то остальные параметры с данного узла в эти 30 секунд не собирабтся, соответственно может нарушится равномерность сбора данных.
Кстати, а почему бы для пингов не использовать PING субагент? Он специально для этого предназначен...
2 Виктор, по-моему Вы через чур правы о PING SubAgent-е :)
По поводу отработки скрипта долго. Разумеется будет долго отрабатывать, ибо в коде посылается 5 пакетов для проверки узла. В среднем уходит 1-1.5 секунды на один запрос.
2 isherim. А я как раз на linux-е и тестил скрипт. У меня для тестов стоит Ubuntu 7. На ней и тестил скрипт.
спасибо
да, причина именно в этом.
А субагент не использовал сугубо по причине первого машинального телодвижения в сторону стандартных средств ОС-и.
а & и говорит об отправке вывода результата в нуль.
Оставил 2 пакета - работает.
Quote from: isherim on April 10, 2008, 10:34:22 AM
спасибо
да, причина именно в этом.
А субагент не использовал сугубо по причине первого машинального телодвижения в сторону стандартных средств ОС-и.
а & и говорит об отправке вывода результата в нуль.
Оставил 2 пакета - работает.
Мне всю жизнь казалось что > и >> это и есть перенаправление куда-либо, хоть в тот же /dev/null. :( Пойду учить МАТЧАСТЬ значится.
Кто бы еще подсказал, как сделать, чтобы алармы навешанные на разные dci(однотипные) не укладывались в один аларм(т.е. хотя dci разные, просто увеличивается счетчик алармов). Есть ли способ помимо создания отдельных эвентов на каждый dci?
На сколько я понимаю это можно. Необходимо насоздавать алармов и затем указывать ноды в Source-ах. Т.е. на сколько я помню можно для каждой ноды свои алармы создать на все случаи жизни.
Счетчик алармов увеличивается если у алармов совпадают ключи. Надо делать ключ на основе DCI ID, скажем добавлять _%5 к ключу.
Спасибо, понятно.
Алексу:
Насоздавать алармов и кучу нод - коряво.
Наряднее подключать сразу контейнерами. Через префикс ключа нормально отрабатывает.
isherim я предложил может и бредовый вариант, но это тот, который первым пришел мне в голову.. Может есть и другие, не знаю.. Может Виктор подскажет?
Не бредовый. Просто громоздкий.
Виктор уже предложил более правильный и компактный - добавлением префикса к ключу. Иначе и пришлось бы делать как ты предложил.
Вылезла не понятная проблема.
Есть 4 Cisco. Есть внешний скрипт. На всех 4-х прописан Trusted Node сервер с NetXMS-ом (у меня и агент и сервер на одном хосте), а в trusted hosts netxms node-ы, прописал все эти 4 Cisco на всякий случай. в nxagentd.conf прописаны строки:
ExternalParameter = SipOrig(*):/usr/bin/perl /root/scripts/sip_stat/originate.pl $1
ExternalParameter = SipAnswer(*):/usr/bin/perl /root/scripts/sip_stat/answer.pl $1
Самое интересное вот в чем. На двух Cisco работает все и данные получаются, а на оставшихся двух нет. Настройки идентичны. Пытался включить дебаг и агента и сервера, нет данных по вызову.
Прописал в скрипте строчку, чтоб в отдельный файл писал ключ-значение (где ключ это IP ноды, а значение число полученное при выполнении скрипта). Так вот, запросы к скриптам даже не приходят. В чем может быть дело? Есть какое-то ограничение или что-то в этом роде?
A mozno prislat' konfiguraciju samih DCI i ob'ektov node?
Quote from: Alex on November 20, 2008, 10:40:26 AM
Вылезла не понятная проблема.
Есть 4 Cisco. Есть внешний скрипт. На всех 4-х прописан Trusted Node сервер с NetXMS-ом (у меня и агент и сервер на одном хосте), а в trusted hosts netxms node-ы, прописал все эти 4 Cisco на всякий случай. в nxagentd.conf прописаны строки:
ExternalParameter = SipOrig(*):/usr/bin/perl /root/scripts/sip_stat/originate.pl $1
ExternalParameter = SipAnswer(*):/usr/bin/perl /root/scripts/sip_stat/answer.pl $1
Самое интересное вот в чем. На двух Cisco работает все и данные получаются, а на оставшихся двух нет. Настройки идентичны. Пытался включить дебаг и агента и сервера, нет данных по вызову.
Прописал в скрипте строчку, чтоб в отдельный файл писал ключ-значение (где ключ это IP ноды, а значение число полученное при выполнении скрипта). Так вот, запросы к скриптам даже не приходят. В чем может быть дело? Есть какое-то ограничение или что-то в этом роде?
А тело скриптов не покажешь? Тоже нужно количество звонков смотреть, а времени нету совсем...
Да скрипты очень простые. Я не стал делать все в одном файлике, сделал разделение по разным. Чтоб проще было.
Скрипт на терминацию:
#!/usr/bin/perl
if ($#ARGV != 0) {
print "usage: $0 host_ip\n";
exit;
}
$host = $ARGV[0];
open(rsh, "/usr/bin/rsh $host \"show sip-ua calls | i UAS\" |");
while (<rsh>) {
$str=$_;
$str = (/calls: (\d+)/);
$num = $1;
$num = 0 if ($num eq "");
}
close (rsh);
print "$num\n";
Скрипт на Оригинацию:
#!/usr/bin/perl
if ($#ARGV != 0) {
print "usage: $0 host_ip\n";
exit;
}
$host = $ARGV[0];
open(rsh, "/usr/bin/rsh $host \"show sip-ua calls | i UAC\" |");
while (<rsh>) {
$str=$_;
$str = (/calls: (\d+)/);
$num = $1;
$num = 0 if ($num eq "");
}
close (rsh);
print "$num\n";
Скрипты идентичны, за исключением поисковой строки. Можно чуток увеличить код, и сделать все в одном файлике. Может тока путь до rsh тебе придется поменять. Ибо кто как ставит называется :)
Я подумал телнетом забираешь...
Ну rsh это примерно тот же telnet :)
Тока remote shell :)
Quote from: Victor Kirhenshtein on November 20, 2008, 11:50:26 AM
A mozno prislat' konfiguraciju samih DCI i ob'ektov node?
Относительно параметров DCI можешь посмотреть в атаче. А вот что касается объектов ноды, то не совсем понял о чем ты. :( Причем они тут?
На двух эта схема работает железках, а на оставшихся двух - нет. Причины неизвестны :( В логах пусто к сожалению. На скрипт запрос по этим двум не рабочим железкам не приходит :(