MikroTik-Skript: Benachrichtigung über erfolgreiche Anmeldung am Gerät oder einfachen MikroTik-Protokollparser

Der Artikel ist interessanter für Spezialisten, die eine kleine Flotte von Geräten verwenden (ohne einen separaten Server, für ein Überwachungs- oder Protokollierungssystem), für Privatanwender, für diejenigen, die zum ersten Mal mit dem Schreiben von Geräteskripten beginnen, und für diejenigen, die keine Zeit / Lust haben, dies herauszufinden.





Beispiel-E-Mail mit Benutzeranmelde- / Abmeldeereignissen
Beispiel-E-Mail mit Benutzeranmelde- / Abmeldeereignissen

Ich wurde aufgefordert, mein eigenes Skript zu schreiben, um die monströsen Skripte zu vereinfachen, die für diese Anfrage im Internet zu finden sind, indem ich diese einfache Aktion ausführte ( ein Beispiel für ein Skript aus dem MikroTik-Wiki) und um zu zeigen, warum MikroTik-Ingenieure eine einfache Analysemethode unmöglich machten, wenn Sie nicht in London ansässig sind. :) :)





Der Artikel analysiert ein Beispiel für eine Benachrichtigung über das An- und Abmelden von Benutzern von einem MikroTik-Gerät, zeigt jedoch auch Beispiele:





  1. Organisation der Zeit im Geräteprotokoll;





  2. Analysieren des Geräteprotokolls und Suchen nach Ereignissen nach Kriterien;





  3. Senden von E-Mail-Benachrichtigungen;





  4. Senden einer Telegrammnachricht.





Hintergrund. Warum sind MikroTik-Protokollanalyse-Skripte "monströs"?

Mit Monstrosität meinen wir eine große Menge an Skriptlogik und Konstruktion der Form:





: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 , .





Beispiel für eine Telegrammnachricht
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 Dies ist mein erster Artikel über Habré, den Sie streng, aber fair beurteilen können. Der Artikel bietet Spezialisten, die Überwachungssysteme oder separate Protokollserver verwenden, nichts Neues. Aber für Anfänger, Heimanwender und Administratoren mit einer kleinen Flotte von Netzwerkgeräten - ich hoffe, es wird nützlich sein.








All Articles