Все исправил, работает на 7.2.3
viewtopic.php?f=14&t=11742
Скрипт для отправки состояния здоровья микротика в телеграмм
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
-
- Сообщения: 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
- Сообщения: 175
- Зарегистрирован: 30 май 2013, 10:20
Добрый день.
На ум приходят 2 варианта проблемы:
1. Работа скрипта в RouterOS 7.xx. У меня нет оборудования, работающего под 7-кой - соответственно я не имею возможности проверить корректную работу скрипта в 7-ке.
2. Работа кода мною не проверялась на ВСЁМ разнообразии устройств от Mikrotik. Возможно какое-то оборудование имеет свои особенности, которые я не учёл. В частности, в процессе отладки мне стало известно о некоторых особенностях в работе серии CHR от пользователя Sertik .
Вероятно, в обоих случаях проблему Вам придётся искать самостоятельно.
Тут невозможно сделать что-то не так...deltaplaned писал(а): ↑19 июн 2022, 16:49 ...
вручную запускаю Ваш скрипт, и в логе никакой построчной информации нет
...
может-что не так сделал?
На ум приходят 2 варианта проблемы:
1. Работа скрипта в RouterOS 7.xx. У меня нет оборудования, работающего под 7-кой - соответственно я не имею возможности проверить корректную работу скрипта в 7-ке.
2. Работа кода мною не проверялась на ВСЁМ разнообразии устройств от Mikrotik. Возможно какое-то оборудование имеет свои особенности, которые я не учёл. В частности, в процессе отладки мне стало известно о некоторых особенностях в работе серии CHR от пользователя Sertik .
Вероятно, в обоих случаях проблему Вам придётся искать самостоятельно.
-
- Сообщения: 6
- Зарегистрирован: 19 июн 2022, 15:11
так это на всех 4-х девайсах Mikrotik hAP mini - RB931-2nD - SMIPS, и 1 - RB952Ui-5ac2nD, обновлены до 7.3.1.drpioneer писал(а): ↑28 июн 2022, 16:44 Добрый день.Тут невозможно сделать что-то не так...deltaplaned писал(а): ↑19 июн 2022, 16:49 ...
вручную запускаю Ваш скрипт, и в логе никакой построчной информации нет
...
может-что не так сделал?
На ум приходят 2 варианта проблемы:
1. Работа скрипта в RouterOS 7.xx. У меня нет оборудования, работающего под 7-кой - соответственно я не имею возможности проверить корректную работу скрипта в 7-ке.
2. Работа кода мною не проверялась на ВСЁМ разнообразии устройств от Mikrotik. Возможно какое-то оборудование имеет свои особенности, которые я не учёл. В частности, в процессе отладки мне стало известно о некоторых особенностях в работе серии CHR от пользователя Sertik .
Вероятно, в обоих случаях проблему Вам придётся искать самостоятельно.
даже если команды просто в терминале запустить, не выдается никакой инфы...
установил скрипты только щас, поэтому работали ли они на 6.4Х не знаю...
может кто-то еще может проверить на других девайсах?
спасибо!
-
- Сообщения: 11
- Зарегистрирован: 31 авг 2019, 10:08
Прошу помочь с пониманием ключа "-1" в примере :put [:find "abca" "a" -1];
Из документации это начало для поиска.
Но по факту что с ним что без него, команда возвращает позицию "0" вместо "3" как предпологает поиск с конца строки.
Или я чего-то не понимаю?
Из документации это начало для поиска.
Но по факту что с ним что без него, команда возвращает позицию "0" вместо "3" как предпологает поиск с конца строки.
Или я чего-то не понимаю?
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
В скриптовом языке РОС :find поиск всегда идет от начала строки (слева-направо).
фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
viewtopic.php?f=14&t=13947
-
- Сообщения: 11
- Зарегистрирован: 31 авг 2019, 10:08
-
- Модератор
- Сообщения: 3416
- Зарегистрирован: 01 окт 2012, 14:48
Не работает у меня на 4011 с ROS 6.49.5.deltaplaned писал(а): ↑29 июн 2022, 23:14
так это на всех 4-х девайсах Mikrotik hAP mini - RB931-2nD - SMIPS, и 1 - RB952Ui-5ac2nD, обновлены до 7.3.1.
даже если команды просто в терминале запустить, не выдается никакой инфы...
установил скрипты только щас, поэтому работали ли они на 6.4Х не знаю...
может кто-то еще может проверить на других девайсах?
спасибо!
В логе ошибка:Error, can't show health status
- Brook
- Сообщения: 156
- Зарегистрирован: 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 и всё должно работать...
:local pppTypes {"l2tp";"pptp";"ovpn";"ppp";"sstp";"pppoe"};
Ниже по коду идет
set connTo ("to $[[:parse "[/interface $pppType get $vpnName connect-to]"]]");
У pppoe нет параметра connect-to, поэтому всё на этом тормозится.
Похоже не работает у тех, у кого подключение к интернету настроено через pppoe соединение.
Уберите из массива pppoe и всё должно работать...
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
Убирать не надо. Лучше обойти по if else для pppoe. Попросим автора скрипта (drPioneer) поправить.
фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
viewtopic.php?f=14&t=13947