Общие рекомендации

 

Словари

НаименованиеОписаниеСтруктураПример обращения к элементам
$rlm

Стандартные коды возврата модуля rlm_perl сервера FreeRADIUS:

  • REJECT — Немедленно отклонить запрос
  • FAIL В модуле возникла ошибка, ничего не отвечать на него
  • OK — Модуль успешно обработал запрос, следует передать запрос следующему модулю
  • HANDLED Модуль обработал запрос, следует прекратить обработку
  • INVALID Модуль считает запрос некорректным
  • USERLOCK — Отклонить запрос, поскольку пользователь заблокирован
  • NOTFOUND Пользователь не найден
  • NOOP Модуль успешно обработал запрос без выполнения каких-либо действий
  • UPDATED Модуль успешно обработал запрос, обновив атрибуты и значения
  • NUMCODES — Общее количество кодов возврата

Не зависит ни от конфигурации, ни от типа запроса — значения постоянны.

{
    "REJECT":   0,
    "FAIL":     1,
    "OK":       2,
    "HANDLED":  3,
    "INVALID":  4,
    "USERLOCK": 5,
    "NOTFOUND": 6,
    "NOOP":     7,
    "UPDATED":  8,
    "NUMCODES": 9
}

$rlm.NOTFOUND

$rlm.OK

$var

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

Динамически формируется в процессе обработки каждого конкретного запроса в соответствии с конфигурацией используемых фильтров.

{
    "Remote-Circuit-Ids": {
        "Remote_Id": "10.70.12.117",
        "Circuit_Id": 12
    },
    "Actual-MAC-Address": "93-AA-4A-B1-D6-79",
    "Customer-VLAN": "114"
}

$var.Remote-Circuit-Ids.Remote_Id

$var.Customer-VLAN

$requestАтрибуты RADIUS-запроса, полученные от модуля rlm_perl

Зависит от типа запроса и может включать следующие элементы верхнего уровня:

  • req_type — тип запроса: authorize, authenticate, accounting, post_auth;
  • RAD_REQUEST — атрибуты RADIUS-запроса;
  • RAD_CHECK — атрибуты для проверки;
  • RAD_REPLY — атрибуты RADIUS-ответа.
{
    "req_type": "authorize",
    "RAD_REQUEST": {
        "NAS-Port-Type": "Virtual",
        "CHAP-Password": "0x01375c12a4c1bf31a195bfb74ca2ab9329",
        "Service-Type": "Framed-User",
        "Tunnel-Type": "L2TP",
        "Tunnel-Client-Endpoint": "192.168.2.1",
        "CHAP-Challenge": "0x5502e459b4e20784bf0003b25021488a",
        "NAS-IP-Address": "192.168.10.110",
        "NAS-Port-Id": "L2TP LNS 33",
        "Framed-Protocol": "PPP",
        "User-Name": "admin-test",
        "NAS-Identifier": "bras2",
        "NAS-Port": "2432696353"
    },
    "RAD_CHECK": {
        "Auth-Type": "CHAP"
    }
}

$request.RAD_CHECK.Auth-Type

$request.RAD_REQUEST.User-Name

 

$responseАтрибуты RADIUS-ответа, которые будут отданы модулю rlm_perl в качестве результата обработки RADIUS-запроса

Зависит от типа запроса и конфигурации плагина, может включать следующие элементы верхнего уровня:

  • result — код результата обработки запроса из словаря $rlm (обязателен);
  • RAD_CHECK — атрибуты для проверки;

  • RAD_REPLY — атрибуты RADIUS-ответа.

{
    "RAD_CHECK": {
        "Cleartext-Password": "password",
        "Auth-Type": "CHAP"
    },
    "result": 2
}

$response.try("RAD_REPLY").try("DHCP-Classless-Static-Route")

$response.Cleartext-Password

$response.try("RAD_REPLY").present?()

$customer_profile

Профиль абонентского оборудования, подобранный в кэше при обработке запроса

Заполняется при успешном подборе абонентского профиля, структура соответствует записи в коллекции profiles кэша. При обработке пакета аккаунтинга подбор профиля выполняется только при отсутствии в кэше записи о сессии, то есть при обработке первого пакета аккаунтинга по сессии.

{
    "nested_profiles": [],
    "dynamic_attributes": [],
    "equipment_id": "50983201",
    "_id": ObjectId('5631d972336b5557b82ea627'),
    "active": True,
    "attributes": {
        "Simultaneous-Use": "1",
        "Username": "admin-test",
        "Static-IP": None,
        "Service-State-Code": "SERV_STATE_InsufficientFunds",
        "Password": "password",
        "Speed-Upload-bps": "6291456",
        "Speed-Download-bps": "6291456"
    },
    "child_profiles": [],
    "context": "C70158719E376FC509318E242C521F5B873A8B437",
    "firm_id": "100",
    "signature": "||||||||0051596501|0051596501",
    "profile_id": "1615601",
    "template_id": "20101",
    "profile_type": "C"
}

Если подбор профиля оборудования не выполнялся или завершился с пустым результатом, то элементы верхнего уровня в словаре всё равно присутствуют.

{
    "nested_profiles": None,
    "dynamic_attributes": None,
    "equipment_id": None,
    "_id": None,
    "active": None,
    "attributes": {},
    "child_profiles": [],
    "context": None,
    "firm_id": None,
    "signature": None,
    "profile_id": None,
    "template_id": None,
    "profile_type": None
}

$customer_profile.null?()

$customer_profile.attributes.L2TP-Password

$provider_profileПрофиль операторского оборудования, подобранный в кэше при обработке запроса

Заполняется при успешном подборе операторского профиля, структура соответствует записи в коллекции profiles кэша. При обработке пакета аккаунтинга подбор профиля выполняется только при отсутствии в кэше записи о сессии, то есть при обработке первого пакета аккаунтинга по сессии.

{
    "dynamic_attributes": [],
    "template_id": "42801",
    "profile_id": "459859701",
    "nested_profiles": [
        {
            "dynamic_attributes": [],
            "template_id": "40501",
            "profile_id": "920732301",
            "bind_type": "network_connection",
            "signature": "|||||||1130457991|1130457991",
            "attributes": {
                "IP-Address": "10.242.119.11",
                "L2TP-Password": "qwerty",
                "Simultaneous-Use": "1",
                "Subnet-Mask": "255.255.255.0",
                "Gateway-IP": "10.242.119.1",
                "L2TP-Login": "test-login"
            },
            "active": True,
            "firm_id": "100",
            "equipment_id": "1130577491",
            "profile_type": "C",
            "child_profiles": [],
            "bind_id": "15805201",
            "context": "C82B0D4273F886E1720C3812AC82AE961285AC2AD"
        }
    ],
    "context": "P3129D3A086862F2BEEA34929D1C3670C31224948",
    "attributes": {
        "Switch-IP": "10.70.12.117",
        "Switch-Port-Code": "12"
    },
    "active": True,
    "_id": ObjectId('55f9662d72099a106d77893f'),
    "firm_id": "100",
    "equipment_id": "392626801",
    "profile_type": "P",
    "child_profiles": [],
    "signature": "||"
}

Если подбор профиля оборудования не выполнялся или завершился с пустым результатом, то элементы верхнего уровня в словаре всё равно присутствуют.

{
    "nested_profiles": None,
    "dynamic_attributes": None,
    "equipment_id": None,
    "_id": None,
    "active": None,
    "attributes": {},
    "child_profiles": [],
    "context": None,
    "firm_id": None,
    "signature": None,
    "profile_id": None,
    "template_id": None,
    "profile_type": None
}

$provider_profile.present?()

$provider_profile.customer_profiles

$provider_profile.attributes.PE-Switch-Id

$bind_id

Идентификатор привязки абонентского оборудования к операторскому

Заполняется только при раздельном подборе абонентского и операторского профилей.

 
 
$contextВесь контекст обработки запроса, включающий в себя теги, данные запроса и ответа и все остальные словари. В конфигурации в основном используется для проверки наличия тегов.
 

$context.has_tag?("new-session")

$context.has_tag?('simultaneous-limit-exceeded')

$sessionСессия, подобранная в кэше при обработке пакета аккаунтинга
 {
    "bind_id": None,
    "load_to_hydra": True,
    "services": [
        {
            "service_id": 50546901,
            "value": 0,
            "unit": "bytes"
        },
        {
            "service_id": 50547101,
            "value": 0,
            "unit": "bytes"
        }
    ],
    "services_loaded": False,
    "last_load_at": None,
    "start_at": datetime.datetime(2015, 11, 4, 8, 28, 20, 801000),
    "last_event_timestamp": datetime.datetime(2015, 11, 4, 8, 28, 21),
    "provider_profile_id": None,
    "_id": ObjectId('56399774336b5557aa2ea629'),
    "duration_sec": 0,
    "plugin_instance_name": "l2tp-login",
    "customer_equipment_id": "50983201",
    "session_id": "FF10FFFF58000021-56399774",
    "customer_template_id": "20101",
    "state": "Started",
    "session_unique_id": "9c2f51c907674a2f0d63bf4717a5f6d7",
    "customer_context": "C70158719E376FC509318E242C521F5B873A8B437",
    "termination_cause": None,
    "plugin_name": "base",
    "finish_at": None,
    "provider_equipment_id": None,
    "customer_child_profiles": [],
    "provider_context": None,
    "archived_at": None,
    "active": True,
    "attributes": {
        "Speedup-Service-State-Code": None,
        "Acct-Interim-Interval": "600",
        "User-Name": "admin-test",
        "NAS-Port": "2432696353",
        "NAS-Identifier": "bras2",
        "NAS-Port-Id": "L2TP LNS 33",
        "Qos-Policing-Profile-Name": "5120-in",
        "Filter-Id": [
            "in:acl_default_subscriber_in",
            "out:acl_default_subscriber_out"
        ],
        "Framed-IP-Address": "10.242.119.11",
        "NAS-IP-Address": "192.168.10.110",
        "Qos-Metering-Profile-Name": "5120-out"
    },
    "provider_signature": None,
    "customer_signature": "||||||||0051596501|0051596501",
    "session_loaded": False,
    "service_profile_id": "1615601",
    "firm_id": "100",
    "customer_profile_id": "1615601",
    "provider_template_id": None
}

Если подходящая запись в кэше не найдена, значит обрабатывается первый пакет аккаунтинга по сессии — выполняется подбор профилей оборудования, а в словаре присутствуют только элементы верхнего уровня.

 {
    "bind_id": None,
    "load_to_hydra": None,
    "services": [],
    "services_loaded": False,
    "last_load_at": None,
    "start_at": None,
    "last_event_timestamp": None,
    "provider_profile_id": None,
    "_id": None,
    "duration_sec": 0,
    "plugin_instance_name": None,
    "customer_equipment_id": None,
    "session_id": None,
    "customer_template_id": None,
    "state": None,
    "session_unique_id": None,
    "customer_context": None,
    "termination_cause": None,
    "plugin_name": None,
    "session_duplicate_protection": None,
    "finish_at": None,
    "provider_equipment_id": None,
    "customer_child_profiles": None,
    "provider_context": None,
    "archived_at": None,
    "active": True,
    "attributes": None,
    "provider_signature": None,
    "customer_signature": None,
    "session_loaded": False,
    "service_profile_id": None,
    "firm_id": None,
    "customer_profile_id": None,
    "provider_template_id": None
}

$session.attributes.try("Speedup-Service-State-Code")

 

Операторы

ОбозначениеОписание
or, and, notЛогические операторы: дизъюнкция, конъюнкция, отрицание
<=, <, >=, >Операторы отношения: меньше или равно, меньше, больше или равно, больше
==, !=Операторы сравнения: равно, не равно
+, -, *, /, %Арифметические операторы: сложение, вычитание, умножение, деление, целочисленное деление

Методы

Формат вызоваОписаниеПример использования
coalesce(<list_of_values>)  

empty?()

  

ends_with?(<suffix>[, <start_position>[, <end_position>]])

  

extract(<code_type>, <start_position>[, <length>])

  

format_mac([<delimeter>][, <groups>])

  

gigabytes()

  

has_field?(<field_name>)

  

has_tag?(<tag_name>)

  

in?(<list_of_values>)

  

int([<base>])

  

ip4?()

  

ip4_and(<mask_string>)

  

ip4_mask?()

  

ip4_or(<mask_string>)

  

ip4_scan()

  

join(<delimeter>)

  

like?(<pattern>)

  

lower()

  

mac?()

  

map_join(<delimeter>)

  

merge(<list_of_values>)

  

mod(<divider>)

  

normalize_mac()

  

null?()

  

pad_left(<length>, <pad_string>)

  

pad_right(<length>, <pad_string>)

  

pairs()

  

present?()

  

private_ip4?()

  

regexp_replace(<regexp>[, <replacement_template>])

  

replace(<string_to_replace>[, <replacement])

  

reverse()

  

split([<separator>[, <maxsplit>]])

  

starts_with?(<prefix>[, <start_position>[, <end_position>]])

  

strip(<chars>)

  

substring(<from_position>[, <to_position>])

  

to_date(<format>)

  

to_days()

  

to_hours()

  

to_minutes()

  

to_s([<format>])

  

to_seconds()

  

to_subnet_suffix()

  

to_subnet_mask()

  

try(<field_name>[, <default_value>])

  

unhex()

  

upper()