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

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

Делюсь с вами скриптом, который присылает в телеграмм сообщение от бота с состоянием здоровья роутера.
Как прикрутить бота можно почитать на хабре (ищется по запросу в гугле mikrotik telegramm)
Если есть вопросы - пишите, помогу.

 Пример вывода сообщения

Спасибо за помощь podarok66!

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

:log info "Start WANstat script"
# set router name
:global routername "Название роутера";
# set url to telegramm bot
# Замените значение в кавычках на свое
:global sendToTele "https://api.telegram.org/botХХХХХХХХХХ:YYYYYYYYYYYYYYYYY/sendmessage\?chat_id=-ZZZZZZZZZZZ&text=";
# set downloaded Gb
# Замените название интерфейса на нужный
:global rxbyte [/interface get [find name=WAN] rx-byte];
:global simplGbrxreport ($rxbyte / 1073741824);
:global lowGbrxreport ((($rxbyte - ($simplGbrxreport * 1073741824)) * 1000000000) / 1048576);
:global Gbrxreport ("$[$simplGbrxreport]".",".[:pick "$[$lowGbrxreport]" 0 3] );
# set uploaded Gb
# Замените название интерфейса на нужный
:global txbyte [/interface get [find name=WAN] tx-byte];
:global simplGbtxreport ($txbyte / 1073741824);
:global lowGbtxreport ((($txbyte - ($simplGbtxreport * 1073741824)) * 1000000000) / 1048576);
:global Gbtxreport ("$[$simplGbtxreport]".",".[:pick "$[$lowGbtxreport]" 0 3] );
# set temp
:global tempC [/system health get temperature];
# set voltage
:global volt [/system health get voltage];
:global simplvolt ($volt / 10);
:global lowvolt ((($volt - ($simplvolt * 10)) * 10) / 1);
:global involt ("$[$simplvolt]".",".[:pick "$[$lowvolt]" 0 3] );
# set uptime
:global uptime [/system resource get uptime]
# set CPU load
:global cpuZ [/system resource get cpu-load]
# set version
:global vers [/system resource get version]
# set memory
:global memt [/system resource get total-memory]
:global memtotal ($memt / 1048576)
:global memo [/system resource get free-memory]
:global memoMB ($memo / 1048576)
#
# Message to telegramm bot
#
/tool fetch url="$sendToTele $routername%0AVersion: $vers%0AUptime: $uptime%0AVoltage: $involt V%0ATemperature: $tempC C%0ACPU load: $cpuZ %%0AMemory Free / Total: $memoMB / $memtotal MB%0ADownload: $Gbrxreport GB%0AUpload: $Gbtxreport GB "  keep-result=no
:log info "WANstat script finished"


Аватара пользователя
EIKA
Сообщения: 41
Зарегистрирован: 30 дек 2017, 21:59

Увы, но не работает.

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

failure: closing connection: <400 Bad Request> 149.154.167.200:443 (4)

Строка API верная и работает из браузера. Но пустой аргумент text передавать нельзя.

В консоли все отрабатывает нормально до строки:

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

/tool fetch url="$sendToTele $routername%0AVersion: $vers%0AUptime: $uptime%0AVoltage: $involt V%0ATemperature: $tempC C%0ACPU load: $cpuZ %%0AMemory Free / Total: $memoMB / $memtotal MB%0ADownload: $Gbrxreport GB%0AUpload: $Gbtxreport GB "  keep-result=no
:log info "MikroTik-Telegram-Status script finished"


Аватара пользователя
EIKA
Сообщения: 41
Зарегистрирован: 30 дек 2017, 21:59

Хотя вру, работает. Но слэш экранирования из URL убирать нельзя (а вот в браузере - необходимо!).


Аватара пользователя
loskiq
Сообщения: 6
Зарегистрирован: 24 дек 2017, 08:43
Контактная информация:

EIKA писал(а):Хотя вру, работает. Но слэш экранирования из URL убирать нельзя (а вот в браузере - необходимо!).


Спасибо, и у меня работает! Только есть вопросик: Как реализовать переход на новую строку? \n - не помогает


Аватара пользователя
Dragon_Knight
Сообщения: 1724
Зарегистрирован: 26 мар 2012, 18:21
Откуда: МО, Мытищи
Контактная информация:

Новая строка - "\x0A".


Небольшой свод правил логики и ссылок:
  1. Если устройство имеет Ethernet порт, то оно обязано быть подключено через него. Компьютер, Ноутбук, Телевизор, Принтер, Камера видеонаблюдения, и т.д.
  2. Если нет возможности протянуть кабель, то найдите её, или страдайте со своими проблемами Wi-Fi дальше.
  3. Wi-Fi это сеть для мобильных устройств. Если Вы подключили свой шикарный 50" телевизор не кабелем, то без фотоотчёта, когда он лежит у Вас в кармане дальнейшего разговора не получиться. Это относится и ко всем остальным устройствам.
  4. Если Ваше устройство вызывает вопросы в работе, первое что необходимо делать: NetInstall + дальнейшая настройка вручную.
  5. Не используйте WebFig или QuickSet - это пути к глюкам и ошибкам. Только SSH или WinBox, и да, - WinBox есть под Android.
  6. name.rsc - это текстовый файл, и Вы можете его открыть блокнотом.
  7. Если Вы хотите связаться со мной для ремонта или настройки, то: Telegram ( Не благотворительность ).
  8. Мой сайт по Mikrotik: Global Zone >> MikroTik.
Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

Добрый день.

Версия скрипта с автоматическим перебором WAN-интерфейсов и выводом инфы в журнал Микротика:

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


# Script view health of device by Enternight
# https://forummikrotik.ru/viewtopic.php?t=7924
# tested on ROS 6.48
# updated 2021/02/14

:do {
    :local message   "";
    :local subject   "";
    :local nameISP   "ISP";
    :local boardName [/system resource get board-name];
    :local boardId   [/system identity get name];
    :local currDate ([/system clock    get date].", ".[/system clock get time]);
    :local uptime    [/system resource get uptime];
    :local cpuZ      [/system resource get cpu-load];
    :local vers      [/system resource get version];
    :local memTotal  [/system resource get total-memory];
    :local memFree   [/system resource get free-memory];
    :local hddTotal  [/system resource get total-hdd-space];
    :local hddFree   [/system resource get free-hdd-space];
    :local badBlocks [/system resource get bad-blocks];
    :local tempC     [/system health   get temperature];
    :local volt      [/system health   get voltage];
    :local simplvolt ($volt / 10);
    :local lowvolt  (($volt - ($simplvolt * 10)) * 10);
    :local involt    ($simplvolt.",".[:pick "$[$lowvolt]" 0 3] );
    :set   memTotal  ($memTotal / 100);
    :set   memFree   ($memFree  / $memTotal);
    :set   hddTotal  ($hddTotal / 100);
    :set   hddFree   ($hddFree  / $hddTotal );
    :set   subject   ($message.(">>>        Health report on ".$currDate));
    :set   message   ($message.(">>> From  '".$boardName." - ".$boardId."',  ROS Version: ".$vers."\r\n"));
    :set   message   ($message.(">>> Uptime:      ".$uptime.",  CPU load: ".$cpuZ."%\r\n"));
    :set   message   ($message.(">>> Voltage:     ".$involt." V,  Temperature: ".$tempC." C\r\n"));
    :set   message   ($message.(">>> HDD free:    ".$hddFree."%,  HDD bad blocks: ".$badBlocks."%,  Memory free: ".$memFree."%\r\n"));
    if ([/ip address find interface~$nameISP;] != "") do={
        :foreach internet in=[ /ip address find interface~$nameISP; ] do={
            :do {
                :local interfaceISP     [/ip address get $internet interface; ];
                :local rxByte           [/interface  get $interfaceISP rx-byte ];
                :local txByte           [/interface  get $interfaceISP tx-byte ];
                :local simpleGbRxReport ($rxByte / 1073741824 );
                :local simpleGbTxReport ($txByte / 1073741824);
                :local lowGbRxReport  ((($rxByte - ($simpleGbRxReport * 1073741824)) * 1000000000) / 1048576);
                :local lowGbTxReport  ((($txByte - ($simpleGbTxReport * 1073741824)) * 1000000000) / 1048576);
                :local gbRxReport      ("$[$simpleGbRxReport]".",".[:pick "$[$lowGbRxReport]" 0 3] );
                :local gbTxReport      ("$[$simpleGbTxReport]".",".[:pick "$[$lowGbTxReport]" 0 3] );
                :set message ($message.(">>> Traffic via  '".$interfaceISP."'  Rx: ".$gbRxReport." Gb;  Tx: ".$gbTxReport." Gb\r\n"));
            } on-error={ :log warning  (">>> Script error. Disappeared interface '".$nameISP."'."); }
        }
    } else={ :set message ($message.(">>> Active interface '".$nameISP."' was not found.\r\n")); }
    :log warning ($subject);
    :log warning ($message);
} on-error={ :log warning (">>> Script error. Script couldn't show the health status."); }


Переменная nameISP содержит общую часть названия искомых WAN-интерфейсов.
Последний раз редактировалось drpioneer 20 фев 2021, 08:43, всего редактировалось 2 раза.


Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Давным давно известные опубликованные скрипты гоняете по 10 раз. Сколько можно то ?
Хоть бы кто-нибудь что-то оригинальное сваял ...


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Sertik писал(а): 18 янв 2021, 12:54 Давным давно известные опубликованные скрипты гоняете по 10 раз. Сколько можно то ?
Хоть бы кто-нибудь что-то оригинальное сваял ...
Дружище! Набор запросов, который используют админы в повседневной жизни, достаточно узок. Его описали, как могли уже давно. Искать новое в том месте, где прошли тысячи и тысячи - сложнейшая задача. Часто идеи, интересные одному, абсолютно неинтересны другим. Или усилия, затрачиваемые на реализацию, могут быть настолько значительны, что результат становится ничтожен. Люди хотят простоты и не желают напрягаться. Это нормально. Закон жизни. Но иногда что-то выстреливает! Кого-то осеняет удачная идея и на основе уже этой идеи появляется гроздь, кластер совершенно оригинальных затей. Ради этого мы и стараемся. Это гений может генерировать идеи часто и по заказу. А мы только надеемся на удачу...


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

Приветствую всех!

На основе имеющегося скрипта, при активном участии Sertik родилась новая версия:

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




# Device status view script
# Script uses ideas by Enternight, Jotne, Sertik, drPioneer
# https://forummikrotik.ru/viewtopic.php?p=84984#p84984
# tested on ROS 6.49.5
# updated 2022/04/27

:do {
    # Digit conversion function via SI-prefix
    # How to use: :put [$NumSiPrefix 648007421264];
    :local NumSiPrefix do={
        :local inp [:tonum $1];
        :local cnt 0;
        :while ($inp > 1024) do={
            :set $inp ($inp/1024);
            :set $cnt ($cnt+1);
        }
        :return ($inp.[:pick [:toarray "B,Kb,Mb,Gb,Tb,Pb,Eb,Zb,Yb"] $cnt]);
    }

    # Defining variables
    :local hddTotal [/system resource get total-hdd-spac];
    :local hddFree  [/system resource get free-hdd-space];
    :local badBlock [/system resource get bad-blocks];
    :local memTotal [/system resource get total-memory];
    :local memFree  [/system resource get free-memory];
    :local cpuZ     [/system resource get cpu-load];
    :local currFW   [/system routerbo get upgrade-firmwa];
    :local upgrFW   [/system routerbo get current-firmwa];
    :if ([/system resource get board-name]!="CHR") do={
        :local tempC [/system health get temperature];
        :local volt  [/system health get voltage];
    }
    :local smplVolt ($volt/10);
    :local lowVolt  (($volt-($smplVolt*10))*10);
    :local inVolt   ("$smplVolt.$[:pick $lowVolt 0 3]");
    :local message  "Health report:\r\nID $[system identity get name]";

    #General information
    :set   message  ("$message \r\nUptime $[system resource get uptime]");
    :set   message  ("$message \r\nModel $[system resource get board-name]");
    :set   message  ("$message \r\nROS $[system resource get version]");
    :if ($currFW != $upgrFW) do={set message ("$message \r\n*FW not updated*")}
    :set   message  ("$message \r\nArch $[/system resource get arch]");
    :set   message  ("$message \r\nCPU $[/system resource get cpu]");
    :set   hddFree  ($hddFree/($hddTotal/100));
    :set   memFree  ($memFree/($memTotal/100));
    :if ($cpuZ < 90) do={:set message ("$message \r\nCPU load $cpuZ%");
    } else={:set message ("$message \r\n*Large CPU usage $cpuZ%*")}
    :if ($memFree > 17) do={:set message ("$message \r\nMem free $memFree%");
    } else={:set message ("$message \r\n*Low free mem $memFree%*")}
    :if ($hddFree > 6) do={:set message ("$message \r\nHDD free $hddFree%");
    } else={:set message ("$message \r\n*Low free HDD $hddFree%*")}
    :if ([:len $badBlock] > 0) do={
        :if ($badBlock = 0) do={:set message ("$message \r\nBad blocks $badBlock%");
        } else={:set message ("$message \r\n*Present bad blocks $badBlock%*")}
    }
    :if ([:len $volt] > 0) do={
        :if ($smplVolt > 4 && $smplVolt < 50) do={:set message ("$message \r\nVoltage $inVolt V");
        } else={:set message ("$message \r\n*Bad voltage $inVolt V*")}
    }
    :if ([:len $tempC] > 0) do={
        :if ($tempC > 10 && $tempC < 40) do={:set message ("$message \r\nTemp $tempC C");
        } else={:set message ("$message \r\n*Abnorm temp $tempC C*")}
    }

    # Connections information
    :local pppInteract {"-client";"-server"};
    :local pppTypes {"l2tp";"pptp";"ovpn";"ppp";"sstp";"pppoe"};
    :foreach pppInt in=$pppInteract do={ 
        :foreach pppTps in=$pppTypes do={ 
            :local pppType ($pppTps.$pppInt);
            :foreach pppConn in=[[:parse "[/interface $pppType find]"]] do={
                :local vpnName  [[:parse "[/interface $pppType get $pppConn name]"]];
                :local vpnComm  [[:parse "[/interface $pppType get $pppConn comment]"]];
                :local vpnType [/interface get $vpnName type];
                :local iType $vpnType;
                :local connTo  "";
                :set vpnType [:pick $vpnType ([:find $vpnType "-"] +1) [:len $vpnType]];
                :if ($vpnType="out" && $iType!="ppp-out") do={
                    :set connTo ("to $[[:parse "[/interface $pppType get $vpnName connect-to]"]]");
                }
                :local vpnState [[:parse "[/interface $pppType monitor $pppConn once as-value]"]];
                :local vpnStatu ($vpnState->"status");
                :local locAddr  ($vpnState->"local-address");
                :local remAddr  ($vpnState->"remote-address");
                :local upTime   ($vpnState->"uptime");
                :if ([:len [find key="terminating" in=$vpnStatu]] > 0) do={:set vpnStatu "disabled"}
                :if ([:typeof $vpnStatu]="nothing") do={:set vpnStatu "unplugged"}
                :if ($vpnStatu!="unplugged" && $vpnStatu!="disabled") do={
                    :set message ("$message\r\nConnect info:\r\n'$vpnName'\r\nType $pppType");
                    :if ([:len $connTo]  > 0) do={:set message ("$message\r\n$connTo")}
                    :if ([:len $vpnComm] > 0) do={:set message ("$message\r\nComment $vpnComm")}
                    :set message ("$message\r\nLcl $locAddr\r\nRmt $remAddr\r\nUptime $upTime");
                }
            }
        }
    }

    # Gateways information
    :local routeISP [/ip route find dst-address=0.0.0.0/0];
    :if ([:len $routeISP] > 0) do={
        :local gwList [:toarray ""];
        :local count 0;
        :foreach inetGate in=$routeISP do={
            :local gwStatus [:tostr [/ip route get $inetGate gateway-status]];
            :if ([:len $gwStatus] > 0) do={
                :if ([:len [:find $gwStatus "unreachable"]]=0 && [:len [:find $gwStatus "inactive"]]=0) do={

                    # Formation of interface name
                    :local ifaceISP "";
                    :foreach idName in=[/interface find] do={
                        :local ifName [/interface get $idName name];
                        :if ([:len [find key=$ifName in=$gwStatus]] > 0) do={:set ifaceISP $ifName}
                    }
                    :if ([:len $ifaceISP] > 0) do={

                        # Checking the interface for entering the Bridge
                        :if ([:len [/interface bridge find name=$ifaceISP]] > 0) do={
                            :local ipAddrGW [:tostr [/ip route get $inetGate gateway]];
                            :if ([:find $ipAddrGW "%"] > 0) do={
                                :set $ipAddrGW [:pick $ipAddrGW ([:len [:pick $ipAddrGW 0 [:find $ipAddrGW "%"]] ] +1) [:len $ipAddrGW]];
                            }
                            :if ($ipAddrGW~"[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}") do={
                                :local mcAddrGate [/ip arp get [find address=$ipAddrGW interface=$ifaceISP] mac-address];
                                :if ($mcAddrGate~"[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]") do={
                                    :set ifaceISP [/interface bridge host get [find mac-address=$mcAddrGate] interface];
                                } else={:set ifaceISP ""}
                            } else={:set ifaceISP ""}
                        }
                        :if ([:len $ifaceISP] > 0) do={

                            # Checking the repetition of interface name
                            :local checkIf [:len [find key=$ifaceISP in=$gwList]];
                            :if ($checkIf = 0) do={
                                :set ($gwList->$count) $ifaceISP;
                                :set count ($count+1);
                                :local gbRxReport [$NumSiPrefix [/interface get $ifaceISP rx-byte]];
                                :local gbTxReport [$NumSiPrefix [/interface get $ifaceISP tx-byte]];
                                :set message ("$message\r\nTraffic via:\r\n'$ifaceISP'\r\nRx/Tx $gbRxReport/$gbTxReport");
                            }
                        }
                    }
                }
            }
        }
    } else={:set message ("$message \r\nWAN iface not found")}

    # Output of message
    :put $message;
    :log warning $message;
} on-error={:log warning ("Error, can't show health status")}



В этой версии скрипт обучен собирать и выводить информацию о:
  • важных параметрах устройства
  • критических отклонениях параметров
  • активных VPN-соединениях
  • трафике через шлюзы
Скрипт не требует никакой настройки, запускай и пользуй!
Собранная информация выводится в терминал и журнал устройства.
Вывод производится построчно и максимально коротко, это сделано в угоду удобства чтения отчёта на экране смартфона в Телеграм.
Для трансляции отчёта о здоровье в Телеграм можно использовать скрипт TLGRM.
Имеются ограничения в работе: скрипт не обучен работе с GRE, IPIP, VRRF, MPLS, GUARD.

Полагаю что, код не лишён косяков, по этой причине готов выслушать замечания.
Заранее спасибо.


FedorVG
Сообщения: 2
Зарегистрирован: 10 май 2022, 22:39

Долго сопротивлялся, но все же обновился на 7ку - скрипт про здоровье Микротика перестал работать:
- не выводит температуру и вольтаж - что то с синтаксисом???

# set temp
:global tempC [/system health get temperature];
# set voltage
##:global volt [/system health get voltage];

- из терминала запускается, скриптом из шедулера нет
.....на 6-ке без проблем
Может кто поправит
Спасибо


Ответить