>Кароче говоря - всё как всегда. Понты да пальцы. Мессаги о том,
>насколько ты крут и насколько зелен человек, задавший вопрос --- очень
>полезно и позновательно!
>Очень благодарен, спасибо! не понятно чего ты не в своей теме флудишь...
автору темы:
http://www.bretterklieber.com/mpd/doc3/mpd20.html#20
(с уважением и благадарностью к Pizik Ilya)
"radiusd.conf (выдержки):
...
modules {
...
perl {
module = ${prefix}/etc/raddb/acct.pl
func_detach = detach
func_authorize = authorize
func_authenticate = authenticate
func_accounting = accounting
func_start_accounting = start_accounting
func_stop_accounting = stop_accounting
func_preacct = preacct
func_checksimul = checksimul
}
...
}
...
# Authorization.
authorize {
mschap
chap
perl
}
# Accounting. Log the accounting data.
accounting {
acct_unique
detail
unix # wtmp file
radutmp
perl
}
# Session database, used for checking Simultaneous-Use. Either the radutmp
# or rlm_sql module can handle this.
# The rlm_sql module is *much* faster
session {
radutmp
}
соответственно определяем названия функций в модуле.
далее просто наш пример:
${prefix}/etc/raddb/acct.pl:
sub authorize {
...
# что-то выдаем
$RAD_CHECK{'User-Password'} = $r->{'password'};
$RAD_REPLY{'Session-Octets-Limit'} = $r->{'maxtraf'};
$RAD_REPLY{'Session-Octets-Direction'} = '0';
$RAD_REPLY{'Framed-IP-Address'} = $r->{'static_ip'};
$RAD_REPLY{'Service-Type'} = 'Framed-User';
$RAD_REPLY{'Framed-Protocol'} = 'PPP';
$RAD_REPLY{'Session-Timeout'} = '86400';
$RAD_REPLY{'Framed-Compression'} = 'Van-Jacobson-TCP-IP';
$RAD_REPLY{'Framed-IP-Netmask'} = '255.255.255.255';
# &radiusd::radlog(0, "RAD_CHECK: ".Dumper \%RAD_CHECK. " RAD_REPLY: ".Dumper \%RAD_REPLY);
return RLM_MODULE_UPDATED;
}
sub checksimul {
return RLM_MODULE_OK;
}
sub stop_accounting {
# Что-то делаем при отключении пользователя
# &radiusd::radlog(0, "rlm_perl:: stop_accounting");
&radiusd::radlog(0, sprintf("logout [%s] (octets in: %d, octets out: %d)", $RAD_REQUEST{'User-Name'},
$RAD_REQUEST{'Acct-Input-Octets'}, $RAD_REQUEST{'Acct-
Output-Octets'}));
return RLM_MODULE_OK;
}
sub start_accounting {
# &radiusd::radlog(0, "rlm_perl:: start_accounting");
return RLM_MODULE_OK;
}
sub accounting {
# А вот тут можно получить из базы данные и их сравнивать или другие критерии придумать :)
$RAD_REPLY{'Drop-User'} = 'Yes' if(($r->{'maxtraf'}-$RAD_REQUEST{'Acct-Input-Octets'}-$RAD_REQUEST{'Acct-Output-Octets'}) < 0);
# &radiusd::radlog(0, "rlm_perl:: accounting");
return RLM_MODULE_OK;
}
sub preacct {
return RLM_MODULE_OK;
}
# Shutdown procedures
sub detach
{
# &radiusd::radlog(0,"rlm_perl::Detaching. Reloading. Done.");
}"