Автоматическая проверка обновлений RouterOS, уведомление о новых версиях при помощи PUSH-сообщений Telegram

06 май 2018 26 288 23
Ранее мы уже неоднократно говорили о необходимости своевременного обновления программного обеспечения Mikrotik. Иногда в RouterOS встречаются серьёзные ошибки, очень редко даже критические.

Чем чревато несвоевременно обновление RouterOS я уже писал, причем многие владельцы Mikrotik-ов не обновились и по сей день. Со своей стороны команда Mikrotik докладывает всех сил на поиск и устранение ошибок, выпуск новых версий и своевременное уведомление клиентов.

Далеко не каждый администратор устройства Mikrotik заходит регулярно на официальный сайт в поисках обновлений.
Если Вы хотите научиться настраивать MikroTik, предлагаем пройти онлайн обучение. Более подробную информацию Вы можете найти в конце данной публикации.

Кнопка «Check for Updates» это хорошо, но толковый администратор, управляющий устройством, на которое возложены серьёзные задачи, перед тем как выполнить команду «Download & Install», обязательно посетит соответствующую ветку официального форума «Announcements». В данной ветке можно ознакомиться с особенностями обновления и отзывами тех клиентов, кто уже успели обновиться.

Очень редко, но всё же случаются ситуации, когда обновление содержит изменение некоторых функций, что потенциально может привести к неполной работоспособности некоторых конфигураций при переходе на новую версию. Бывало и такое, что после обновления пользователи не могли получить доступ к устройству или же конфигурация вовсе слетала.

Бывали на моей памяти и такие обновления, перед которыми, из-за кардинальных изменений, в обязательно порядке необходимо было выполнять бэкап. Без бэкапа вы попросту не смогли бы откатить все настройки в случае необходимости downgrade. Да и копию самого бэкапа необходимо хранить на стороннем устройстве, а не в памяти RouterBOARD.

С учетом всего вышеизложенного, вы не сможете полностью положиться на автоматическое обновление. Собственно, функция автоматического обновления в RouterOS имеется еще с версии RouterOS v6.31 (см. документацию).

Реализован механизм при помощи простенького скрипта:
/system package update
check-for-updates once
:delay 1s;
:if ( [get status] = "New version is available") do={ install }

Добавляете скрипт в System – Scripts, после чего настраиваете планировщик (System – Scheduler) на периодический запуск самого скрипта. Система будет обновляться автоматически, как только при проверке определит доступность новой версии.

Само собой разумеется, таким скриптом следует пользоваться только в крайнем случае, на свой собственный страх и риск.

Есть ли другие варианты? Конечно же, есть. Всё зависит только от вас и вашего умения писать скрипты.

Со своей стороны хочу предложить вам весьма интересный вариант реализации уведомлений о выходе новых версий. Я уже писал о реализации PUSH-уведомлений прямо из Mikrotik RouterOS, так почему бы не воспользоваться этим же методом для уведомлений о новых версиях?

Заходим в System – Scripts и добавляем 2 скрипта.

Первый скрипт, «check_updates»:
:log info "Checking new version RouterOS...";
/system package update
check-for-updates once
:delay 5s;
:if ( [get status] = "System is already up to date") do={ 
:log info "Installed last RouterOS version, skip notification";
}
:if ( [get status] = "New version is available") do={ 
:log warning "Attention! New version of RouterOS is available!";
/system script run new_version_notifier
:delay 2s;
:log warning "Admin was notified by PUSH-message";
}

Данный скрипт осуществляет проверку доступности новой версии и, в зависимости от статуса, либо просто пишет запись в лог, либо запускает скрипт с отправкой уведомления. Скрипт проверен и работает на RouterOS 6.42.1 current, для bugfixes-only и Release candidate, возможно, потребуется вносить правки и указывать Channel.

Если у вас большой парк устройств, вероятно, вам будет полезна следующая команда:
/system routerboard get [параметр]

При её помощи вы сможете получить такие данные:
  • board-name – название устройства, например «hEX»;
  • model – модель, например «RouterBOARD 750G r3»;
  • current-firmware – текущая версия RouterBOOT, например «6.42.1»;
  • upgrade-firmware – последняя версия RouterBOOT, например «6.42.1»;
Что это вам даст? Во-первых, модель устройства, что позволит пересмотреть список изменений конкретно для вашей платформы. Во-вторых, вы можете прямо в скрипте выполнить проверку версии RouterBOOT. Обращаю ваше внимание, версия RouterBOOT не обновляется автоматически!

Версия RouterBOOT обновляется нажатием кнопки «Upgrade», или же выполнением команд (требуется перезагрузка):
/system routerboard upgrade 
/system reboot

Если же вас интересует название конкретного устройства, вытянуть его можно при помощи команды:
/system identity get name

Если данный функционал востребован – вам придется дописать его самостоятельно. Мой скрипт реализует только базовое уведомление. Само уведомление выполняется только в том случае, если у вас более старая версия, если же система актуальна – в уведомлениях нет необходимости. В противном случае Mikrotik будет каждый раз слать вам уведомления и вы попросту перестанете обращать на них внимание.

Второй скрипт, «new_version_notifier»:
tool fetch url="https://api.telegram.org/bot<ваш_токен>/sendMessage?chat_id=<id_чата>&text=New%20version%20RouterOS%20is%20available" dst-path=telegram.txt; 

Данный скрипт реализует исключительно отправку уведомления, для него вам потребуется <ваш_токен> и <id_чата> для Telegram Bot API, более подробно о них рассказано в публикации: «Отправка Push-уведомлений из Mikrotik RouterOS прямо на мобильный при помощи Telegram».

Последний шаг – настройка планировщика. Заходим в System – Scheduler, создаем новую задачу с командой:
/system script run check_updates

В качестве интервала для запуска я использую 1 день, при желании, интервал можно менять, например, установить запуск каждые 12 часов.

И напоследок, если вы хотите использовать форматирование теста, в URL Telegram API следует заменить:
&text=

на:
&parse_mode=html&text=

В итоге у вас получится URL вида:
https://api.telegram.org/bot<ваш_токен> /sendMessage?chat_id=<id_чата &parse_mode=html&text=<сообщение>"

После этого в сообщении можно будет использовать форматирование, например:
<b>жирный</b>
<i>курсив</i>

Выделение жирным шрифтом будет полезно в случаях, когда вы получаете много уведомлений.

Видеокурс «Настройка оборудования MikroTik» (аналог MTCNA)

Учитесь работать с MikroTik? Рекомендую видеокурс «Настройка оборудования MikroTik». В курсе разобраны все темы из официальной учебной программы MTCNA и много дополнительного материала. Курс сочетает теоретическую часть и практику – настройку маршрутизатора по техническому заданию. Консультации по заданиям курса ведет его автор Дмитрий Скоромнов. Подойдет и для первого знакомства с оборудованием MikroTik, и для систематизации знаний опытным специалистам.

Комментарии:

Добавить
  • bowtiesmilelaughingblushsmileyrelaxedsmirk
    heart_eyeskissing_heartkissing_closed_eyesflushedrelievedsatisfiedgrin
    winkstuck_out_tongue_winking_eyestuck_out_tongue_closed_eyesgrinningkissingstuck_out_tonguesleeping
    worriedfrowninganguishedopen_mouthgrimacingconfusedhushed
    expressionlessunamusedsweat_smilesweatdisappointed_relievedwearypensive
    disappointedconfoundedfearfulcold_sweatperseverecrysob
    joyastonishedscreamtired_faceangryragetriumph
    sleepyyummasksunglassesdizzy_faceimpsmiling_imp
    neutral_faceno_mouthinnocent
  1. Руслан Георгиевич Попков
    Руслан Георгиевич Попков Гости 20 апреля 2020 17:53
    + 0 -
    не подскажите как в скрипт добавить автоперезагрузку после обновления ? /system package update check-for-updates once :delay 1s; :if ( [get status] = "New version is available") do={ install }
    1. Гость Виталий
      Гость Виталий Гости 1 мая 2020 17:31
      + 0 -
      Вот вам скрипт на автообновление прошивки и последующего обновление загрузчика.
      Настройки времени запуска делать в шедулере.

      /system script
      add dont-require-permissions=no name=auto-upgrade policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/system packag\
      e update\r\
      \ncheck-for-updates once\r\
      \n:delay 1s;\r\
      \n:if ( [get status] = \"New version is available\") do={ install } else={:log info \"System is already up to date\"}"
      add dont-require-permissions=no name=boot-updater policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":log info \"Ch\
      ecking firmware...\";\r\
      \n/system routerboard\r\
      \n:if ([get current-firmware] != [get upgrade-firmware]) do={\r\
      \n :log info \"Updating firmware\";\r\
      \n upgrade;\r\
      \n # Automatic restart\r\
      \n :delay 2s\r\
      \n /system reboot\r\
      \n } else={\r\
      \n :log info \"No firmware update\"\r\
      \n }"
      /system scheduler
      add interval=1d name=auto-upgrade on-event=auto-upgrade policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-time=06:00:00
      add interval=1h name=boot-updater on-event=boot-updater policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-time=startup
      1. Гость Виктор
        Гость Виктор Гости 23 мая 2020 16:29
        + 0 -
        Исправил в Вашем скрипте опечатки из-за которых он кидал ошибки в терминале

        /system script
        add dont-require-permissions=no name=auto-upgrade policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\
        \n/system package update\r\
        \ncheck-for-updates once\r\
        \n:delay 1s;\r\
        \n:if ( [get status] = \"New version is available\") do={ install } else={:log info \"System is already up to date\"}"
        add dont-require-permissions=no name=boot-updater policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\
        \n:log info \"Checking firmware...\";\r\
        \n/system routerboard\r\
        \n:if ([get current-firmware] != [get upgrade-firmware]) do={\r\
        \n:log info \"Updating firmware\";\r\
        \nupgrade;\r\
        \n# Automatic restart\r\
        \n:delay 2s\r\
        \n/system reboot\r\
        \n} else={\r\
        \n:log info \"No firmware update\"\r\
        \n}"
        /system scheduler
        add interval=1d name=auto-upgrade on-event=auto-upgrade policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-time=06:00:00
        add interval=1h name=boot-updater on-event=boot-updater policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-time=startup
        1. Гость Виталий
          Гость Виталий Гости 27 мая 2020 19:43
          + 0 -
          У меня не было никаких ошибок в терминале
  2. Leonid Tur
    Leonid Tur Гости 25 октября 2018 12:37
    + 0 -
    DmitryAVET,
    а не для для вывода на экран командной строки.

    :if ([get status] = "System is already up to date") do={:log info "Installed last RouterOS version, skip notification";};
    тоже ничего не произойдет, "System is already up to date" заменяю на любое сочетание символов
    1. DmitryAVET
      DmitryAVET Создатель 25 октября 2018 20:02
      + +1 -
      Не знаю, что и как вы пробуете менять, но в самой публикации на 100% рабочий проверенный код.
  3. Vitaliy Pavlov
    Vitaliy Pavlov Посетители 30 мая 2018 23:26
    + +2 -
    Вот такой вариант попробуйте, универсальный под любой channel
    
    {
    :log info "Checking for new ROS version ...";
    /system package update
    check-for-updates once
    :delay 5;
    :if ([get status] = "System is already up to date") do={:log info "Installed latest ROS version, skip notification";};
    :if ([get status] = "New version is available") do={:log warning "New ROS version available";};
    :local sysid  [/system identity get name];
    :log info "System name is: $sysid";
    :local channel [get channel];
    :log info "Current ROS channel is: $channel";
    :local installed [get value-name=installed-version];
    :local latest [get value-name=latest-version];
    :delay 5;
    :local ver [/system script get value-name=comment [find name=ros]];
    :log info "Current FW in comment is: $ver";
    :if ($ver = $latest) do={:log info "Noting to update"} else={:log warning "Attention! Available new ROS version! Read changelog before upgrading";/tool fetch url="https://api.telegram.org/bot<YOURBOT>/sendMessage\?chat_id=<YOURCHATID>&parse_mode=html&text=New $channel update available for your RouterOS device (RBNAME: $sysid). Installed version: $installed, latest version: $latest. See full changelog: https://mikrotik.com/download.rss" keep-result=no;:delay 2s;:log warning "Admin was notified by PUSH-message";/system script set comment=$latest [find name=ros]}};
    
  4. Павел
    Павел Гости 17 мая 2018 23:54
    + 0 -
    Вообщем подправил я скрипт. Короче он теперь записывает версию ОС которую отправил в телеграм и сравнивает- это сделано для того что б не было повторых отправок при необновленном микротике. Записывает в коммент самого скрипта - специально не в глобальную переменную, так как они очищаються при перезагрузке. Обратите внимание, в скрипте есть название самого скрипта "ros" вдвух местах,там где извлекается и записывается коммент - подправить название своего скрипта на свое и вперед.

    {:log info "Checking new version RouterOS..."; 
    /system package update 
    set channel=current
    check-for-updates once 
    :delay 5;     
    :if ([get status] = "System is already up to date") do={:log info "Installed last RouterOS version, skip notification";};
    :if ([get status] = "New version is available") do={:local name [/system identity get value-name=name];
    :local install [/system package update get value-name=installed-version];
    :local latest [/system package update get value-name=latest-version]; 
    :local ver [/system script get value-name=comment [find name=ros]]; :if ($ver = $latest) do={:log info "uvedomlenie uche otpravili"} else={:log warning "Attention! New version of RouterOS is available!"; /tool fetch url="https://api.telegram.org/bot111111111:ееееееее_ннннннннннннннннннннннннн/sendMessage\?chat_id=-666666666&parse_mode=html&text=<b>New%20current%20version%20RouterOS%20is%20available</b>%20(Routerboard: $name).%20Installed version: <b>$install</b>,%20latest version: <b>$latest</b>.%20Changelog:%20https://mikrotik.com/current.rss" keep-result=no; :delay 2s; :log warning "Admin was notified by PUSH-message";/system script set comment=$latest [find name=ros]}}};
    1. DmitryAVET
      DmitryAVET Создатель 18 мая 2018 11:37
      + 0 -
      Для устройств с бипером еще можно использовать команды beep, у меня RB951Ui-2HnD при обрыве VPN проигрывает сирену:

      :for i from=1 to=3 step=1 do={
         :beep frequency=550 length=494ms;
         :delay 494ms;
         :beep frequency=400 length=494ms;
         :delay 494ms;
      }
      1. Павел
        Павел Гости 19 мая 2018 07:35
        + 0 -
        а у вас получилось файл отправить с микротик в телеграм?
        /tool fetch url="https://api.telegram.org/bot11111111:rrrrrrrrr_rrrrrrrrrrrrrrrrrr/sendDocument\?chat_id=-111111111" http-method=post http-data="document=https://wiki.mikrotik.com/images/5/54/Dude-icon3.png" keep-result=no;

        Так получилось, а с самого микротика приложить файл - нет.
        1. Ваня
          Ваня Гости 17 января 2021 03:16
          + 0 -
          Это возможно? Отправить файл, сохранённый в памяти с микрота?
      2. Александр
        Александр Гости 10 июня 2018 06:52
        + 0 -
        Дмитрий добрый день!
        Подскажите корректный синтаксис для форматирования сообщений в Telegramm
        Пробовал: &text=<b>Test</b>
        Возвращает -->&text=<b>Test</b>
        1. DmitryAVET
          DmitryAVET Создатель 10 июня 2018 08:34
          + 0 -
          Для того, чтобы можно было форматировать, надо включить парсинг HTML, например вот так:
          sendMessage?chat_id=[CHAT_ID]&parse_mode=html&text=%3Cb%3ENew%20version%20RouterOS%20is%20available%3C%2Fb%3E" dst-path=telegram.txt
          1. Алексанрд
            Алексанрд Гости 10 июня 2018 22:41
            + 0 -
            СПАСИБО!!!!!
  5. Павел
    Павел Гости 17 мая 2018 13:15
    + 0 -
    "/system package update check-for-updates" работает, а "{/system package update check-for-updates once
    :if ( [get status] = "System is already up to date") do={log info 1}}" нет. так как ответ status: finding out latest version...

    forum.mikrotik.com
    1. DmitryAVET
      DmitryAVET Создатель 17 мая 2018 15:03
      + +1 -
      Все там работает, вы не внимательны.

      Во-первых, в ответе вы получили "finding out latest version..." что значит "поиск последней версии". Данный ответ означает, что запущен процесс проверки (!). Читайте, "запрос отправлен, ожидается ответ".

      Во-вторых, ответ нужно проверять не сразу, а с задержкой, что и реализовано в скрипте:
      :delay 1s;

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

      Вы же выполняете запрос и хотите сразу при отправке получить статус? Командная строка не предполагает обновление параметров в режиме реального времени.

      разница между check-for-updates once и check-for-updatesв том, что вторая команда выдает ответ с задержкой, а первая сразу делает print. Поэтому и используется delay.

      К слову, если надо выбирать канал обновлений, синтаксис следующий:
      /system package update
      set channel=current
      check-for-updates once
      


      Таким образом, можно использовать
      set channel=bugfix


      Обратите внимание, что во время выполнения check-for-updates, вы не сможете выполнять другие команды, пока система не получит ответ. В случае со scripts, следом сразу же будет запущена следующая команда, но система её обрабатывать не будет.
      1. Павел
        Павел Гости 17 мая 2018 21:41
        + 0 -
        Спасибо за ответ.
        Я выполняю в командной строке:
        {:log info "Checking new version RouterOS...";
        /system package update check-for-updates once
        :delay 5s;
        :if ( [get status] = "System is already up to date") do={ :log info "Installed last RouterOS version, skip notification"; }}


        Ответ:
        channel: current
        current-version: 6.41.1
        status: finding out latest version...
        bad command name get (line 4 column 8)


        Что не так?
        1. DmitryAVET
          DmitryAVET Создатель 17 мая 2018 22:05
          + +1 -
          Вы в очередной раз коверкаете код. Используйте синтаксис:
          /system package update
          check-for-updates once

          Именно так, как указано, в 2 (две) строки. Вместо используемой вами конструкции:
          /system package update check-for-updates once 

          В моем коде, во время выполнения команд, вы заходите в подменю /system package update и там и остаетесь на время выполнения последующих команд, пока не будет введена команда с "/". В то время как вы запускаете функцию, после чего идет сброс и строка переходит к нулевой позиции. Затем вы пытаетесь получить несуществующий status.

          Еще раз повторюсь, код абсолютно рабочий, проверенный на нескольких конфигурациях, сегодня уже приходили уведомления о версии 6.42.2.
          1. Павел
            Павел Гости 17 мая 2018 22:22
            + +1 -
            офигеть! спасибо! оказывается это две разные команды. Хотя эта конструкция работает в командной строке и как одна команда. Дело в том что при копировании сбиваются переносы, это меня и запутало. Спасибо что разжевали.

            Вот что у меня получилось:
            {:log info "Checking new version RouterOS..."; 
            /system package update 
            check-for-updates once 
            :delay 5;     
            :if ([get status] = "System is already up to date") do={:log info "Installed last RouterOS version, skip notification";};
            :if ([get status] = "New version is available") do={:local name [/system identity get value-name=name];
            :local install [/system package update get value-name=installed-version];
            :local latest [/system package update get value-name=latest-version]; :log warning "Attention! New version of RouterOS is available!"; /tool fetch url="https://api.telegram.org/bot1111111:qqqqqq_qqqqqqqqqqqqqqqqqq/sendMessage\?chat_id=-444444444&parse_mode=html&text=<b>New%20current%20version%20RouterOS%20is%20available</b>%20(Routerboard: $name).%20Installed version: <b>$install</b>,%20latest version: <b>$latest</b>.%20Changelog:%20https://mikrotik.com/current.rss" keep-result=no; :delay 2s; :log warning "Admin was notified by PUSH-message"}};


            С выводом в телеграм:
            New current version RouterOS is available (Routerboard: master). Installed version: 6.42.1, latest version: 6.42.2. Changelog: https://mikrotik.com/current.rss


            Еще раз спасибо!
          2. Павел
            Павел Гости 17 мая 2018 22:53
            + 0 -
            ну и еще нужно добрать проверку. допустим после отправки записывать latest-version. Но не в глобальную переменную, а например, в комментарий. и перед запуском скрипта сравнивать -отправлялось ли уведомление об этой версии, если отправлялось и коммент записался- повторную отправку игнорировать, если версия еще выше стала-то опять отправлять и заменять коммент. Что б если сразу не обновил-не было повторных отправок. Это впринцыпе легко организовать.
          3. DmitryAVET
            DmitryAVET Создатель 17 мая 2018 22:56
            + +1 -
            Да, неплохо вышло) а по поводу синтаксиса... в ROS куча нюансов, на которых спотыкаются многие скрипты, особенно когда что-то меняют
          4. Leonid Tur
            Leonid Tur Гости 25 октября 2018 10:54
            + 0 -
            Добрый день!
            /system routerboard get [параметр]
            ничего не вернет
            current-version: 6.42.9
          5. DmitryAVET
            DmitryAVET Создатель 25 октября 2018 11:04
            + 0 -
            GET = получить значение параметра

            Конструкция GET используется для присвоения значения переменной, а не для для вывода на экран командной строки.

Функция Protected Routerboot в RouterOS, обновление загрузчика RouterBOOT

Почти 2 года назад в одном из обновлений загрузчика и RouterOS, для устройств Mikrotik была добавлена функция «Protected Routerboot». Спрятан этот...

Начиная с RouterOS 6.43, Winbox будет использовать безопасное соединение с

Тем, кто пользуются устройствами Mikrotik RouterBOARD на уровне более продвинутых пользователей, хорошо известна утилита под названием Winbox. По...

Отправка Push-уведомлений из Mikrotik RouterOS прямо на мобильный при помощи

Ранее в блоге я уже писал о том, как можно осуществлять удаленное управление устройствами Mikrotik под управлением RouterOS при помощи SMS-команд....

Как давно вы обновляли RouterOS? Mikrotik предупреждает о необходимости

Несколько дней назад компания Mikrotik совершила массовую рассылку с уведомлением о ботнете, сканирующем одну из прошлогодних уязвимостей....

В разработке: подробности грядущего обновления RouterOS v6.42

Команда Mikrotik продолжает работу над подготовкой очередного обновления RouterOS до версии 6.42. Более подробную информацию обо всех изменениях вы...

Обновление RouterOS на примере Mikrotik hAP lite (RB941-2n)

Абсолютное большинство устройств Mikrotik работает под управлением специальной операционной системы – RouterOS. ROS является одной из самых...

авторизация на сайте

Войти при помощи Facebook Войти при помощи Google+
Забыли пароль?