X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=httemplate%2Fsearch%2Fsqlradius.cgi;h=84f1f40ef959f1e65d8bd418b56e37735955cab1;hp=5363944e47ce1bd08cd57acd029ff343b43a0d8d;hb=f30eaaf66cd0a947f388a03edd4522ba92a367bb;hpb=fb4ab1073f0d15d660c6cdc4e07afebf68ef3924 diff --git a/httemplate/search/sqlradius.cgi b/httemplate/search/sqlradius.cgi index 5363944e4..84f1f40ef 100644 --- a/httemplate/search/sqlradius.cgi +++ b/httemplate/search/sqlradius.cgi @@ -1,37 +1,25 @@ -<% include( '/elements/header.html', 'RADIUS Sessions') %> +<& /elements/header.html, 'RADIUS Sessions' &> % ### % # and finally, display the thing % ### % -% foreach my $part_export ( -% #grep $_->can('usage_sessions'), qsearch( 'part_export' ) -% qsearch( 'part_export', { 'exporttype' => 'sqlradius' } ), -% qsearch( 'part_export', { 'exporttype' => 'sqlradius_withdomain' } ) -% ) { -% %user2svc_acct = (); +% foreach my $part_export ( @part_export ) { +% +% %user2svc = (); % % my $efields = tie my %efields, 'Tie::IxHash', %fields; % delete $efields{'framedipaddress'} if $part_export->option('hide_ip'); % if ( $part_export->option('hide_data') ) { % delete $efields{$_} foreach qw(acctinputoctets acctoutputoctets); % } -% if ( $part_export->option('show_called_station') ) { -% $efields->Splice(1, 0, -% 'calledstationid' => { -% 'name' => 'Destination', -% 'attrib' => 'Called-Station-ID', -% 'fmt' => -% sub { length($_[0]) ? shift : ' '; }, -% 'align' => 'left', -% }, -% ); -% } -% -% - <% $part_export->exporttype %> to <% $part_export->machine %>
- <% include( '/elements/table-grid.html' ) %> + + <% $part_export->exportname || $part_export->exporttype |h %> + <% $part_export->machine ? ' to '. $part_export->machine : '' |h %> +
+ + <& /elements/table-grid.html &> % my $bgcolor1 = '#eeeeee'; % my $bgcolor2 = '#ffffff'; % my $bgcolor; @@ -51,10 +39,10 @@ % @{ $part_export->usage_sessions( { % 'stoptime_start' => $beginning, % 'stoptime_end' => $ending, -% 'open_sessions' => $open_sessions, +% 'session_status' => $status, % 'starttime_start' => $starttime_beginning, % 'starttime_end' => $starttime_ending, -% 'svc_acct' => $cgi_svc_acct, +% 'svc' => $cgi_svc, % 'ip' => $ip, % 'prefix' => $prefix, % 'summarize' => $summarize, @@ -117,9 +105,9 @@ if ( $cgi->param('end') && $cgi->param('end') =~ /^(\d+)$/ ) { $ending = $1; } -my $open_sessions = ''; -if ( $cgi->param('open_sessions') =~ /^(\d*)$/ ) { - $open_sessions = $1; +my $status = ''; +if ( $cgi->param('session_status') =~ /^(closed|open)$/ ) { + $status = $1; } my( $starttime_beginning, $starttime_ending ) = ( '', '' ); @@ -132,9 +120,10 @@ if ( $cgi->param('starttime_ending') $starttime_ending = parse_datetime($1); # + 86399; } -my $cgi_svc_acct = ''; +my $cgi_svc = ''; if ( $cgi->param('svcnum') =~ /^(\d+)$/ ) { - $cgi_svc_acct = qsearchs( 'svc_acct', { 'svcnum' => $1 } ); + $cgi_svc = qsearchs( 'svc_acct', { 'svcnum' => $1 } ) + || qsearchs( 'svc_broadband', { 'svcnum' => $1 } ); } elsif ( $cgi->param('username') =~ /^([^@]+)\@([^@]+)$/ ) { my %search = { 'username' => $1 }; my $svc_domain = qsearchs('svc_domain', { 'domain' => $2 } ); @@ -143,10 +132,27 @@ if ( $cgi->param('svcnum') =~ /^(\d+)$/ ) { } else { delete $search{'username'}; } - $cgi_svc_acct = qsearchs( 'svc_acct', \%search ) + $cgi_svc = qsearchs( 'svc_acct', \%search ) if keys %search; } elsif ( $cgi->param('username') =~ /^(.+)$/ ) { - $cgi_svc_acct = qsearchs( 'svc_acct', { 'username' => $1 } ); + $cgi_svc = qsearchs( 'svc_acct', { 'username' => $1 } ); +} + +my @part_export = (); +if ( $cgi_svc ) { + my $part_svc = $cgi_svc->cust_svc->part_svc; + @part_export = ( + $part_svc->part_export('sqlradius'), + $part_svc->part_export('sqlradius_withdomain'), + $part_svc->part_export('broadband_sqlradius'), + ); +} else { + @part_export = ( + #grep $_->can('usage_sessions'), qsearch( 'part_export' ) + qsearch( 'part_export', { 'exporttype' => 'sqlradius' } ), + qsearch( 'part_export', { 'exporttype' => 'sqlradius_withdomain' } ), + qsearch( 'part_export', { 'exporttype' => 'broadband_sqlradius' } ), + ); } my $ip = ''; @@ -167,55 +173,87 @@ if ( $prefix =~ /^(\d+)$/ ) { # field formatting subroutines ### -my %user2svc_acct = (); +my %user2svc = (); my $user_format = sub { my ( $user, $session, $part_export ) = @_; - my $svc_acct = ''; - if ( exists $user2svc_acct{$user} ) { - $svc_acct = $user2svc_acct{$user}; + my $svc = ''; + if ( exists $user2svc{$user} ) { + $svc = $user2svc{$user}; } else { - my %search = (); - if ( $part_export->exporttype eq 'sqlradius_withdomain' ) { - my $domain; - if ( $user =~ /^([^@]+)\@([^@]+)$/ ) { - $search{'username'} = $1; - $domain = $2; - } else { - $search{'username'} = $user; - $domain = $session->{'realm'}; - } - my $svc_domain = qsearchs('svc_domain', { 'domain' => $domain } ); - if ( $svc_domain ) { - $search{'domsvc'} = $svc_domain->svcnum; - } else { - delete $search{'username'}; - } - } elsif ( $part_export->exporttype eq 'sqlradius' ) { - $search{'username'} = $user; - } else { - die 'unknown export type '. $part_export->exporttype. - " for $part_export\n"; - } - if ( keys %search ) { - my @svc_acct = + + if ( $part_export->exporttype eq 'broadband_sqlradius' ) { + + ( my $mac = $user ) =~ s/[^0-9a-f]//ig; + + my @svc_broadband = grep { qsearchs( 'export_svc', { 'exportnum' => $part_export->exportnum, 'svcpart' => $_->cust_svc->svcpart, } ) - } qsearch( 'svc_acct', \%search ); - if ( @svc_acct ) { - warn 'multiple svc_acct records for user $user found; '. + } qsearch( 'svc_broadband', { + mac_addr => { op=>'ILIKE', value=>$mac } + }); + + if ( @svc_broadband ) { + warn 'multiple svc_broadband records for user $user found; '. 'using first arbitrarily' - if scalar(@svc_acct) > 1; - $user2svc_acct{$user} = $svc_acct = shift @svc_acct; + if scalar(@svc_broadband) > 1; + $user2svc{$user} = $svc = shift @svc_broadband; + } + + } else { + + my %search = (); + if ( $part_export->exporttype eq 'sqlradius_withdomain' ) { + my $domain; + if ( $user =~ /^([^@]+)\@([^@]+)$/ ) { + $search{'username'} = $1; + $domain = $2; + } else { + $search{'username'} = $user; + $domain = $session->{'realm'}; + } + my $svc_domain = qsearchs('svc_domain', { 'domain' => $domain } ); + if ( $svc_domain ) { + $search{'domsvc'} = $svc_domain->svcnum; + } else { + delete $search{'username'}; + } + } elsif ( $part_export->exporttype eq 'sqlradius' ) { + $search{'username'} = $user; + } else { + die 'unknown export type '. $part_export->exporttype. + " for $part_export\n"; } - } + if ( keys %search ) { + my @svc_acct = + grep { qsearchs( 'export_svc', { + 'exportnum' => $part_export->exportnum, + 'svcpart' => $_->cust_svc->svcpart, + } ) + } qsearch( 'svc_acct', \%search ); + if ( @svc_acct ) { + warn 'multiple svc_acct records for user $user found; '. + 'using first arbitrarily' + if scalar(@svc_acct) > 1; + $user2svc{$user} = $svc = shift @svc_acct; + } + } + + } + } - if ( $svc_acct ) { - my $svcnum = $svc_acct->svcnum; - qq($user); + $user = encode_entities($user); + + if ( $svc ) { + + #i should use svc_link, but that's expensive per-user + my $svcnum = $svc->svcnum; + my $table = $svc->table; + qq($user); + } else { "$user"; } @@ -224,14 +262,14 @@ my $user_format = sub { my $customer_format = sub { my( $unused, $session ) = @_; - return ' ' unless exists $user2svc_acct{$session->{'username'}}; - my $svc_acct = $user2svc_acct{$session->{'username'}}; - my $cust_pkg = $svc_acct->cust_svc->cust_pkg; + return ' ' unless exists $user2svc{$session->{'username'}}; + my $svc = $user2svc{$session->{'username'}}; + my $cust_pkg = $svc->cust_svc->cust_pkg; return ' ' unless $cust_pkg; my $cust_main = $cust_pkg->cust_main; qq!'. - $cust_pkg->cust_main->name. ''; + encode_entities($cust_pkg->cust_main->name). ''; }; my $time_format = sub { @@ -242,8 +280,15 @@ my $time_format = sub { $pretty; }; +my $time_format_or_open = sub { + my $time = shift; + return '
OPEN
' if $time == 0; + &{$time_format}($time); +}; + my $duration_format = sub { my $seconds = shift; + return '' if $seconds eq ''; # open session my $hour = int($seconds/3600); my $min = int( ($seconds%3600) / 60 ); my $sec = $seconds%60; @@ -259,110 +304,140 @@ my $duration_format = sub { my $octets_format = sub { my $octets = shift; - my $megs = $octets / 1048576; - sprintf('%.3f megs', $megs); - #my $gigs = $octets / 1073741824 - #sprintf('%.3f gigabytes', $gigs); + #my $megs = $octets / 1048576; + #sprintf('%.3f megs', $megs); + my $gigs = $octets / 1073741824; + sprintf('%.3f gigs', $gigs); +}; + +my $mac_format = sub { + my $value = shift; + if ( $value =~ /^\s*(([\dA-F]{2}[\-:]){5}[\dA-F]{2})/i + and my $vendor = Net::MAC::Vendor::lookup($1) + ) + { + return encode_entities($value). + ' ('. + encode_entities($vendor->[0]). + ')'; + } + length($value) ? encode_entities($value) : ' '; }; + ### # the fields ### my %fields; if ( $summarize ) { -tie %fields, 'Tie::IxHash', - 'username' => { - name => 'User', - attrib => 'UserName', - fmt => $user_format, - align => 'left', - }, - 'dummy' => { - name => 'Customer', - attrib => '', - fmt => $customer_format, - align => 'left', - }, - 'acctsessiontime' => { - name => 'Duration', - attrib => 'Acct-Session-Time', - fmt => $duration_format, - align => 'right', - }, - 'acctinputoctets' => { - name => 'Upload', # (from user)', - attrib => 'Acct-Input-Octets', - fmt => $octets_format, - align => 'right', - }, - 'acctoutputoctets' => { - name => 'Download', # (to user)', - attrib => 'Acct-Output-Octets', - fmt => $octets_format, - align => 'right', - }, -; + + tie %fields, 'Tie::IxHash', + 'username' => { + name => 'User', + attrib => 'UserName', + fmt => $user_format, + align => 'left', + }, + 'dummy' => { + name => 'Customer', + attrib => '', + fmt => $customer_format, + align => 'left', + }, + 'acctsessiontime' => { + name => 'Duration', + attrib => 'Acct-Session-Time', + fmt => $duration_format, + align => 'right', + }, + 'acctinputoctets' => { + name => 'Upload', # (from user)', + attrib => 'Acct-Input-Octets', + fmt => $octets_format, + align => 'right', + }, + 'acctoutputoctets' => { + name => 'Download', # (to user)', + attrib => 'Acct-Output-Octets', + fmt => $octets_format, + align => 'right', + }, + ; + } else { -tie %fields, 'Tie::IxHash', - 'username' => { - name => 'User', - attrib => 'UserName', - fmt => $user_format, - align => 'left', - }, - 'realm' => { - name => 'Realm', - attrib => 'Realm', - align => 'left', - }, - 'dummy' => { - name => 'Customer', - attrib => '', - fmt => $customer_format, - align => 'left', - }, - 'framedipaddress' => { - name => 'IP Address', - attrib => 'Framed-IP-Address', - fmt => sub { my $ip = shift; - length($ip) ? $ip : ' '; - }, - align => 'right', - }, - 'acctstarttime' => { - name => 'Start time', - attrib => 'Acct-Start-Time', - fmt => $time_format, - align => 'left', - }, - 'acctstoptime' => { - name => 'End time', - attrib => 'Acct-Stop-Time', - fmt => $time_format, - align => 'left', - }, - 'acctsessiontime' => { - name => 'Duration', - attrib => 'Acct-Session-Time', - fmt => $duration_format, - align => 'right', - }, - 'acctinputoctets' => { - name => 'Upload', # (from user)', - attrib => 'Acct-Input-Octets', - fmt => $octets_format, - align => 'right', - }, - 'acctoutputoctets' => { - name => 'Download', # (to user)', - attrib => 'Acct-Output-Octets', - fmt => $octets_format, - align => 'right', + + tie %fields, 'Tie::IxHash', + 'username' => { + name => 'User', + attrib => 'UserName', + fmt => $user_format, + align => 'left', + }, + 'realm' => { + name => 'Realm', + attrib => 'Realm', + align => 'left', + }, + 'dummy' => { + name => 'Customer', + attrib => '', + fmt => $customer_format, + align => 'left', + }, + 'framedipaddress' => { + name => 'IP Address', + attrib => 'Framed-IP-Address', + fmt => sub { my $ip = shift; + length($ip) ? $ip : ' '; + }, + align => 'right', + }, + 'callingstationid' => { + name => 'Source or MAC', + attrib => 'Calling-Station-Id', + fmt => $mac_format, + align => 'right', + }, + 'calledstationid' => { + name => 'Destination', + attrib => 'Called-Station-ID', + fmt => $mac_format, + align => 'left', }, -; + 'acctstarttime' => { + name => 'Start time', + attrib => 'Acct-Start-Time', + fmt => $time_format, + align => 'left', + }, + 'acctstoptime' => { + name => 'End time', + attrib => 'Acct-Stop-Time', + fmt => $time_format_or_open, + align => 'left', + }, + 'acctsessiontime' => { + name => 'Duration', + attrib => 'Acct-Session-Time', + fmt => $duration_format, + align => 'right', + }, + 'acctinputoctets' => { + name => 'Upload', # (from user)', + attrib => 'Acct-Input-Octets', + fmt => $octets_format, + align => 'right', + }, + 'acctoutputoctets' => { + name => 'Download', # (to user)', + attrib => 'Acct-Output-Octets', + fmt => $octets_format, + align => 'right', + }, + ; } -$fields{$_}->{fmt} ||= sub { length($_[0]) ? shift : ' '; } +$fields{$_}->{fmt} ||= sub { length($_[0]) ? encode_entities(shift) : ' '; } foreach keys %fields;