Универсальные фильтры
case
Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_case_filter.py
check_attr
Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_check_attr.py
delete_attrs
Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_delete_attrs_filter.py
divide
Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_divide_filter.py
format
Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_format_filter.py
map
Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_map_filter.py
match
Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_match_filter.py
multiply
Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_multiply_filter.py
reduce
Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_reduce_filter.py
set_tag
Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_set_tag_filter.py
set_value
Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_set_value.py
split
Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_split_filter.py
Специальные фильтры
encode_dhcp_options (только after)
Тесты: https://gitlab.com/latera/hard/blob/master/src/hydra/hard/tests/filters/test_encode_dhcp_options.py
render_reply (только after)
reject_on_error (!)
Спецификации фильтров (автотесты)
https://gitlab.com/latera/hard/blob/master/conf/specs.yml.template
Code Block |
---|
title | podryad-rad-ran:/etc/hydra/hard/plugins/base-ran-rad-by-login.yml |
---|
collapse | true |
---|
|
Info |
---|
Конфигурации фильтров являются общими для всех экземпляров плагинов. Набор используемых фильтров и порядок их вызова определяется списком plugins → base → <plugin_instance_name > → call_stack конфигурации конкретного экземпляра плагина. |
Info |
---|
Если ключа, значение которого формирует фильтр, нет, он будет добавлен. Если ключ уже существует, его значение будет заменено новым. |
Спецификации фильтров
В конфигурации любого настроенного фильтра, в секции specs
, могут быть описаны его спецификации — примеры входных данных и результатов их обработки фильтром. Агент HARD при запуске тестирует все активные, то есть участвующие хотя бы в одном стэке обработки запросов, фильтры, для которых задана спецификация. На вход фильтра подаются данные, указанные в секции input
спецификации, а результат обработки сравнивается с заданным в секции expected
. Если обнаруживается несоответствие, генерируется ошибка с указанием наименования проблемной спецификации (ключ name
) и отличий вывода фильтра от ожидаемого значения. Запуск агента при возникновении ошибки прекращается.
Code Block |
---|
title | Пример спецификации фильтра |
---|
|
plugins:
filters:
set_value_before:
fix_doubledduplicated_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_doubledduplicated_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' |
Jira |
---|
server | JIRA |
---|
serverId | 7e385121-fe81-3ba6-a338-f18d15a6b63a |
---|
key | HARD-438 |
---|
|
Если в таком фильтре, в ключе 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 : пары ключ-значение из него будут вычислены и записаны, если ни одно из условий when не выполнилось. |
Code Block |
---|
title | Пример фильтра case_before: различное декодирование DHCP-опции 82 при различных форматах Circuit-Id |
---|
collapse | true |
---|
|
plugins:
filters:
case_before:
decode_option_82:
tags: post_auth
case:
- when: $request.RAD_REQUEST.DHCP-Relay-Circuit-Id.like?("^0x0006[0-9a-f]{12}$")
then:
'$var.PE-Switch-MAC-Address': $request.RAD_REQUEST.DHCP-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: $request.RAD_REQUEST.DHCP-Relay-Circuit-Id.like?("^0x[0-9a-f]{20}$")
then:
'$var.PE-Switch-MAC-Address': $request.RAD_REQUEST.DHCP-Relay-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:
'$var.PE-Switch-IP-Address': $request.RAD_REQUEST.DHCP-Relay-Remote-Id.unhex()
'$var.PE-Switch-Port-Number': $request.RAD_REQUEST.DHCP-Relay-Circuit-Id.unhex().regexp_replace("^.+/(\d+):\d+$", "\\1") |
check_attr_before
Выполнение некоторого действия с запросом.
Параметр | Описание |
---|
tags | Наименование тега, которым должен быть промаркирован запрос для выполнения фильтра. В данном параметре может быть указан список наименований тегов — в таком случае фильтр будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags . |
condition | Условие применения фильтра. Фильтр выполняется, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags ). |
action → type | Тип действия. Единственный поддерживаемый на данный момент — досрочное прекращение обработки запроса halt_processing . |
action → tag | Тег, которым запрос необходимо промаркировать. Может быть указано несколько тегов в виде списка — запрос будет промаркирован каждым из них. |
action → arguments | Параметры выполняемого действия. В случае halt_processing — шаблон ответа на запрос, который будет отправлен. Структура шаблона аналогична таковым в ключах plugins → base → <plugin_instance_name> → actions → <action_name> → reply конфигурации плагина. |
Code Block |
---|
title | Пример фильтра check_attr_before: игнорирование лишних пакетов аккаунтинга |
---|
collapse | true |
---|
|
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
Удаление атрибутов по наименованию или по шаблону значения.
Параметр | Описание |
---|
tags | Наименование тега, которым должен быть промаркирован запрос для выполнения фильтра. В данном параметре может быть указан список наименований тегов — в таком случае фильтр будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags . |
condition | Условие применения фильтра. Фильтр выполняется, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags ). |
attributes
| Список полных наименований атрибутов, которые необходимо удалить. |
attribute_patterns | Пары <dict>: <pattern> . Из словаря <dict> удаляются все атрибуты, наименование которых удовлетворяет регулярному выражению <pattern> . |
Code Block |
---|
title | Пример фильтра delete_attrs_after: удаление всех параметров сервиса при его отсутствии |
---|
collapse | true |
---|
|
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-адреса и маски подсети при отсутствии адреса |
---|
collapse | true |
---|
|
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
Массовое деление значений атрибутов.
Параметр | Описание |
---|
tags | Наименование тега, которым должен быть промаркирован запрос для выполнения фильтра. В данном параметре может быть указан список наименований тегов — в таком случае фильтр будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags . |
condition | Условие применения фильтра. Фильтр выполняется, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags ). |
factors | Пары <attr_name>: <divider> , где <attr_name> — полное наименование атрибута, значение которого должно быть разделено на <divider> . Делимое и частное дополнительно приводятся к целому числу отбрасыванием дробной части. Если указанный в <attr_name> атрибут отсутствует, результатом операции над ним станет пустое значение. |
Code Block |
---|
title | Пример фильтра divide_after: пропорциональное уменьшение скоростей доступа |
---|
collapse | true |
---|
|
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 |
format_before, format_after
Формирование строкового значения на основе шаблона.
Параметр | Описание |
---|
tags | Наименование тега, которым должен быть промаркирован запрос для выполнения фильтра. В данном параметре может быть указан список наименований тегов — в таком случае фильтр будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags . |
condition | Условие применения фильтра. Фильтр выполняется, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags ). |
destination | Полное наименование атрибута, в который необходимо записать результат. |
values | Пары ключ-значение, где ключ — наименование подстановки, а значение — полное наименование соответствующего ей атрибута. |
template | Строка-шаблон, содержащая подстановки в формате #{<subst_expression>} , где <subst_expression > — выражение, вычисляемое с использованием подстановок-переменных из values . |
delete_values | Флаг (true или false ), определяющий, нужно ли по окончании удалять атрибуты, перечисленные в values . По умолчанию атрибуты не удаляются. |
Code Block |
---|
title | Пример фильтра format_after: формирование политики ограничения скорости с расчётом burst-значений |
---|
collapse | true |
---|
|
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 |
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-адрес |
---|
collapse | true |
---|
|
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 |
---|
collapse | true |
---|
|
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 |
---|
collapse | true |
---|
|
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
Массовое умножение значений атрибутов.
Параметр | Описание |
---|
tags | Наименование тега, которым должен быть промаркирован запрос для выполнения фильтра. В данном параметре может быть указан список наименований тегов — в таком случае фильтр будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags . |
condition | Условие применения фильтра. Фильтр выполняется, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags ). |
factors | Пары <attr_name>: <multiplier> , где <attr_name> — полное наименование атрибута, значение которого должно быть умножено на <multiplier > . Множимое и произведение дополнительно приводятся к целому числу отбрасыванием дробной части. Если указанный в <attr_name> атрибут отсутствует, результатом операции над ним станет пустое значение. |
Code Block |
---|
title | Пример фильтра multiply_after: кратное увеличение скоростей |
---|
collapse | true |
---|
|
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
Свёртка списка значений с предварительной фильтрацией его элементов.
Параметр | Описание |
---|
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 в словарь |
---|
collapse | true |
---|
|
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 шлюза подсети |
---|
collapse | true |
---|
|
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
).
Параметр | Описание |
---|
tags | Наименование тега, которым должен быть промаркирован запрос для выполнения фильтра. В данном параметре может быть указан список наименований тегов — в таком случае фильтр будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags . |
condition | Условие применения фильтра. Фильтр выполняется, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags ). |
value | Наименование тега, которым необходимо промаркировать запрос. |
value_expression | Вычисляемое выражение, возвращающее строку — наименование тега, которым должен быть промаркирован запрос. Используется, если не задан параметр value . |
Code Block |
---|
title | Пример фильтра set_tag_before: маркировка запроса соответствующим его типу тегом |
---|
collapse | true |
---|
|
plugins:
filters:
set_tag_before:
request_type:
value_expression: $request.type |
Code Block |
---|
title | Пример фильтра set_tag_before: маркировка отдельным тегом запросов Accounting-On/-Off |
---|
collapse | true |
---|
|
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 к списку подсетей |
---|
collapse | true |
---|
|
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 |
---|
collapse | true |
---|
|
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
Разбор строки по разделителю.
Параметр | Описание |
---|
tags | Наименование тега, которым должен быть промаркирован запрос для выполнения фильтра. В данном параметре может быть указан список наименований тегов — в таком случае фильтр будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags . |
condition | Условие применения фильтра. Фильтр выполняется, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags ). |
value_expression | Полное наименование атрибута, строковое значение которого необходимо разобрать. |
delimiter | Строка-разделитель. |
destination | Список полных наименований атрибутов, в которые необходимо записать полученные в результате разбора значения. Первое значение сохраняется в первый атрибут, второе — во второй и т. д. Если отдельные значения сохранять не нужно, для них следует указать пустую строку вместо наименования атрибута. Вместо списка может быть указана одна строка — полное наименование атрибута, в который будут списком сохранены все полученные при разборе значения. |
delete_values | Флаг (true или false ), определяющий, нужно ли по окончании удалить атрибут, указанный в value_expression . По умолчанию атрибут не удаляется. |
Code Block |
---|
title | Пример фильтра split_after: извлечение скоростей из сформированного Cisco-Account-Info |
---|
collapse | true |
---|
|
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. Аналог одноименного фильтра второй версии агента.
Параметр | Описание |
---|
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-серверы |
---|
collapse | true |
---|
|
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-фильтров и уже на основании их результатов формировать ответ.
Параметр | Описание |
---|
tags | Наименование тега, которым должен быть промаркирован запрос для выполнения фильтра. В данном параметре может быть указан список наименований тегов — в таком случае фильтр будет выполнен только если запрос промаркирован всеми указанными тегами. Параметр condition игнорируется, если задан tags . |
condition | Условие применения фильтра. Фильтр выполняется, если вычисляемое выражение из данного ключа вернуло истину, либо не задано (и не используется tags ). |
Code Block |
---|
title | Пример фильтра render_reply_after: отложенное формирование ответа на запросы авторизации и аутентификации |
---|
collapse | true |
---|
|
plugins:
filters:
render_reply_after:
main:
condition: not $context.has_tag?("accounting") |
reject_on_error
Отправка Access-Reject при возникновении ошибки во время обработки запроса. Данный фильтр не имеет никаких параметров — он должен присутствовать только в стэке обработки запроса конфигурации ядра плагина, причём в вершине этого стэка (первым в списке).
Code Block |
---|
title | Пример указания фильтра reject_on_error/main в стэке обработки запроса |
---|
collapse | true |
---|
|
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 |