Страница 1 из 4
Скрипт для отправки состояния здоровья микротика в телеграмм
Добавлено: 04 сен 2017, 13:10
enternight
Делюсь с вами скриптом, который присылает в телеграмм сообщение от бота с состоянием здоровья роутера.
Как прикрутить бота можно почитать на хабре (ищется по запросу в гугле
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"
Re: Скрипт для отправки состояния здоровья микротика в телеграмм
Добавлено: 31 дек 2017, 01:47
EIKA
Увы, но не работает.
Код: Выделить всё
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"
Re: Скрипт для отправки состояния здоровья микротика в телеграмм
Добавлено: 31 дек 2017, 01:57
EIKA
Хотя вру, работает. Но слэш экранирования из URL убирать нельзя (а вот в браузере - необходимо!).
Re: Скрипт для отправки состояния здоровья микротика в телеграмм
Добавлено: 11 янв 2018, 15:38
loskiq
EIKA писал(а):Хотя вру, работает. Но слэш экранирования из URL убирать нельзя (а вот в браузере - необходимо!).
Спасибо, и у меня работает! Только есть вопросик: Как реализовать переход на новую строку?
\n - не помогает
Re: Скрипт для отправки состояния здоровья микротика в телеграмм
Добавлено: 12 янв 2018, 00:32
Dragon_Knight
Новая строка - "\x0A".
Re: Скрипт для отправки состояния здоровья микротика в телеграмм
Добавлено: 16 янв 2021, 12:10
drpioneer
Добрый день.
Версия скрипта с автоматическим перебором 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-интерфейсов.
Re: Скрипт для отправки состояния здоровья микротика в телеграмм
Добавлено: 18 янв 2021, 12:54
Sertik
Давным давно известные опубликованные скрипты гоняете по 10 раз. Сколько можно то ?
Хоть бы кто-нибудь что-то оригинальное сваял ...
Re: Скрипт для отправки состояния здоровья микротика в телеграмм
Добавлено: 18 янв 2021, 13:18
podarok66
Sertik писал(а): ↑18 янв 2021, 12:54
Давным давно известные опубликованные скрипты гоняете по 10 раз. Сколько можно то ?
Хоть бы кто-нибудь что-то оригинальное сваял ...
Дружище! Набор запросов, который используют админы в повседневной жизни, достаточно узок. Его описали, как могли уже давно. Искать новое в том месте, где прошли тысячи и тысячи - сложнейшая задача. Часто идеи, интересные одному, абсолютно неинтересны другим. Или усилия, затрачиваемые на реализацию, могут быть настолько значительны, что результат становится ничтожен. Люди хотят простоты и не желают напрягаться. Это нормально. Закон жизни. Но иногда что-то выстреливает! Кого-то осеняет удачная идея и на основе уже этой идеи появляется гроздь, кластер совершенно оригинальных затей. Ради этого мы и стараемся. Это гений может генерировать идеи часто и по заказу. А мы только надеемся на удачу...
Re: Скрипт для отправки состояния здоровья микротика в телеграмм
Добавлено: 25 апр 2022, 16:00
drpioneer
Приветствую всех!
На основе имеющегося скрипта, при активном участии
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.
Полагаю что, код не лишён косяков, по этой причине готов выслушать замечания.
Заранее спасибо.
Re: Скрипт для отправки состояния здоровья микротика в телеграмм
Добавлено: 10 май 2022, 22:45
FedorVG
Долго сопротивлялся, но все же обновился на 7ку - скрипт про здоровье Микротика перестал работать:
- не выводит температуру и вольтаж - что то с синтаксисом???
# set temp
:global tempC [/system health get temperature];
# set voltage
##:global volt [/system health get voltage];
- из терминала запускается, скриптом из шедулера нет
.....на 6-ке без проблем
Может кто поправит
Спасибо