Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Info

Конфигурации фильтров являются общими для всех экземпляров плагинов. Набор используемых фильтров и порядок их вызова определяется списком plugins → base → <plugin_instance_name> → call_stack конфигурации конкретного экземпляра плагина.

...

Info

Если ключа, значение которого формирует фильтр, нет, он будет добавлен. Если ключ уже существует, его значение будет заменено новым.

Спецификации фильтров

В конфигурации любого настроенного фильтра, в секции specs, могут быть описаны его спецификации — примеры входных данных и результатов их обработки фильтром. Агент HARD при запуске тестирует все активные, то есть участвующие хотя бы в одном стэке обработки запросов, фильтры, для которых задана спецификация. На вход фильтра подаются данные, указанные в секции input спецификации, а результат обработки сравнивается с заданным в секции expected. Если обнаруживается несоответствие, генерируется ошибка с указанием наименования проблемной спецификации (ключ name) и отличий вывода фильтра от ожидаемого значения. Запуск агента при возникновении ошибки прекращается.

Code Block
titleПример спецификации фильтра
plugins:
  filters:
    set_value_before:
      fix_duplicated_acct-session-id_attribute:
        condition: '   $context.has_tag?("accounting")
                   and $request.RAD_REQUEST.try("Acct-Session-Id", "").to_s() != $request.RAD_REQUEST.try("Acct-Session-Id", "")'
        destination: $request.RAD_REQUEST.Acct-Session-Id
        value_expression: $request.RAD_REQUEST.Acct-Session-Id[0]
        specs:
          - name: fix_duplicated_acct-session-id_attribute
            input:
              tags: [accounting]
              request:
                RAD_REQUEST:
                  Acct-Session-Id:
                    - '5746ECB0-00000027'
                    - '5746ECB0-00000027'
            expected:
              tags: [accounting]
              request:
                RAD_REQUEST:
                  Acct-Session-Id: '5746ECB0-00000027'
          - name: pass_through_correct_acct-session-id_attribute
            input:
              tags: [accounting]
              request:
                RAD_REQUEST:
                  Acct-Session-Id: '5746ECB0-00000027'
            expected:
              tags: [accounting]
              request:
                RAD_REQUEST:
                  Acct-Session-Id: '5746ECB0-00000027' 

Если в таком фильтре, в ключе condition, заменить оператор != на ==, то фильтр не изменит входные данные — результат работы фильтра не совпадёт с ожидаемым и возникнет ошибка:

Code Block
25.11.2016 18:01:17.291 13384/Worker#1   MainThread ERROR    Failed filter spec "fix_duplicate_acct-session-id_attribute" with diff
--- a
+++ b
{
 'RAD_REQUEST': {
 -'Acct-Session-Id': ['5746ECB0-00000027', '5746ECB0-00000027'],
 +'Acct-Session-Id': '5746ECB0-00000027',
 },
}

Универсальные фильтры

case_before, case_after

...

ПараметрОписание
tagsНаименование тега, которым должен быть промаркирован запрос для выполнения фильтра. В данном параметре может быть указан список наименований тегов — в таком случае фильтр будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags.
conditionУсловие применения фильтра. Фильтр выполняется, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags).
case

Список пар ключей when и then. Ключ when содержит вычисляемое выражение — условие, а then — пары ключ-значение, которые будут вычислены и записаны. Условия when вычисляются и проверяются в порядке следования до первого успешного результата.

elseОпциональный набор пар

Последним элементом списка может быть else: пары ключ-значение

, которые

из него будут вычислены и записаны, если ни одно из

выражений

условий when

в параметре case

не

вернуло истину

выполнилось.


Code Block
titleПример фильтра case_after: добавление номера порта для одних запросов и IP сервера для другихbefore: различное декодирование DHCP-опции 82 при различных форматах Circuit-Id
collapsetrue
plugins:
  filters:
    case_afterbefore:
      adddecode_dst-port_for_dlink-relays_or_server-ip_for_othersoption_82:
        tags: post_auth
        case:
          - when: $context$request.has_tagRAD_REQUEST.DHCP-Relay-Circuit-Id.like?("dlink_dhcp-relay^0x0006[0-9a-f]{12}$")
            then:
              $response.'$var.PE-Switch-MAC-Address': $request.RAD_REPLYREQUEST.PacketDHCP-Dst-Port: '"67"'
Relay-Remote-Id.substring(2).format_mac()
              '$var.PE-Switch-Port-Number': $request.RAD_REQUEST.DHCP-Relay-Circuit-Id.substring(-2).to_i(16).to_s()
          - when: $response$request.RAD_REPLYREQUEST.try("DHCP-Router-Address").ip4?(Relay-Circuit-Id.like?("^0x[0-9a-f]{20}$")
            then:
              $response.'$var.PE-Switch-MAC-Address': $request.RAD_REPLYREQUEST.DHCP-DHCPRelay-Server-Identifier: $response.RAD_REPLY.DHCP-Router-Address
Remote-Id.substring(2).format_mac()
              '$var.PE-Switch-Port-Number': $request.RAD_REQUEST.DHCP-Relay-Circuit-Id.substring(-10, -8).to_i(16).to_s()
          - else:
 $response.RAD_REPLY             '$var.PE-Switch-IP-Address': $request.RAD_REQUEST.DHCP-ServerRelay-IP-Address: $responseRemote-Id.unhex()
              '$var.PE-Switch-Port-Number': $request.RAD_REPLYREQUEST.DHCP-Router-AddressRelay-Circuit-Id.unhex().regexp_replace("^.+/(\d+):\d+$", "\\1")

check_attr_before

...

Выполнение некоторого действия с запросом.

...

Code Block
titleПример фильтра divide_after: пропорциональное уменьшение скоростей доступа
collapsetrue
plugins:
  filters:
    divide_after:
      tags:
        - authorize
        - service_status_ok
        - residential_customer
      divide_speed_limits:
        factors:
          '$response.RAD_REPLY.HARD-Day-In-Speed': 8
          '$response.RAD_REPLY.HARD-Day-Out-Speed': 2
          '$response.RAD_REPLY.HARD-Night-In-Speed': 4
          '$response.RAD_REPLY.HARD-Night-Out-Speed': 2

...

Code Block
titleПример фильтра format_after: формирование политики ограничения скорости с расчётом burst-значений
collapsetrue
plugins:
  filters:
    format_after:
      combine_rate_and_burst_values:
        tags: [authorize, individual_customer]
        values:
          InRate: '$response.RAD_REPLY.InRate'
          OutRate: '$response.RAD_REPLY.OutRate'
        destination: '$response.Speed-Limits'
        template: 'InRate=#{$InRate};InBurst=#{($InRate.to_i() / 8 * 900).to_i()};OutRate=#{$OutRate};OutBurst=#{($OutRate.to_i() / 8 * 900).to_i()}'
        delete_values: true

...

Code Block
titleПример указания фильтра reject_on_error/main в стэке обработки запроса
collapsetrue
plugins:
  base:
    dhcp-ip-private:
      call_stack:
        # Стандартные фильтры
        - reject_on_error/main
        - set_tag_before/request_type

        # Для DHCP-relay D-Link нужны особые параметры - маркируем запрос
        - set_tag_before/dlink_dhcp-relay

        # Добавление MS-атрибута с маршрутами
        - set_value_after/add_dhcp-ms-classless-static-route_attr

        # Заполнение атрибута с маршрутами
        - reduce_after/fill_dhcp-classless-static-route_attr

        # Добавление в ответ порта для D-Link или IP сервера для остальных
        - case_after/add_dst-port_for_dlink-relays_or_server-ip_for_others

Спецификации фильтров

В конфигурации любого настроенного фильтра, в секции specs, могут быть описаны его спецификации — примеры входных данных и результатов их обработки фильтром. Агент HARD при запуске тестирует все активные, то есть участвующие хотя бы в одном стэке обработки запросов, фильтры, для которых задана спецификация. На вход фильтра подаются данные, указанные в секции input спецификации, а результат обработки сравнивается с заданным в секции expected. Если обнаруживается несоответствие, генерируется ошибка с указанием наименования проблемной спецификации (ключ name) и отличий вывода фильтра от ожидаемого значения. Запуск агента при возникновении ошибки прекращается.

Code Block
titleПример спецификации фильтра
plugins:
  filters:
    set_value_before:
      fix_duplicated_acct-session-id_attribute:
        condition: '   $context.has_tag?("accounting")
                   and $request.RAD_REQUEST.try("Acct-Session-Id", "").to_s() != $request.RAD_REQUEST.try("Acct-Session-Id", "")'
        destination: $request.RAD_REQUEST.Acct-Session-Id
        value_expression: $request.RAD_REQUEST.Acct-Session-Id[0]
        specs:
          - name: fix_duplicated_acct-session-id_attribute
            input:
              tags: [accounting]
              request:
                RAD_REQUEST:
                  Acct-Session-Id:
                    - '5746ECB0-00000027'
                    - '5746ECB0-00000027'
            expected:
              tags: [accounting]
              request:
                RAD_REQUEST:
                  Acct-Session-Id: '5746ECB0-00000027'
          - name: pass_through_correct_acct-session-id_attribute
            input:
              tags: [accounting]
              request:
                RAD_REQUEST:
                  Acct-Session-Id: '5746ECB0-00000027'
            expected:
              tags: [accounting]
              request:
                RAD_REQUEST:
                  Acct-Session-Id: '5746ECB0-00000027' 

Если в таком фильтре, в ключе condition, заменить оператор != на ==, то фильтр не изменит входные данные — результат работы фильтра не совпадёт с ожидаемым и возникнет ошибка:

Code Block
25.11.2016 18:01:17.291 13384/Worker#1   MainThread ERROR    Failed filter spec "fix_duplicate_acct-session-id_attribute" with diff
--- a
+++ b
{
 'RAD_REQUEST': {
 -'Acct-Session-Id': ['5746ECB0-00000027', '5746ECB0-00000027'],
 +'Acct-Session-Id': '5746ECB0-00000027',
 },
}