MikroTik Script: Notifikasi berhasil login ke perangkat atau parser log MikroTik sederhana

Artikel ini akan lebih menarik bagi spesialis yang menggunakan armada kecil perangkat (tidak menggunakan server terpisah, untuk sistem pemantauan atau pencatatan), pengguna rumahan, mereka yang mulai menulis skrip perangkat untuk pertama kali dan mereka yang tidak punya waktu / keinginan untuk mengetahuinya.





Contoh email dengan aktivitas login / logout pengguna
Contoh email dengan aktivitas login / logout pengguna

Saya diminta untuk menulis skrip saya sendiri dengan keinginan untuk menyederhanakan skrip mengerikan yang dapat ditemukan untuk permintaan ini di Internet, melakukan tindakan sederhana ini ( contoh skrip dari MikroTik Wiki), serta untuk menunjukkan mengapa insinyur MikroTik membuat metode parsing sederhana tidak mungkin dilakukan jika Anda bukan penduduk London. :)





Artikel ini menguraikan contoh notifikasi tentang login dan logout pengguna dari perangkat MikroTik, tetapi juga menampilkan contoh:





  1. Organisasi waktu di log perangkat;





  2. Parsing log perangkat, mencari peristiwa berdasarkan kriteria;





  3. Mengirim pemberitahuan email;





  4. Mengirim pesan Telegram.





Latar Belakang. Mengapa skrip parsing log MikroTik "mengerikan"?

Yang kami maksud dengan monstrositas adalah sejumlah besar logika skrip dan konstruksi bentuk:





:set tmpstring ([:pick [:tostr $tmpstring] 0 $findindex] . [:pick [:tostr $tmpstring] ($findindex + [:len [:tostr $ruleop]]) [:len [:tostr $tmpstring]]])
      
      



"" , .





MIkroTik, . :)





: " "account", (UTC+06)?





/log find where time > $LastRunTime topics ~ "account"
      
      



, 23:59:59 . 12 , 00:00:00 . ?





MikroTik : , , , , "" . , /, , .





? , MikroTik 00:00:00 UTC±0:00. , .. (UTC+06), 6 , . 06:00:00 .





(UTC±0:00), , .





( ), .





, , MikroTik id , (.id , , 0).





  • ParseLogAccountEndArrayID - .id ;





  • IDsEventsAccount .id , "account" - (: , ). 1000 , ;





  • LenArrayIDs - , StartArrayID - ( ID ), EndArrayID - 1( 0).





  • .id (IDsEventsAccount) .id (ParseLogAccountEndArrayID) (.. "account") (ParseLogAccountEndArrayID) - ( / ) ;





  • "account", (IDsEventsAccount) , " +1" ( ) " -1" (.. 0);





  • .id (IDMessage) ;





  • email, MikroTik;





  • Telegram , %0D%0A ;





  • ParseLogAccountEndArrayID ID "account" (EndArrayID).





  • email;





  • Telegram;





: read, write, test, policy.





[System] -> [Scripts] -> [+] -> [Name: ParseLogAccountEvents] -> [Policy: read, write, test, policy]





:local DeviceName [/system identity get name];
:local Time [/system clock get time];
:local Date [/system clock get date];
:local EmailMessageText;
:local TelegramMessageText;

:global ParseLogAccountEndArrayID;

:local IDsEventsAccount [/log find where  topics ~ "account"];

:local LenArrayIDs [:len $IDsEventsAccount];
:local StartArrayID [:find $IDsEventsAccount $ParseLogAccountEndArrayID];
:local EndArrayID ($IDsEventsAccount -> ($LenArrayIDs-1));

:if ($EndArrayID != $ParseLogAccountEndArrayID and [:tobool $ParseLogAccountEndArrayID] ) do={

    :local StartArray [:find $IDsEventsAccount $ParseLogAccountLastRunID];

    :for KeyArray from=($StartArrayID+1) to=($LenArrayIDs-1) do={
        :local IDMessage ($IDsEventsAccount ->$KeyArray );
        :set EmailMessageText "$EmailMessageText \n\r  $[/log get number=$IDMessage time] - $[/log get number=$IDMessage message];";
        :set TelegramMessageText "$TelegramMessageText %0D%0A  $[/log get number=$IDMessage time] - $[/log get number=$IDMessage message];";
        }

    :set ParseLogAccountEndArrayID $EndArrayID;

    # START SEND EMAIL
    :local SendFrom "ToMail@mail.ru";
    :local PasswordMail "yourpassword";
    :local SmtpServer [:resolve "smtp.mail.ru"];
    :local UserName "FromMail@mail.ru";
    :local SmtpPort 465;
    :local UseTLS "tls-only";
    :local SendTo "ToMail@mail.ru";
    :local Subject "\F0\9F\94\93 AUTH: $DeviceName [$Date $Time]";
    :local MessageText $EmailMessageText;
    /tool e-mail send to=$SendTo server=$SmtpServer port=$SmtpPort start-tls=$UseTLS user=$SendFrom password=$PasswordMail  from=$SendFrom subject=$Subject body=$MessageText;
    # END SEND EMAIL

    # START SEND TELEGRAM MESSAGE
    :local BotToken "YourBotID";
    :local ChatID "YourChatID";
    :local ParseMode "html";
    :local DisableWebPagePreview True;
    :local SendText "\F0\9F\94\93 <b>$DeviceName: AUTH</b> $TelegramMessageText";
    :local tgUrl "https://api.telegram.org/bot$BotToken/sendMessage?chat_id=$ChatID&text=$SendText&parse_mode=$ParseMode&disable_web_page_preview=$DisableWebPagePreview";
    /tool fetch http-method=get url=$tgUrl keep-result=no;
    # END SEND TELEGRAM MESSAGE

}
      
      



: read, write, test, policy.





[System] -> [Schedule] -> [+] -> [Name: ParseLogAccountEvents] —> [Interval: 00:05:00] -> [Policy: read, write, policy, test]





:





/system scheduler add name=ParseLogAccountEvents policy=read,write,policy,test on-event="/system script run ParseLogAccountEvents" interval=5m
      
      



, MikroTik , .





Contoh pesan Telegram
Telegram

, Logging:





[System] -> [Logging] -> [Rules] -> [+] -> [Topics]





:





[/log find where message ~ "log"]





, / , ( Firewall , MikroTik Safe Mode) .





, , .





, Telegram , , . : " Email" " Telegram", , MikroTik.





MikroTik, - .





: hAP ac lite, RouterOS 6.47.8 (stable).





PS Ini adalah artikel pertama saya tentang Habré, Anda bisa menilai dengan ketat, tapi adil. Artikel ini tidak akan memberikan informasi baru kepada spesialis yang menggunakan sistem pemantauan atau server log terpisah. Tetapi untuk pemula, pengguna rumahan, administrator dengan armada kecil perangkat jaringan - semoga bermanfaat.








All Articles