Скрипт мониторинга (версия из второго сообщения полностью работоспособна, из первого не актуальна)

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить

используете микротовский скриптинг для мониторинга?

нет, это баловство
0
Голосов нет
да, у меня свой скрипт это очень удобно
1
100%
попробую твой скрипт
0
Голосов нет
 
Всего голосов: 1
kirifunlp
Сообщения: 2
Зарегистрирован: 08 май 2024, 15:17

Добрый день! Есть скрипт мониторинга устройств в локальной сети. Сразу скажу что я не программист(что-то подглядел здесь, что-то где-то еще, что-то придумал сам методом тыка), потому и косяков вы тут можете найти миллион, и скорее всего найдёте, я тут как раз за этим :-): Скрипт вполне себе работает, но есть неприятные моменты, которые я сам устранить не могу, уже всю голову сломал. Можете брать на тест кому интересно, делиться своими мыслями по этому поводу.

Что не нравится:
1)если ненадолго(пара секунд) теряется связь с хостом, то (по задумке) он должен подождать, всё перепроверить, не появился ли хост, и если появился то ничего не отправлять, а если надолго то должен присылать уведомление. Задержки специально стоят большие, чтобы было меньше ложных оповещений, но они всё равно иногда бывают, вот это бы хотелось как-то устранить
2)иногда upscript спотыкается об downscript, и может не прислать уведомление о появлении хоста в сети после отвала, случается такое когда быстро происходит смена статуса хоста в netwatch up->down->up, пинал такие хосты в netwatch через шедульку, но это прям всем костылям костыль, честно говоря.

Код: Выделить всё

:local kolich 4;
:local zaderzhka 4;
:local interv 2s;
#zaderzhka должна быть больше чем interv!!!

:local Chat "-710445623";
:local BotToken "5073467164:AAHXyZZhqCbfhbOkACuIwERFG9IY7wOZak";

:foreach k,v in={"host1"=192.168.88.1; "host2"=192.168.88.2; "host3"=192.168.8.3; "host4"=192.168.88.4} do={delay 0.1;
:do {:put [ip firewall address-list get value-name=list [find list="netwatch_$k"]]} on-error={ip firewall address-list add list="netwatch_$k" address=$v};
/ip firewall address-list set comment=start [find list="netwatch_$k"];
:local PingTest [/ping $v count=1];
if ($PingTest = 0) do={/ip firewall address-list set comment=unavailable [find list="netwatch_$k"];} else={/ip firewall address-list set comment=on [find list="netwatch_$k"];};
/tool netwatch remove [/tool netwatch find host=$v];
/tool netwatch
add comment=$k down-script="/ip firewall address-list set comment=work [find list=\"netwatch_$k\"];\r\
    \n:delay $zaderzhka;\r\
    \n:local hostStatus [tool netwatch get [find host=$v] status];\
    \r\
    \nif (\$hostStatus = \"up\") do={} else={\r\
    \n:delay 1;\r\
    \n:local Pinger [/ping $v count=$kolich];\r\
    \n:delay 1;\r\
    \n:local state [ip firewall address-list get value-name=comment [find list\
    =netwatch_$k]];\r\
    \n:local hostStatus [tool netwatch get [find host=$v] status];\
    \r\
    \nif (\$Pinger = 0 and \$hostStatus = \"down\" and \$state = \"work\") do=\
    {\r\
    \n/tool fetch url=\"https://api.telegram.org/bot$BotToken/sendMessage\\\?chat_id=$Chat&text=\\E2\\9D\\8C $k $v\" keep-result=no; /ip firewall address-list s\
    et comment=unavailable [find list=\"netwatch_$k\"];} else={/ip\
    \_firewall address-list set comment=on [find list=\"netwatch_$k\"];}}" host=$v interval=$interv up-script=":local state [ip firew\
    all address-list get value-name=comment [find list=netwatch_$k\
    ]];\r\
    \nif (\$state = \"unavailable\") do={\r\
    \n/ip firewall address-list set comment=on [find list=\"netwatch_$k\"];\r\
    \n/tool fetch url=\"https://api.telegram.org/bot$BotToken/sendMessage\\\?chat_id=$Chat&text=\\E2\\9C\\85 $k $v\" keep-result=no;} else={/ip firewall address\
    -list set comment=on [find list=\"netwatch_$k\"];}"
}
#/tool fetch url="https://api.telegram.org/bot$BotToken/sendMessage\?chat_id=$Chat&text=Monitoring started" keep-result=no;
коротко о работе скрипта: добавляете названия хостов и адреса в массив через точку с запятой, и добавляете свой токен телеграм бота и id своей группы, запускаете, он создаёт нетвочи на каждый хост, и адрес-листы так же на каждый хост в firewall (ради того чтобы записать туда состояние устройства, поскольку netwatch в глобальные переменные не умеет)

P.S.: раньше у меня крутился аналогичный скрипт, но без netwatch, а через шедулер, но при большом количестве хостов он очень сильно грузил проц, поэтому таки пришел к нетвоч
Последний раз редактировалось kirifunlp 31 май 2024, 16:44, всего редактировалось 1 раз.


kirifunlp
Сообщения: 2
Зарегистрирован: 08 май 2024, 15:17

Переделал логику работы, замеченные косяки исправлены :ya_hoo_oo: на прикреплённом изображении видно результат работы :-ok-:

Код: Выделить всё

#настройки

:local kolich 4;                     #количество пингов для подтверждения недоступности устройства;
:local interv 2s;                     #интервал между пингами (если как в данном случае 4 пингов с интервалом 2 секунды то минимум 8 секунд будете ждать в группе уведомления после того как устройство стало недоступным;
:local Chat "-123456789";                     #id группы в телеге в которую ваш бот будет слать сообщения;
:local BotToken "5164489214:AHXyZhqCbfHO4kAGIwERFG9IY7wOZak";                     #токен вашего бота, который будет заниматься рассылкой, бот обязательно должен быть добавлен в указанную вами строчкой выше группу;
:local downSymbol "\\E2\\9D\\8C";                     #красный значок который будет показывать что устройство недоступно; 
:local upSymbol "\\E2\\9C\\85";                     #зеленый значок, отображающий что устройство в сети;
:local startKey start;                     #если значение "start", то при старте скрипта он пришлет в группу информацию обо всех добавленных в мониторинг устройствах, а если значение "up", то только те устройства, которые в данный момент не в сети;
#ниже в фигурные скобки добавляйте название своего устройства в кавычках, знак "равно", затем ip адрес, через точку с запятой;
:foreach k,v in={"device1"=192.168.88.1; "device2"=192.168.88.254; "device3"=192.168.88.253} do={
delay 0.1;


#тело скрипта, не влезай, сломаешь!!!

/tool netwatch remove [/tool netwatch find host=$v];
/tool netwatch 
add comment="$startKey $k" down-script="
:delay 1;
:local state [tool netwatch get value-name=comment [find host=\"$v\"]];
if (\$state = \"up $k\") do={
:local Pinger [/ping $v count=$kolich interval=$interv];
if (\$Pinger = 0) do={
/tool netwatch set comment=\"down $k\" [find host=\"$v\"];
:do {/tool fetch url=\"https://api.telegram.org/bot$BotToken/sendMessage\\\?chat_id=$Chat&text=$downSymbol $k $v\" keep-result=no;} on-error={/tool netwatch set comment=\"error $k\" [find host=\"$v\"];}
}
}
if (\$state = \"start $k\" or \$state = \"error $k\") do={
:local hostStatus [tool netwatch get [find host=$v] status];
:do {/tool fetch url=\"https://api.telegram.org/bot$BotToken/sendMessage\\\?chat_id=$Chat&text= $k $v is \$hostStatus\" keep-result=no; /tool netwatch set comment=\"\$hostStatus $k\" [find host=\"$v\"];} on-error={/tool netwatch set comment=\"error $k\" [find host=\"$v\"];}
}" host=$v interval=$interv up-script=":delay 1;
:local state [tool netwatch get value-name=comment [find host=\"$v\"]];
if (\$state = \"down $k\") do={
/tool netwatch set comment=\"up $k\" [find host=\"$v\"];
:do {/tool fetch url=\"https://api.telegram.org/bot$BotToken/sendMessage\\\?chat_id=$Chat&text=\\E2\\9C\\85 $k $v\" keep-result=no;} on-error={/tool netwatch set comment=\"error $k\" [find host=\"$v\"];}
}
if (\$state = \"start $k\" or \$state = \"error $k\") do={
:local hostStatus [tool netwatch get [find host=$v] status];
:do {/tool fetch url=\"https://api.telegram.org/bot$BotToken/sendMessage\\\?chat_id=$Chat&text=$k $v is \$hostStatus\" keep-result=no; /tool netwatch set comment=\"\$hostStatus $k\" [find host=\"$v\"];} on-error={/tool netwatch set comment=\"error $k\" [find host=\"$v\"];}
}"
}
Изображение


Ответить