Оглавление |
---|
TerminalServiceActivator
Обработчик предназначен для выполнения команд по telnet, ssh, tcp, shell. Команды для разных событий задаются в конфигурации типа устройства.
Параметры подключения
Блок кода | ||||
---|---|---|---|---|
| ||||
# Хост подключения (если не указан, используется значение из поля Хост/порт) #sa.terminal.host= # Порт подключения (если не указан, используется значение из поля Хост/порт) #sa.terminal.port= # протокол подключения (telnet/ssh/tcp/mikrotik/shell/mikrotik-api) sa.terminal.protocol=telnet # логин (если не указан, используется значение из поля Логин) #sa.terminal.username= # пароль (если не указан, используется значение из поля Пароль) #sa.terminal.password= # Шаблон приглашения ввода команды (для telnet/ssh/tcp) # Для ssh можно указать regexp, если в начале и конце строки будет символ '\', например, "\(#)|(~\$)\" sa.terminal.endSequence=# # Для sa.terminal.protocol=mikrotik - хост и порт, с которых открывать соединение #sa.terminal.sourceHost= #sa.terminal.sourcePort= # Отложенное подключение. Если указано 1, то подключение происходит перед выполнением первой команды, # иначе - 0 (по умолчанию), подключение происходит в методе connect sa.terminal.lazyConnect=0 |
...
Подсказка |
---|
Во время выполнения команд есть возможность подменить значение sa.endSequence на другое, с помощью макроса ${setEndSequence(':~$')}. Это может быть полезно, т.к. на некотором оборудовании строка приглашения во время выполнения команд может меняться. Для того, чтобы вернуть значение на значение sa.endSequence из конфига, можно вызвать макрос без агрумента: ${setEndSequence()}. |
Команды для инициации подключения и отключения
При появлении задачи синхронизации, если на данный момент соединение не установлено, обработчик подключается к устройству, используя параметры подключения, затем выполняет команды, прописанные в параметре sa.terminal.connect. Далее выполняются команды синхронизации, возможно последовательно для нескольких договоров. Когда задания выполнены и новых нет в течении sa.batch.waitNext.millis, то происходит отключение от устройства, но перед этим выполняются команды, указанные в sa.terminal.disconnect. Перед самим отключением выполняется команда sa.terminal.exit (в отличие от sa.terminal.disconnect после этой команды нет ожидания ответа от устройства).
Блок кода | ||||
---|---|---|---|---|
| ||||
# Команды, которые необходимо выполнить после установки соединения sa.terminal.connect= # команды, которые необходимо выполнить перед отключением соединения sa.terminal.disconnect= # команда выхода (отключения) sa.terminal.exit=exit |
Параметры работы
Блок кода | ||||
---|---|---|---|---|
| ||||
# Смена состояния сессии после вызова connectionModify (по умолчанию 1) # (подробнее о состоянии на странице документации Сущности модуля Inet - Сессии) #sa.terminal.connection.stateModify=1 # Пропуск дочернего аккаунтинга (дочерних/сервисны сессий ISG/SmartEdge) # Т.е. для них onAccountingStart/onAccountingStop вызываться не будет (по умолчанию 1) #sa.terminal.connection.skipServiceAccounting=1 # Устройства, сессии с которых будут обрабатываться командами onAccountingStart/onAccountingStop #sa.terminal.connection.deviceIds= # Ограничение на количество одновременных подключений (обычно максимально возможное кол-во - это ((кол-во дочерних устройств этого устройства) + 1), но не более 100) #sa.terminal.semaphorePermits=0 # Фильтр по опциям (можно использовать отдельную ветку) #sa.inetOption.root= |
Выполнение команд
Возможные наборы команд для событий
Для каждого события есть три набора команд: "перед вызовом обычного набора", "обычный набор", "после вызова обычного набора". Например, sa.terminal.serv.modify, sa.terminal.serv.modify.before, sa.terminal.serv.modify.after. Наборы команд .before и .after в основном предназначены для вызова других наборов команд и изменения логики работы, в зависимости от ситуации.
...
Подсказка |
---|
Синхронизация всегда выполняется для родительского сервиса. Для работы с информацией из дочерних сервисов необходимо использовать макрос loopServ(). При изменении IP-адреса, интерфейса, VLAN или набора дочерних сервисов вызываются команды удаления сервиса (с использованием старых параметров), а затем добавления (с использованием новых). |
Макросы
Макросы вызываются с помощью последовательности ${имямакроса()}. Внутри фигурных скобок может быть логическое выражение, однако в этом случае, оно должно быть оформлено как правильный java-код, например: ${(newState()==1)?'вкл':'выкл'}, ${(newState()==1&&oldState()!=1)?(connectionEnable()+optionsEnable()):''}.
...
loopServ(имя_параметра_шаблона_команды, использовать_в_цикле_родительский_сервис, выполять_как_отдельную_команду_или_построить_строку) - способ выполнения команд с использованием дочерних сервисов; выполняется цикл для всех дочерних сервисов, а также для родительского, если второй агрумент равен true; шаблоном команды является значение параметра, имя которого прописано в первом агрументе; выполняются как отдельные команды (true) или возвращается конкатенированная строка с указанным разделителем
Блок кода language groovy m_ipLoop=${net()} sa.commandSet.staticIP.serv.create.1=/queue/simple/remove\n=numbers=${contractId()}:${servId()} sa.commandSet.staticIP.serv.create.2=/queue/simple/add\n=name=${contractId()}:${servId()}\n=target=127.0.0.1/32,${loopServ('m_ipLoop', false, ',')}
Вызовы других наборов команд через макросы
Для каждого события есть три набора команд: "перед вызовом обычного набора", "обычный набор", "после вызова обычного набора". Например, sa.terminal.serv.modify, sa.terminal.serv.modify.before, sa.terminal.serv.modify.after. Наборы команд .before и .after предназначены в основном для вызова других наборов команд и изменения логики работы, в зависимости от ситуации. Например, стандартная предопределенная конфигурация выглядит так:
...
Макросы serviceEnable(), serviceDisable(), connectionEnable(), connectionDisable(), connectionClose(), optionsEnable(), optionsDisable() вызывают соответствующие наборы команд. optionsSwitch() - вызывает наборы команд на отключение для старых опций и включение для новых. newState() и oldState() возвращают текущее и новое состояние сервиса или соединения, значения -1 - удален (для сервиса), 0 - отключен, 1 - включен.
Управление c помощью Mikrotik API
Оборудование Mikrotik предоставляет протокол для управления: https://wiki.mikrotik.com/wiki/Manual:API
Основное отличие от обычного синткакиса консольного синтаксиса CLI состоит в том, что в командах заменяются пробелы на "/"( "/interface vlan print" превращается в "/interface/vlan/print"), параметры передаются по другому и нет возможности вызывать вложенные команды ( зато однако есть запоминание id, которые вернул предыдущий вызов команды, и есть возмодность возможность использовать их использовать в следующей команде).
Новый режим
Для управления с помощью Mikrotik API нужно поставить типуказать:
Блок кода | ||
---|---|---|
| ||
sa.terminal.protocol=mikrotik-api |
Тогда Для управления с помощью Mikrotik API-SSL нужно указать:
Блок кода | ||
---|---|---|
| ||
sa.terminal.protocol=mikrotik-api-ssl |
В обоих случаях используется библиотека mikrotik-java. Она поддерживает как api так и api-ssl. Синтаксис несколько отличается от того, который пописан описан в протоколе , и описан тут:Mikrotik, примеры можно посмотреть здесь: https://github.com/GideonLeGrange/mikrotik-java.
Вот пример Пример конфигурации для mikrotik:
Блок кода | ||
---|---|---|
| ||
# Порт подключения (если не указан, используется значение из поля Хост/порт)
sa.terminal.port=8728
# протокол подключения (telnet/ssh/tcp/mikrotik-api/shell)
sa.terminal.protocol=mikrotik-api
sa.port=8728
# команда выхода (отключения)
sa.terminal.exit=
# команды, вызываемые при включении сервиса (состояние стало "включено")
sa.terminal.serv.modify.enable.1=/interface/vlan/print where name=${ifaceTitle()}
sa.terminal.serv.modify.enable.2=/interface/vlan/enable .id=${mikrotikLastIds()}
# команды, вызываемые при отключение сервиса (состояние стало "отключено")
sa.terminal.serv.modify.disable.1=/interface/vlan/print where name=${ifaceTitle()}
sa.terminal.serv.modify.disable.2=/interface/vlan/disable .id=${mikrotikLastIds()}
# команды, вызываемые при включении опции ID=x (и дочерних опций по отношению к опции с ID=x) на сервисе
sa.terminal.serv.inetOption.1.enable.1=/queue/simple/print where target=${ifaceTitle()}
sa.terminal.serv.inetOption.1.enable.2=/queue/simple/set .id=${mikrotikLastIds()} max-limit= ${param(option() , 'mikrotik_rate','20M/20M')}
|
Еще пример:
Блок кода | ||
---|---|---|
| ||
# Команды, вызываемые при включении опции ID=x (и дочерних опций по отношению к ID=x) на соединении sa.terminal.connection.inetOption.1.enable.1=/ip/firewall/address-list/print .proplist=.id where address=${ip()} and comment=bgb${servId()} sa.terminal.connection.inetOption.1.enable.2=${skipIfEmpty(mikrotikLastIds())}/ip/firewall/address-list/remove .id=${mikrotikLastIds()} sa.terminal.connection.inetOption.1.enable.3=/ip/firewall/address-list/add address=${ip()} list=${param(option(1),'list','512k_ip')} comment=bgb${servId()} # команды, вызываемые при отключении опции ID=x (и дочерних опций по отношению к ID=x) на соединении sa.terminal.connection.inetOption.1.disable.1=/ip/firewall/address-list/print .proplist=.id where address=${ip()} and comment=bgb${servId()} sa.terminal.connection.inetOption.1.disable.2=${skipIfEmpty(mikrotikLastIds())}/ip/firewall/address-list/remove .id=${mikrotikLastIds()} |
Старый режим
Так же есть вот такой тип режим работы:
Информация |
---|
typesa.terminal.protocol=mikortik |
Это тоже проткол протокол Mikrotik API, но другой синтакс команд в конфигурации. В данный момент он объявлен устаревшим и возможно будет удален в следующих версиях. Рекомендуем Не рекомендуем его не использовать.
Там Здесь команды задаются немного немного другим образом:
Блок кода |
---|
#Команды включения сервиса на устройстве sa.terminal.serv.modify.enable.1=/interface/vlan/print\n?name=${ifaceTitle()} sa.terminal.serv.modify.enable.2=/interface/vlan/enable\n.id=${mikrotikLastIds()} #Выключение интерфейса sa.terminal.serv.modify.disable.1=/interface/vlan/print\n?name=${ifaceTitle()} sa.terminal.serv.modify.disable.2=/interface/vlan/disable\n.id=${mikrotikLastIds()} |