Скриптуем: бэкапы, начало

Итак, захотелось сделать автобэкапы.

И не просто, а культурно – дабы с обработкой ошибок, с логированием, с легкой настройкой потом. В общем – легких путей не ищем (намекаю на Auto Backup MikroTik ).

Во-первых, что такое скриптование в Микротик? Это, по сути, их собственный язык скриптов, который мало похож на другие. Но тем не менее он достаточно простой и понятен тем, кто имел дело с любыми другими языками программирования или скриптования. Хотя лично мне хотелось бы видеть тот же Python в виде скриптового языка %)) (мечтать не вредно). Когда-то пытались прикрутить LUA, но дальше бэты не ушло. А жаль. Как по мне LUA хоть и не питон, но с более читаемым синтаксисом %) Любителям других языков тем не менее оставлена возможность работы с Микротиком – удаленно через API. Но эот уже совсем другая история.

Во-вторых, обязательно нужно ознакомиться с описанием этого самого языка –Scripting:manuals

В-третьих, план – что конкретно собираемся делать и как.

Дабы не плодить однотипные скрипты по автобекапу, коих “тьма” (но по сути один или два скрипта в разных вариациях) напишем свой с нуля. И не просто напишем скрипт, а сделаем максимально гибким (постараемся) и всё, что может потом пригодиться – оформим в виде подключаемых “библиотек” (почему в кавычках – о том ниже).

Что я хочу – хочу бекапить по расписанию конфиг, при этом иметь возможность отправлять его по почте, по фтп или куда-нить в облако. И “доправлять” повторно, если по какой-то причине отправить не удалось. Вполне возможно, что всё сразу. При этом чтобы новый пункт “назначения” можно было добавлять не пытаясь в муках через год-два вспомнить, что и где менять.

Итак, начинаем…

1. Сохраняем бекап

Вроде бы задачка простая и в консоли всем понятна и известна:

/system backup save

При этом файла генерится автоматически в виде

<System Identity>-<Date>-<Time>.backup

где

<System Identity> – имя роутера (очень советую для каждого роутера ставить понятное и уникальное имя – иначе как потом понять, где чей бэкап?)

<Date> – текущая дата в виде YYYYMMDD. Очень мудрое решение – при сортировке по имени бекапы будут сортироваться подряд по дате их создания.

<Time> – текущее время в виде HHMM

При этом очень советую проверять, что время и дата на роутере выставлены правильно и синхронизируются по Интернет. Иначе рискуете иметь все бекапы датированные 1970 годом… Не очень удобно…

А вот теперь интересный вопрос – бекап то сохраняется, но под каким точно именем, как узнать?

Вариант 1. Просто смотрим на диске бекап с самой новой датой. Например, так или так.

Вариант 2. Сами задаем имя файла:

/system backup save name=<имя файла>

где <имя файла> – это имя файла бекапа. При этом советую не использовать пробелы и всякие “стремные” символы, иначе потом вылезут проблемы при сохранении таких файлов через интернет – не все протоколы допускают просто так любые символы в имени файла.

Кроме того, хорошая практика в имени файла указывать ид роутера и дату-время создания. По аналогии с тем, как это делает по умолчанию сам роутер. Ибо если бекапы несколько раз копируются, есть риск, что оригинальная дата создания самого файла может быть изменена/утеряна. Но вот тут возникает задача, как сгенерить само это имя. Например так (все используемые внешние функции можно найти тут):

# get external functions. I set it as local to not overload /environment 
# due to this function will be called rarely
:local datetime2str [:parse [/system script get func_datetime2str source]]

#suffix for auto backups
:local cSuffix "auto"

# generate backup name
:local sysname [/system identity get name]
:local datetime [$datetime2str]
:local backupName "$sysname-$datetime-$cSuffix"

В результате будем иметь имя бэкапа похожее на:

CCR-Home-2016-11-18_165822-auto

Я специально в конце генерируемых бэкапов ставлю общий суффикс (в моем случае “auto”) – это позволит потом отличать такие бэкапы от тех, что были созданы вручную. Зачем? Ну хотя бы для того, чтобы потом периодически (и автоматически) удалять слишком старые авто-бэкапы – место на “диске” рутера не безгарнично…

А далее идея очень проста – заводим отдельно очереди на отсылку файлов по почте, фтп или еще кудой. И добавляем имена сгенерированных файлов в эти очереди.

Затем у нас по расписанию будут запускаться отдельные скрипты для осблуживания каждой очереди.

То есть сам процесс будет выглядеть примерно так:

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

Скрипты 2, 3, … N. Обработчики каждой очереди. Выполняются, скажем, раз в час. Пытаются отослать файл. Если успешно – то файл из очереди будет удален. Если же неуспешно – ругаемся (в лог или на почту админу) и из очереди НЕ удаляем.

Скрипт N+1. Обслуживание имеющихся бэкапов. Например, удалять все бэкапы старше 1 месяца.

Пока что мы написали первый скрипт, создание бэкапа и добавление его в очереди (для начала, почта и фтп):

Шаг 1. Создание бэкапа

Теперь будем их отправлять.

Продолжение следует…