Или как избавиться от страха нажать
/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 устройствах. Ни одно из них не стало кирпичом. Значит, всё работает. А главное — повторяемо.