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

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

Строковые значения аргументов методов и статические строки в самих выражениях рекомендуется заключать в двойные кавычки, а одинарные использовать только для ограничения строковых значений параметров 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"'
...

Для отладки выражений можно использовать HYAML Playground

Пример работы с hyaml в интерактивном режиме
>>> evaluate("$x.starts_with?('foo')", x="foobar")
True

>>> evaluate("$request.RAD_REQUEST.Alc-Acct-O-All-Octets_64.unhex()", request={"RAD_REQUEST":{"Alc-Acct-O-All-Octets_64":"0x3830303130303030303031376231346563303839"}})
'800100000017b14ec089'
>>> evaluate("$request.RAD_REQUEST.Alc-Acct-O-All-Octets_64.unhex().substring(4)", request={"RAD_REQUEST":{"Alc-Acct-O-All-Octets_64":"0x3830303130303030303031376231346563303839"}})
'00000017b14ec089'
>>> evaluate("$request.RAD_REQUEST.Alc-Acct-O-All-Octets_64.unhex().substring(4).to_i(16)", request={"RAD_REQUEST":{"Alc-Acct-O-All-Octets_64":"0x3830303130303030303031376231346563303839"}})
101758976137

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

НаименованиеОписаниеПримеры использования
$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")
$prev_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")

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

В HARD версии до 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()

Доступно в HARD версии 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
<value>.to_list()
Доступно в HARD версии 6.0 и новее.
Приведение <value> к списку из <value>. Особенности преобразования в зависимости от типа <value>:
  • Список значений возвращается «как есть».
  • Пустое значение (None) становится пустым списком.
  • Словарь становится списком пар (ключ, значение), упорядоченных по ключам.

$request.RAD_REQUEST.Cisco-AVPair.to_list()

  • "client-mac-address=0026.9e5d.ddfa"["client-mac-address=0026.9e5d.ddfa"]
  • ["client-mac-address=0026.9e5d.ddfa","remote-id-tag=0006acf1dfafe680"]["client-mac-address=0026.9e5d.ddfa","remote-id-tag=0006acf1dfafe680"]

$var.X.to_list()

  • 123[123]
  • "foo"["foo"]
  • {"foo": 123, "bar": 456}[('bar', 456), ('foo', 123)]
  • {}[]
  • None[]


<number>.to_minutes()

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

$customer_profile.attributes.Timeout.to_minutes()

  • "-5" → datetime.timedelta(-1, 86100)
  • 123 → datetime.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