Помощь проекту


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

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

Чем чревато несвоевременно обновление RouterOS я уже писал, причем многие владельцы 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, и для систематизации знаний опытным специалистам.

Интернет-магазин ntools.com.ua

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

Добавить
  • 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. 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
      + 0 -
      Не знаю, что и как вы пробуете менять, но в самой публикации на 100% рабочий проверенный код.
  2. Vitaliy Pavlov
    Vitaliy Pavlov Посетители 30 мая 2018 23:26
    + +1 -
    Вот такой вариант попробуйте, универсальный под любой 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]}};
    
  3. Павел
    Павел Гости 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;

        Так получилось, а с самого микротика приложить файл - нет.
      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 -
            СПАСИБО!!!!!
  4. Павел
    Павел Гости 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 используется для присвоения значения переменной, а не для для вывода на экран командной строки.

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

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

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

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

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

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

Следом за Mikrotik о проблемах с безопасностью заговорили в Ubiquiti

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

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

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

Как удалить оповещение о Windows 10

После получения очередного набора обновлений, абсолютное большинство пользователей операционных систем Windows могут лицезреть в системном трее...


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

Войти при помощи Вконтакте Войти при помощи Facebook Войти при помощи Google+ Войти при помощи Яндекс
Забыли пароль?