Как стать автором
Обновить

Скрипт автоматического бэкапа конфигурации Mikrotik

Всем привет!

Недавно передо мной встала задача организовать автоматическое создание бэкапов на Mikrorik. Так как конфигурация меняется, но не всегда сохраняют эти изменения. И в случае выхода из строя маршрутизатора, необходимо быстро накатить работающую конфигурацию на другой маршрутизатор. Так как я недавно начал изучать Python решил, что буду использовать этот язык для написания скрипта.


Мысль была следующей: написать скрипт, который будет подключаться к mikrotik, посылать команду для сохранения текущей конфигурации и далее по ftp скачиваем с этого маршрутизатора файл конфигурации. В результате родился следующий скрипт:

import telnetlib
import time
import datetime
import logging

###делаем бэкап конфигурации микротика###


def mikrotik_make_backup():
    host = "ip_adress_mikrotik" # ip адрес нашего mikrotik
    user = "login" # логин для подключения к mikrotik
    password = "pass" # пароль для подключения
    dn = datetime.datetime.today() # получаем дату
    cur_year = str(dn.year)
    cur_month = str(dn.month)
    cur_day = str(dn.day)
    date_now = cur_day + cur_month + cur_year
    cur_hour = str(dn.hour)
    cur_minutes = str(dn.minute)
    cur_time = cur_hour + cur_minutes
    command_1 = '/system backup save name=mikrotik' + date_now + "-" + cur_time # команда для создания бэкапа на микротике
    command_2 = 'quit'
    tn = telnetlib.Telnet(host) # подключаемся к микротик по telnet
    tn.read_until(b"Login: ")
    tn.write(user.encode('UTF-8') + b"\n")
    tn.read_until(b"Password: ")
    tn.write(password.encode('UTF-8') + b"\n")
    tn.read_until(b'>')
    tn.write(command_1.encode('UTF-8') + b"\r\n")
    logging.basicConfig(filename='log.txt', level=logging.INFO,
                        format='%(asctime)s - %(levelname)s - %(message)s')
    logging.info("backup сделан")
    time.sleep(5)
    tn.read_until(b'>')
    tn.write(command_2.encode('UTF-8') + b"\r\n")
    time.sleep(5)
    upload_ftp()


def upload_ftp():
    import ftplib
    import os
    import os.path

    ftp = ftplib.FTP('ip_adress_mikrotik') # подключаемся к микротик по FTP, вместо ip_adress_mikrotik вводим адрес нашего устройства
    ftp.login('login', 'password') # вместо login и password вводим наши логин и пароли
    listing = []
    lst_for_delete = []  # лист для списка существуующих бэкапов
    ftp.retrlines('LIST', listing.append)
    for i in range(len(listing)):
        words = listing[i].split(None, 8)
        filename = words[-1].lstrip()
        string = 'mikrotik'
        count = filename.count(string)
        if count == 1:
            backup_name = filename
            lst_for_delete.append(backup_name)
        local_filename = os.path.join(r"d:\MikrotikBackUp", backup_name)
        lf = open(local_filename, "wb")
        ftp.retrbinary("RETR " + filename, lf.write, 8 * 1024)
        logging.basicConfig(filename='log.txt', level=logging.INFO,
                            format='%(asctime)s - %(levelname)s - %(message)s')
        logging.info(backup_name + " скопирован на сервер")
    if len(lst_for_delete) > 15:
        ftp.delete(lst_for_delete[-1])  # на микротике сохраняется только последние 15 бэкапов
        logging.basicConfig(filename='log.txt', level=logging.INFO,
                            format='%(asctime)s - %(levelname)s - %(message)s')
        logging.info("Файл удален: " + lst_for_delete[-1])


mikrotik_make_backup()


Этот скрипт я скинул на сервер по пути d:\Scripts. В этой же папке создал файл log.txt для записи в него событий.
Так же создал папку d:\MikrotikBackUp, туда будут бэкапиться конфигурации. С помощью планировщика заданий задаем необходимую частоту запуска скрипта.
Запускаем и смотрим результат.

PS: Скрипт легко переделывается для обхода нескольких микротиков. Так же можно переписать так, чтобы конфигурация копировалась и устанавливалась на резервный микротик.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.