Page tree

Versions Compared

Key

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

Table of Contents

Info
  • Большинство фильтров могут быть before и аfter.
  • У всех (question) есть condition.
  • У всех (question) можно использовать либо value, либо value_expression.
  • Если ключа

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

    Info

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

    есть

    уже существует, его значение будет заменено новым.

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

    case_before, case_after

    Установка значений в зависимости от выполнения условий.Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_case_filter.pyодного или нескольких условий.

    ПараметрОписание
    tagsНаименование тега, которым должен быть промаркирован запрос для выполнения фильтра. В данном параметре может быть указан список наименований тегов — в таком случае фильтр будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags.
    conditionУсловие применения фильтра. Фильтр выполняется, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags).
    caseСписок пар ключей when и then. Ключ when содержит вычисляемое выражение — условие, а then — пары ключ-значение, которые будут вычислены и записаны. Условия when вычисляются и проверяются в порядке следования до первого успешного результата.
    elseОпциональный набор пар ключ-значение, которые будут вычислены и записаны, если ни одно из выражений when в параметре case не вернуло истину.
    Code Block
    titleПример фильтра case_after: добавление номера порта для одних запросов и IP сервера для других
    collapsetrue
    plugins:
      filters:
        case_after:
          add_dst-port_for_dlink-relays_or_server-ip_for_others:
            case:
              - when: $context.has_tag?("dlink_dhcp-relay")
                then:
                  $response.RAD_REPLY.Packet-Dst-Port: '"67"'
              - when: $response.RAD_REPLY.try("DHCP-Router-Address").ip4?()
                then:
                  $response.RAD_REPLY.DHCP-DHCP-Server-Identifier: $response.RAD_REPLY.DHCP-Router-Address
                  $response.RAD_REPLY.DHCP-Server-IP-Address: $response.RAD_REPLY.DHCP-Router-Address

    check_attr_before, check_attr_after

    Прерывание обработки запроса.

    Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_check_attr.pyВыполнение некоторого действия с запросом.

    ПараметрОписание
    tagsНаименование тега, которым должен быть промаркирован запрос для выполнения фильтра. В данном параметре может быть указан список наименований тегов — в таком случае фильтр будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags.
    conditionУсловие применения фильтра. Фильтр выполняется, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags).
    actiontypeТип действия. Единственный поддерживаемый на данный момент — досрочное прекращение обработки запроса halt_processing.
    actiontagТег, которым запрос необходимо промаркировать. Может быть указано несколько тегов в виде списка — запрос будет промаркирован каждым из них.
    actionargumentsПараметры выполняемого действия. В случае halt_processing — шаблон ответа на запрос, который будет отправлен. Структура шаблона аналогична таковым в ключах plugins → base → <plugin_instance_name> → actions → <action_name> → reply конфигурации плагина.
    Code Block
    titleПример фильтра check_attr_before: игнорирование лишних пакетов аккаунтинга
    collapsetrue
    plugins:
      filters:
        check_attr_before:
          finish_processing_of_unnecessary_accounting:
            condition: '   $context.has_tag?("accounting")
                       and $request.RAD_REQUEST.try("Session-Error-Msg").in?("Radius test by administrator;Authentication failure".split(";"))'
            action:
              type: halt_processing
              arguments:
                reply:
                  result: $rlm.OK

    delete_attrs_before, delete_attrs_after

    Удаление ключей.Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_delete_attrs_filter.pyатрибутов по наименованию или по шаблону значения.

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

    attributes

    Список полных наименований атрибутов, которые необходимо удалить.
    attribute_patternsПары <dict>: <pattern>. Из словаря <dict> удаляются все атрибуты, наименование которых удовлетворяет регулярному выражению <pattern>.
    Code Block
    titleПример фильтра delete_attrs_after: удаление всех параметров сервиса при его отсутствии
    collapsetrue
    plugins:
      filters:
        delete_attrs_after:
          no_first_service:
            condition: $context.has_tag?("authenticate") and $response.RAD_REPLY.try("ERX-Service-Activate:1").empty?()
            attribute_patterns:
              $response.RAD_REPLY: '^ERX-Service.+:1$'
    Code Block
    titleПример фильтра delete_attrs_after: удаление из ответа атрибутов IP-адреса и маски подсети при отсутствии адреса
    collapsetrue
    plugins:
      filters:
        delete_attrs_after:
          no_ip_address:
            condition: $context.has_tag?("authenticate") and $response.RAD_REPLY.try("Framed-IP-Address").empty?()
            attributes:
              - $response.RAD_REPLY.Framed-IP-Address
              - $response.RAD_REPLY.Framed-IP-Netmask

    divide_before, divide_after

    Массовое деление значений ключей на заданные делители.Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_divide_filter.pyатрибутов.

    ПараметрОписание
    tagsНаименование тега, которым должен быть промаркирован запрос для выполнения фильтра. В данном параметре может быть указан список наименований тегов — в таком случае фильтр будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags.
    conditionУсловие применения фильтра. Фильтр выполняется, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags).
    factorsПары <attr_name>: <divider>, где <attr_name> — полное наименование атрибута, значение которого должно быть разделено на <divider>. Делимое и частное дополнительно приводятся к целому числу отбрасыванием дробной части. Если указанный в <attr_name> атрибут отсутствует, результатом операции над ним станет пустое значение.
    Code Block
    titleПример фильтра divide_after: пропорциональное уменьшение скоростей доступа
    collapsetrue
    plugins:
      filters:
        divide_after:
          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

    format_before, format_after

    Формирование строкового значения на основе шаблона.

    Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_format_filter.py

    map_before, map_after

    Применение некоторого преобразования к удовлетворяющим заданному фильтру элементам входного списка и формирование списка результатов (https://ru.wikipedia.org/wiki/Map).

    ...

    ПараметрОписание
    tagsНаименование тега, которым должен быть промаркирован запрос для выполнения фильтра. В данном параметре может быть указан список наименований тегов — в таком случае фильтр будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags.
    conditionУсловие применения фильтра. Фильтр выполняется, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags).
    destinationПолное наименование атрибута, в который необходимо записать результат.
    valuesПары ключ-значение, где ключ — наименование подстановки, а значение — полное наименование соответствующего ей атрибута.
    templateСтрока-шаблон, содержащая подстановки в формате #{<subst_expression>}, где <subst_expression> — выражение, вычисляемое с использованием подстановок-переменных из values.
    delete_valuesФлаг (true или false), определяющий, нужно ли по окончании удалять атрибуты, перечисленные в values. По умолчанию атрибуты не удаляются.
    Code Block
    titleПример фильтра format_after: формирование политики ограничения скорости с расчётом burst-значений
    collapsetrue
    plugins:
      filters:
        format_after:
          combine_rate_and_burst_values:
            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

    map_before, map_after

    Преобразование списка значений с предварительной фильтрацией его элементов.

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

    value

    Список значений, который необходимо преобразовать. Используется при отсутствии параметра value_expression.
    filter_expressionВычисляемое для каждого элемента входного списка выражение, определяющее, нужно ли данный элемент преобразовывать и включать в результат. В выражении может использоваться переменная $value, которая соответствует проверяемому элементу списка. Если параметр не задан, преобразование выполняется над всеми элементами входного списка.
    transform_expressionВычисляемое для каждого прошедшего filter_expression элемента входного списка выражение, выполняющее необходимое преобразование. Переменная $value, в данном выражении представляет элемент входного списка. Если параметр не задан, выполняется тождественное преобразование.
    Code Block
    titleПример фильтра map_before: формирование списка подсетей, в которые входит IP-адрес
    collapsetrue
    plugins:
      filters:
        map_before:
          get_possible_subnets_list:
            value_expression: '"27,28,29,30".split(",")'
            destination: '$var.Possible-Subnets'
            transform_expression: '$request.RAD_REQUEST.Framed-IP-Address.ip4_and($value.to_subnet_mask()) + "/" + $value'
    
    Code Block
    titleПример фильтра map_after: расчёт Dyncamic-QoS-Param для SmartEdge
    collapsetrue
    plugins:
      filters:
        map_after:
          build_dynamic-qos-param:
            destination: '$response.RAD_REPLY.Dynamic-QoS-Param'
            value:
              - ['meter-class-rate CLS-DAY-OUT rate-absolute',   'Day-In-Speed',    1]
              - ['meter-class-burst CLS-DAY-OUT',                'Day-In-Speed',    128]
              - ['meter-class-excess-burst CLS-DAY-OUT',         'Day-In-Speed',    192]
              - ['meter-class-rate CLS-NIGHT-OUT rate-absolute', 'Night-In-Speed',  1]
              - ['meter-class-burst CLS-NIGHT-OUT',              'Night-In-Speed',  128]
              - ['meter-class-excess-burst CLS-NIGHT-OUT',       'Night-In-Speed',  192]
              - ['police-class-rate CLS-DAY-IN rate-absolute',   'Day-Out-Speed',   1]
              - ['police-class-burst CLS-DAY-IN',                'Day-Out-Speed',   128]
              - ['police-class-excess-burst CLS-DAY-IN',         'Day-Out-Speed',   192]
              - ['police-class-rate CLS-NIGHT-IN rate-absolute', 'Night-Out-Speed', 1]
              - ['police-class-burst CLS-NIGHT-IN',              'Night-Out-Speed', 128]
              - ['police-class-excess-burst CLS-NIGHT-IN',       'Night-Out-Speed', 192]
            filter_expression: '$var.try($value[1]).present?()'
            transform_expression: '$value[0] + " " + ($var[$value[1]].to_i() * $value[2]).to_s()'

    match_before, match_after

    Разбор входного значения-строки по шаблону. Шаблон -

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

    ...

    Результат разбора — записанные в destination пары <key>: <value>, где <key> — наименование группы, а <value> — соответствующая данной группе часть входной строки.
    transformationsПары <key>: <transformation>, определяющие дополнительные преобразования извлечённых из входной строки значений. Здесь <key> — наименование группы из параметра matcher, а <transformation> — преобразование в виде вычисляемого относительно переменной $value выражения. Переменная $value в этих выражениях соответствует исходному значению, полученному при разборе входной строки. Если параметр не задан, преобразования не выполняются.
    Code Block
    titleПример фильтра match_before: извлечение S-VLAN и С-VLAN из NAS-Port-Id
    collapsetrue
    plugins:
      filters:
        match_before:
          get_remote_circuit_ids:
            condition: not $context.has_tag?("accounting_on_or_off_packet") and $request.RAD_REQUEST.try("NAS-Port-Id", "").like?('^.+:\d+-\d+$')
            value_expression: $request.RAD_REQUEST.NAS-Port-Id
            destination: $var.Remote-Circuit-Ids
            # Q-in-Q VLAN:    S-VLAN        - C-VLAN=PortNumber+100
            matcher: '^.+:(?P<Remote_Id>\d+)-(?P<Circuit_Id>\d+)$'
            transformations:
              # Remote_Id = S-VLAN
              Remote_Id: $value.to_i()
              # Circuit_Id = C-VLAN - 100
              Circuit_Id: $value.to_i() - 100

    multiply_before, multiply_after

    Массовое умножение значений ключей на заданные множители.Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_multiply_filter.pyатрибутов.

    ПараметрОписание
    tagsНаименование тега, которым должен быть промаркирован запрос для выполнения фильтра. В данном параметре может быть указан список наименований тегов — в таком случае фильтр будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags.
    conditionУсловие применения фильтра. Фильтр выполняется, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags).
    factorsПары <attr_name>: <multiplier>, где <attr_name> — полное наименование атрибута, значение которого должно быть умножено на <multiplier>. Множимое и произведение дополнительно приводятся к целому числу отбрасыванием дробной части. Если указанный в <attr_name> атрибут отсутствует, результатом операции над ним станет пустое значение.
    Code Block
    titleПример фильтра multiply_after: кратное увеличение скоростей
    collapsetrue
    plugins:
      filters:
        multiply_after:
          multiply_speed_limits:
            condition: $context.has_tag?('trial_period')
            factors:
              '$response.RAD_REPLY.HARD-Day-In-Speed': 2
              '$response.RAD_REPLY.HARD-Day-Out-Speed': 4
              '$response.RAD_REPLY.HARD-Night-In-Speed': 4
              '$response.RAD_REPLY.HARD-Night-Out-Speed': 6

    reduce_before, reduce_after

    Свёртка входного списка значений с предварительной фильтрацией его элементов (https://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D1%91%D1%80%D1%82%D0%BA%D0%B0_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0).Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_reduce_filter.py.

    ПараметрОписание
    tagsНаименование тега, которым должен быть промаркирован запрос для выполнения фильтра. В данном параметре может быть указан список наименований тегов — в таком случае фильтр будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags.
    conditionУсловие применения фильтра. Фильтр выполняется, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags).
    destinationПолное наименование атрибута, в который необходимо записать результат.
    value_expressionВычисляемое выражение, возвращающее список значений, который необходимо свернуть.
    filter_expressionВычисляемое для каждого элемента входного списка выражение, определяющее, нужно ли данный элемент включать в свёртку. В выражении может использоваться переменная $value, которая соответствует проверяемому элементу списка. Если параметр не задан, свёртка выполняется по всем элементам входного списка.
    initial_expressionВычисляемое выражение, определяющее начальное значение свёртки. Если параметр не задан, он полагается равным пустому значению.
    reduce_expressionВычисляемое для каждого прошедшего filter_expression элемента входного списка выражение, определяющее комбинирующую функцию. Переменная $value, в данном выражении представляет элемент входного списка, а переменная $accumulator — текущее значение свёртки.
    Code Block
    titleПример фильтра reduce_before: преобразование Cisco-AVPair в словарь
    collapsetrue
    plugins:
      filters:
        reduce_before:
          convert_cisco-avpair_to_dictionary:
            destination: $var.Cisco-Attributes
            value_expression: $request.RAD_REQUEST.Cisco-AVPair
            initial_expression: '{}'
            reduce_expression: '$accumulator.merge($value.split("=", 1))'
    Code Block
    titleПример фильтра reduce_after: формирование DHCP-Classless-Static-Route для IP шлюза подсети
    collapsetrue
    plugins:
      filters:
        reduce_after:
          # https://tools.ietf.org/html/rfc3442
          fill_dhcp-classless-static-route_attr:
            condition: $response.RAD_REPLY.try("DHCP-Router-Address").ip4?()
            initial_expression: '"0x"'
            reduce_expression: $accumulator + $value.to_i().to_hex().substring(2).pad_left(2, "0")
            value_expression: '(   "9" + "," + "10.0"           + "," + $response.RAD_REPLY.DHCP-Router-Address + ","
                                + "24" + "," + "192.168.100"    + "," + $response.RAD_REPLY.DHCP-Router-Address + ","
                                + "24" + "," + "192.168.113"    + "," + $response.RAD_REPLY.DHCP-Router-Address + ","
                                + "24" + "," + "192.168.120"    + "," + $response.RAD_REPLY.DHCP-Router-Address + ","
                                + "24" + "," + "192.168.158"    + "," + $response.RAD_REPLY.DHCP-Router-Address + ","
                                + "23" + "," + "192.168.224"    + "," + $response.RAD_REPLY.DHCP-Router-Address      ).replace(".", ",").split(",")'
            destination: $response.RAD_REPLY.DHCP-Classless-Static-Route

    set_tag_before, set_tag_after

    Маркировка запроса тегом (добавление тега в список $context.tags).Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_set_tag_filter.py

    ПараметрОписание
    tagsНаименование тега, которым должен быть промаркирован запрос для выполнения фильтра. В данном параметре может быть указан список наименований тегов — в таком случае фильтр будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags.
    conditionУсловие применения фильтра. Фильтр выполняется, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags).
    valueНаименование тега, которым необходимо промаркировать запрос.
    value_expressionВычисляемое выражение, возвращающее строку — наименование тега, которым должен быть промаркирован запрос. Используется, если не задан параметр value.
    Code Block
    titleПример фильтра set_tag_before: маркировка запроса соответствующим его типу тегом
    collapsetrue
    plugins:
      filters:
        set_tag_before:
          request_type:
            value_expression: $request.type
    Code Block
    titleПример фильтра set_tag_before: маркировка отдельным тегом запросов Accounting-On/-Off
    collapsetrue
    plugins:
      filters:
        set_tag_before:
          accounting_on_or_off_packet:
            condition: '   $context.has_tag?("accounting")
                       and $request.RAD_REQUEST.Acct-Status-Type.in?("Accounting-On;Accounting-Off".split(";"))'
            value: accounting_on_or_off_packet

    set_value_before, set_value_after

    Установка значения одного атрибута.

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

    ...

    вернуло истину, либо не задано (и не используется tags).
    destinationПолное наименование атрибута, в который необходимо записать результат.
    valueЗначение, которое необходимо записать в destination.
    value_expressionВыражение, результат вычисления которого должен быть записан в destination. Используется, если не задан параметр value.
    Code Block
    titleПример фильтра set_value_before: добавление IP к списку подсетей
    collapsetrue
    plugins:
      filters:
        set_value_before:
          add_ip_to_cpe-addresses-list:
            destination: $var.CPE-Addresses-List
            value_expression: '$var.Possible-Subnets + $request.RAD_REQUEST.Framed-IP-Address.split(";")'
    Code Block
    titleПример фильтра set_value_after: копирование DHCP-Classless-Static-Route в DHCP-MS-Classless-Static-Route
    collapsetrue
    plugins:
      filters:
        set_value_after:
          add_dhcp-ms-classless-static-route_attr:
            condition: $response.RAD_REPLY.try("DHCP-Classless-Static-Route").present?()
            destination: $response.RAD_REPLY.DHCP-MS-Classless-Static-Route
            value_expression: $response.RAD_REPLY.DHCP-Classless-Static-Route

    split_before, split_after

    Разбор входного значения- строки по разделителю с записью полученных значений в различные ключи. См. также фильтр match.Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_split_filter.py.

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

    Список полных наименований атрибутов, в которые необходимо записать полученные в результате разбора значения. Первое значение сохраняется в первый атрибут, второе — во второй и т. д. Если отдельные значения сохранять не нужно, для них следует указать пустую строку вместо наименования атрибута.

    Вместо списка может быть указана одна строка — полное наименование атрибута, в который будут списком сохранены все полученные при разборе значения.

    delete_valuesФлаг (true или false), определяющий, нужно ли по окончании удалить атрибут, указанный в value_expression. По умолчанию атрибут не удаляется.
    Code Block
    titleПример фильтра split_after: извлечение скоростей из сформированного Cisco-Account-Info
    collapsetrue
    plugins:
      filters:
        split_after:
          get_speed_limits:
            # Example value: 'QU;20971520;3932160;D;20971520;3932160'
            value_expression: $response.RAD_REPLY.Cisco-Account-Info
            delimiter: ';'
            destination:
              - ''
              - '$var.Inbound-Speed'
              - '$var.Inbound-Burst'
              - ''
              - '$var.Outgoing-Speed'
              - '$var.Outgoing-Burst'

    Специальные фильтры

    encode_dhcp_options_after

    Преобразование DHCP-опций в двоичный формат в соответствии с RFC 2132. Требуется дополнительная настройка hard.pm. Аналог одноименного фильтра второй версии агента.Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_encode_dhcp_options.py

    ПараметрОписание
    tagsНаименование тега, которым должен быть промаркирован запрос для выполнения фильтра. В данном параметре может быть указан список наименований тегов — в таком случае фильтр будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags.
    conditionУсловие применения фильтра. Фильтр выполняется, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags).
    destinationПолное наименование атрибута, в который необходимо записать результат.
    valueСписок вычисляемых выражений, каждое из которых соответствует отдельной DHCP-опции. Выражение должно возвращать строку в формате <option_name>:<option_value>, где <option_name> — наименование DHCP-опции, а <option_value> — её значение. Список разрешенных опций можно получить в описании Python-библиотеки pydhcplib.
    Code Block
    titleПример фильтра encode_dhcp_options_after: маршрутизатор и DNS-серверы
    collapsetrue
    plugins:
      filters:
        encode_dhcp_options_after:
          router_and_dns-servers:
            condition: '   $context.has_tag?("authenticate")
                       and $response.RAD_REPLY.try("ERX-Dhcp-Options").empty?()
                       and $customer_profile.attributes.try("CPE-IP-Gateway").present?()'
            destination: $response.RAD_REPLY.ERX-Dhcp-Options
            value:
              - '"router:" + $customer_profile.attributes.CPE-IP-Gateway'
              - '"domain_name_server:192.168.1.2,10.10.10.1"'

    render_reply_after

    Выбор шаблона ответа и формирование по нему ответа на запрос. Позволяет формировать ответ отложенно, после выполнения некоторых after-фильтров. Пример — конфигурация агента для второй версии портала авторизации (ramtel-rad). При наличии такого фильтра в стэке обработки запроса, ядро плагина не формирует ответ, а только подбирает профили оборудования. Это позволяет провести дополнительные вычисления и проверки с помощью after-фильтров и уже на основании их результатов формировать ответ.

    ПараметрОписание
    tagsНаименование тега, которым должен быть промаркирован запрос для выполнения фильтра. В данном параметре может быть указан список наименований тегов — в таком случае фильтр будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags.
    conditionУсловие применения фильтра. Фильтр выполняется, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags).
    Code Block
    titleПример фильтра render_reply_after: отложенное формирование ответа на запросы авторизации и аутентификации
    collapsetrue
    plugins:
      filters:
        render_reply_after:
          main:
            condition: not $context.has_tag?("accounting")

    reject_on_error

    Отправка Access-Reject при возникновении ошибки во время обработки запроса ошибки. Должен быть на вершине стека вызова (question). Данный фильтр не имеет никаких параметров — он должен присутствовать только в стэке обработки запроса конфигурации ядра плагина, причём в вершине этого стэка (первым в списке).

    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) и отличий вывода фильтра от ожидаемого значения. Запуск агента при возникновении ошибки прекращается.

    ...

    Если в таком фильтре, в ключе 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',
     },
    }