Страница 1 из 2

[Beta] Мониторинг интернета с уведомлением в Telegram

Добавлено: 25 дек 2016, 04:09
Dragon_Knight
Благодаря одной теме на форуме я познакомился с сервисом Telegram, особенно с их ботами и осознал что это идеальная площадка для уведомлений, как в моих поделках, так и для моего непосредственного заработка :-):

Собственно набросал скрипт, который пингует указанный хост, и если пинг нестабильный или его вообще нет, то дожидается нормального пинга и отправляет сообщение в Telegram с пометкой начала и окончания сбоя.
Пока писал вспомнил, какая-же гадость [s]это ваша заливная рыба[/s] этот скриптовый язык... Сделали-бы уже урезанную учётку в ядре и дали писать скрипты на привычном shell...

 Собственно скрипт

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

# ISP Checker
# Developed by Dragon_Knight, 2016 - 2017.

:local CFGSchedulerName "schedule1";
:local CFGSchedulerNormalInterval 00:00:30;
:local CFGPingCount 10;
:local CFGPingError 1;
:local CFGPingInterval "100ms";
:local CFGPingInterface "ether1";
:local CFGPingAddress "77.88.8.1";
:global CFGTelegramBotToken "XXX";
:global CFGTelegramChatId YYY;

:global LastPingStatus;
:global SendString;

:local GetCurrentTime do={
   :local currentDate [/system clock get date];
   :local mouth {"jan"="01";"feb"="02";"mar"="03";"apr"="04";"may"="05";"jun"="06";"jul"="07";"aug"="08";"sep"="09";"oct"=10;"nov"="11";"dec"="12"};
   :return ([:pick $currentDate 7 11] . "." . $mouth -> [:pick $currentDate 0 3] . "." . [:pick $currentDate 4 6] . " " . [/system clock get time]);
};

:local Send2Telegram do={
   :do {
      :local URLEncodeString "";
      :for i from=0 to=([:len $string] - 1) do={
         :local char [:pick $string $i];
         :if ($char = " ") do={:set $char "%20";};
         :if ($char = "-") do={:set $char "%2D";};
         :if ($char = ":") do={:set $char "%3A";};
         :set URLEncodeString ($URLEncodeString . $char);
      };
      
      /tool fetch keep-result=no mode=https url=("https://api.telegram.org/bot" . $CFGTelegramBotToken . "/sendmessage\?chat_id=" . $CFGTelegramChatId . "&text=" . $URLEncodeString);
   } on-error={
      :log error "[ISP Checker]: Error sending message.";
   };
};

:local pingResult [ping count=$CFGPingCount interval=$CFGPingInterval interface=$CFGPingInterface $CFGPingAddress];

:if ($pingResult < ($CFGPingCount - $CFGPingError)) do={
   :if ($pingResult = 0) do={
      :if ($LastPingStatus != 1) do={
         :set LastPingStatus 1;
         :set SendString ($SendString . [$GetCurrentTime] . ": Ping failed (all " . $CFGPingCount . " packets lost)!%0A");
         /system scheduler set [find name=$CFGSchedulerName] interval=((CFGPingInterval * CFGPingCount) + 00:00:01.500);
      };
   } else={
      :if ($LastPingStatus != 2) do={
         :set LastPingStatus 2;
         :set SendString ($SendString . [$GetCurrentTime] . ": Ping unstable (" . $pingResult . " of " . $CFGPingCount . " received)!%0A");
         /system scheduler set [find name=$CFGSchedulerName] interval=((CFGPingInterval * CFGPingCount) + 00:00:01.500);
      };
   };
} else={
   :if ($LastPingStatus != 3) do={
      :set LastPingStatus 3;
      :set SendString ($SendString . [$GetCurrentTime] . ": Ping ok!%0A");
      [$Send2Telegram string=$SendString];
      :set SendString "";
      /system scheduler set [find name=$CFGSchedulerName] interval=$CFGSchedulerNormalInterval;
   };
};

Настройки:

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

:local CFGSchedulerName "schedule1"   # Имя этого скрипта.
:local CFGSchedulerNormalInterval 00:00:30   # Интервал проверки пинга в нормальных условиях.
:local CFGPingCount 10;   # Кол-во пакетов проверки пинга.
:local CFGPingError 1;   # Кол-во потерянных пакетов, при котором считается что пинг нормальный.
:local CFGPingInterval "100ms";   # Интервал оправки пакетов пинга.
:local CFGPingInterface "MAIN-BRIDGE";   # Интерфейс выхода в мир.
:local CFGPingAddress "77.88.8.1";   # Пингуемый узел.
:global CFGTelegramBotToken "XXX";   # Token бота Telegram.
:global CFGTelegramChatId YYY;   # ID чата с ботом Telegram.


Изображение Изображение


Интересно услышать Ваше мнение.

Re: [Beta] Мониторинг интернета с уведомлением в Telegram

Добавлено: 28 дек 2016, 16:50
Dragon_Knight
Добавил режим, при котором в случае проблем с пингом, скрипт начинает работать непрерывно и возвращается в исходное состояние в случае возобновления пинга.

PS: Если кто знает, как можно редактировать параметры скрипта из тела самого скрипта, без указания его имени, то прошу подсказать.
Типа такого: "set [find on-event="# ISP Checker\r"] interval=25".

Re: [Beta] Мониторинг интернета с уведомлением в Telegram

Добавлено: 28 дек 2016, 16:54
Vladimir22
а если интернет пропал ?
как в телеграм отправить сообщение ?

Re: [Beta] Мониторинг интернета с уведомлением в Telegram

Добавлено: 28 дек 2016, 16:56
Dragon_Knight
Vladimir22, Сообщение отправляется только после его возобновления.
Скрипит предназначен не для мониторинга интернета, а для учёта статистики, - когда и как долго его не было, или был но с провалами.
Сами понимаете, - что-бы мониторить само подключение, то нужно или пинговать хост снаружи, что не всегда даёт верную картину, или иметь другой канал связи, - SMS, GPRS...

Re: [Beta] Мониторинг интернета с уведомлением в Telegram

Добавлено: 10 янв 2017, 21:55
root_s
Dragon_Knight писал(а):Благодаря одной теме на форуме я познакомился с сервисом Telegram, особенно с их ботами и осознал что это идеальная площадка для уведомлений, как в моих поделках, так и для моего непосредственного заработка :-):

Интересно услышать Ваше мнение.



Извините за вопрос начинающего, а как его правильно прикрутить в Mikrotik ?
Ставлю в Scripts, вроде все выполняется, а в telegram не приходит
все настройки бота в телеграмме выполнил
если выполняю вот так
/tool fetch url="https://api.telegram.org/botXXXXXXXXXXXXXXXXXXXXXXXXXX/sendMessage?chat_id=XXXXXXXXXX&text=Host OK
то сообщение приходит
Спасибо !

Re: [Beta] Мониторинг интернета с уведомлением в Telegram

Добавлено: 11 янв 2017, 20:22
Dragon_Knight
Нужно не скрипт а планировщик создать, и вызывать его, скажем каждые 30сек.
Если Вы пишите свой скрипт, то можете взять функцию Send2Telegram и использовать по своему, только поправить ID и токен или использовать глагольные переменные.

Re: [Beta] Мониторинг интернета с уведомлением в Telegram

Добавлено: 11 янв 2017, 21:38
root_s
Dragon_Knight писал(а):Нужно не скрипт а планировщик создать, и вызывать его, скажем каждые 30сек.
Если Вы пишите свой скрипт, то можете взять функцию Send2Telegram и использовать по своему, только поправить ID и токен или использовать глагольные переменные.


Создал шедулер
на скриншоте видно
в телеграм не идет
опять что-то не так
Извините начинающего :-(

ИзображениеИзображение

Re: [Beta] Мониторинг интернета с уведомлением в Telegram

Добавлено: 11 янв 2017, 21:45
Dragon_Knight
А Вы уверены что происходят сбои? Попробуйте изменить время обновления в 2 секунды и кратковременно, на пол секунды вытащить WAN кабель из роутера, или вытащить на продолжительное время (больше чем время обновления планировщика) и потом обратно подключить.
При возобновлении пинга должно прийти сообщение.

Re: [Beta] Мониторинг интернета с уведомлением в Telegram

Добавлено: 11 янв 2017, 22:36
root_s
Спасибо !!!!
Все работает отлично ! :co_ol:

Re: [Beta] Мониторинг интернета с уведомлением в Telegram

Добавлено: 12 янв 2017, 13:32
podarok66
А у меня вот странность такая, если оставить переменную $string - не работает шедулер, если заменяю на "There has been a drop interface" - отрабатывает на ура. Никак не въеду, что не так...