- Большинство фильтров могут быть before и аfter.
- У всех
есть condition.
- У всех
можно использовать либо 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 при возникновении во время обработки запроса ошибки. Должен быть на вершине стека вызова
Спецификации фильтров
В конфигурации любого настроенного фильтра, в секции 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', }, }