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

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

Все привет.
На основе этого скрипта можно сделать вывод любой информации
Для себя вывожу все в телеграмм бот.

Можно выводить в простом варианте.

Изображение


Так и в более вычурном.
При наличии двух провайдеров можно отслеживать их состояние.

Изображение

И ничего в этом сложного нет.
Я делал это так
1, Объявление глобальной переменной
2, Пишу в глобальную переменную данные (результат можно посмотреть в - system script environment)
3, Если данные корректные их можно вывести куда угодно хоть в консоль хоть в чат-бот хоть в смс.


SergeyKRG
Сообщения: 5
Зарегистрирован: 14 авг 2023, 09:01

Добрый день подскажите пожалуйста где что подправить в скрипте на ros7.10
Сейчас вывод в таком варианте:
08:59:42 Error defining variables
08:59:42 Error gateways information
08:59:42 >>>Health report:
08:59:42 ID nas
08:59:42 uptime 16:05:56
08:59:42 model RB5009UG+S+
08:59:42 ROS 7.10.2 (stable)
08:59:42 arch arm64
08:59:42 CPU ARM64
08:59:42 CPU load 32%
08:59:42 mem free 56%
08:59:42 HDD free 89%
08:59:42 bad blocks 0%
08:59:42 >>>Connect info:
08:59:42 'DomRu'
08:59:42 type pppoe-client
08:59:42 Comment Internet
08:59:42 lcl мой айпи
08:59:42 rmt шлюз
08:59:42 uptime 15:59:26

Не могу понять что за ошибки первые две строчки?
Не могу понять почему не выводит информацию по трафику?
Ну и основное не выводит информацию по температуре именно с 5009( с 750Gr3 выводит темпу но так же не выводит трафик)

Спасибо большое.


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

Насчет температуры - в седьмой версии РОС температуру нужно получать так:

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

[/system health get [find name=temperature] value]
Насчет трафика - имя интерфейса на своё меняли ?


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
SergeyKRG
Сообщения: 5
Зарегистрирован: 14 авг 2023, 09:01

Sertik писал(а): 14 авг 2023, 19:39 Насчет температуры - в седьмой версии РОС температуру нужно получать так:

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

[/system health get [find name=temperature] value]
Насчет трафика - имя интерфейса на своё меняли ?
да температуру вывел с помощью
:set tempC [/system health get [:pick [/system health get 0]] value];

Но вот с вывод трафика так и не смог ни чего сделать по инерфейсам имеем ether1 (DomRu)
Выводы в терменале:
[admin@nas] > /interface list print
Flags: *, D - DYNAMIC
Columns: NAME
# NAME
;;; contains all interfaces
0 * all
;;; contains no interfaces
1 * none
;;; contains dynamic interfaces
2 * dynamic
;;; contains static interfaces
3 * static
;;; defconf
4 WAN
;;; defconf
5 LAN

[admin@nas] > /interface ethernet export compact
# 2023-08-15 08:40:37 by RouterOS 7.10.2
# software id = UCQW-5Z73
#
# model = RB5009UG+S+
# serial number =
/interface ethernet
set [ find default-name=ether1 ] comment=WAN
set [ find default-name=sfp-sfpplus1 ] comment=SFP

Подскажите в какую сторону копать или что куда внести. Спасибо большое.


-13-
Сообщения: 124
Зарегистрирован: 18 мар 2021, 12:45

температура и текущее напряжение в 7
:set $cuHealth (([/system health get 0]->"value" . "V") . "; " . ([/system health get 1]->"value" . "\E2\84\83"))


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

Всех приветствую!

Представляю версию скрипта, в которой учтены накопившиеся замечания:

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




# Device status view script
# Script uses ideas by Enternight, Jotne, rextended, Sertik, Brook, drPioneer
# https://github.com/drpioneer/MikrotikHealth/blob/main/health.rsc
# https://forummikrotik.ru/viewtopic.php?p=91302#p91302
# tested on ROS 6.49.10 & 7.12
# updated 2024/02/17

:do {
  # external IP address return function (in case of double NAT) # https://forummikrotik.ru/viewtopic.php?p=65345#p65345
  :local ExtIP do={
    :local urlString "http://checkip.dyndns.org"; :local httpResp ""; :local cnt 0;
    :do {
      :do {:set httpResp [/tool fetch mode=http url=$urlString as-value output=user]} on-error={}
      :set cnt ($cnt+1);
    } while ([:len $httpResp]=0 && cnt<4);
    :if ([:len $httpResp]!=0) do={
      :local content ($httpResp->"data");
      :if ([:len $content]!=0) do={:return [:pick $content ([:find $content "dress: " -1] +7) [:find $content "</body>" -1]]}}
    :return "NotRespond";
  }

  # general info reading function # https://forummikrotik.ru/viewtopic.php?p=45743#p45743
  :local GenInfo do={
    /system identity;
    :local ident ([print as-value]->"name");
    /system health;
    :local volt ([print as-value]->"voltage");
    :local tempC ([print as-value]->"temperature");
    /system routerboard;
    :local currFW ([print as-value]->"current-firmware");
    :local upgrFW ([print as-value]->"upgrade-firmware");
    /system resource;
    :local uptime ([print as-value]->"uptime");
    :local arch ([print as-value]->"architecture-name");
    :local cpu ([print as-value]->"cpu");
    :local hddTotal ([print as-value]->"total-hdd-space");
    :local hddFree ([print as-value]->"free-hdd-space");
    :local badBlock ([print as-value]->"bad-blocks");
    :local memTotal ([print as-value]->"total-memory");
    :local memFree ([print as-value]->"free-memory");
    :local cpuZ ([print as-value]->"cpu-load");
    :local ros ([print as-value]->"version");
    :local board ([print as-value]->"board-name");
    :if ([:pick $ros 0 1]="7") do={:set tempC ([/system health print as-value]->0->"value")}
    :local msg "Id $ident\r\nBrd $board\r\nRos $ros";
    :if ($currFW!=$upgrFW) do={:set msg "$msg\r\n**Fw not updated"}
    :set msg "$msg\r\nArch $arch\r\nCpu $cpu";
    :if ($cpuZ<90) do={:set msg "$msg\r\nCpuLoad $cpuZ%"} else={:set msg "$msg\r\n**large Cpu usage $cpuZ%"}
    :set memFree ($memFree/($memTotal/100));
    :if ($memFree>17) do={:set msg "$msg\r\nMemFree $memFree%"} else={:set msg "$msg\r\n**low free Mem $memFree%"}
    :set hddFree ($hddFree/($hddTotal/100));
    :if ($hddFree>6) do={:set msg "$msg\r\nHddFree $hddFree%"} else={:set msg "$msg\r\n**low free Hdd $hddFree%"}
    :if ([:len $badBlock]>0) do={
      :if ($badBlock=0) do={:set msg "$msg\r\nBadBlck $badBlock%"} else={:set msg "$msg\r\n**present Bad blocks $badBlock%"}}
    :if ([:len $volt]>0) do={
      :local smplVolt ($volt/10); :local lowVolt (($volt-$smplVolt*10)*10); :local inVolt "$smplVolt.$[:pick $lowVolt 0 3]";
      :if ($smplVolt>4 && $smplVolt<53) do={:set msg "$msg\r\nPwr $inVolt V"} else={:set msg "$msg\r\n**bad Pwr $inVolt V"}}
    :if ([:len $tempC]>0) do={
      :if ($tempC<70) do={:set msg "$msg\r\nTemp $tempC C"} else={:set msg "$msg\r\n**abnorm Temp $tempC C"}}
    :return "$msg\r\nUpt $uptime";
  }

  # ppp info reading function
  :local PPPInfo do={
    :local msg ""; :local cnt 1;
    :foreach pppInt in={"-client";"-server"} do={ 
      :foreach pppTps in={"l2tp";"pptp";"ovpn";"ppp";"sstp";"pppoe"} 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 callrID ""; :local connTo "";
          :if ($pppType~"-server") do={:set callrID  [[:parse "[/interface $pppType get $pppConn client-address]"]]}
          :local vpnType  [/interface get $vpnName type]; :local iType $vpnType;
          :set vpnType [:pick $vpnType ([:find $vpnType "-"] +1) [:len $vpnType]];
          :if ($pppTps!="pppoe" && $vpnType="out" && $iType!="ppp-out") do={
            :set connTo "$[[: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 msg "$msg\r\n>>>PPPinfo$cnt:\r\nTyp $pppType\r\nNam $vpnName";
            :if ([:len $callrID]>0) do={:set msg "$msg\r\nFrm $callrID"}
            :if ([:len $connTo ]>0) do={:set msg "$msg\r\nTo $connTo"}
            :if ([:len $vpnComm]>0) do={:set msg "$msg\r\nCmnt $vpnComm"}
            :set msg ("$msg\r\nLcl $locAddr\r\nRmt $remAddr\r\nUpt $upTime");
            :set cnt (cnt+1)}}}}
    :return $msg;
  }

  # gateways info reading function
  :local GwInfo do={
    # digit conversion function via SI-prefix # https://forum.mikrotik.com/viewtopic.php?t=182904#p910512
    :local NumSiPrefix do={
      :if ([:len $1]=0) do={:return "0b"}
      :local inp [:tonum $1]; :local cnt 0;
      :while ($inp>1000) do={:set $inp ($inp>>10); :set $cnt ($cnt+1)}
      :return ($inp.[:pick [:toarray "b,Kb,Mb,Gb,Tb,Pb,Eb,Zb,Yb"] $cnt])}
    :local routeISP [/ip route find dst-address="0.0.0.0/0"]; :local msg "";
    :if ([:len $routeISP]=0) do={:return "WAN not found"}
    :foreach inetGate in=$routeISP do={
      :local ifGate [:tostr [/ip route get $inetGate vrf-interface]];
      :if ([:len $ifGate]>0) do={
        /interface;
        :local rxReport [$NumSiPrefix [get [find name=$ifGate] rx-byte]];
        :local txReport [$NumSiPrefix [get [find name=$ifGate] tx-byte]];
        :set msg "$msg\r\n>>>TraffVia:\r\n'$ifGate'\r\nrx/tx $rxReport/$txReport"}}
    :return $msg;
  }

  # main body
  :local message ">>>HealthRep:\r\n$[$GenInfo]$[$PPPInfo]$[$GwInfo]\r\n>>>ExternIp\r\n$[$ExtIP]";
  :log warning $message; :put $message;
} on-error={:log warning ("Error, can't show health status"); :put ("Error, can't show health status")}


Как всегда приветствуются замечания и конструктивная критика.
Зеркало тут.
Последний раз редактировалось drpioneer 17 фев 2024, 11:40, всего редактировалось 1 раз.


netrol
Сообщения: 1
Зарегистрирован: 15 фев 2024, 11:29

drpioneer писал(а): 11 ноя 2023, 13:28 Всех приветствую!
Представляю версию скрипта, в которой учтены накопившиеся замечания:
Подскажите плиз как его привязать к Телеграм


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

Добрый день.
netrol писал(а): 15 фев 2024, 17:24 Подскажите плиз как его привязать к Телеграм
У себя этот вопрос решаю в связке со скриптом TLGRM.
В таком варианте скрипт СОСТОЯНИЯ ЗДОРОВЬЯ вываливает результат своей работы в журнал устройства, а скрипт TLGRM полученный результат из журнала устройства транслирует в Телегу.


Ответить