LINUX.ORG.RU

freeradius2 + rlm_perl


0

1

Всем привет, вопрос - как передавать данные между вызовами authorize authenticate accounting_start ... ?

Сейчас делаю передачу через переменные объявленные как our. Нет ли тут подводных камней? И правильно ля я понимаю, что freeradius2 запускает для каждого клиента свой thread?

★★

Ответ на: комментарий от hizel

смотрел, вобщем то по нему и все делаю, вопрос не об этом :) Хочу получить подтверждение - да это работает именно так, или допустим работает несколько по другому и нужно сделать так-то. Сейчас переделываю авторизацию, сейчас реализовано на древнем xtradius, отлаживаться на абонентах в неск. тысяч не особенно желательно

PETER ★★ ()
Ответ на: комментарий от hizel

ок, спасибо, но одно дело работает скажем для 10 коннектов и для 5000 вещи несколько разные

PETER ★★ ()

radiusd создаёт несколько потоков исполнния. При получении RADIUS-запроса из пула потоков случайным образом берётся один поток, и этот поток обрабатывает запрос от начала и до конца (т.е., выполняет секции authorize, authenticate, postauth для запросов Access-Request и секции preacct, accounting для Accounting-Request).

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

Если очень хочется «шарить» данные между интерпретаторами, это можно:

use threads::shared;
my %sharedhash;
share(%sharedhash);
my $sharedscalar;
share($sharedscalar);
$sharedhash{key} = $sharedscalar;

Но требуется вручную локировать эти шареные данные.

На самом деле лучше не изгаляться с хранением общих данных в шареных переменных перлового интерпретатора. Лучше хранить шаренные данные в key-value хранилище (например, redis), и обращаться к этому хранилищу из freeradius-а. У него, кстати, есть модуль для обращения к redis.

iliyap ★★★★★ ()

radiusd создаёт несколько потоков исполнения. При получении RADIUS-запроса из пула потоков случайным образом берётся один поток, и этот поток обрабатывает запрос от начала и до конца (т.е., выполняет секции authorize, authenticate, postauth для запросов Access-Request и секции preacct, accounting для Accounting-Request).

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

Если очень хочется «шарить» данные между интерпретаторами, это можно:

use threads::shared;
my %sharedhash;
share(%sharedhash);
my $sharedscalar;
share($sharedscalar);
$sharedhash{key} = $sharedscalar;

Но требуется вручную локировать эти шареные данные.

На самом деле лучше не изгаляться с хранением общих данных в шареных переменных перлового интерпретатора. Лучше хранить шаренные данные в key-value хранилище (например, redis), и обращаться к этому хранилищу из freeradius-а. У него, кстати, есть модуль для обращения к redis.

А передавать данные от секции в секции в процессе обработки одного запроса надо просто добавляя атрибуты в списки request, reply, control по своему вкусу.

iliyap ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.