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 8 Next »

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

 

 Системные переменные

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

Стандартные коды возврата модуля rlm_perl сервера FreeRADIUS. Структура не зависит ни от конфигурации, ни от типа запроса — значения постоянны.

Словарь $rlm
{
    "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

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

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

Пример словаря $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-ответа.
Пример словаря $request
{
    "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-ответа.

Пример словаря $response
{
    "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 кэша. При обработке пакета аккаунтинга подбор профиля выполняется только при отсутствии в кэше записи о сессии, то есть при обработке первого пакета аккаунтинга по сессии.

Пример словаря $customer_profile
{
    "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"
}

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

Пустой словарь $customer_profile
{
    "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 кэша. При обработке пакета аккаунтинга подбор профиля выполняется только при отсутствии в кэше записи о сессии, то есть при обработке первого пакета аккаунтинга по сессии.

Пример словаря $provider_profile
{
    "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": "||"
}

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

Пустой словарь $provider_profile
{
    "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

Идентификатор привязки абонентского оборудования ($customer_profile) к операторскому ($provider_profile). Заполняется только при раздельном подборе абонентского и операторского профилей.

 
$context

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

Пример словаря $context
{
    "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"
        }
    ],
    "request": {
        "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"
        },
        "req_type": "authorize",
        "RAD_CHECK": {
            "Auth-Type": "CHAP"
        }
    },
    "tags": {
        "authorize",
        "request_from_smartedge"
    },
    "response": {}
}


  • $context.has_tag?("new-session")
  • $context.has_tag?('simultaneous-limit-exceeded')
$session

Сессия, подобранная в кэше при обработке пакета аккаунтинга.

Пример словаря $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
}

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

Пустой словарь $session
 {
    "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Логические операторы: дизъюнкция, конъюнкция, отрицание
<=, <, >=, >Операторы отношения: меньше или равно, меньше, больше или равно, больше
==, !=Операторы сравнения: равно, не равно
+, -, *, /, %Арифметические операторы: сложение, вычитание, умножение, деление, целочисленное деление

Методы

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

Проверки

Формат вызоваОписаниеПримеры использования

empty?()

Является ли значение «пустым»? Пустыми считаются:

  • None
  • пустая строка
  • 0

$customer_profile.attributes.Static-IP.empty?()

$request.RAD_REQUEST.try("DHCP-Relay-Circuit-Id").empty?()

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

Заканчивается ли значение строкой <suffix>? Если указаны опциональные аргументы, то проверяется не всё значение, а подстрока c символа <start_position> до символа <end_postion>. Символы нумеруются с нуля, верхняя граница интервала не включается

$response.RAD_REPLY.DHCP-Subnet-Mask.ends_with?("/32")

has_field?(<field_name>)

Имеется ли ключ <field_name> в словаре?$response.RAD_REPLY.has_filed?("DHCP-Flags")

has_tag?(<tag_name>)

Присвоен ли тег запросу? Применяется только к переменной $context

$context.has_tag?("accounting")

$context.has_tag?("auth-isg-service")

in?(<list_of_values>)

Входит ли значение в список <list_of_values>?$request.RAD_REQUEST.try("Session-Error-Msg").in?("Radius test by administrator;Authentication failure".split(";"))

ip4?()

Является ли значение IPv4-адресом?$request.RAD_REQUEST.Agent-Remote-Id.ip4?()

ip4_mask?()

Является ли значение маской IPv4-подсети?$request.RAD_REQUEST.DHCP-Subnet-Mask.ip4_mask?() 

like?(<pattern>)

Соответствует ли значение регулярному выражению <pattern>?

$request.RAD_REQUEST.Agent-Circuit-Id.like?("^0x(.+)$")

mac?()

Является ли значение MAC-адресом?$request.RAD_REQUEST.Agent-Remote-Id.mac?()

null?()

Пуст ли словарь?$customer_profile.null?()

present?()

Заполнен ли словарь или задано ли значение?

$bind_id.present?()

$customer_profile.present?()

private_ip4?()

Принадлежность IPv4-адреса к одной из локальных подсетей:

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16
$request.RAD_REQUEST.Agent-Remote-Id.private_ip4?()

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

Начинается ли значение строкой <prefix>. Если указаны опциональные аргументы, то проверяется не всё значение, а подстрока c символа <start_position> до символа <end_postion>. Символы нумеруются с нуля, верхняя граница интервала не включается

$request.RAD_REQUEST.User-Name.starts_with?("Tester", 4, 16) 

Преобразования

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

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

  

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

  

gigabytes()

  

int([<base>])

  

ip4_and(<mask_string>)

  

ip4_or(<mask_string>)

  

ip4_scan()

  

join(<delimeter>)

  

lower()

  

map_join(<delimeter>)

  

merge(<list_of_values>)

  

mod(<divider>)

  

normalize_mac()

  

pad_left(<length>, <pad_string>)

  

pad_right(<length>, <pad_string>)

  

pairs()

  

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

  

replace(<string_to_replace>[, <replacement])

  

reverse()

  

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

  

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

  

 


  • No labels