Page tree
Skip to end of metadata
Go to start of metadata

В агенте HARD имеется возможность выполнения дополнительных действий по окончании обработки запросов. Данная функциональность может использоваться для отправки сведений об авторизации IPoE-порталу, или для уведомления шейпера Cisco SCE о начале новой сессии на BRAS'е другого производителя (например Ericsson SmartEdge 100).

Параметры экземпляров хуков настраивается в секции hooks общей конфигурации агента, а списки вызова нужных хуков — в конфигурациях действий соответствующих экземпляров плагинов.

Конфигурация хуков

Параметры хуков определяются в секциях hooks<hook_type><hook_name>, где <hook_type> — тип хука, а <hook_instance_name> — наименование его экземпляра.

В секции hooks → <hook_type> → default можно указывать значения по умолчанию для всех хуков. Например там можно задать параметры подключения к брокеру ActiveMQ, которому будут отправляться сообщения.

На текущий момент поддерживается только один тип хуков — send_stomp_request. Хук данного типа предназначен для отправки сообщений по протоколу STOMP.

КлючОписание
hostIP-адрес сетевого интерфейса, на котором работает получатель.
portНомер TCP-порта, на котором получатель принимает сообщения по протоколу STOMP.
destinationURL-путь, к которому необходимо выполнить запрос. При использовании в качестве получателя ActiveMQ, это может быть строка /queue/<queue_name>, где <queue_name> — наименование очереди, в которую брокер должен поместить сообщение.
loginЛогин пользователя STOMP-сервера.
passwordЛогин пользователя STOMP-сервера.
tagsНаименование тега, которым должен быть промаркирован запрос для выполнения хука. В данном параметре может быть указан список наименований тегов — в таком случае хук будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags.
conditionУсловие срабатывания хука: сообщение будет сформировано и отправлено, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags).
bodyСловарь (набор пар ключ-значение), определяющий тело сообщения. Значения в данном словаре — это вычисляемые выражения, которые обрабатываются непосредственно перед отправкой сообщения. Тело сообщения — словарь с вычисленными значениями, представленный в формате JSON.
Пример конфигурации хуков: уведомление о различных событиях IPoE-портала, Cisco SCE и техподдержки
hooks:
  send_stomp_request:
    # Параметры подключения к ActiveMQ
    default:
      host: '192.168.26.47'
      port: 61613
      login: 'hard'
      password: 'F9qqg1eDXo3h0dZnirYD'

    # Уведомление IPoE-портала об авторизации гостевой сессии
    notify_hap_about_auth_attempt:
      condition: '$context.has_tag?("redirected_to_hap")'
      destination: '/queue/hard_to_hap'
      body:

        ## Данные для обновления параметров оборудования в Гидре
        # Идентификатор подобранного абонентского оборудования
        num_N_CPE_ID: '$customer_profile.attributes.try("CPE-Id", "none")'
        # Актуальный MAC-адрес абонентского оборудования
        vch_VC_CPE_ADDRESS: '$var.try("Actual-CPE-MAC-Address", "none")'
        # IP-адрес, выданный абонентскому оборудованию
        vch_VC_CPE_IP_ADDRESS: '$request.RAD_REQUEST.Framed-IP-Address'
        # Подобранное операторское оборудование
        num_N_OP_EQUIP_ID: '$provider_profile.attributes.try("PE-Switch-Id", "none")'
        # Подобранный компонент операторского оборудования
        num_N_OP_PORT_ID: '$provider_profile.attributes.try("PE-Switch-Port-Id", "none")'
        # Абонентское оборудование, привязанное к подобранному операторскому
        num_N_BOUND_CPE_ID: '$var.CPE-Bound-To-The-Port.try("equipment_id").coalesce("none")'
        # Операторское оборудование, привязанное к подобранному абонентскому
        num_N_BOUND_OP_EQUIP_ID: '$customer_profile.provider_profiles.try(0).try("attributes").try("PE-Switch-Id", "none")'
        # Компонент операторского оборудования, привязанный к подобранному абонентскому
        num_N_BOUND_OP_PORT_ID: '$customer_profile.provider_profiles.try(0).try("equipment_id", "none")'
        # MAC-адрес абонентского оборудования, привязанного к подобранному операторскому
        vch_VC_BOUND_CPE_ADDRESS: '$var.CPE-Bound-To-The-Port.try("CPE-MAC").coalesce("none")'
        # Время поступления RADIUS-запроса в HARD
        dt_D_OPER: '$request.generated_at.to_s("%d.%m.%Y %H:%M:%S")'

        ## Данные для завершения сессии после обновления параметров оборудования в Гидре
        Session-Info:
          # Внешний идентификатор сессии
          Acct-Session-Id: '$request.RAD_REQUEST.Acct-Session-Id'
          # User-Name
          User-Name: '$request.RAD_REQUEST.User-Name'
          # IP-адрес сервера доступа
          NAS-IP-Address: '$request.RAD_REQUEST.NAS-IP-Address'
          # Флаг нового оборудования
          New-CPE-Flag: '$customer_profile.attributes.try("CPE-Id").empty?() and $var.CPE-Bound-To-The-Port.try("equipment_id").empty?()'

 
    # Уведомление утилиты управления Cisco SCE о новой сессии с полным доступом, для которой нужно ограничить скорость
    notify_sce_about_new_session_for_shaping:
      condition: '    $context.has_tag?("new-session")
                  and $customer_profile.attributes.try("Service-State") == "SERV_STATE_Provision"
                  and not $customer_profile.attributes.Speed-Limit.empty?()'
      destination: '/queue/hard_to_sce-control-tool'
      body:
        Action: '"Add policy"'
        Session-Id: '$request.RAD_REQUEST.Acct-Session-Id'
        IP-Address: '$request.RAD_REQUEST.Framed-IP-Address'
        Speed-Limit: '$customer_profile.attributes.Speed-Limit'

 
    # Уведомление приложения службы техподдержки об авторизации гостевой сессии на свободном порту коммутатора доступа 
    notify_support_team_about_guest_on_empty_port:
      condition: '    $provider_profile.present?()
                  and $var.CPE-Bound-To-The-Port.try("equipment_id").empty?()
                  and $customer_profile.null?()'
      destination: '/queue/hard_to_support-team-dashboard'
      body:
        Event-Name: '"Authorized guest session on unbound switch port"'
        Switch-IP-Address: '$provider_profile.attributes.Switch-IP-Address'
        Switch-Port-Number: '$provider_profile.attributes.Switch-Port-Number'
        CPE-MAC-Address: '$var.try("Actual-CPE-MAC-Address")'
        NAS-IP-Address: '$request.RAD_REQUEST.NAS-IP-Address'
        User-Name: '$request.RAD_REQUEST.User-Name'

Конфигурация списков вызова

Списки вызова хуков задаются в ключах plugins → base → <plugin_instance_name> → actions → <action_name> → hooks, где <plugin_instance_name> — наименование экземпляра плагина, а <action_name> — наименование соответствующего типу запроса от FreeRADIUS действия ядра плагина.

Каждый элемент таких списков — полное наименование хука в формате <hook_type>/<hook_instance_name>, где <hook_type> — тип хука, а <hook_instance_name> — наименование его экземпляра.

Пример конфигурации списков вызова хуков
plugins:
...
  base:
    se100-ipoe:
...
      actions:
...
        authenticate:
...
          hooks:
            - 'send_stomp_request/notify_hap_about_auth_attempt'
            - 'send_stomp_request/notify_support_team_about_guest_on_empty_port'
...
        accounting:
...
          hooks:
            - 'send_stomp_request/notify_sce_about_new_session_for_shaping'
...
  • No labels