Мониторинг порта

Автоматизация при помощи встроенного скриптового языка и RouterOS API
dub88
Сообщения: 7
Зарегистрирован: 11 окт 2021, 14:32

Мониторинг порта

Сообщение dub88 »

Добрый день всем, помогите пожалуйста реализовать мониторинг порта
Хочу сделать отправку СМС после того как определенный порт станет недоступен. (по принципу работы NetWatch-а)

Есть идея скрипта который бы запускал команду /system telnet каждые 5 мин. например, и при "отрицательном" ответе запускать /tool sms send usb1 +11111111111 message="Service 192.168.1.1:8080 is down"
Аватара пользователя
Chupaka
Сообщения: 3352
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Мониторинг порта

Сообщение Chupaka »

Добрый. Вот так сразу и не скажу, чем с роутера можно такое проверить... Возможно, fetch каким-нибудь.

А не хотите сторонние сервисы использовать? UptimeRobot какой-нибудь, например
dub88
Сообщения: 7
Зарегистрирован: 11 окт 2021, 14:32

Re: Мониторинг порта

Сообщение dub88 »

У fetcha не нашел подходящий функционал, или не знаю как его применить, по поводу сторонних сервисов не вариант, так как нужно мониторить внутренние ресурсы, а натить не хочется.
Аватара пользователя
Sir_Prikol
Сообщения: 489
Зарегистрирован: 14 апр 2018, 15:21
Откуда: СССР

Re: Мониторинг порта

Сообщение Sir_Prikol »

Тут стоит глобальный вопрос. Вам нужно отмониторить физическое отключение линка у порта или логическое (устройство не доступно?)

Если физичесеок, то надо считывать статус порта (R или нет), это можно посредством SNMP или парсером логов. Даже не или, а именно парсером логов. Считываем лог, смотрим что там понаписано, если есть запись interface ether1 link down - отослать СМС, если такой записи нет, ничего не делать. Состояние порта, желательно, писать в отдельную лог инстанцию, с количеством строк, допустим, 10, чтоб не было ложных срабатываний

Если логическое, то это делается простым пингованием и подсчётом пинга, если n пакетов с таймаутом - то отослать СМС
Дома: CCR2004 (7-ISP(GPON)белый IP)
Аватара пользователя
Sir_Prikol
Сообщения: 489
Зарегистрирован: 14 апр 2018, 15:21
Откуда: СССР

Re: Мониторинг порта

Сообщение Sir_Prikol »

Вот логическое, с оповещением в телегу. Честно, лень сокращать было

Стоит в шедуллере с выполнением каждую минуту

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

# Íàñòðîéêè òåëåãðàìà
:local telega "https://api.telegram.org/botYOUR_BOT_TOKEN/sendmessage\[email protected]_CHAT_ID&text=";
# Èìåíà õîñòîâ äëÿ ìîíèòîðèíãà
:local name001 DOM001;
:local name002 DOM002;
:local name003 DOM003;
:local name004 DOM004;
:local name005 DOM005;
:local name006 DOM006;
:local name007 DOM007;
:local name008 DOM008;
#:local name009 DOM009;
:local name010 DOM010;
:local name100 DOM100;
# Óêàçûâàåì ïîíÿòíîå èìÿ äëÿ îïîâåùåíèé
:local pooling001 BORDER;
:local pooling002 Switch;
:local pooling003 PoE_switch;
:local pooling004 Stoika;
:local pooling005 5Ghz;
:local pooling006 Kuhnja;
:local pooling007 Spaljnja;
:local pooling008 Gostinaja;
#:local pooling009 Lab;
:local pooling010 GE;
:local pooling100 DUDE;
# Óêàçûâàåì IP òî÷åê ìîíèòîðèíãà
:local IP001 100.64.0.1;
:local IP002 100.64.0.2;
:local IP003 100.64.0.3;
:local IP004 100.64.0.4;
:local IP005 100.64.0.5;
:local IP006 100.64.0.6;
:local IP007 100.64.0.7;
:local IP008 100.64.0.8;
#:local IP009 198.18.1.9;
:local IP010 198.18.24.1;
:local IP100 100.64.0.100;
# Ïðîïèñûâàåì ÃËÎÁÀËÜÍÛÅ ïåðåìåííûå äëÿ òî÷åê (èçáåãàåì ôëóä)
:global DOMNAME001;
:global DOMNAME002;
:global DOMNAME003;
:global DOMNAME004;
:global DOMNAME005;
:global DOMNAME006;
:global DOMNAME007;
:global DOMNAME008;
#:global DOMNAME009;
:global DOMNAME010;
:global DOMNAME100;
# Ïîëó÷àåì âðåìÿ
:local time [/system clock get time];
# Êîëè÷åñòâî ïèíãîâ äëÿ ïðîâåðêè
:local PingCount 3;
# Ïðîâåðÿåì è çàïèñûâàåì â àäðåññëèñò íàøè òî÷êè, äëÿ ïðèñâîåíèÿ êîììåíòà î ñîñòîÿíèè
:do {:put [ip firewall address-list get value-name=list [find list="zz_$name001"]]} on-error={ip firewall address-list add list="zz_$name001" address=$IP001};
:do {:put [ip firewall address-list get value-name=list [find list="zz_$name002"]]} on-error={ip firewall address-list add list="zz_$name002" address=$IP002};
:do {:put [ip firewall address-list get value-name=list [find list="zz_$name003"]]} on-error={ip firewall address-list add list="zz_$name003" address=$IP003};
:do {:put [ip firewall address-list get value-name=list [find list="zz_$name004"]]} on-error={ip firewall address-list add list="zz_$name004" address=$IP004};
:do {:put [ip firewall address-list get value-name=list [find list="zz_$name005"]]} on-error={ip firewall address-list add list="zz_$name005" address=$IP005};
:do {:put [ip firewall address-list get value-name=list [find list="zz_$name006"]]} on-error={ip firewall address-list add list="zz_$name006" address=$IP006};
:do {:put [ip firewall address-list get value-name=list [find list="zz_$name007"]]} on-error={ip firewall address-list add list="zz_$name007" address=$IP007};
:do {:put [ip firewall address-list get value-name=list [find list="zz_$name008"]]} on-error={ip firewall address-list add list="zz_$name008" address=$IP008};
#:do {:put [ip firewall address-list get value-name=list [find list="zz_$name009"]]} on-error={ip firewall address-list add list="zz_$name009" address=$IP009};
:do {:put [ip firewall address-list get value-name=list [find list="zz_$name010"]]} on-error={ip firewall address-list add list="zz_$name010" address=$IP010};
:do {:put [ip firewall address-list get value-name=list [find list="zz_$name100"]]} on-error={ip firewall address-list add list="zz_$name100" address=$IP100};
# Âîññòàíàâëèâàåì çíà÷íèå òî÷åê ïîñëå ðåáóòà
:do {:put [/system scheduler get value-name=name "zz_$name001"]} on-error={/system scheduler add name="zz_$name001" on-event=":delay 3; :global DOMNAME001 [ip firewall address-list get value-name=comment [find list=zz_$name001]]" start-time=startup};
:do {:put [/system scheduler get value-name=name "zz_$name002"]} on-error={/system scheduler add name="zz_$name002" on-event=":delay 3; :global DOMNAME002 [ip firewall address-list get value-name=comment [find list=zz_$name002]]" start-time=startup};
:do {:put [/system scheduler get value-name=name "zz_$name003"]} on-error={/system scheduler add name="zz_$name003" on-event=":delay 3; :global DOMNAME003 [ip firewall address-list get value-name=comment [find list=zz_$name003]]" start-time=startup};
:do {:put [/system scheduler get value-name=name "zz_$name004"]} on-error={/system scheduler add name="zz_$name004" on-event=":delay 3; :global DOMNAME004 [ip firewall address-list get value-name=comment [find list=zz_$name004]]" start-time=startup};
:do {:put [/system scheduler get value-name=name "zz_$name005"]} on-error={/system scheduler add name="zz_$name005" on-event=":delay 3; :global DOMNAME005 [ip firewall address-list get value-name=comment [find list=zz_$name005]]" start-time=startup};
:do {:put [/system scheduler get value-name=name "zz_$name006"]} on-error={/system scheduler add name="zz_$name006" on-event=":delay 3; :global DOMNAME006 [ip firewall address-list get value-name=comment [find list=zz_$name006]]" start-time=startup};
:do {:put [/system scheduler get value-name=name "zz_$name007"]} on-error={/system scheduler add name="zz_$name007" on-event=":delay 3; :global DOMNAME007 [ip firewall address-list get value-name=comment [find list=zz_$name007]]" start-time=startup};
:do {:put [/system scheduler get value-name=name "zz_$name008"]} on-error={/system scheduler add name="zz_$name008" on-event=":delay 3; :global DOMNAME008 [ip firewall address-list get value-name=comment [find list=zz_$name008]]" start-time=startup};
#:do {:put [/system scheduler get value-name=name "zz_$name009"]} on-error={/system scheduler add name="zz_$name009" on-event=":delay 3; :global DOMNAME009 [ip firewall address-list get value-name=comment [find list=zz_$name009]]" start-time=startup};
:do {:put [/system scheduler get value-name=name "zz_$name100"]} on-error={/system scheduler add name="zz_$name010" on-event=":delay 3; :global DOMNAME010 [ip firewall address-list get value-name=comment [find list=zz_$name010]]" start-time=startup};
:do {:put [/system scheduler get value-name=name "zz_$name100"]} on-error={/system scheduler add name="zz_$name100" on-event=":delay 3; :global DOMNAME100 [ip firewall address-list get value-name=comment [find list=zz_$name100]]" start-time=startup};
# Ïèíãóåì 2 ðàçà ñ ïåðåðûâîì â 5 ñåê (èçáåãàåì ëîæíûõ ñðàáàòûâàíèé)
:local Ping001 [/ping $IP001 count=$PingCount];
:local Ping002 [/ping $IP002 count=$PingCount];
:local Ping003 [/ping $IP003 count=$PingCount];
:local Ping004 [/ping $IP004 count=$PingCount];
:local Ping005 [/ping $IP005 count=$PingCount];
:local Ping006 [/ping $IP006 count=$PingCount];
:local Ping007 [/ping $IP007 count=$PingCount];
:local Ping008 [/ping $IP008 count=$PingCount];
#:local Ping009 [/ping $IP009 count=$PingCount];
:local Ping010 [/ping $IP010 count=$PingCount];
:local Ping011 [/ping $IP100 count=$PingCount];
:delay 5;
:local Ping501 [/ping $IP001 count=$PingCount];
:local Ping502 [/ping $IP002 count=$PingCount];
:local Ping503 [/ping $IP003 count=$PingCount];
:local Ping504 [/ping $IP004 count=$PingCount];
:local Ping505 [/ping $IP005 count=$PingCount];
:local Ping506 [/ping $IP006 count=$PingCount];
:local Ping507 [/ping $IP007 count=$PingCount];
:local Ping508 [/ping $IP008 count=$PingCount];
#:local Ping509 [/ping $IP009 count=$PingCount];
:local Ping510 [/ping $IP010 count=$PingCount];
:local Ping511 [/ping $IP100 count=$PingCount];
# Ïðîâåðÿåì ñîñòîÿíèå, îïîâåùàåì â ëîã è òåëåãó è ïåðåâîäèì ñòàòóñ "on" "off"
# Ïðîâåðÿåì 1-þ òî÷êó
if (($Ping001 = 0) and ($Ping501 = 0)) do={
if ($DOMNAME001 = "off") do={} else={set $DOMNAME001 off; /ip firewall address-list set comment=$DOMNAME001 [find list="zz_$name001"]; log warning "$time - $pooling001 off"; /tool fetch address=api.telegram.org url="$telega $pooling001 - Off!" keep-result=no;}} else={ if ($DOMNAME001 = "on") do={} else={set $DOMNAME001 on; /ip firewall address-list set comment=$DOMNAME001 [find list="zz_$name001"]; log warning "$time - $pooling001 on"; /tool fetch address=api.telegram.org url="$telega $pooling001 - On!" keep-result=no;}}
# Ïðîâåðÿåì 2-þ òî÷êó
if (($Ping002 = 0) and ($Ping502 = 0)) do={
if ($DOMNAME002 = "off") do={} else={set $DOMNAME002 off; /ip firewall address-list set comment=$DOMNAME002 [find list="zz_$name002"]; log warning "$time - $pooling002 off"; /tool fetch address=api.telegram.org url="$telega $pooling002 - Off!" keep-result=no;}} else={ if ($DOMNAME002 = "on") do={} else={set $DOMNAME002 on; /ip firewall address-list set comment=$DOMNAME002 [find list="zz_$name002"]; log warning "$time - $pooling002 on"; /tool fetch address=api.telegram.org url="$telega $pooling002 - On!" keep-result=no;}}
# Ïðîâåðÿåì 3-þ òî÷êó
if (($Ping003 = 0) and ($Ping503 = 0)) do={
if ($DOMNAME003 = "off") do={} else={set $DOMNAME003 off; /ip firewall address-list set comment=$DOMNAME003 [find list="zz_$name003"]; log warning "$time - $pooling003 off"; /tool fetch address=api.telegram.org url="$telega $pooling003 - Off!" keep-result=no;}} else={ if ($DOMNAME003 = "on") do={} else={set $DOMNAME003 on; /ip firewall address-list set comment=$DOMNAME003 [find list="zz_$name003"]; log warning "$time - $pooling003 on"; /tool fetch address=api.telegram.org url="$telega $pooling003 - On!" keep-result=no;}}
# Ïðîâåðÿåì 4-þ òî÷êó
if (($Ping004 = 0) and ($Ping504 = 0)) do={
if ($DOMNAME004 = "off") do={} else={set $DOMNAME004 off; /ip firewall address-list set comment=$DOMNAME004 [find list="zz_$name004"]; log warning "$time - $pooling004 off"; /tool fetch address=api.telegram.org url="$telega $pooling004 - Off!" keep-result=no;}} else={ if ($DOMNAME004 = "on") do={} else={set $DOMNAME004 on; /ip firewall address-list set comment=$DOMNAME004 [find list="zz_$name004"]; log warning "$time - $pooling004 on"; /tool fetch address=api.telegram.org url="$telega $pooling004 - On!" keep-result=no;}}
# Ïðîâåðÿåì 5-þ òî÷êó
if (($Ping005 = 0) and ($Ping505 = 0)) do={
if ($DOMNAME005 = "off") do={} else={set $DOMNAME005 off; /ip firewall address-list set comment=$DOMNAME005 [find list="zz_$name005"]; log warning "$time - $pooling005 off"; /tool fetch address=api.telegram.org url="$telega $pooling005 - Off!" keep-result=no;}} else={ if ($DOMNAME005 = "on") do={} else={set $DOMNAME005 on; /ip firewall address-list set comment=$DOMNAME005 [find list="zz_$name005"]; log warning "$time - $pooling005 on"; /tool fetch address=api.telegram.org url="$telega $pooling005 - On!" keep-result=no;}}
# Ïðîâåðÿåì 6-þ òî÷êó
if (($Ping006 = 0) and ($Ping506 = 0)) do={
if ($DOMNAME006 = "off") do={} else={set $DOMNAME006 off; /ip firewall address-list set comment=$DOMNAME006 [find list="zz_$name006"]; log warning "$time - $pooling006 off"; /tool fetch address=api.telegram.org url="$telega $pooling006 - Off!" keep-result=no;}} else={ if ($DOMNAME006 = "on") do={} else={set $DOMNAME006 on; /ip firewall address-list set comment=$DOMNAME006 [find list="zz_$name006"]; log warning "$time - $pooling006 on"; /tool fetch address=api.telegram.org url="$telega $pooling006 - On!" keep-result=no;}}
# Ïðîâåðÿåì 7-þ òî÷êó
if (($Ping007 = 0) and ($Ping507 = 0)) do={
if ($DOMNAME007 = "off") do={} else={set $DOMNAME007 off; /ip firewall address-list set comment=$DOMNAME007 [find list="zz_$name007"]; log warning "$time - $pooling007 off"; /tool fetch address=api.telegram.org url="$telega $pooling007 - Off!" keep-result=no;}} else={ if ($DOMNAME007 = "on") do={} else={set $DOMNAME007 on; /ip firewall address-list set comment=$DOMNAME007 [find list="zz_$name007"]; log warning "$time - $pooling007 on"; /tool fetch address=api.telegram.org url="$telega $pooling007 - On!" keep-result=no;}}
# Ïðîâåðÿåì 8-þ òî÷êó
if (($Ping008 = 0) and ($Ping508 = 0)) do={
if ($DOMNAME008 = "off") do={} else={set $DOMNAME008 off; /ip firewall address-list set comment=$DOMNAME008 [find list="zz_$name008"]; log warning "$time - $pooling008 off"; /tool fetch address=api.telegram.org url="$telega $pooling008 - Off!" keep-result=no;}} else={ if ($DOMNAME008 = "on") do={} else={set $DOMNAME008 on; /ip firewall address-list set comment=$DOMNAME008 [find list="zz_$name008"]; log warning "$time - $pooling008 on"; /tool fetch address=api.telegram.org url="$telega $pooling008 - On!" keep-result=no;}}
# Ïðîâåðÿåì 9-þ òî÷êó
#if (($Ping009 = 0) and ($Ping509 = 0)) do={
#if ($DOMNAME009 = "off") do={} else={set $DOMNAME009 off; /ip firewall address-list set comment=$DOMNAME009 [find list="zz_$name009"]; log warning "$time - $pooling009 off"; /tool fetch address=api.telegram.org url="$telega $pooling009 - Off!" keep-result=no;}} else={ if ($DOMNAME009 = "on") do={} else={set $DOMNAME009 on; /ip firewall address-list set comment=$DOMNAME009 [find list="zz_$name009"]; log warning "$time - $pooling009 on"; /tool fetch address=api.telegram.org url="$telega $pooling009 - On!" keep-result=no;}}
# Ïðîâåðÿåì 10-þ òî÷êó
if (($Ping010 = 0) and ($Ping510 = 0)) do={
if ($DOMNAME010 = "off") do={} else={set $DOMNAME010 off; /ip firewall address-list set comment=$DOMNAME010 [find list="zz_$name010"]; log warning "$time - $pooling010 off"; /tool fetch address=api.telegram.org url="$telega $pooling010 - Off!" keep-result=no;}} else={ if ($DOMNAME010 = "on") do={} else={set $DOMNAME010 on; /ip firewall address-list set comment=$DOMNAME010 [find list="zz_$name010"]; log warning "$time - $pooling010 on"; /tool fetch address=api.telegram.org url="$telega $pooling010 - On!" keep-result=no;}}
# Ïðîâåðÿåì 11-þ òî÷êó
if (($Ping011 = 0) and ($Ping511 = 0)) do={
if ($DOMNAME100 = "off") do={} else={set $DOMNAME100 off; /ip firewall address-list set comment=$DOMNAME100 [find list="zz_$name100"]; log warning "$time - $pooling101 off"; /tool fetch address=api.telegram.org url="$telega $pooling100 - Off!" keep-result=no;}} else={ if ($DOMNAME100 = "on") do={} else={set $DOMNAME100 on; /ip firewall address-list set comment=$DOMNAME100 [find list="zz_$name100"]; log warning "$time - $pooling100 on"; /tool fetch address=api.telegram.org url="$telega $pooling100 - On!" keep-result=no;}}
Думаю разберётесь. :)
Дома: CCR2004 (7-ISP(GPON)белый IP)
Аватара пользователя
Sir_Prikol
Сообщения: 489
Зарегистрирован: 14 апр 2018, 15:21
Откуда: СССР

Re: Мониторинг порта

Сообщение Sir_Prikol »

И да, отослать СМС с usb модема - не вариант, поддерживается очень мало устройств.

Для начала надо проверить вообще, видите-ли вы модем:

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

/system resource usb print 
 # DEVICE VENDOR NAME SPEED 
 0 1:1 Linux 3.3.5 ehci_hcd RB400 EHCI 480 Mbps 
 1 1:3 HUAWEI_MOBILE HUAWEI_MOBILE 480 Mbps
После проверить порт

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

/port print detail 
Flags: I - inactive 
 0 name="usb1" used-by="" device="1:3" channels=3 baud-rate=9600 data-bits=8 parity=none stop-bits=1 flow-control=none
После проверить можно ли выполнить АТ команды

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

/system serial-terminal port=usb1 channel=0
[Ctrl-A is the prefix key]

AT+CNUM
+CNUM: "My Number","+79261893412",145
OK
[Q - quit connection] [B - send break]
[A - send Ctrl-A prefix] [R - autoconfigure rate]
 
Welcome back!
Если вы видете свой номер, то у вас появился шанс, тогда пробуем:

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

/tool sms send port=usb1 channel=0 phone-number="+79151234567" message="Test SMS 123" 
Но учтите, русского языка нет.

Проще слать в телегу, слак, на почту...

На правильность не претендую, давно этим занимался
Дома: CCR2004 (7-ISP(GPON)белый IP)
dub88
Сообщения: 7
Зарегистрирован: 11 окт 2021, 14:32

Re: Мониторинг порта

Сообщение dub88 »

Спасибо Всем огромное за отзывы и предложения но я для себя ничего из перечисленного не могу использовать для решение поставленной задачи, так как нужно проверять именно ПОРТ. На данном этапе СМС рассылка работает безотказно используя NetWatch, но это решает лишь доступность IP. Я надеялся на какой та скрипт который периодически (раз в 5 миню например) запускается и делает телнет, и при отрицательном результате высылает СМС.
Аватара пользователя
Sir_Prikol
Сообщения: 489
Зарегистрирован: 14 апр 2018, 15:21
Откуда: СССР

Re: Мониторинг порта

Сообщение Sir_Prikol »

Балин, так и пишите что вам нужно проверка порта на хосте, а не просто порт. С микротиком такого не прокатит, это не полноценная OS, а маршрутизатор. Для вашей задачи подойдёт только писание какого-нить BASH серипта, ну или ставьте The Dude и оттуда мониторте и отправляйте. Там точно можно по портам разделять
Дома: CCR2004 (7-ISP(GPON)белый IP)
dub88
Сообщения: 7
Зарегистрирован: 11 окт 2021, 14:32

Re: Мониторинг порта

Сообщение dub88 »

Dude есть (отдельно), есть идеи как с него отправить команду на микротик (который с модемом) на отправку СМС?
Аватара пользователя
Sir_Prikol
Сообщения: 489
Зарегистрирован: 14 апр 2018, 15:21
Откуда: СССР

Re: Мониторинг порта

Сообщение Sir_Prikol »

Создать новое оповещение с новым типом - работает
Дома: CCR2004 (7-ISP(GPON)белый IP)
dub88
Сообщения: 7
Зарегистрирован: 11 окт 2021, 14:32

Re: Мониторинг порта

Сообщение dub88 »

Не понял, простите.
Аватара пользователя
Sir_Prikol
Сообщения: 489
Зарегистрирован: 14 апр 2018, 15:21
Откуда: СССР

Re: Мониторинг порта

Сообщение Sir_Prikol »

Settings > Notifications > добавить , тип - execute on server и там такая-же команда как и с микротика
Дома: CCR2004 (7-ISP(GPON)белый IP)
Аватара пользователя
Chupaka
Сообщения: 3352
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Мониторинг порта

Сообщение Chupaka »

Это если сервер - микротик с модемом. А если нет... Тогда лучше в Телеграм-бота слать :D
dub88
Сообщения: 7
Зарегистрирован: 11 окт 2021, 14:32

Re: Мониторинг порта

Сообщение dub88 »

Почти готово.
В дуде сделал новый Notification (с использованием утилиты plink):
Изображение
Беда в другом ), когда в дуде что то происходит, запускается этот plink, конектится к микротику, но не выполняет комманду /tool, ждет нажатие Enter-а:
Изображение
После нажатия, СМС приходит.

Кто знает как добавить этот Enter в код?
dub88
Сообщения: 7
Зарегистрирован: 11 окт 2021, 14:32

Re: Мониторинг порта

Сообщение dub88 »

Нужно добавить команду: -batch, и тогда Enter не просит, СМС приходит.
Теперь думаю этот plink перенести на некий сервер, а то он сейчас запускается с локального компа.
Есть идейки?
Аватара пользователя
Sir_Prikol
Сообщения: 489
Зарегистрирован: 14 апр 2018, 15:21
Откуда: СССР

Re: Мониторинг порта

Сообщение Sir_Prikol »

Settings > Notifications > добавить , тип - execute on server и там такая-же команда как и с микротика
Модем, с которого летят СМС - запихать в тот микротик где установлен The Dude
Дома: CCR2004 (7-ISP(GPON)белый IP)