Чёт я окопался, и взгляд замылился. 2й день бьюсь с TerminalServiceActivator, новым режимом управления MikroTik'ом и с loopServ().
Код:
# Порт подключения (если не указан, то используется порт из поля Хост/порт)
sa.terminal.port=8728
# протокол подключения (telnet/ssh/tcp/mikrotik-api/mikrotik-api-ssl/shell)
sa.terminal.protocol=mikrotik-api
# Команда выхода (отключения)
sa.terminal.exit=
#Макросы дочерних сервисов
white_ip=${ip()}
white_sID=${servId()}
#Создание договора
#Поиск запрещающего правила фаервола, создание правила фаервола сервиса
sa.terminal.serv.create.1=/ip/firewall/filter/print where comment=BLOCK
sa.terminal.serv.create.2=/ip/firewall/filter/add chain=forward place-before=${mikrotikLastIds()} src-mac-address=${mac()} disabled=no src-address=${ip()} comment=bg${servId()}
#Адрес-лист сервиса
sa.terminal.serv.create.3=/ip/firewall/address-list/add address=${ip()} list=Allow comment=bg${servId()}
#Адрес-лист дочернего сервиса
sa.terminal.serv.create.4=/ip/firewall/address-list/add address=${loopServ('white_ip', false, '')} list=WhiteCostIP comment=bg${loopServ('white_sID', false, '')}
#NAT дочернего сервиса
sa.terminal.serv.create.5=/ip/firewall/nat/add chain=srcnat src-address=${ip()} action=netmap to-addresses=${loopServ('white_ip', false, '')} comment=bg${loopServ('white_sID', false, '')}
sa.terminal.serv.create.6=/ip/firewall/nat/add chain=dstnat dst-address=${loopServ('white_ip', false, '')} action=netmap to-addresses=${ip()} comment=bg${loopServ('white_sID', false, '')}
#Включение договора
#Включение правила фаервола
sa.terminal.serv.modify.enable.1=/ip/firewall/filter/print where comment=bg${servId()}
sa.terminal.serv.modify.enable.2=${skipIfEmpty(mikrotikLastIds())}/ip/firewall/filter/enable numbers=${mikrotikLastIds()}
#Включение адрес-листа
sa.terminal.serv.modify.enable.3=/ip/firewall/address-list/print where comment=bg${servId()}
sa.terminal.serv.modify.enable.4=${skipIfEmpty(mikrotikLastIds())}/ip/firewall/address-list/enable numbers=${mikrotikLastIds()}
#Включение адрес-листа дочернего сервиса
sa.terminal.serv.modify.enable.5=/ip/firewall/address-list/print where comment=bg${loopServ('white_sID', false, '')}
sa.terminal.serv.modify.enable.6=${skipIfEmpty(mikrotikLastIds())}/ip/firewall/address-list/enable numbers=${mikrotikLastIds()}
#Включение NAT дочернего сервиса
sa.terminal.serv.modify.enable.7=/ip/firewall/nat/print where comment=bg${loopServ('white_sID', false, '')}
sa.terminal.serv.modify.enable.8=${skipIfEmpty(mikrotikLastIds())}/ip/firewall/nat/enable numbers=${mikrotikLastIds()}
#Выключение договора
#Выключение правила фаервола
sa.terminal.serv.modify.disable.1=/ip/firewall/filter/print where comment=bg${servId()}
sa.terminal.serv.modify.disable.2=${skipIfEmpty(mikrotikLastIds())}/ip/firewall/filter/disable numbers=${mikrotikLastIds()}
#Выключение адрес-листа
sa.terminal.serv.modify.disable.3=/ip/firewall/address-list/print where comment=bg${servId()}
sa.terminal.serv.modify.disable.4=${skipIfEmpty(mikrotikLastIds())}/ip/firewall/address-list/disable numbers=${mikrotikLastIds()}
#Выключение адрес-листа дочернего сервиса
sa.terminal.serv.modify.disable.5=/ip/firewall/address-list/print where comment=bg${loopServ('white_sID', false, '')}
sa.terminal.serv.modify.disable.6=${skipIfEmpty(mikrotikLastIds())}/ip/firewall/address-list/disable numbers=${mikrotikLastIds()}
#Выключение NAT дочернего сервиса
sa.terminal.serv.modify.disable.7=/ip/firewall/nat/print where comment=bg${loopServ('white_sID', false, '')}
sa.terminal.serv.modify.disable.8=${skipIfEmpty(mikrotikLastIds())}/ip/firewall/nat/disable numbers=${mikrotikLastIds()}
#Удаление договора
#Удаление правила фаервола
sa.terminal.serv.cancel.1=/ip/firewall/filter/print where comment=bg${servId()}
sa.terminal.serv.cancel.2=${skipIfEmpty(mikrotikLastIds())}/ip/firewall/filter/remove numbers=${mikrotikLastIds()}
#Удаление адрес-листа
sa.terminal.serv.cancel.3=/ip/firewall/address-list/print where comment=bg${servId()}
sa.terminal.serv.cancel.4=${skipIfEmpty(mikrotikLastIds())}/ip/firewall/address-list/remove numbers=${mikrotikLastIds()}
#Удаление очереди
sa.terminal.serv.cancel.5=/queue/simple/print where comment=bg${servId()}
sa.terminal.serv.cancel.6=${skipIfEmpty(mikrotikLastIds())}/queue/simple/remove numbers=${mikrotikLastIds()}
#Удаление адрес-листа дочернего сервиса
sa.terminal.serv.cancel.7=/ip/firewall/address-list/print where comment=bg${loopServ('white_sID', false, '')}
sa.terminal.serv.cancel.8=${skipIfEmpty(mikrotikLastIds())}/ip/firewall/address-list/remove numbers=${mikrotikLastIds()}
#Удаление NAT дочернего сервиса
sa.terminal.serv.cancel.9=/ip/firewall/nat/print where comment=bg${loopServ('white_sID', false, '')}
sa.terminal.serv.cancel.10=${skipIfEmpty(mikrotikLastIds())}/ip/firewall/nat/remove numbers=${mikrotikLastIds()}
#Создание очереди для сервиса
#1 MB/Sec
sa.terminal.serv.inetOption.10.enable=/queue/simple/add max-limit=1M/1M target=${ip()} comment=bg${servId()}
Как только раскомменчиваю куски связанные с дочерними сервисами, inetAccess начинает болеть.
Сперва пишет
Код:
connection 11-27/16:26:11 ERROR [sa-p-13-t-28] AcknowledgeConsumer - Error on device:99 - me.legrange.mikrotik.MikrotikApiException: unknown parameter
ru.bitel.bgbilling.common.BGException: Error on device:99 - me.legrange.mikrotik.MikrotikApiException: unknown parameter
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doTask(ServiceActivatorDeviceWorker.java:516)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.internalDoTaskImpl(AsyncEventWorker.java:248)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.notify(AsyncEventWorker.java:238)
at ru.bitel.bgbilling.kernel.event.AcknowledgeConsumer.onMessage0(AcknowledgeConsumer.java:77)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.internalDoTask(AsyncEventWorker.java:213)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.doTasks(AsyncEventWorker.java:120)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.runWorker(ServiceActivatorDeviceWorker.java:253)
at ru.bitel.bgbilling.kernel.event.EventWorker.internalRunWorker(EventWorker.java:154)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.runImpl(ServiceActivatorDeviceWorker.java:157)
at ru.bitel.common.worker.WorkerTask.run(WorkerTask.java:87)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:46)
Caused by: me.legrange.mikrotik.MikrotikApiException: unknown parameter
at me.legrange.mikrotik.impl.ApiConnectionImpl$SyncListener.getResults(ApiConnectionImpl.java:476)
at me.legrange.mikrotik.impl.ApiConnectionImpl$SyncListener.access$100(ApiConnectionImpl.java:430)
at me.legrange.mikrotik.impl.ApiConnectionImpl.execute(ApiConnectionImpl.java:114)
at me.legrange.mikrotik.impl.ApiConnectionImpl.execute(ApiConnectionImpl.java:72)
at ru.bitel.bgbilling.kernel.network.mikrotik.MikrotikApiSession.doCommand(MikrotikApiSession.java:92)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalSession$MikrotikApiTerminalSession.sendCommandImpl(TerminalSession.java:678)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalSession.sendCommand(TerminalSession.java:140)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalSession.sendCommand(TerminalSession.java:133)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.executeCommand(TerminalServiceActivator.java:762)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.executeCommands(TerminalServiceActivator.java:728)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.executeCommands(TerminalServiceActivator.java:689)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.serviceCreate(TerminalServiceActivator.java:2213)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorSet.serviceCreate(ServiceActivatorSet.java:386)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doCommand(ServiceActivatorDeviceWorker.java:576)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doTask(ServiceActivatorDeviceWorker.java:512)
... 17 more
Caused by: me.legrange.mikrotik.impl.ApiCommandException: unknown parameter
at me.legrange.mikrotik.impl.ApiConnectionImpl$Processor.run(ApiConnectionImpl.java:267)
потом уходит в рекурсию создания сервиса, причём исключительно первые две команды выполняет(на создание правила фаерволла) и пишет
Код:
connection 11-27/16:27:11 ERROR [sa-p-13-t-25] EventWorker - Error on device:99 - me.legrange.mikrotik.MikrotikApiException: failure: already have such entry
ru.bitel.bgbilling.common.BGException: Error on device:99 - me.legrange.mikrotik.MikrotikApiException: failure: already have such entry
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doTask(ServiceActivatorDeviceWorker.java:516)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.internalDoTaskImpl(AsyncEventWorker.java:248)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.internalDoTask(AsyncEventWorker.java:220)
at ru.bitel.bgbilling.kernel.event.AsyncEventWorker.doTasks(AsyncEventWorker.java:120)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.runWorker(ServiceActivatorDeviceWorker.java:253)
at ru.bitel.bgbilling.kernel.event.EventWorker.internalRunWorker(EventWorker.java:154)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.runImpl(ServiceActivatorDeviceWorker.java:157)
at ru.bitel.common.worker.WorkerTask.run(WorkerTask.java:87)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:46)
Caused by: me.legrange.mikrotik.MikrotikApiException: failure: already have such entry
at me.legrange.mikrotik.impl.ApiConnectionImpl$SyncListener.getResults(ApiConnectionImpl.java:476)
at me.legrange.mikrotik.impl.ApiConnectionImpl$SyncListener.access$100(ApiConnectionImpl.java:430)
at me.legrange.mikrotik.impl.ApiConnectionImpl.execute(ApiConnectionImpl.java:114)
at me.legrange.mikrotik.impl.ApiConnectionImpl.execute(ApiConnectionImpl.java:72)
at ru.bitel.bgbilling.kernel.network.mikrotik.MikrotikApiSession.doCommand(MikrotikApiSession.java:92)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalSession$MikrotikApiTerminalSession.sendCommandImpl(TerminalSession.java:678)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalSession.sendCommand(TerminalSession.java:140)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalSession.sendCommand(TerminalSession.java:133)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.executeCommand(TerminalServiceActivator.java:762)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.executeCommands(TerminalServiceActivator.java:728)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.executeCommands(TerminalServiceActivator.java:689)
at ru.bitel.bgbilling.modules.inet.dyn.device.terminal.TerminalServiceActivator.serviceCreate(TerminalServiceActivator.java:2213)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorSet.serviceCreate(ServiceActivatorSet.java:386)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doCommand(ServiceActivatorDeviceWorker.java:576)
at ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorDeviceWorker.doTask(ServiceActivatorDeviceWorker.java:512)
... 15 more
Caused by: me.legrange.mikrotik.impl.ApiCommandException: failure: already have such entry
at me.legrange.mikrotik.impl.ApiConnectionImpl$Processor.run(ApiConnectionImpl.java:267)
и продолжает клепать эти правила, даже если удалить сервис (принудительно или с переносом даты открытия на будущее число).
Перезапуск аксесса не помогает. Помогает "удаление событий из очереди" в дереве устройств.