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

Приведение строки к нижнему регистру.

$request.RAD_REQUEST.User-Name.lower()

  • "sUpErUsEr.321""superuser.321"
  • "TEST-LOGIN""test-login"

map_join(<delimeter>)

 

$)

  • """"
  • """"

merge(<list_of_values>)

 

$)

  • """"
  • """"

mod(<divider>)

 

$)

  • """"
  • """"

normalize_mac()

 

$)

  • """"
  • """"

pad_left(<length>, <pad_string>)

 

$)

  • """"
  • """"

pad_right(<length>, <pad_string>)

 

$)

  • """"
  • """"

pairs()

 

$)

  • """"
  • """"

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

 

$request.RAD_REQUEST.User-Name.regexp_replace("^office([0-9]+?)$", "\\1")

  • "office2""2"
  • "office123456789""123456789"

<string>.replace(<string_to_replace>[, <replacement])

 

$request.RAD_REQUEST.Cisco-Attributes.h323-incoming-conf-id.reverse()

  • "A0E8218F 9A4011E4""4E1104A9 F8128E0A"

<string>.reverse()

Изменение порядка символов в строке <string> на обратный.

$)

  • """"
  • """"

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

 

$)

  • """"
  • """"

<string>.strip(<chars>)

Удаление пробелов в начале и конце строки <string>.

$request.RAD_REQUEST.User-Name.strip()

  • " Vasiliy Terkin ""Vasiliy Terkin"

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

Извлечение подстроки из <string>: <from_position> — начало, а <to_position> — окончание. Символы нумеруются с нуля, верхняя граница интервала не включается. Если верхняя граница <to_position> не задана, подстрока извлекается до конца исходной строки.

$request.RAD_REQUEST.DHCP-Relay-Remote-Id.substring(6)

  • "0x010a31302e3232312e332e34""31302e3232312e332e34"

$request.RAD_REQUEST.DHCP-Relay-Circuit-Id.substring(12,14)

  • "0x0005010d0004e3a1""04"
  • "0x0005010d00c""c"

<string>.to_date(<format>)

Приведение строки в формате <format> к дате с временем (тип datetime.datetime в Python). Правила преобразования и описания формата идентичны таковым у метода datetime.strptime в Python: описание на docs.python.org.

$request.RAD_REQUEST.Event-Timestamp.to_date("%d.%m.%Y %H:%M:%S")

  • "06.08.1961 06:00:00"datetime.datetime(1961, 8, 6, 6, 0)

<number>.to_days()

Приведение количества дней <number> к разнице между датами с временем (тип datetime.timedelta в Python). <number> — целое число, либо преобразуемая к такому числу строка.

$session.attributes.Trial-Period-Days.to_days()

  • "-5"datetime.timedelta(-5)
  • 123datetime.timedelta(123)

<number>.to_hours()

Приведение количества часов <number> к разнице между датами с временем (тип datetime.timedelta в Python). <number> — целое число, либо преобразуемая к такому числу строка.

$provider_profile.attributes.Acct-UTC-Offset.to_hours()

  • "-5"datetime.timedelta(-1, 68400)
  • 123datetime.timedelta(5, 10800)
<value>.to_i()

Приведение <value> к целому числу. Если <value> — это число, оно будет округлено к меньшему по модулю («к нулю»). Если <value> является строкой, то в ней должно быть только целое десятичное число:

  • Перед числом может присутствовать знак: + или -. Знак может быть отделён от числа пробелами.
  • По краям могут быть пробелы — они будут отрезаны автоматически.

$request.RAD_REQUEST.Bill-Total-Amount.to_i()

  • "012"12
  • " - 12345 "-12345
  • -123.45-123

<number>.to_minutes()

Приведение количества минут <number> к разнице между датами с временем (тип datetime.timedelta в Python). <number> — целое число, либо преобразуемая к такому числу строка.

$customer_profile.attributes.Timeout.to_minutes()

  • "-5"datetime.timedelta(-1, 86100)
  • 123datetime.timedelta(0, 7380)

<value>.to_s([<format>])

Приведение <value> к строке. Если <value> — это дата с временем (тип datetime.datetime в Python), то она будет преобразована в соответствии с форматом <format> (его указание в этом случае обязательно). Правила преобразования и описания формата идентичны таковым у метода datetime.strftime в Python: описание на docs.python.org.

($var.Connection-Date.to_date("%d.%m.%Y %H:%M:%S") + 1.to_seconds()).to_s("%Y-%m-%dT%H:%M:%S")

  • datetime.datetime(1961, 4, 12, 9, 7)"1961-04-12T09:07:00"

<number>.to_seconds()

Приведение количества секунд <number> к разнице между датами (тип datetime.timedelta в Python). <number> — целое число, либо преобразуемая к такому числу строка.

$var.Delay-In-Seconds.to_seconds()

  • "-5"datetime.timedelta(-1, 86395)
  • 123datetime.timedelta(0, 123)

<string>.to_subnet_suffix()

Определение длины префикса IPv4-подсети с маской <string> (суффикса подсети в CIDR-нотации).

$response.RAD_REPLY.Framed-IP-Netmask.to_subnet_suffix()

  • "255.255.255.248"29
  • "255.255.240.0"20

<number>.to_subnet_mask()

Формирование маски IPv4-подсети с длиной префикса равной <number> бит. <number> целое число от 0 до 32, либо преобразуемая к такому числу строка.

$customer_profile.attributes.Custom-Netmask-Prefix.to_subnet_mask()

  • 30"255.255.255.252"
  • "21""255.255.248.0"

<value>.try(<key>[, <default_value>])

Возвращает значение из <value>, соответствующее ключу <key>, или значение по умолчанию <default_value>, если такого ключа нет. Если <default_value> не задано, в качестве него используется пустое значение (None). Особенности поведения в зависимости от типа <value>:

  • Пустое значение (None) — возвращается <default_value> независимо от <key>. Это позволяет применять несколько методов try в одном выражении.
  • Список — возвращается элемент списка с номером <key>, нумерация элементов списка ведётся с нуля. <key> — целое неотрицательное число.
  • $request.RAD_REQUEST.try("ERX-Service-Session")
  • $customer_profile.provider_profiles.try(0).try("equipment_id")
  • $var.try("Service-Auth-Speed-Limits").try("Rate", "100000000")
  • $response.try("RAD_REPLY").try("Cisco-Account-Info").present?()

<string>.unhex()

Декодирование строки <string>, представленной в виде шестнадцатеричных кодов символов (формат ASCII-HEX). Если в исходной строке есть префикс 0x, он отбрасывается.

$request.RAD_REQUEST.DHCP-Relay-Remote-Id.unhex()

  • "61383a66393a34623a35623a31623a3032""a8:f9:4b:5b:1b:02"
  • "0x3137322e31362e3132302e323130""172.16.120.210"

<string>.upper()

Приведение строки <string> к верхнему регистру.

$request.RAD_REQUEST.User-Name.upper()

  • "SuPeRuSeR-123""SUPERUSER-123"

  • "test-login""TEST-LOGIN"

 


  • No labels