...
Info |
---|
Конфигурации фильтров являются общими для всех экземпляров плагинов. Набор используемых фильтров и порядок их вызова определяется списком |
...
Info |
---|
Если ключа, значение которого формирует фильтр, нет, он будет добавлен. Если ключ уже существует, его значение будет заменено новым. |
Спецификации фильтров
В конфигурации любого настроенного фильтра, в секции specs
, могут быть описаны его спецификации — примеры входных данных и результатов их обработки фильтром. Агент HARD при запуске тестирует все активные, то есть участвующие хотя бы в одном стэке обработки запросов, фильтры, для которых задана спецификация. На вход фильтра подаются данные, указанные в секции input
спецификации, а результат обработки сравнивается с заданным в секции expected
. Если обнаруживается несоответствие, генерируется ошибка с указанием наименования проблемной спецификации (ключ name
) и отличий вывода фильтра от ожидаемого значения. Запуск агента при возникновении ошибки прекращается.
Code Block | ||
---|---|---|
| ||
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 | Список пар ключей | else | Опциональный набор пар Последним элементом списка может быть из него будут вычислены и записаны, если ни одно из выраженийусловий case не вернуло истинувыполнилось. |
Code Block | ||||
---|---|---|---|---|
| ||||
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 | ||||
---|---|---|---|---|
| ||||
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 | ||||
---|---|---|---|---|
| ||||
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 | ||||
---|---|---|---|---|
| ||||
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 | ||
---|---|---|
| ||
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',
},
} |