Для работы этой схемы нужен FTP сервер (у меня он виндовый, но батник легко переделывается под никсы) с учетной записью, имеющей права на чтение–запись. Механизм строится на взаимодействии следующих элементов: на шлюзе зашедуленные скрипты BackupDynList_to_FTP и BackupDynListFromFTP, на FTP сервере зашедуленный скрипт convertmtik.bat. Сторонний сервер нужен для того, чтобы разгрузить внутреннюю память микротика (списки могут быть довольно большими, а энергонезависимая память не у всех большая) и для того, чтобы обработать файл более мощными средствами работы с текстом, чем имеет встроенный скриптовый язык mikrotik. Вызов функции DynListExport используется для того, чтобы обойти ограничение системы на размер списка. Необходимость конвертирования списка связана с тем, что если в базе уже присутствует такой же элемент (скажем, статическая запись), то при импорте возникает ошибка и происходит остановка выполнения импорта. Чтобы этого не происходило, при каждом добавлении статической записи, сбрасывается обработчик ошибок и в случае совпадения запись просто не добавляется, а процесс импорта идет дальше.
Скрипт BackupDynList_to_FTP выполняется каждый час (00:00), он собирает в файл iplist_dyn.src все данные о динамических записях (которым осталось жить не менее получаса) во всех списках и отправляет этот файл на ftp. На сервере каждый час со сдвигом в полчаса от первого скрипта (00:30) выполняется батник convertmtik.bat, который преобразует исходный скрипт, принятый от шлюза, в скрипт, защищенный от ошибок совпадений и сохраняет его под именем iplist_dyn_done.src
Теперь, в случае падения или перезагрузки шлюза, в момент запуска данные о динамических записях автоматически пропадают, но через 60 секунд после запуска скрипт BackupDynListFromFTP скачивает с FTP файл iplist_dyn_done.src и запускает его на выполнение, восстанавливая списки.
Активатор Hourly_Dynlist_Backup_on_FTP (/sys sheduler), выполняется в начале каждого часа:
/system script run BackupDynList_to_FTP
Скрипт BackupDynList_to_FTP (не забудьте поменять адрес FTP, логин и пароль):
/system script environment remove [ find where name="DynListExport" ]; :global DynListExport do={ :foreach i in=[/ip firewall address–list find where dynamic=yes and timeout>0d00h30m] do={ :local list [/ip firewall address–list get $i list]; :local address [/ip firewall address–list get $i address]; :local timeout [/ip firewall address–list get $i timeout]; :local comment [/ip firewall address–list get $i comment]; :put "/ip firewall address–list add list=$list address=$address timeout=$timeout comment=\"$comment\";"}; } :log info "Starting Backup to FTP Script..." :global iplistfile ("iplist_dyn.rsc") :if ([/file find name=$iplistfile]!= "") do={/file rem $iplistfile}; /execute script="\$DynListExport" file=$iplistfile :delay 60s /tool fetch address="Адрес_FTP_сервера" port=21 mode=ftp src–path="iplist_dyn.rsc.txt" user=Пользователь password=Пароль dst–path="iplist_dyn.src" upload=yes :delay 20s /file rem $iplistfile :log info "Finished Backup to FTP!"
Активатор BackupDynList_from_FTP (/sys sheduler), выполняется в момент запуска шлюза (startup):
{:delay 60s}; /system script run BackupDynListFromFTP
Скрипт BackupDynListFromFTP (не забудьте поменять адрес FTP, логин и пароль):
:local BackupFile "iplist_dyn_done.src" /file remove [find name=$BackupFile] /tool fetch address="Адрес_FTP_сервера" port=21 mode=ftp src–path="$BackupFile" user=Пользователь password=Пароль /import file–name=$BackupFile {:delay 30s}; /file remove [find name=$BackupFile] /log info "$BackupFile imported"
Серверный скрипт convertmtik.bat — для своей работы использует порт линуксовой утилиты SED, например из gnuwin32, которая должна быть прописана в path на сервере:
echo # ––––––––––––––––––––––––––––––––––––––––––––––––––––– — > iplist_dyn_done.src echo # %date% %time% >> iplist_dyn_done.src echo # ––––––––––––––––––––––––––––––––––––––––––––––––––––– — >> iplist_dyn_done.src echo /ip firewall address–list > iplist_dyn_done.src sed –e "s/;//" –e "s/\/ip firewall address–list //" –e "s/.*/:do { & } on–error={}/" iplist_dyn.src >> iplist_dyn_done.src
ссылка на оригинал статьи https://habr.com/ru/post/477510/
Добавить комментарий