Иногда может возникать ситуация, когда оборудование доступа перезагружается или выходит из строя, при этом появляется необходимость восстановить текущее состояние оборудования или кэша агента 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 данного типа сообщений включает в себя пару «Атрибут — Значение». При обработке запроса система выбирает операторское оборудование, у которого есть активные профили, содержащие атрибут из элемента vc_key со значением из vc_value. По этому оборудованию (их может быть несколько) формируются и отправляются на выполнение агенту HEX команды с типом «Подключение» для всех действующих конфигурациий.

Команды при обработке такого запроса формируются системой только на подключение и только для активных конфигураций. Команды на отключение по оборудованию без активных конфигураций не формируются.


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   ENQ_TIME,
         DEQ_TIME,
         CEIL(DEQ_TIME - ENQ_TIME) PROC_DURATION_SEC,
         MSG_STATE,
         NVL(I.USER_DATA.TEXT_LOB, I.USER_DATA.TEXT_VC) MESSAGE
FROM     AQ$AQ_IN_HYDRA_SYS I
ORDER BY ENQ_TIME;