Что не нравится:
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;
P.S.: раньше у меня крутился аналогичный скрипт, но без netwatch, а через шедулер, но при большом количестве хостов он очень сильно грузил проц, поэтому таки пришел к нетвоч