Απομακρυσμένη ενεργοποίηση σεναρίων Mikrotik από το Telegram v 2.0

Όλα με τις περασμένες διακοπές. Αυτό το θέμα είναι καλύτερο έκδοση αυτού που έγραψα το 2016 εδώ.

Γενικά, η αρχή λειτουργίας δεν έχει αλλάξει, με τη μόνη διαφορά ότι τώρα λειτουργεί άμεσα χωρίς καθυστέρηση.

Ανεβάζουμε το σενάριο στο Mikrotik, αλλάζουμε το BotID και το ChatID στο δικό μας και δημιουργούμε ένα πρόγραμμα για αυτό. Ρυθμίστε την παράμετρο "Ώρα έναρξης" για εκκίνηση (Εκτελέστε το σενάριο κατά την εκκίνηση.)
Διάλειμμα: 00:00:00
Όλα τα άλλα είναι όπως ήταν.

Telegram-v2

:delay 10
:global mtIdentity [/system identity get name];
:global botID "botXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXX" ;
:global myChatID "YYYYYY" ;
:local chatId 0;
:local messageId 0;


:local parse do={
  :local startLoc ([:find $content $variable -1] + [:len $variable] + 2);
  :local commaLoc ([:find $content "," $startLoc] - 1 + 1);
  :local braceLoc ([:find $content "}" $startLoc] - 1 + 1);
  :local endLoc $commaLoc;
  :local startSymbol [:pick $content $startLoc]
  :if ($braceLoc != 0 and ($commaLoc = 0 or $braceLoc < $commaLoc)) do={
    :set endLoc $braceLoc;
  };
  :if ($startSymbol = "{") do={
    :set endLoc ($braceLoc + 1);
  };
  :if ($quotas = true) do={
    :set startLoc ($startLoc + 1);
    :set endLoc ($endLoc - 1);
  }
  :if ($endLoc < $startLoc) do={
    :set endLoc ($startLoc + 1);
  };
  :local message [:pick $content $startLoc $endLoc]
  #:log info $message;
  :return $message;
}


:while ( true ) do={
  :do {
    #:log info "https://api.telegram.org/$botID/getUpdates?offset=$messageId&limit=1&allowed_updates=message&timeout=60";
    :tool fetch url=("https://api.telegram.org/$botID/getUpdates?offset=$messageId&limit=1&allowed_updates=message&timeout=60") dst-path="getUpdates";
    :local content [/file get [/file find name=getUpdates] contents] ;
    #:log info $content;
    :if ([:len $content] > 30) do={
      :set messageId ([$parse content=$content variable="update_id"] + 1)
      :local message [$parse content=$content variable="text" quotas=true]
      :local chat [$parse content=$content variable="chat"]
      :local chatId [$parse content=$chat variable="id"]      
      
      :if (($chatId = $myChatID) and ([/system script find name=$message] != "")) do={
        :system script run $message;
      } else={
        :tool fetch url=("https://api.telegram.org/$botID/sendmessage?chat_id=$chatId&text=$mtIdentity: Unknown command: $message") keep-result=no
      }
    }
  } on-error={}
};

Για μερικά χρόνια χρήσης, αποκαλύφθηκε ένα σφάλμα, για κάποιο λόγο, το αδύναμο Mikrotik για κάποιο λόγο σταματά το σενάριο, σε πιο ισχυρά λειτουργεί ασταμάτητα.

Για τους σκοπούς αυτούς, πέταξα ένα δεκανίκι WatchDog. εδώ αλλάζουμε το όνομα του σεναρίου σε αυτό που υποδεικνύεται παραπάνω. και ορίστε το διάστημα επανεκκίνησης στα 5 λεπτά. Κάθε 5 λεπτά, το "watch dog" μας θα ελέγχει το σενάριο, και αν δεν λειτουργεί, θα το τρέχει.

WatchDogT.me

:global scriptname "t.me"
:if ([:len [/system script job find script=$"scriptname"]] > 0) do={
:log info "$scriptname Already Running - killing old script before continuing"
:foreach counter in=[/system script job find script=$"scriptname"] do={
/system script job remove $counter
}
}
/system script run $scriptname

Και για επιδόρπιο, το σενάριο είναι παρμένο από το φόρουμ της Mikrotik.
Στέλνει σημαντικά θέματα από το αρχείο καταγραφής στο καλάθι μας.

Βάλτε το σενάριο στο πρόγραμμα και καθορίστε το διάστημα επανεκκίνησης κάθε 5 λεπτά, αλλάξτε το BotID και το ChatID στο δικό σας.

ειδοποίηση-καταγραφή

:global lastTime
:global output
:global mtIdentity [/system identity get name];
:global botID "botXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXX" ;
:global myChatID "YYYYYY" ;

:local LogGet [ :toarray [ /log find topics~"critical" || message~"login failure" || message~"[Ff]ailure" ] ] ;
:local LogtLineCount [ :len $LogGet ] ;
if ($LogtLineCount > 0) do={
   :local currentTime "$[ /log get [ :pick $LogGet ($LogtLineCount -1) ] time ]";
   :if ([:len $currentTime] = 10 ) do={
      :set currentTime [ :pick $currentTime 0 10 ];
   }
   :set output "$currentTime - $[/log get [ :pick $LogGet ($LogtLineCount-1) ] message ]";
   :if (([:len $lastTime] < 1) || (([:len $lastTime] > 0) && ($lastTime != $currentTime))) do={
      :set lastTime $currentTime ;
         :tool fetch url=("https://api.telegram.org/$botID/sendmessage?chat_id=$myChatID&text="$mtIdentity" :  $output") keep-result=no
   }
}

Παίρνουμε το αποτέλεσμα:

Απομακρυσμένη ενεργοποίηση σεναρίων Mikrotik από το Telegram v 2.0

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο