Pull to refresh

Обновление MikroTik по SSH: Python-скрипт с автоматическим RouterBOARD upgrade

Level of difficultyMedium
Reading time2 min
Views2.8K

Или как избавиться от страха нажать /system reboot

Обновление MikroTik — та ещё боль. То не влезешь по SSH, то забыл сделать routerboard upgrade, то устройство «уходит в себя» и не возвращается. Особенно, когда устройств не одно, а десятки. Вручную это превращается в спорт на выносливость и крепкие нервы.

Я решил, что хватит. Написал скрипт на Python, который делает всю грязную работу за меня: подключается, проверяет обновления, ставит новые пакеты, делает routerboard upgrade и даже ждёт, пока устройство снова появится в сети. Главное — всё логируется и работает аккуратно, как системный администратор в хорошем настроении.

В этой статье:

  • Подробно разберём, как устроен скрипт.

  • Поговорим про SSH, логи, таймауты и тонкости MikroTik.

  • Приведу полный технический разбор Python-кода.


📜 Ключевые фрагменты кода

Подключение к устройству через Netmiko

device = {    "device_type": "mikrotik_routeros",    "ip": ip,    "username": username,    "password": password
}
conn = ConnectHandler(**device)

Проверка обновлений RouterOS

check_output = conn.send_command("/system package update check-for-updates")

Установка обновлений и подтверждение

output = conn.send_command_timing("/system package update install")
if "Do you want to upgrade" in output:    conn.write_channel("y
")

RouterBOARD upgrade при необходимости

rb_info = conn.send_command("/system routerboard print")
if curr_fw != upg_fw:    conn.send_command("/system routerboard upgrade", expect_string=r"\[y/n\]")    conn.write_channel("y
")

📦 Полный код и инструкции доступны:


🔍 Технический разбор кода

🧱 Структура

  • Аргументы CLI обрабатываются через argparse.

  • Netmiko используется для SSH-подключения (с поддержкой MikroTik).

  • Цветной вывод — с помощью colorama.

  • Все логи сохраняются в файл mikrotik_update.log.

🧠 Как работает gather_info()

  • Подключается к устройству.

  • Извлекает установленную версию /system package update print.

  • Проверяет наличие обновлений /system package update check-for-updates.

  • Если обновление есть, показывает версию, иначе пишет, что всё актуально.

  • Работает надёжно даже при медленных ответах — с повторами.

⚙️ Что делает upgrade_device()

  • Проверяет наличие новой версии RouterOS.

  • Если есть — инициирует обновление через install.

  • Подтверждает y при необходимости.

  • Ждёт возвращения устройства после ребута.

  • Затем проверяет /system routerboard print:

    • Если upgrade-firmware > current-firmware, запускает апгрейд и ребут.

  • После каждого действия — лог.

🧪 Как обрабатываются исключения

  • Подключение и команды завернуты в try/except.

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

💤 reboot_and_wait()

  • Ждёт возврата устройства после ребута, пингует и переподключается.

  • Максимальное время ожидания — 5 минут (настраивается).

📎 Пример запуска

# Проверка устройств из списка
python3 mikrotik_update.py --mode gather --file ip_list.txt --user admin
# Обновление одного IP
python3 mikrotik_update.py --mode upgrade --ip 192.168.88.1 --user admin

Пароль будет запрошен при запуске — не хранится нигде в файле.

🧱 Стандарты и стиль

  • Код PEP8-совместим.

  • Типизация (: str, : bool) добавлена для читаемости.

  • Архитектура модульная, можно дорабатывать под себя.


🔐 Безопасность и устойчивость

  • Нет хранения паролей.

  • Все действия логируются.

  • Последовательная обработка IP-адресов (без параллельных SSH-сессий).


P.S. Скрипт прошёл боевое тестирование на более чем 20 устройствах. Ни одно из них не стало кирпичом. Значит, всё работает. А главное — повторяемо.

Tags:
Hubs:
+5
Comments13

Articles