From 049da6c538c952f938af4544a07c688b89c26a17 Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 5 Oct 2004 16:28:28 +0000 Subject: RADIUS session viewing --- httemplate/search/sqlradius.cgi | 249 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 httemplate/search/sqlradius.cgi (limited to 'httemplate/search/sqlradius.cgi') diff --git a/httemplate/search/sqlradius.cgi b/httemplate/search/sqlradius.cgi new file mode 100644 index 000000000..3c5046bea --- /dev/null +++ b/httemplate/search/sqlradius.cgi @@ -0,0 +1,249 @@ +<%= include( '/elements/header.html', 'RADIUS Sessions', + include('/elements/menubar.html', + 'Main menu' => $p, # popurl(2), + ), + + ) +%> + +<% + ### + # parse cgi params + ### + + #sort of false laziness w/cust_pay.cgi + my $beginning = ''; + my $ending = ''; + if ( $cgi->param('beginning') + && $cgi->param('beginning') =~ /^([ 0-9\-\/]{0,10})$/ ) { + $beginning = str2time($1); + } + if ( $cgi->param('ending') + && $cgi->param('ending') =~ /^([ 0-9\-\/]{0,10})$/ ) { + $ending = str2time($1) + 86399; + } + if ( $cgi->param('begin') && $cgi->param('begin') =~ /^(\d+)$/ ) { + $beginning = $1; + } + if ( $cgi->param('end') && $cgi->param('end') =~ /^(\d+)$/ ) { + $ending = $1; + } + + my $cgi_svc_acct = ''; + if ( $cgi->param('svcnum') =~ /^(\d+)$/ ) { + $cgi_svc_acct = qsearchs( 'svc_acct', { 'svcnum' => $1 } ); + } elsif ( $cgi->param('username') =~ /^([^@]+)\@([^@]+)$/ ) { + my %search = { 'username' => $1 }; + my $svc_domain = qsearchs('svc_domain', { 'domain' => $2 } ); + if ( $svc_domain ) { + $search{'domsvc'} = $svc_domain->svcnum; + } else { + delete $search{'username'}; + } + $cgi_svc_acct = qsearchs( 'svc_acct', \%search ) + if keys %search; + } elsif ( $cgi->param('username') =~ /^(.+)$/ ) { + $cgi_svc_acct = qsearchs( 'svc_acct', { 'username' => $1 } ); + } + + my $ip = ''; + if ( $cgi->param('ip') =~ /^((\d+\.){3}\d+)$/ ) { + $ip = $1; + } + + ### + # field formatting subroutines + ### + + my %user2svc_acct = (); + my $user_format = sub { + my ( $user, $session, $part_export ) = @_; + + my $svc_acct = ''; + if ( exists $user2svc_acct{$user} ) { + $svc_acct = $user2svc_acct{$user}; + } else { + my %search = (); + if ( $part_export->exporrtype 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 "guru meditation #420"; + } + 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_acct{$user} = $svc_acct = shift @svc_acct; + } + } + } + + if ( $svc_acct ) { + my $svcnum = $svc_acct->svcnum; + qq($user); + } else { + "$user"; + } + + }; + + 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 $cust_pkg; + my $cust_main = $cust_pkg->cust_main; + + qq!'. + $cust_pkg->cust_main->name. ''; + }; + + my $time_format = sub { + my $time = shift; + $time > 0 + ? time2str('%T%P %a %b %o %Y', $time ) + : ' '; + }; + + my $duration_format = sub { + my $seconds = shift; + my $hour = int($seconds/3600); + my $min = int( ($seconds%3600) / 60 ); + my $sec = $seconds%60; + ''. + '
'. + ( $hour ? "$hourh" : ' ' ). + ''. + ( ( $hour || $min ) ? "$minm" : ' ' ). + ''. + "$secs". + '
'; + }; + + my $octets_format = sub { + my $octets = shift; + my $megs = $octets / 1048576; + sprintf('%.3f megs', $megs); + #my $gigs = $octets / 1073741824 + #sprintf('%.3f gigabytes', $gigs); + }; + + ### + # the fields + ### + + tie my %fields, 'Tie::IxHash', + 'username' => { + name => 'User', + attrib => 'UserName', + fmt => $user_format, + }, + 'realm' => { + name => 'Realm', + attrib => 'Realm', + }, + 'dummy' => { + name => 'Customer', + attrib => '', + fmt => $customer_format, + }, + 'framedipaddress' => { + name => 'IP Address', + attrib => 'Framed-IP-Address', + fmt => sub { my $ip = shift; + length($ip) ? $ip : ' '; + }, + }, + 'acctstarttime' => { + name => 'Start time', + attrib => 'Acct-Start-Time', + fmt => $time_format, + }, + 'acctstoptime' => { + name => 'End time', + attrib => 'Acct-Stop-Time', + fmt => $time_format, + }, + 'acctsessiontime' => { + name => 'Duration', + attrib => 'Acct-Session-Time', + fmt => $duration_format, + }, + 'acctinputoctets' => { + name => 'Upload', # (from user)', + attrib => 'Acct-Input-Octets', + fmt => $octets_format, + }, + 'acctoutputoctets' => { + name => 'Download', # (to user)', + attrib => 'Acct-Output-Octets', + fmt => $octets_format, + }, + ; + $fields{$_}->{fmt} ||= sub { length($_[0]) ? shift : ' '; } + foreach keys %fields; + + ### + # and finally, display the thing + ### + + foreach my $part_export ( map $_->rebless, + qsearch( 'part_export', { 'exporttype' => 'sqlradius' } ), + qsearch( 'part_export', { 'exporttype' => 'sqlradius_withdomain' } ) + ) { + %user2svc_acct = (); +%> + +<%= $part_export->exporttype %> to <%= $part_export->machine %>
+<%= include( '/elements/table.html' ) %> + + <% foreach my $field ( keys %fields ) { %> + + <%= $fields{$field}->{name} %>
+ <%= $fields{$field}->{attrib} %> + + <% } %> + +<% foreach my $session ( + @{ $part_export->usage_sessions( $beginning, $ending, $cgi_svc_acct, $ip ) } +) { %> + + <% foreach my $field ( keys %fields ) { %> + + <%= &{ $fields{$field}->{fmt} }( $session->{$field}, + $session, + $part_export, + ) + %> + + <% } %> + +<% } %> + + +

+ +<% } %> -- cgit v1.2.1 From eb4cf5563939a08eba1a10d8c2a8f52205f6535b Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 6 Oct 2004 13:27:49 +0000 Subject: small formatting updates to RADIUS report --- httemplate/search/sqlradius.cgi | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'httemplate/search/sqlradius.cgi') diff --git a/httemplate/search/sqlradius.cgi b/httemplate/search/sqlradius.cgi index 3c5046bea..9cc5958ee 100644 --- a/httemplate/search/sqlradius.cgi +++ b/httemplate/search/sqlradius.cgi @@ -123,9 +123,9 @@ my $time_format = sub { my $time = shift; - $time > 0 - ? time2str('%T%P %a %b %o %Y', $time ) - : ' '; + return ' ' if $time == 0; + my $pretty = time2str('%T%P %a %b %o %Y', $time ); + $pretty =~ s/ (\d)(st|dn|rd|th)/ $1$2/; }; my $duration_format = sub { @@ -223,7 +223,7 @@ <% foreach my $field ( keys %fields ) { %> <%= $fields{$field}->{name} %>
- <%= $fields{$field}->{attrib} %> + <%= $fields{$field}->{attrib} %> <% } %> -- cgit v1.2.1 From 8590a91eb0d64755dff5622a152ab6b5136d8520 Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 6 Oct 2004 13:33:25 +0000 Subject: small formatting updates to RADIUS report --- httemplate/search/sqlradius.cgi | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'httemplate/search/sqlradius.cgi') diff --git a/httemplate/search/sqlradius.cgi b/httemplate/search/sqlradius.cgi index 9cc5958ee..bb51acb7a 100644 --- a/httemplate/search/sqlradius.cgi +++ b/httemplate/search/sqlradius.cgi @@ -126,6 +126,7 @@ return ' ' if $time == 0; my $pretty = time2str('%T%P %a %b %o %Y', $time ); $pretty =~ s/ (\d)(st|dn|rd|th)/ $1$2/; + $pretty; }; my $duration_format = sub { @@ -171,19 +172,19 @@ fmt => $customer_format, }, 'framedipaddress' => { - name => 'IP Address', + name => 'IP Address', attrib => 'Framed-IP-Address', fmt => sub { my $ip = shift; length($ip) ? $ip : ' '; }, }, 'acctstarttime' => { - name => 'Start time', + name => 'Start time', attrib => 'Acct-Start-Time', fmt => $time_format, }, 'acctstoptime' => { - name => 'End time', + name => 'End time', attrib => 'Acct-Stop-Time', fmt => $time_format, }, -- cgit v1.2.1 From 85277a99fc463da9da890d0fa11df4abf0af6fe0 Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 6 Oct 2004 13:39:17 +0000 Subject: more formatting updates to RADIUS report --- httemplate/search/sqlradius.cgi | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'httemplate/search/sqlradius.cgi') diff --git a/httemplate/search/sqlradius.cgi b/httemplate/search/sqlradius.cgi index bb51acb7a..11edf3cf9 100644 --- a/httemplate/search/sqlradius.cgi +++ b/httemplate/search/sqlradius.cgi @@ -125,7 +125,7 @@ my $time = shift; return ' ' if $time == 0; my $pretty = time2str('%T%P %a %b %o %Y', $time ); - $pretty =~ s/ (\d)(st|dn|rd|th)/ $1$2/; + $pretty =~ s/ (\d)(st|dn|rd|th)/$1$2/; $pretty; }; @@ -161,15 +161,18 @@ 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', @@ -177,31 +180,37 @@ 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', }, ; $fields{$_}->{fmt} ||= sub { length($_[0]) ? shift : ' '; } -- cgit v1.2.1 From 83ccbe7d9626cea57ad70a9c22d8fa4518e39919 Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 6 Oct 2004 13:41:49 +0000 Subject: more formatting updates to RADIUS report --- httemplate/search/sqlradius.cgi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'httemplate/search/sqlradius.cgi') diff --git a/httemplate/search/sqlradius.cgi b/httemplate/search/sqlradius.cgi index 11edf3cf9..5fd32f4dc 100644 --- a/httemplate/search/sqlradius.cgi +++ b/httemplate/search/sqlradius.cgi @@ -242,7 +242,7 @@ ) { %> <% foreach my $field ( keys %fields ) { %> - + <%= &{ $fields{$field}->{fmt} }( $session->{$field}, $session, $part_export, -- cgit v1.2.1 From 6083603212ea08b80c0f48ad61f4421aae85c31d Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 12 Oct 2004 06:08:03 +0000 Subject: more info in error message for unknown export type, fix test for sqlradius_withdomain export, woo! --- httemplate/search/sqlradius.cgi | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'httemplate/search/sqlradius.cgi') diff --git a/httemplate/search/sqlradius.cgi b/httemplate/search/sqlradius.cgi index 5fd32f4dc..b506ba1cb 100644 --- a/httemplate/search/sqlradius.cgi +++ b/httemplate/search/sqlradius.cgi @@ -64,7 +64,7 @@ $svc_acct = $user2svc_acct{$user}; } else { my %search = (); - if ( $part_export->exporrtype eq 'sqlradius_withdomain' ) { + if ( $part_export->exporttype eq 'sqlradius_withdomain' ) { my $domain; if ( $user =~ /^([^@]+)\@([^@]+)$/ ) { $search{'username'} = $1; @@ -82,7 +82,8 @@ } elsif ( $part_export->exporttype eq 'sqlradius' ) { $search{'username'} = $user; } else { - die "guru meditation #420"; + die 'unknown export type '. $part_export->exporttype. + " for $part_export\n"; } if ( keys %search ) { my @svc_acct = -- cgit v1.2.1 From 48ba2845d0119c56971d5b724661aa37e73b49dd Mon Sep 17 00:00:00 2001 From: ivan Date: Sat, 20 Nov 2004 17:26:56 +0000 Subject: first pass at VoIP rating --- httemplate/search/sqlradius.cgi | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) (limited to 'httemplate/search/sqlradius.cgi') diff --git a/httemplate/search/sqlradius.cgi b/httemplate/search/sqlradius.cgi index b506ba1cb..9e4a55e62 100644 --- a/httemplate/search/sqlradius.cgi +++ b/httemplate/search/sqlradius.cgi @@ -51,6 +51,15 @@ $ip = $1; } + my $prefix = $cgi->param('prefix'); + $prefix =~ s/\D//g; + if ( $prefix =~ /^(\d+)$/ ) { + $prefix = $1; + $prefix = "011$prefix" unless $prefix =~ /^1/; + } else { + $prefix = ''; + } + ### # field formatting subroutines ### @@ -221,11 +230,30 @@ # and finally, display the thing ### - foreach my $part_export ( map $_->rebless, + foreach my $part_export ( + #grep $_->can('usage_sessions'), qsearch( 'part_export' ) qsearch( 'part_export', { 'exporttype' => 'sqlradius' } ), qsearch( 'part_export', { 'exporttype' => 'sqlradius_withdomain' } ) ) { %user2svc_acct = (); + + 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' => + 'attrib' => 'Called-Station-ID', + 'fmt' => + sub { length($_[0]) ? shift : ' '; }, + 'align' => 'left', + }, + ); + } + %> <%= $part_export->exporttype %> to <%= $part_export->machine %>
@@ -239,8 +267,10 @@ <% } %> <% foreach my $session ( - @{ $part_export->usage_sessions( $beginning, $ending, $cgi_svc_acct, $ip ) } -) { %> + @{ $part_export->usage_sessions( + $beginning, $ending, $cgi_svc_acct, $ip, $prefix, ) } + ) { +%> <% foreach my $field ( keys %fields ) { %> -- cgit v1.2.1 From d14421ac2a351bb1d934b1e3b16f3f806a239331 Mon Sep 17 00:00:00 2001 From: ivan Date: Mon, 22 Nov 2004 02:31:17 +0000 Subject: UI fix on search directions, fix bug preventing show_called_station, hide_ip and hide_data form working --- httemplate/search/sqlradius.cgi | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'httemplate/search/sqlradius.cgi') diff --git a/httemplate/search/sqlradius.cgi b/httemplate/search/sqlradius.cgi index 9e4a55e62..af6a4c640 100644 --- a/httemplate/search/sqlradius.cgi +++ b/httemplate/search/sqlradius.cgi @@ -259,10 +259,10 @@ <%= $part_export->exporttype %> to <%= $part_export->machine %>
<%= include( '/elements/table.html' ) %> - <% foreach my $field ( keys %fields ) { %> + <% foreach my $field ( keys %efields ) { %> - <%= $fields{$field}->{name} %>
- <%= $fields{$field}->{attrib} %> + <%= $efields{$field}->{name} %>
+ <%= $efields{$field}->{attrib} %> <% } %> @@ -272,9 +272,9 @@ ) { %> - <% foreach my $field ( keys %fields ) { %> - - <%= &{ $fields{$field}->{fmt} }( $session->{$field}, + <% foreach my $field ( keys %efields ) { %> + + <%= &{ $efields{$field}->{fmt} }( $session->{$field}, $session, $part_export, ) -- cgit v1.2.1 From 97ddf39b5798913bbd2b0205b2767df2cd362a2b Mon Sep 17 00:00:00 2001 From: ivan Date: Mon, 22 Nov 2004 11:11:02 +0000 Subject: Called-Station-ID label --- httemplate/search/sqlradius.cgi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'httemplate/search/sqlradius.cgi') diff --git a/httemplate/search/sqlradius.cgi b/httemplate/search/sqlradius.cgi index af6a4c640..b84df1a03 100644 --- a/httemplate/search/sqlradius.cgi +++ b/httemplate/search/sqlradius.cgi @@ -245,7 +245,7 @@ if ( $part_export->option('show_called_station') ) { $efields->Splice(1, 0, 'calledstationid' => { - 'name' => + 'name' => 'Destination', 'attrib' => 'Called-Station-ID', 'fmt' => sub { length($_[0]) ? shift : ' '; }, -- cgit v1.2.1