Если вы используете API-приложение, вам даже не нужно планировать синхронизацию. Можно держать API-соединение открытым и синхронизировать сразу, как только элемент будет добавлен или удалён из списка адресов. Например, с PHP (запускается из командной строки, а не с веб-страницы!):
<?php
use PEAR2\Net\RouterOS;
require_once 'PEAR2_Net_RouterOS-1.0.0b5.phar';
$master = new RouterOS\Client('master-router-ip', 'admin', 'password');
$slaveUtil = new RouterOS\Util($slave = new RouterOS\Client('slave-router-ip', 'admin', 'password'));
$slaveUtil->setMenu('/ip firewall address-list');
$addressLists = array('List1', 'List2');
$master->sendAsync(
new RouterOS\Request('/ip firewall address-list listen'),
function ($response) use ($addressLists, $slave, $slaveUtil) {
if (in_array($response('list'), $addressLists, true)) {
if (null !== $response('.dead')) {
//Удалено
$slaveUtil->remove(
$slaveUtil->find(
RouterOS\Query::where('list', $response('list'))->andWhere('address', $response('address'))
)
);
} else {
//Добавлено
$slaveUtil->add(
array(
'list' => $response('list'),
'address' => $response('address')
)
);
}
}
}
);
$master->loop();
Или, если вы не хотите использовать третье устройство, можно воспользоваться идеей jurgenskrause… Только её можно реализовать проще и эффективнее…
На мастере запланируйте:
# Список через точку с запятой адресных списков, которые нужно синхронизировать
:local lists {"List1";"List2"}
# Имя файла экспорта (должно совпадать с именем файла импорта на принимающем роутере)
:local exportFile "ExportAddressList.rsc"
:local fileContents "/ip firewall address-list\n"
:foreach i in=$lists do={
:set $fileContents ($fileContents . "remove [find list=\"" . $i . "\"]\n")
:foreach j in=[/ip firewall address-list print as-value where list=$i] do={
:set $fileContents ($fileContents . "add list=\"" . ($j->"list") . "\" address=\"" . ($j->"address") . "\"\n")
}
}
# Только первый раз
:if ([/file print count-only where name=$exportFile] = 0) {
/file print file=$exportFile
:delay 2s
}
/file set $exportFile contents=$fileContents
На слейве запланируйте:
# Имя файла экспорта (должно совпадать с именем файла импорта на принимающем роутере)
:local importFile "ExportAddressList.rsc"
# IP-адрес роутера с существующими адресными списками
:local hostIP 1.2.3.4
# FTP-пользователь и пароль
:local ftpUser username
:local ftpPassword userpassword
/tool fetch address=$hostIP src-path=$importFile dst-path=$importFile mode=ftp user=$ftpUser password=$ftpPassword
/import $importFile