Страница 1 из 1

перезагрузка RB через telegram

Добавлено: 21 окт 2022, 15:55
-13-
помогите осилить

после запуска такой строки через telegram

Код: Выделить всё

/system reboot
роутер уходит в цикличный ребут

Re: перезагрузка RB через telegram

Добавлено: 23 окт 2022, 13:56
Brook
-13- писал(а): 21 окт 2022, 15:55 помогите осилить

после запуска такой строки через telegram

Код: Выделить всё

/system reboot
роутер уходит в цикличный ребут
Мало информации. Покажите как команда вызывается в коде.

Возможно Ваш бот не увеличивает update_id до перезагрузки и получает это сообщение заново, поэтому система опять перезагружается.

Re: перезагрузка RB через telegram

Добавлено: 25 окт 2022, 10:07
-13-
 скрипт проверяющий telegram

Код: Выделить всё

# Name: Check botChat
# Description: Check message to botTelegram

:global fnExe
:global fnParse
:global fnSend

:set $dbCmd [[$fnParse script="dbCmd"]]
:set $botID ($dbCmd->"botID")
:set $myChat ($dbCmd->"myChat")
:set $apiTg ($dbCmd->"apiTg")

:set $parse do={
    :set $startLoc ([:find $content $variable -1] + [:len $variable] + 2)
    :set $commaLoc ([:find $content "," $startLoc] - 1 + 1)
    :set $braceLoc ([:find $content "}" $startLoc] - 1 + 1)
    :set $endLoc $commaLoc
    :set $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)
    }
    :set $message [:pick $content $startLoc $endLoc]
    :if ($message ~"@") do={
        :set $message [:pick $message 0 [:find $message "@"]]
    }
    :return $message
}

:while ( true ) do={
    :do {
        :set $fetchCheck ("/getUpdates\?offset=$messageId&limit=1&allowed_updates=message&timeout=60")
        :set $fetchCheck ($apiTg . $botID . $fetchCheck)
        :set $content ([/tool fetch url=$fetchCheck as-value output=user]-> "data")
        :if ([:len $content] > 30) do={
            :set $messageId ([$parse content=$content variable="update_id"] + 1)
            :set $message [$parse content=$content variable="text" quotas=true]
            :set $chat [$parse content=$content variable="chat"]
            :set $chatid [$parse content=$chat variable="id"]

## Chat authentication.
            :if ($chatid = $myChat) do={
                :set $script [[$fnParse script="fnChat"] message=$message]
                :if (any $script) do={
                    [$fnParse script=$script] message=$message chatid=$chatid
                } else={
                    :set $text "unknow cmd - $message"
                    $fnSend chatid=$chatid text=$text
                }
            } else={
                :set $text "No one's home."
                :set $fetchLeave ("/leaveChat\?chat_id=" . $chatid)
                :set $fetchLeave ($apiTg . $botID . $fetchLeave)
                $fnSend chatid=$chatid text=$text
                /tool fetch url=$fetchLeave as-value output=none
            }
        }
    } on-error={}
}

# End script
 перезагрузка

Код: Выделить всё

# Name: -Reboot RB
# Description: Reboot RB

:global fnExe
:global fnParse
:global fnSend

:set $dbCmd [[$fnParse script="dbCmd"]]
:set $myChat ($dbCmd->"myChat")
:set $syName ($dbCmd->"syName")
:set $cuDate ($dbCmd->"cuDate")

:set $text  ("$syName:%0A\
            $cuDate%0A\
            %0A\
            system will be rebooted")

$fnSend chatid=$myChat text=$text

:delay 30
/system reboot

# End
update_id счетчик отрабатывает при посыле команды, после перезагрузки приходит повторно сообщение о перезагрузке, скрипт естественно отрабатывает, но update_id счетчик стоит на месте

Re: перезагрузка RB через telegram

Добавлено: 25 окт 2022, 22:13
Brook
-13- писал(а): 25 окт 2022, 10:07
 скрипт проверяющий telegram

Код: Выделить всё

# Name: Check botChat
# Description: Check message to botTelegram

:global fnExe
:global fnParse
:global fnSend

:set $dbCmd [[$fnParse script="dbCmd"]]
:set $botID ($dbCmd->"botID")
:set $myChat ($dbCmd->"myChat")
:set $apiTg ($dbCmd->"apiTg")

:set $parse do={
    :set $startLoc ([:find $content $variable -1] + [:len $variable] + 2)
    :set $commaLoc ([:find $content "," $startLoc] - 1 + 1)
    :set $braceLoc ([:find $content "}" $startLoc] - 1 + 1)
    :set $endLoc $commaLoc
    :set $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)
    }
    :set $message [:pick $content $startLoc $endLoc]
    :if ($message ~"@") do={
        :set $message [:pick $message 0 [:find $message "@"]]
    }
    :return $message
}

:while ( true ) do={
    :do {
        :set $fetchCheck ("/getUpdates\?offset=$messageId&limit=1&allowed_updates=message&timeout=60")
        :set $fetchCheck ($apiTg . $botID . $fetchCheck)
        :set $content ([/tool fetch url=$fetchCheck as-value output=user]-> "data")
        :if ([:len $content] > 30) do={
            :set $messageId ([$parse content=$content variable="update_id"] + 1)
            :set $message [$parse content=$content variable="text" quotas=true]
            :set $chat [$parse content=$content variable="chat"]
            :set $chatid [$parse content=$chat variable="id"]

## Chat authentication.
            :if ($chatid = $myChat) do={
                :set $script [[$fnParse script="fnChat"] message=$message]
                :if (any $script) do={
                    [$fnParse script=$script] message=$message chatid=$chatid
                } else={
                    :set $text "unknow cmd - $message"
                    $fnSend chatid=$chatid text=$text
                }
            } else={
                :set $text "No one's home."
                :set $fetchLeave ("/leaveChat\?chat_id=" . $chatid)
                :set $fetchLeave ($apiTg . $botID . $fetchLeave)
                $fnSend chatid=$chatid text=$text
                /tool fetch url=$fetchLeave as-value output=none
            }
        }
    } on-error={}
}

# End script
 перезагрузка

Код: Выделить всё

# Name: -Reboot RB
# Description: Reboot RB

:global fnExe
:global fnParse
:global fnSend

:set $dbCmd [[$fnParse script="dbCmd"]]
:set $myChat ($dbCmd->"myChat")
:set $syName ($dbCmd->"syName")
:set $cuDate ($dbCmd->"cuDate")

:set $text  ("$syName:%0A\
            $cuDate%0A\
            %0A\
            system will be rebooted")

$fnSend chatid=$myChat text=$text

:delay 30
/system reboot

# End
update_id счетчик отрабатывает при посыле команды, после перезагрузки приходит повторно сообщение о перезагрузке, скрипт естественно отрабатывает, но update_id счетчик стоит на месте
update_id попадает на сервер Телеги при выполнении fetch.
Когда приходит команда перезагрузки, то до следующего fetch уже дело не доходит, потому что роуетер в ребуте.
Телеграм думает, что это сообщение еще не забрали и микротик благополучно его опять загружает. И так по кругу.

Перед перезагрузкой выполняйте свой код с увеличенным на 1 update_id, это должно помочь.

Код: Выделить всё

 
 :set $fetchCheck ("/getUpdates\?offset=$messageId&limit=1&allowed_updates=message&timeout=60")
 :set $fetchCheck ($apiTg . $botID . $fetchCheck)
 :set $content ([/tool fetch url=$fetchCheck as-value output=user]-> "data")

Re: перезагрузка RB через telegram

Добавлено: 26 окт 2022, 09:59
Sertik
Или используете парсер-уведомитель TLGRM viewtopic.php?f=14&t=12659&start=80.
Там проблемы такой (цикличного ребута) нет, проверено. :-):

Re: перезагрузка RB через telegram

Добавлено: 05 ноя 2022, 21:39
Apollo22
Всем привет,
Тоже задался целью перезагружать mikrotik через телегу,
и вот что получилось

Первый скрипт:
Название скрипта - /reboot
Сам скрипт - /system scheduler enable reboot-ON

Скрипт включает задание (reboot-ON) в планировщике
/system script run reboot
Задача настроена на выполнение раз в минуту

После перезагрузки срабатывает другое задание (Reboot-OFF)
:delay 30
/system scheduler disable reboot-ON
Данное задание выключает (reboot-ON)

В итоге роутер перезагружается и скрипт телеграмма корректно отрабатывает :-):
Понимаю что топорно зато работает отлично.