FreeRADIUS-Database
view release on metacpan or search on metacpan
lib/FreeRADIUS/Database.pm view on Meta::CPAN
# do the 'easy-to-automate' config members
while ( my ( $member, $value ) = ( each %{ $config->{ $section } } ) ) {
$member = uc $member;
$self->{ config }{ $member } = $value;
no strict 'refs';
*$member = sub {
my $self = shift;
$self->{ config }{ $member } = shift if @_;
return $self->{ config }{ $member };
} if ! defined &$member;
}
}
return $self;
}
# accounting
sub aggregate_daily {
my $self = shift;
my $params = shift if @_;
my $classify_ras = $self->RAS_CLASSIFICATION();
# check to see if the operator wants to override the
# config variable
$classify_ras = $params->{ classify } if exists $params->{ classify };
if ( exists $params->{ day } && $params->{ day } !~ m{ \A \d{4}-\d{2}-\d{2} \z }xms ) {
croak "The 'day' param must be in the form YYYY-MM-DD: $!";
}
my $day = $params->{ day };
if ( ! $day ) {
my $datetime = $self->date();
$datetime->subtract( days => 1 );
$day = $datetime->ymd();
}
my $schema = $self->_schema();
# UPDATE
if ( $classify_ras ) {
$self->update_ras_name( {
day => $day,
} );
}
# DELETE if this is an overlay run
$schema->resultset( 'DailyAgg' )->search({ acctdate => $day })->delete();
# FETCH
my $daily_fetch_rs = $schema->resultset( 'Radacct' )->search(
{
'acctstoptime' => { like => "$day%" },
},{
select => [
'username',
{ count => 'radacctid' },
{ sum => 'acctsessiontime' },
{ max => 'acctsessiontime' },
{ min => 'acctsessiontime' },
{ sum => 'acctinputoctets' },
{ sum => 'acctoutputoctets' },
'nasipaddress',
],
group_by => [ qw/ username nasipaddress / ],
as => [ qw/
UserName
ConnNum
ConnTotDuration
ConnMaxDuration
ConnMinDuration
InputOctets
OutputOctets
NASIPAddress
/,
],
});
$daily_fetch_rs->result_class( 'DBIx::Class::ResultClass::HashRefInflator' );
my $agg_table = $schema->resultset( 'DailyAgg' );
while ( my $daily_entry = $daily_fetch_rs->next() ) {
$daily_entry->{ AcctDate } = $day;
$agg_table->create( $daily_entry );
}
return 0;
}
sub aggregate_monthly {
my $self = shift;
my $params = shift;
my $month;
if ( $params->{ month } ) {
$month = $params->{ month };
if ( $month !~ m{ \A \d{4}-\d{2} \z }xms ){
croak "The 'month' param must be in the form YYYY-MM: $!";
}
}
else {
my $datetime = $self->date();
$datetime->subtract( days => 1 );
$month = $self->date( { get => 'month', datetime => $datetime } );
}
my $schema = $self->_schema();
# DELETE if overlay run
$schema->resultset( 'MonthlyAgg' )->search({
acctdate => { like => "$month%" },
})->delete();
my $month_rs = $schema->resultset( 'DailyAgg' )->search(
{
'AcctDate' => { like => "$month%" },
},
{
select => [
'UserName',
{ sum => 'ConnNum' },
{ sum => 'ConnTotDuration' },
{ max => 'ConnMaxDuration' },
{ min => 'ConnMinDuration' },
{ sum => 'InputOctets' },
{ sum => 'OutputOctets' },
'NASIPAddress',
],
group_by => [ qw/ UserName NASIPAddress / ],
as => [ qw/
UserName
ConnNum
ConnTotDuration
ConnMaxDuration
ConnMinDuration
InputOctets
OutputOctets
NASIPAddress
/,
],
}
);
$month_rs->result_class( 'DBIx::Class::ResultClass::HashRefInflator' );
my $agg_table = $schema->resultset( 'MonthlyAgg' );
while ( my $month_entry = $month_rs->next() ) {
$month_entry->{ AcctDate } = $month . "-00";
$agg_table->create( $month_entry );
}
return 0;
}
# archiving & management
sub archive_radacct {
my $self = shift;
my $params = shift;
my $month;
( run in 0.616 second using v1.01-cache-2.11-cpan-2398b32b56e )