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

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
-13-
Сообщения: 124
Зарегистрирован: 18 мар 2021, 12:45

помогите осилить

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

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

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


Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

-13- писал(а): 21 окт 2022, 15:55 помогите осилить

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

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

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

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


-13-
Сообщения: 124
Зарегистрирован: 18 мар 2021, 12:45

 скрипт проверяющий 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 счетчик стоит на месте


Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

-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")


Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

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


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Apollo22
Сообщения: 21
Зарегистрирован: 05 ноя 2022, 21:27

Всем привет,
Тоже задался целью перезагружать mikrotik через телегу,
и вот что получилось

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

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

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

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


Ответить