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

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

Все исправил, работает на 7.2.3
viewtopic.php?f=14&t=11742


deltaplaned
Сообщения: 6
Зарегистрирован: 19 июн 2022, 15:11

drpioneer писал(а): 25 апр 2022, 16:00 Приветствую всех!

На основе имеющегося скрипта, при активном участии 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.

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

вручную запускаю Ваш скрипт, и в логе никакой построчной информации нет, если запсукаю команду из бота, в логе вижу что такой то юзер, запустил такой скрипт.
но больше ничегоне приходит, ни в окне лога, ни в телегу.

если войти в Winbox, то данное сообщение отобраается в окне и в телегу приходит.

может-что не так сделал?


Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

Добрый день.
deltaplaned писал(а): 19 июн 2022, 16:49 ...
вручную запускаю Ваш скрипт, и в логе никакой построчной информации нет
...
может-что не так сделал?
Тут невозможно сделать что-то не так...

На ум приходят 2 варианта проблемы:
1. Работа скрипта в RouterOS 7.xx. У меня нет оборудования, работающего под 7-кой - соответственно я не имею возможности проверить корректную работу скрипта в 7-ке.
2. Работа кода мною не проверялась на ВСЁМ разнообразии устройств от Mikrotik. Возможно какое-то оборудование имеет свои особенности, которые я не учёл. В частности, в процессе отладки мне стало известно о некоторых особенностях в работе серии CHR от пользователя Sertik .

Вероятно, в обоих случаях проблему Вам придётся искать самостоятельно.


deltaplaned
Сообщения: 6
Зарегистрирован: 19 июн 2022, 15:11

drpioneer писал(а): 28 июн 2022, 16:44 Добрый день.
deltaplaned писал(а): 19 июн 2022, 16:49 ...
вручную запускаю Ваш скрипт, и в логе никакой построчной информации нет
...
может-что не так сделал?
Тут невозможно сделать что-то не так...

На ум приходят 2 варианта проблемы:
1. Работа скрипта в RouterOS 7.xx. У меня нет оборудования, работающего под 7-кой - соответственно я не имею возможности проверить корректную работу скрипта в 7-ке.
2. Работа кода мною не проверялась на ВСЁМ разнообразии устройств от Mikrotik. Возможно какое-то оборудование имеет свои особенности, которые я не учёл. В частности, в процессе отладки мне стало известно о некоторых особенностях в работе серии CHR от пользователя Sertik .

Вероятно, в обоих случаях проблему Вам придётся искать самостоятельно.
так это на всех 4-х девайсах Mikrotik hAP mini - RB931-2nD - SMIPS, и 1 - RB952Ui-5ac2nD, обновлены до 7.3.1.
даже если команды просто в терминале запустить, не выдается никакой инфы...
установил скрипты только щас, поэтому работали ли они на 6.4Х не знаю...

может кто-то еще может проверить на других девайсах?
спасибо!


Vaippp
Сообщения: 9
Зарегистрирован: 31 авг 2019, 10:08

Прошу помочь с пониманием ключа "-1" в примере :put [:find "abca" "a" -1];
Из документации это начало для поиска.
Но по факту что с ним что без него, команда возвращает позицию "0" вместо "3" как предпологает поиск с конца строки.
Или я чего-то не понимаю?


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

В скриптовом языке РОС :find поиск всегда идет от начала строки (слева-направо).


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Vaippp
Сообщения: 9
Зарегистрирован: 31 авг 2019, 10:08

Sertik писал(а): 30 июн 2022, 10:53 В скриптовом языке РОС :find поиск всегда идет от начала строки (слева-направо).
А что тогда дает отрицательный ключ?


gmx
Модератор
Сообщения: 3290
Зарегистрирован: 01 окт 2012, 14:48

deltaplaned писал(а): 29 июн 2022, 23:14

так это на всех 4-х девайсах Mikrotik hAP mini - RB931-2nD - SMIPS, и 1 - RB952Ui-5ac2nD, обновлены до 7.3.1.
даже если команды просто в терминале запустить, не выдается никакой инфы...
установил скрипты только щас, поэтому работали ли они на 6.4Х не знаю...

может кто-то еще может проверить на других девайсах?
спасибо!
Не работает у меня на 4011 с ROS 6.49.5.
В логе ошибка:Error, can't show health status


Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

В блоке с кодом # Connections information есть массив в котором присутствует pppoe.

:local pppTypes {"l2tp";"pptp";"ovpn";"ppp";"sstp";"pppoe"};

Ниже по коду идет

set connTo ("to $[[:parse "[/interface $pppType get $vpnName connect-to]"]]");

У pppoe нет параметра connect-to, поэтому всё на этом тормозится.
Похоже не работает у тех, у кого подключение к интернету настроено через pppoe соединение.

Уберите из массива pppoe и всё должно работать...


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

Убирать не надо. Лучше обойти по if else для pppoe. Попросим автора скрипта (drPioneer) поправить.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Ответить