Will things ever be the same again?
[freeside.git] / httemplate / search / sqlradius.cgi
1 <% include( '/elements/header.html', 'RADIUS Sessions',
2              include('/elements/menubar.html',
3                        'Main menu' => $p, # popurl(2),
4                     ),
5
6     )
7 %>
8 %
9 %  ###
10 %  # parse cgi params
11 %  ###
12 %
13 %  #sort of false laziness w/cust_pay.cgi
14 %  my $beginning = '';
15 %  my $ending = '';
16 %  if ( $cgi->param('beginning')
17 %       && $cgi->param('beginning') =~ /^([ 0-9\-\/]{0,10})$/ ) {
18 %    $beginning = str2time($1);
19 %  }
20 %  if ( $cgi->param('ending')
21 %       && $cgi->param('ending') =~ /^([ 0-9\-\/]{0,10})$/ ) {
22 %    $ending = str2time($1) + 86399;
23 %  }
24 %  if ( $cgi->param('begin') && $cgi->param('begin') =~ /^(\d+)$/ ) {
25 %    $beginning = $1;
26 %  }
27 %  if ( $cgi->param('end') && $cgi->param('end') =~ /^(\d+)$/ ) {
28 %    $ending = $1;
29 %  }
30 %
31 %  my $cgi_svc_acct = '';
32 %  if ( $cgi->param('svcnum') =~ /^(\d+)$/ ) {
33 %    $cgi_svc_acct = qsearchs( 'svc_acct', { 'svcnum' => $1 } );
34 %  } elsif ( $cgi->param('username') =~ /^([^@]+)\@([^@]+)$/ ) {
35 %    my %search = { 'username' => $1 };
36 %    my $svc_domain = qsearchs('svc_domain', { 'domain' => $2 } );
37 %    if ( $svc_domain ) {
38 %      $search{'domsvc'} = $svc_domain->svcnum;
39 %    } else {
40 %      delete $search{'username'};
41 %    }
42 %    $cgi_svc_acct = qsearchs( 'svc_acct', \%search )
43 %      if keys %search;
44 %  } elsif ( $cgi->param('username') =~ /^(.+)$/ ) {
45 %    $cgi_svc_acct = qsearchs( 'svc_acct', { 'username' => $1 } );
46 %  }
47 %
48 %  my $ip = '';
49 %  if ( $cgi->param('ip') =~ /^((\d+\.){3}\d+)$/ ) {
50 %    $ip = $1;
51 %  }
52 %
53 %  my $prefix = $cgi->param('prefix');
54 %  $prefix =~ s/\D//g;
55 %  if ( $prefix =~ /^(\d+)$/ ) {
56 %    $prefix = $1;
57 %    $prefix = "011$prefix" unless $prefix =~ /^1/;
58 %  } else {
59 %    $prefix = '';
60 %  }
61 %
62 %  ###
63 %  # field formatting subroutines
64 %  ###
65 %
66 %  my %user2svc_acct = ();
67 %  my $user_format = sub {
68 %    my ( $user, $session, $part_export ) = @_;
69 %
70 %    my $svc_acct = '';
71 %    if ( exists $user2svc_acct{$user} ) {
72 %      $svc_acct = $user2svc_acct{$user};
73 %    } else {
74 %      my %search = ();
75 %      if ( $part_export->exporttype eq 'sqlradius_withdomain' ) {
76 %        my $domain;
77 %        if ( $user =~ /^([^@]+)\@([^@]+)$/ ) {
78 %         $search{'username'} = $1;
79 %         $domain = $2;
80 %       } else {
81 %         $search{'username'} = $user;
82 %         $domain = $session->{'realm'};
83 %       }
84 %       my $svc_domain = qsearchs('svc_domain', { 'domain' => $domain } );
85 %       if ( $svc_domain ) {
86 %         $search{'domsvc'} = $svc_domain->svcnum;
87 %       } else {
88 %         delete $search{'username'};
89 %       }
90 %      } elsif ( $part_export->exporttype eq 'sqlradius' ) {
91 %        $search{'username'} = $user;
92 %      } else {
93 %        die 'unknown export type '. $part_export->exporttype.
94 %            " for $part_export\n";
95 %      }
96 %      if ( keys %search ) {
97 %        my @svc_acct =
98 %          grep { qsearchs( 'export_svc', {
99 %                   'exportnum' => $part_export->exportnum,
100 %                   'svcpart'   => $_->cust_svc->svcpart,
101 %                 } )
102 %               } qsearch( 'svc_acct', \%search );
103 %        if ( @svc_acct ) {
104 %          warn 'multiple svc_acct records for user $user found; '.
105 %               'using first arbitrarily'
106 %            if scalar(@svc_acct) > 1;
107 %          $user2svc_acct{$user} = $svc_acct = shift @svc_acct;
108 %        }
109 %      } 
110 %    }
111 %
112 %    if ( $svc_acct ) { 
113 %      my $svcnum = $svc_acct->svcnum;
114 %      qq(<A HREF="${p}view/svc_acct.cgi?$svcnum"><B>$user</B></A>);
115 %    } else {
116 %      "<B>$user</B>";
117 %    }
118 %
119 %  };
120 %
121 %  my $customer_format = sub {
122 %    my( $unused, $session ) = @_;
123 %    return '&nbsp;' unless exists $user2svc_acct{$session->{'username'}};
124 %    my $svc_acct = $user2svc_acct{$session->{'username'}};
125 %    my $cust_pkg = $svc_acct->cust_svc->cust_pkg;
126 %    return '&nbsp;' unless $cust_pkg;
127 %    my $cust_main = $cust_pkg->cust_main;
128 %
129 %    qq!<A HREF="${p}view/cust_main.cgi?!. $cust_main->custnum. '">'.
130 %      $cust_pkg->cust_main->name. '</A>';
131 %  };
132 %
133 %  my $time_format = sub {
134 %    my $time = shift;
135 %    return '&nbsp;' if $time == 0;
136 %    my $pretty = time2str('%T%P %a&nbsp;%b&nbsp;%o&nbsp;%Y', $time );
137 %    $pretty =~ s/ (\d)(st|dn|rd|th)/$1$2/;
138 %    $pretty;
139 %  };
140 %
141 %  my $duration_format = sub {
142 %    my $seconds = shift;
143 %    my $hour = int($seconds/3600);
144 %    my $min = int( ($seconds%3600) / 60 );
145 %    my $sec = $seconds%60;
146 %    '<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>'.
147 %    '<TR><TD ALIGN="right">'.
148 %       ( $hour ? "<B>$hour</B>h" : '&nbsp;' ).
149 %     '</TD><TD ALIGN="right">'.
150 %       ( ( $hour || $min ) ? "<B>$min</B>m" : '&nbsp;' ).
151 %     '</TD><TD ALIGN="right">'.
152 %       "<B>$sec</B>s".
153 %    '</TD></TR></TABLE>';
154 %  };
155 %
156 %  my $octets_format = sub {
157 %    my $octets = shift;
158 %    my $megs = $octets / 1048576;
159 %    sprintf('<B>%.3f</B>&nbsp;megs', $megs);
160 %    #my $gigs = $octets / 1073741824
161 %    #sprintf('<B>%.3f</B> gigabytes', $gigs);
162 %  };
163 %
164 %  ###
165 %  # the fields
166 %  ###
167 %
168 %  tie my %fields, 'Tie::IxHash', 
169 %    'username'          => {
170 %                             name    => 'User',
171 %                             attrib  => 'UserName',
172 %                             fmt     => $user_format,
173 %                             align   => 'left',
174 %                           },
175 %    'realm'             => {
176 %                             name    => 'Realm',
177 %                             attrib  => 'Realm',
178 %                             align   => 'left',
179 %                           },
180 %    'dummy'             => {
181 %                             name    => 'Customer',
182 %                             attrib  => '',
183 %                             fmt     => $customer_format,
184 %                             align   => 'left',
185 %                           },
186 %    'framedipaddress'   => {
187 %                             name    => 'IP&nbsp;Address',
188 %                             attrib  => 'Framed-IP-Address',
189 %                             fmt     => sub { my $ip = shift;
190 %                                              length($ip) ? $ip : '&nbsp';
191 %                                            },
192 %                             align   => 'right',
193 %                           },
194 %    'acctstarttime'     => {
195 %                             name    => 'Start&nbsp;time',
196 %                             attrib  => 'Acct-Start-Time',
197 %                             fmt     => $time_format,
198 %                             align   => 'left',
199 %                           },
200 %    'acctstoptime'      => {
201 %                             name    => 'End&nbsp;time',
202 %                             attrib  => 'Acct-Stop-Time',
203 %                             fmt     => $time_format,
204 %                             align   => 'left',
205 %                           },
206 %    'acctsessiontime'   => {
207 %                             name    => 'Duration',
208 %                             attrib  => 'Acct-Session-Time',
209 %                             fmt     => $duration_format,
210 %                             align   => 'right',
211 %                           },
212 %    'acctinputoctets'   => {
213 %                             name    => 'Upload', # (from user)',
214 %                             attrib  => 'Acct-Input-Octets',
215 %                             fmt     => $octets_format,
216 %                             align   => 'right',
217 %                           },
218 %    'acctoutputoctets'  => {
219 %                             name    => 'Download', # (to user)',
220 %                             attrib  => 'Acct-Output-Octets',
221 %                             fmt     => $octets_format,
222 %                             align   => 'right',
223 %                           },
224 %  ;
225 %  $fields{$_}->{fmt} ||= sub { length($_[0]) ? shift : '&nbsp'; }
226 %    foreach keys %fields;
227 %
228 %  ###
229 %  # and finally, display the thing
230 %  ### 
231 %
232 %  foreach my $part_export (
233 %    #grep $_->can('usage_sessions'), qsearch( 'part_export' )
234 %    qsearch( 'part_export', { 'exporttype' => 'sqlradius' } ),
235 %    qsearch( 'part_export', { 'exporttype' => 'sqlradius_withdomain' } )
236 %  ) {
237 %    %user2svc_acct = ();
238 %
239 %    my $efields = tie my %efields, 'Tie::IxHash', %fields;
240 %    delete $efields{'framedipaddress'} if $part_export->option('hide_ip');
241 %    if ( $part_export->option('hide_data') ) {
242 %      delete $efields{$_} foreach qw(acctinputoctets acctoutputoctets);
243 %    }
244 %    if ( $part_export->option('show_called_station') ) {
245 %      $efields->Splice(1, 0,
246 %        'calledstationid' => {
247 %                               'name'   => 'Destination',
248 %                               'attrib' => 'Called-Station-ID',
249 %                               'fmt'    =>
250 %                                 sub { length($_[0]) ? shift : '&nbsp'; },
251 %                               'align'  => 'left',
252 %                             },
253 %      );
254 %    }
255 %
256 %
257
258
259 <% $part_export->exporttype %> to <% $part_export->machine %><BR>
260 <% include( '/elements/table.html' ) %>
261 <TR>
262 % foreach my $field ( keys %efields ) { 
263
264     <TH>
265       <% $efields{$field}->{name} %><BR>
266       <FONT SIZE=-2><% $efields{$field}->{attrib} %></FONT>
267     </TH>
268 % } 
269
270 </TR>
271 % foreach my $session (
272 %     @{ $part_export->usage_sessions(
273 %          $beginning, $ending, $cgi_svc_acct, $ip, $prefix, ) }
274 %   ) {
275 %
276
277   <TR>
278 % foreach my $field ( keys %efields ) { 
279
280       <TD ALIGN="<% $efields{$field}->{align} %>">
281         <% &{ $efields{$field}->{fmt} }( $session->{$field},
282                                          $session,
283                                          $part_export,
284                                        )
285         %>
286       </TD>
287 % } 
288
289   </TR>
290 % } 
291
292
293 </TABLE>
294 <BR><BR>
295 % } 
296