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 )