Иногда может возникать ситуация, когда оборудование доступа перезагружается или выходит из строя, при этом появляется необходимость восстановить текущее состояние оборудования или кэша агента HARD.
Для запроса текущего состояния необходимо отправить в системную очередь AIS_NET.HB_SYS_IN_*
специальным образом сформированное сообщение, формат которого зависит от типа запроса и описан ниже. Сообщения из данной очереди извлекаются и обрабатываются системным заданием «Обработка входящей системной очереди».
Наименование очереди для конкретной фирмы можно получить c помощью запроса:
SELECT SS_QUEUES_PKG_S.GET_QUEUE_FOR_FIRM( num_N_FIRM_ID => :num_N_FIRM_ID, num_N_QUEUE_TYPE_ID => SYS_CONTEXT('CONST', 'QUEUE_SystemIn')) FROM DUAL;
Все действия при обработке запроса происходят в рамках фирмы, идентификатор которой указан в элементе system_message.n_firm_id
самого запроса.
Формирование команд применения конфигураций
Если необходимо, например, восстановить состояние программного файервола, ограничивающего доступ абонентов в сеть, необходимо отправить в очередь сообщение следующего вида:
<system_message> <vc_message_type>ProvisioningCurrentStateRequest</vc_message_type> <n_firm_id>100</n_firm_id> <content> <vc_key>Provider-Equipment-Attribute-Name</vc_key> <vc_value>Attribute-Value</vc_value> <n_value /> <d_value /> </content> </system_message>
Элемент system_message.content
данного типа сообщений включает в себя пару «Атрибут — Значение». Система формирует и отправляет на выполнение агенту HEX команды с типом «Подключение» по всем действующим конфигурациям, в которых участвуют профили операторского оборудования, содержащие атрибут из элемента vc_key
со значением из vc_value
.
Команды при обработке такого запроса формируются системой только на подключение и только для активных конфигураций. Команды на отключение по оборудованию без активных конфигураций не формируются.
SET SERVEROUTPUT ON; DECLARE num_N_FIRM_ID NUMBER := 100; vch_Attribute VARCHAR2(100) := 'MikroTik-IP'; vch_AttrValue VARCHAR2(100) := '10.15.24.38'; -- vch_VC_QUEUE_NAME VARCHAR2(30); vch_VC_MESSAGE VARCHAR2(4000); BEGIN vch_VC_MESSAGE := ' <system_message> <vc_message_type>ProvisioningCurrentStateRequest</vc_message_type> <n_firm_id>' || num_N_FIRM_ID || '</n_firm_id> <content> <vc_key>' || vch_Attribute || '</vc_key> <vc_value>' || vch_AttrValue || '</vc_value> <n_value /> <d_value /> </content> </system_message>'; vch_VC_QUEUE_NAME := SS_QUEUES_PKG_S.GET_QUEUE_FOR_FIRM( num_N_FIRM_ID => num_N_FIRM_ID, num_N_QUEUE_TYPE_ID => CONST.QUEUE_SystemIn); SS_QUEUES_PKG.ENQUEUE_MESSAGE( vch_VC_QUEUE_NAME => vch_VC_QUEUE_NAME, vch_VC_MESSAGE => vch_VC_MESSAGE); COMMIT; DBMS_OUTPUT.PUT_LINE('Queue: ' || vch_VC_QUEUE_NAME); DBMS_OUTPUT.PUT_LINE('Message: ' || vch_VC_MESSAGE); END; /
Отправка профилей и привязок оборудования агенту HARD
Система отправляет только действующие на момент запроса профили и привязки оборудования. Если кэш агента содержит какие-то старые данные (например агент работал ранее с тестовым экземпляром Гидры), его необходимо сначала очистить от этих записей:
db.profiles.remove({}); db.equipment_binds.remove({});
После очистки кэша агента можно отправить в очередь сообщение следующего вида:
<system_message> <vc_message_type>ProvisioningSendProfilesAndBinds</vc_message_type> <n_firm_id>100</n_firm_id> </system_message>
В элементе n_firm_id
данного запроса необходимо указать идентификатор фирмы, по которой необходимо отправить данные.
Такую же отправку можно вызвать PL/SQL-скриптом непосредственно из основной БД:
BEGIN RP_PROFILES_PKG.SEND_ALL_PROFILES( num_N_FIRM_ID => 100); COMMIT; EP_EQUIPMENT_PKG.ENQUEUE_BINDS_BY_FIRM( num_N_FIRM_ID => 100, b_CommitBatches => CONST.b_TRUE); COMMIT; END; /
В результате обработки сообщений через системные очереди агенту HARD будут отправлены все действующие профили абонентского и операторского оборудования, а также привязки данного оборудования друг к другу и подписки абонентов на службы.
Для отладки можно использовать следующий запрос:
SELECT I.ENQ_TIME + 3/24, I.DEQ_TIME + 3/24, I.DEQ_TIME - I.ENQ_TIME, NVL(I.USER_DATA.TEXT_LOB, I.USER_DATA.TEXT_VC) MESSAGE FROM AQ_IN_HYDRA_SYS I ORDER BY I.ENQ_TIME; /