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

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 10 Next »

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

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

case_before, case_after

Установка значений в зависимости от выполнения условий.

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

check_attr_before, check_attr_after

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

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

delete_attrs_before, delete_attrs_after

Удаление ключей.

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

divide_before, divide_after

Массовое деление значений ключей на заданные делители.

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

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).

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

match_before, match_after

Разбор входного значения-строки по шаблону. Шаблон - регулярное выражение с именованными группами. См. также фильтр split.

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

multiply_before, multiply_after

Массовое умножение значений ключей на заданные множители.

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

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

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

set_value_before, set_value_after

Установка значения одного ключа.

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

split_before, split_after

Разбор входного значения-строки по разделителю с записью полученных значений в различные ключи. См. также фильтр match.

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

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

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

render_reply_after

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

reject_on_error

Отправка Access-Reject при возникновении во время обработки запроса ошибки. Должен быть на вершине стека вызова (question)

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

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

Пример спецификации фильтра
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, заменить оператор != на ==, то фильтр не изменит входные данные — результат работы фильтра не совпадёт с ожидаемым и будет сгенерирована ошибка:

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',
 },
}
  • No labels