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;
}
}