Page tree
Skip to end of metadata
Go to start of metadata

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

  • Строковые значения аргументов методов и статические строки в самих выражениях рекомендуется заключать в двойные кавычки, а одинарные использовать только для ограничения строковых значений параметров YAML–формата.

    Пример использования кавычек в конфигурационном файле
    plugins:
      base:
        jmx5-qinq:
    ...
          actions:
            authorize:
    ...
              reply:
                - condition: $context.has_tag?("cpe_is_up_to_date") and $context.has_tag?("network_access_allowed")
                  template:
                    RAD_REPLY:
                      'ERX-Service-Activate:1': '$customer_profile.attributes.try("Internet-Service-Code", "") + "(" + $customer_profile.attributes.try("Speed-Limit-bps", "0") + ")"'
                      'ERX-Service-Statistics:1': '"time-volume"'
                      Framed-IP-Address: $customer_profile.attributes.try("CPE-IP")
                      Framed-IP-Netmask: $customer_profile.attributes.try("CPE-IP-Mask")
                      Service-Type: '"Framed-User"'
                      Session-Timeout: '"900"'
    ...

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

НаименованиеОписаниеПримеры использования
$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;
  • generated_at — дата и время получения запроса агентом;
  • 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
  • $request.generated_at.to_s("%d.%m.%Y %H:%M:%S")
$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Логические операторы: дизъюнкция, конъюнкция, отрицание.
<=, <, >=, >Операторы отношения: меньше или равно, меньше, больше или равно, больше.
==, !=Операторы сравнения: равно, не равно.
+, -, *, /, %Арифметические операторы: сложение, вычитание, умножение, деление, деление по модулю.

 

Методы

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

Проверки

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

<value>.empty?()

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

  • None;
  • Пустая строка;
  • 0.
  • $customer_profile.attributes.Static-IP.empty?()
  • $request.RAD_REQUEST.try("DHCP-Relay-Circuit-Id").empty?()

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

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

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

<dictionary>.has_field?(<field_name>)

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

$context.has_tag?(<tag_name>)

Присвоен ли тег запросу? Применяется только к переменной $context.
  • $context.has_tag?("accounting")
  • $context.has_tag?("auth-isg-service")

<substring>.in?(<string>)

<value>.in?(<list_of_values>)

Содержится ли строка <substring> в строке <string>?

Входит ли значение <value> в список <list_of_values>?

  • $var.Separator.in?($request.RAD_REQUEST.User-Name)
  • $request.RAD_REQUEST.try("Session-Error-Msg").in?("Radius test by administrator;Authentication failure".split(";"))
  • "local_access".in?($customer_profile.attributes.Service-Tags.split(", "))

<string>.ip4?()

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

<string>.ip4_mask?()

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

<string>.like?(<pattern>)

Соответствует ли <string> регулярному выражению <pattern>? Синтаксис регулярных выражений идентичен библиотеке re в Python.

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

<string>.mac?()

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

<dictionary>.null?()

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

<value>.present?()

Заполнен ли словарь или задано ли значение?
  • $bind_id.present?()
  • $customer_profile.present?()

<string>.private_ip4?()

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

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

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

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

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

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

Формат вызоваОписаниеПримеры использования
<value>.coalesce(<arg1>[, <arg2>[, <arg3>...]])Возвращение первого отличного от None аргумента из <arg1>, <arg2> и т.д., если <value> равен None. В качестве аргументов могут быть указаны как фиксированные значения, так и вычисляемые выражения.

$customer_profile.attributes.L2TP-Class.coalesce("3")

  • None"3"
  • "15""15"

$customer_profile.attributes.Custom-ACL-Name.coalesce($customer_profile.attributes.Service-ACL-Name, $var.Default-ACL-Name)

Custom-ACL-NameService-ACL-NameDefault-ACL-NameРезультат
NoneNoneNoneNone
NoneNonePERM_ALLPERM_ALL
NoneBLOCK_IPv6PERM_ALLBLOCK_IPv6
BLOCK_SMTPBLOCK_IPv6PERM_ALLBLOCK_SMTP
<dictionary>.except(<key_1>[, <key_2>[, ...]])Исключение из словаря <dictionary> элементов с ключами <key_1>, <key_2> и т. д.

$request.RAD_CHECK.except('Auth-Type')

{"Auth-Type": "CHAP", "Pool-Name": "NAT-10"} {"Pool-Name": "NAT-10"}

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

Приведение MAC–адреса <string> к верхнему регистру и форматирование его разбиением на <groups> групп с разделителем <delimeter> между ними. Если аргумент <delimeter> не передан, в качестве разделителя используется дефис. Если аргумент <groups> не передан, адрес разбивается на 6 групп.

$request.RAD_REQUEST.Agent-Remote-Id.format_mac(":")

  • "acf1.dfaf.42c0""AC:F1:DF:AF:42:C0"
  • "BA46EC2EA786""BA:46:EC:2E:A7:86"

$request.RAD_REQUEST.Calling-Station-Id.format_mac(".", 3)

  • "AC:F1:DF:AF:42:C0""ACF1.DFAF.42C0"
  • "BA46EC2EA786""BA46.EC2E.A786"

<number>.gigabytes()

Перевод гигабайтов в байты умножением числа <number> на 230.

4 * $request.RAD_REQUEST.try("Acct-Input-Gigawords", "0").to_i().gigabytes()

  • "0"0
  • "2"8589934592

<string>.ip4_and(<mask_string>)

Побитовое И для IPv4–адреса <string> и маски подсети <mask_string>. Можно использовать для получения адреса подсети.

$request.RAD_REQUEST.Framed-IP-Address.ip4_or("255.255.0.0")

  • "192.168.154.37""192.168.0.0"

$request.RAD_REQUEST.Framed-IP-Address.ip4_or("255.255.240.0")

  • "10.83.5.1""10.83.0.0"

<string>.ip4_or(<mask_string>)

Побитовое ИЛИ для IPv4–адреса <string> и маски подсети <mask_string>. Можно использовать для получения широковещательного адреса, передавая в <mask_string> инвертированную маску подсети.

$request.RAD_REQUEST.Framed-IP-Address.ip4_or("0.0.255.255")

  • "192.168.154.37""192.168.255.255"

$request.RAD_REQUEST.Framed-IP-Address.ip4_or("0.0.15.255")

  • "10.83.5.1""10.83.15.255"

<string>.ip4_scan()

Извлечение из строки <string> IPv4–адреса. Если адресов в <string> несколько, возвращается первый из них. Если адресов нет, возвращается пустая строка.

$request.RAD_REQUEST.Raw-Ip.ip4_scan()

  • "vlan102260.172.16.1.1.2""60.172.16.1.1"
  • "172.16.0."""

<list>.join([<delimeter>])

Объединение элементов списка <list> в одну строку с использованием разделителя <delimeter>. Если аргумент <delimeter> не передан, разделитель не используется.

$response.RAD_REPLY.Rules.join(";")

  • [2048, 1024, None, 100]"2048;1024;;100"

<dictionary>.length()

<list>.length()

<string>.length()

Вычисление количетсва элементов списка <list>, словаря <dictionary> или длины строки <string>.

$response.RAD_REPLY.DHCP-Vendor.length()

  • "http://10.20.30.40:4321/acs"27

$response.RAD_REPLY.Rules.length()

  • [2048, 1024, None, 100]4

<string>.lower()

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

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

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

<list_of_kvp>.map_join([<delimeter>])

Формирование из списка <list_of_kvp> пар (ключ, значение) списка строк, полученных объединением ключа и соответствующего ему значения. Ключ и значение в строках разделяются символом <delimeter>. Если аргумент <delimeter> не передан, в качестве разделителя используется запятая.

$response.RAD_REPLY.Cisco-Attributes.pairs().map_join("=")

  • {"ip:dns-servers": "10.1.14.1", "ip": "inacl: blockdns"}["ip=inacl: blockdns", "ip:dns-servers=10.1.14.1"]

<dictionary>.merge(<key>, <value>)

<dictionary>.merge(<key_value_list>)

<dictionary>.merge(<list_of_kvp>)

<dictionary>.merge(<additional_dictionary>)

Обновление словаря <dictionary>. Если в словаре <dictionary> обновляемый ключ уже существует, его значение будет заменено новым. Аргументы могут быть следующими:

  • Ключ <key> и значение <value>;
  • Список <key_value_list> из двух элементов: первый — ключ, второй — значение;
  • Список <list_of_kvp> пар (ключ, значение);
  • Словарь <additional_dictionary>.

$request.RAD_REQUEST.Cisco-AVPair.merge("xpgk-owner-type=User".split("="))

  • {"xpgk-request-type": "number"}{"xpgk-request-type": "number", "xpgk-owner-type": "User"}
  • {"xpgk-owner-type": "Gateway"}{"xpgk-owner-type": "User"}

<value>.mod(<divider>)

Получение остатка от деления <value> на <divider> с предварительным приведением <value> к целому числу методом to_i(). Аналог оператора %.

$request.RAD_REQUEST.Acct-Session-Time.mod(86400)

  • "325752"66552
  • 325325

<string>.normalize_mac()

Приведение MAC–адреса из строки <string> к формату, используемому Гидрой: верхний регистр, пары шестнадцатеричных цифр разделены дефисом.

$request.RAD_REQUEST.Agent-Remote-Id.normalize_mac()

  • "acf1.dfaf.42c0""AC-F1-DF-AF-42-C0"
  • "428d01c53db7""42-8D-01-C5-3D-B7"

<string>.pad_left(<length>, <character>)

Дополнение строки <string> до длины <length> путём добавления в начало символов <character>. Если длина строки меньше или равна указанной в <length>, возвращается исходная строка <string>.

"0x" + $var.Port-Number.to_hex_from_int().substring(2).pad_left(12, "0")

  • 24"0x000000000018"

<string>.pad_right(<length>, <character>)

Дополнение строки <string> до длины <length> путём добавления в конец символов <character>. Если длина строки меньше или равна указанной в <length>, возвращается исходная строка <string>.

$var.Port-Number.to_hex_from_int().pad_right(14, "0")

  • 39"0x270000000000"

<dictionary>.pairs()

Приведение словаря <dictionary> к списку пар (ключ, значение), лексикографически упорядоченных по ключу.

$response.RAD_REPLY.Cisco-Attributes.pairs()

  • {"ip:dns-servers": "10.1.14.1", "ip": "inacl: blockdns"}[("ip", "inacl: blockdns"), ("ip:dns-servers", "10.1.14.1")]

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

Замена в строке <string> удовлетворяющих регулярному выражению <regexp> подстрок в соответствии с шаблоном <replacement_template>. Если <replacement_template> не задан, подстроки удаляются. В шаблоне могут использоваться ссылки на группы из регулярного выражения. Правила замены и синтаксис шаблона идентичны таковым у метода re.sub в Python за исключением необходимости дополнительного экранирования символа \ в шаблоне.

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

  • "office2""2"
  • "office123456789""123456789"
$var.Circuit-Id.regexp_replace("^0x0005(?P<vlan>[0-9a-f]{4})(?P<slot>[0-9a-f]{4})(?P<port>[0-9a-f]{2})$", "0x0006\g<vlan>\g<slot>00\g<port>")
  • "0x0005043d000016""0x0006043d00000016"

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

Замена в строке <string> подстрок <string_to_replace> на <replacement>. Если <replacement> не задан, подстроки удаляются.

$request.RAD_REQUEST.Agent-Circuit-Id.replace("0x")

  • "0x10006a12""10006a12"

<list>.reverse()

<string>.reverse()

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

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

  • "A0E8218F 9A4011E4""4E1104A9 F8128E0A"

$var.DNS-Servers-List.reverse()

  • ["10.1.0.254", "10.254.0.254"]["10.254.0.254", "10.1.0.254"]

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

Разбиение строки <string> на части (результат — список строк) по строке-разделителю <separator>. Правила разбиения и аргументы идентичны таковым у метода str.split в Python.

$response.RAD_REPLY.DHCP-Classless-Static-Route.replace(".", ";").split(";")

  • "24;192.168.123;10.1.1.1"["24", "192", "168", "123", "10", "1", "1", "1"]

$var.Routed-Subnets.split(",")

  • "192.168.14.128/29,,10.0.0.0/8"["192.168.14.128/29", "", "10.0.0.0/8"]

<string>.strip()

Удаление пробелов в начале и конце строки <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"

$request.RAD_REQUEST.DHCP-Relay-Circuit-Id.substring(-4,-2)

  • "0x0005010d0004e3a1""e3"
  • "0x0005010d00c""d0"

$request.RAD_REQUEST.DHCP-Relay-Circuit-Id.substring(-2)

  • "0x0005010d0004e3a1""a1"
  • "0x0005010d00c""0c"

<string>.to_date(<format>)

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

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

до 4.2.10.6 <number>.to_hex()

Перевод целого числа <number> в шестнадцатеричную систему с возвращением результата в виде строки в нижнем регистре с префиксом 0x.

$var.Service-Priority.to_hex_from_int()

  • 24"0x18"
  • -237"-0xed"

<string>.to_hex_from_str()

c 4.2.10.6

Возвращает строку, содержащую шестнадцатеричное представление строки <string>.

$request.RAD_REQUEST.Agent-Remote-Id.to_hex_from_str()

  • "a8:f9:4b:5b:1b:02" → "61383a66393a34623a35623a31623a3032"
  • "172.17.0.4" "3137322e31372e302e34"
 

<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([<base>])

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

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

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

$request.RAD_REQUEST.Agent-Circuit-Id.substring(2).to_i(16)

  • "0x100" 256


<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.

($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"

"QU;" + ($customer_profile.attributes.Upload-Rate.to_i() / 1024).to_i().to_s() + ";"

  • "250000""QU;244;"
  • "256000""QU;250;"

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

Возвращение соответствующего ключу <key> значения из <value>, или значения по умолчанию <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