Malayong pagpapagana ng mga script ng Mikrotik mula sa Telegram v 2.0

Happy belated holiday sa lahat. Mas maganda ang temang ito bersyon ng isinulat ko noong 2016 dito.

Sa pangkalahatan, ang prinsipyo ng pagpapatakbo ay hindi nagbago, ang pagkakaiba lamang ay na ngayon ay gumagana kaagad nang walang pagkaantala.

Ina-upload namin ang script sa Mikrotik, binago namin ang BotID at ChatID sa aming sarili at gumawa ng iskedyul para dito. Itakda ang parameter na "Start Time" sa startup (Patakbuhin ang script sa startup.)
"Interval": 00:00:00
Kung hindi, ang lahat ay tulad ng dati.

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

Pagkatapos ng ilang taon ng paggamit, natuklasan ang isang bug: para sa ilang hindi kilalang dahilan, ang mahinang Mikrotik ay huminto sa script, ngunit sa mas malakas na mga ito ay gumagana ito nang walang tigil.

Para sa mga layuning ito, inihagis ko ang WatchDog crutch. Dito pinapalitan namin ang pangalan ng script sa ipinahiwatig sa itaas. at itakda ang restart interval sa 5 minuto. Bawat 5 minuto ay susuriin ng aming "tagabantay" ang script at kung hindi ito gumana, tatakbo ito.

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

Well, para sa dessert, ang script ay kinuha mula sa forum ng Mikrotik.
Nagpapadala ng mahahalagang paksa mula sa log sa aming cart.

Idinaragdag namin ang script upang mag-iskedyul at tukuyin ang agwat ng pag-restart bawat 5 minuto, baguhin ang BotID at ChatID sa aming sarili.

Notify-log

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

Nakukuha namin ang resulta:

Malayong pagpapagana ng mga script ng Mikrotik mula sa Telegram v 2.0

Pinagmulan: www.habr.com

Magdagdag ng komento