Скрипт оповещения в телеграмм

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

21 июн 2019, 11:45

Нашел на просторах, решил поделиться. Позволяет отправлять в телеграмм уведомление с нужной строчкой из лога. Скрипт работает при условии, что вы уже настроили телеграмм-бота (botfather). Создаете планировщик с именем LogMikrotik, выставляете нужный промежуток запуска и вставляете код из спойлера, предварительно вписав данные своего бота.

В этой конструкции пишутся слова, которые вы хотите отслеживать из лога и отправлять в уведомления:

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

:local startBuf [:toarray [/log find message~”logged in” || message~”login failure”]]
Сюда же пишутся слова для игнорирования отправки.

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

:local removeThese {“telnet”; “ssh”}



 code

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

# BEGIN SETUP
:local scheduleName "LogMikrotik"
local bot "BOT TELEGRAM ANDA"
local ChatID "CHAT ID ANDA"
:local startBuf [:toarray [/log find message~"logged in" || message~"login failure"]]
:local removeThese {"telnet";"whatever string you want"}
# END SETUP

# warn if schedule does not exist
:if ([:len [/system scheduler find name="$scheduleName"]] = 0) do={
  /log warning "[LOGMON] ERROR: Schedule does not exist. Create schedule and edit script to match name"
}

# get last time
:local lastTime [/system scheduler get [find name="$scheduleName"] comment]
# for checking time of each log entry
:local currentTime
# log message
:local message
 
# final output
:local output

:local keepOutput false
# if lastTime is empty, set keepOutput to true
:if ([:len $lastTime] = 0) do={
  :set keepOutput true
}

:local counter 0
# loop through all log entries that have been found
:foreach i in=$startBuf do={
 
# loop through all removeThese array items
  :local keepLog true
  :foreach j in=$removeThese do={
#   if this log entry contains any of them, it will be ignored
    :if ([/log get $i message] ~ "$j") do={
      :set keepLog false
    }
  }
  :if ($keepLog = true) do={
   
   :set message [/log get $i message]

#   LOG DATE
#   depending on log date/time, the format may be different. 3 known formats
#   format of jan/01/2002 00:00:00 which shows up at unknown date/time. Using as default
    :set currentTime [ /log get $i time ]
#   format of 00:00:00 which shows up on current day's logs
   :if ([:len $currentTime] = 8 ) do={
     :set currentTime ([:pick [/system clock get date] 0 11]." ".$currentTime)
    } else={
#     format of jan/01 00:00:00 which shows up on previous day's logs
     :if ([:len $currentTime] = 15 ) do={
        :set currentTime ([:pick $currentTime 0 6]."/".[:pick [/system clock get date] 7 11]." ".[:pick $currentTime 7 15])
      }
   }
    
#   if keepOutput is true, add this log entry to output
   :if ($keepOutput = true) do={
     :set output ($output.$currentTime." ".$message."\r\n")
   }

    :if ($currentTime = $lastTime) do={
     :set keepOutput true
     :set output ""
   }
  }
  :if ($counter = ([:len $startBuf]-1)) do={
   :if ($keepOutput = false) do={    
     :if ([:len $message] > 0) do={
        :set output ($output.$currentTime." ".$message."\r\n")
      }
    }
  }
  :set counter ($counter + 1)
}

if ([:len $output] > 0) do={
  /system scheduler set [find name="$scheduleName"] comment=$currentTime
  /tool fetch url="https://api.telegram.org/bot$bot/sendmessage?chat_id=$ChatID&text=MikroTik alert $currentTime : $output" keep-result=no;
}
 У меня приходят уведомления так
Изображение


R2B2
Сообщения: 1
Зарегистрирован: 10 авг 2019, 12:38

10 авг 2019, 12:47

Доброе!
Подскажите, а есть какой-нибудь способ заставить ходить fetch через прокси ? как сurl, например...
спасибо


tenhi1
Сообщения: 1
Зарегистрирован: 27 сен 2019, 17:14

27 сен 2019, 19:31

спасибо большое!!! получилось


Аватара пользователя
r67wru
Сообщения: 3
Зарегистрирован: 24 июн 2018, 21:29

14 мар 2020, 18:23

Жалко в России уже не работает...


Остановите Землю, я сойду...
Аватара пользователя
podarok66
Модератор
Сообщения: 4085
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

14 мар 2020, 18:45

r67wru писал(а):
14 мар 2020, 18:23
Жалко в России уже не работает...
Телеграмм? Да ладно! От болталок школьников до каналов государственных предприятий всё работает. Видимо у вас какая-то другая Россия. Может вы из будущего? :sh_ok:


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
denis.korsachv
Сообщения: 31
Зарегистрирован: 13 ноя 2019, 15:56

01 апр 2020, 10:12

Добавлю ссылку на оригинал статьи где подробно в видео показывается как добавить CHAT_ID и TOKEN

https://labkom.co.id/mikrotik/monitorin ... t-telegram


Аватара пользователя
Virtue
Сообщения: 123
Зарегистрирован: 07 мар 2014, 10:17

18 май 2020, 15:32

1) у меня (и как выяснилось, не только у меня) почему-то приходят повторные сообщения ровно в полночь и еще в 3 ночи (возможно это как-то связано с часовым поясом, но это точно связано с отображением времени логов в терминале (в эти часы меняется формат (время-дата_время))), по этому решил добавить пару строк, чтобы запретить отправку именно в это время..
2) скрипт шлёт только по одному сообщению (даже если их сразу несколько новых, то приходит только одно из них), методом "тыка" и потанцевав с бубном было выяснено: телеграм не переваривает "\r\n" в тексте сообщения, в итоге нарыл что перенос делается так "%0A"
3) (это уже чисто по желанию) добавил оповещение о подключающихся\отключающихся по вайфаю устройствах (мне например так удобно узнавать когда начальник пришел в офис :-) ) + описание мака устройства, которое берется из комментария статической дхцп лесс записи
4) отредактировал counter счетчик, чтоб присылал не одно, а 5 последних сообщений (учитывая все вышеперечисленные поправки)

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

# BEGIN SETUP
:local scheduleName "LogMikrotik"
:local bot "BOT TELEGRAM ANDA"
:local ChatID "CHAT ID ANDA"
:local startBuf [:toarray [/log find message~"logged in" || topics~"wireless" || topics~"error" || topics~"warning" || topics~"critical"]]
:local removeThese {"telnet";"whatever string you want"}
:local name [/system  identity  get name]
:local TimeNow [:pick [/system clock get time] 0 5]
:local TimeOFF [:toarray ("00:00","03:00")]
# END SETUP

# warn if schedule does not exist
:if ([:len [/system scheduler find name="$scheduleName"]] = 0) do={
  /log warning "[LOGMON] ERROR: Schedule does not exist. Create schedule and edit script to match name"
}

# get last time
:local lastTime [/system scheduler get [find name="$scheduleName"] comment]
# for checking time of each log entry
:local currentTime
# log message
:local message
 
# final output
:local output

:local keepOutput false

# if lastTime is empty, set keepOutput to true
:if ([:len $lastTime] = 0) do={
  :set keepOutput true
}

:local counter 0
# loop through all log entries that have been found
:foreach i in=$startBuf do={
 
# loop through all removeThese array items
  :local keepLog true
  :foreach j in=$removeThese do={
#   if this log entry contains any of them, it will be ignored
    :if ([/log get $i message] ~ "$j") do={
      :set keepLog false
    }
  }
  :if ($keepLog = true) do={
  
   :set message [/log get $i message]

#   LOG DATE
#   depending on log date/time, the format may be different. 3 known formats
#   format of jan/01/2002 00:00:00 which shows up at unknown date/time. Using as default
    :set currentTime [ /log get $i time ]
#   format of 00:00:00 which shows up on current day's logs
   :if ([:len $currentTime] = 8 ) do={
     :set currentTime ([:pick [/system clock get date] 0 11]." ".$currentTime)
    } else={
#     format of jan/01 00:00:00 which shows up on previous day's logs
     :if ([:len $currentTime] = 15 ) do={
        :set currentTime ([:pick $currentTime 0 6]."/".[:pick [/system clock get date] 7 11]." ".[:pick $currentTime 7 15])
      }
   }
    
#   if keepOutput is true, add this log entry to output
   :if ($keepOutput = true) do={
   
    :if ([/log get $i message] ~ "[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={
     :foreach k in=[/ip dhcp-server lease find] do={
	 :local mac [/ip dhcp-server lease get $k value-name=mac-address]
      if ([/log get $i message] ~ "$mac") do={
       :set message ($message . " / " . [/ip dhcp-server lease get $k value-name=comment])
      }
     }
	}
     
     :set output ($output.$currentTime." ".$message."%0A%0A")
	 	 
   }

    :if ($currentTime = $lastTime) do={
     :set keepOutput true
     :set output ""
   }
  }
 
# pri nali4ii kommenta shedulera i nesootvetstviya ego ni odnomu vremeni zapisi loga, otpravlyat' 5 poslednih sobytiy (udovletvoryayus4ih vsem usloviyam)
  :if ($counter >= ([:len $startBuf]-5)) do={
   :if ($keepOutput = false) do={    
     :if ([:len $message] > 0) do={
	 
	     :if ([/log get $i message] ~ "[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={
     :foreach k in=[/ip dhcp-server lease find] do={
	 :local mac [/ip dhcp-server lease get $k value-name=mac-address]
      if ([/log get $i message] ~ "$mac") do={
       :set message ($message . " / " . [/ip dhcp-server lease get $k value-name=comment])
      }
     }
	}
	    :if ($counter = ([:len $startBuf]-5)) do={:set output "5 poslednih logov%0A%0A"}
        :set output ($output.$currentTime." ".$message."%0A%0A")
      }
    }
  }
  
  :set counter ($counter + 1)
  
}

if (([:len $output] > 0) and ($TimeOFF ~ $TimeNow)) do={
  /system scheduler set [find name="$scheduleName"] comment=$currentTime
} else={

if ([:len $output] > 0) do={
  /system scheduler set [find name="$scheduleName"] comment=$currentTime
  /tool fetch url="https://api.telegram.org/bot$bot/sendmessage?chat_id=$ChatID&text= $name : %0A$output" keep-result=no;
  }
}


Аватара пользователя
Virtue
Сообщения: 123
Зарегистрирован: 07 мар 2014, 10:17

21 май 2020, 17:38

Наблюдаю некоторый баг скрипта при отработке исключенных сообщений. Чтобы исправить нужна помощь гуру. Впринципе я сам исправлю скрипт, просто не могу понять как сконструировать один прием:
переменной присваивают массив значений из записей логов, которые (~) содержат "что-то там"

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

/log find message~
Вопрос:
как можно присвоить переменной значения из записей логов, которые (!~) НЕ содержат "что-то там"

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

/log find message!~
такой вариант не прокатит :-(

Покачто в голову приходит мысль взять первую переменную (с нужными нам тегами), создать еще одну переменную и запихнуть в нее значения из записей логов, которые содержат то, что необходимо исключить, а затем из первой переменной вычесть вторую (только еще не понял как будет выглядеть это вычетание синтаксически) :du_ma_et:


Аватара пользователя
podarok66
Модератор
Сообщения: 4085
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

21 май 2020, 18:15

Обычное условие не прокатит? Типа там

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

:if ([/log find message~]) do={....................} else={ Вот тут ваш код }
Только придётся всё в цикле делать :foreach


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

21 май 2020, 18:24

Есть такой вариант, правда он медленный:

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

:foreach index in=[ /log find message~"" ] do={
    if ($index != [ /log find message~"system" ]) do={
        :put ($index);
    }
}


Ответить