freeside/httemplate/search sqlradius.cgi,NONE,1.1 sqlradius.html,NONE,1.1

ivan ivan at pouncequick.420.am
Tue Oct 5 09:28:32 PDT 2004


Update of /home/cvs/cvsroot/freeside/httemplate/search
In directory pouncequick:/tmp/cvs-serv10168/httemplate/search

Added Files:
	sqlradius.cgi sqlradius.html 
Log Message:
RADIUS session viewing

--- NEW FILE: sqlradius.cgi ---
<%= 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(<A HREF="${p}view/svc_acct.cgi?$svcnum"><B>$user</B></A>);
    } else {
      "<B>$user</B>";
    }

  };

  my $customer_format = sub {
    my( $unused, $session ) = @_;
    return '&nbsp;' unless exists $user2svc_acct{$session->{'username'}};
    my $svc_acct = $user2svc_acct{$session->{'username'}};
    my $cust_pkg = $svc_acct->cust_svc->cust_pkg;
    return '&nbsp;' unless $cust_pkg;
    my $cust_main = $cust_pkg->cust_main;

    qq!<A HREF="${p}view/cust_main.cgi?!. $cust_main->custnum. '">'.
      $cust_pkg->cust_main->name. '</A>';
  };

  my $time_format = sub {
    my $time = shift;
    $time > 0
      ? time2str('%T%P&nbsp;%a&nbsp;%b&nbsp;%o&nbsp;%Y', $time )
      : '&nbsp;';
  };

  my $duration_format = sub {
    my $seconds = shift;
    my $hour = int($seconds/3600);
    my $min = int( ($seconds%3600) / 60 );
    my $sec = $seconds%60;
    '<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>'.
    '<TR><TD ALIGN="right">'.
       ( $hour ? "<B>$hour</B>h" : '&nbsp;' ).
     '</TD><TD ALIGN="right">'.
       ( ( $hour || $min ) ? "<B>$min</B>m" : '&nbsp;' ).
     '</TD><TD ALIGN="right">'.
       "<B>$sec</B>s".
    '</TD></TR></TABLE>';
  };

  my $octets_format = sub {
    my $octets = shift;
    my $megs = $octets / 1048576;
    sprintf('<B>%.3f</B>&nbsp;megs', $megs);
    #my $gigs = $octets / 1073741824
    #sprintf('<B>%.3f</B> 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 : '&nbsp';
                                            },
                           },
    '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 : '&nbsp'; }
    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 %><BR>
<%= include( '/elements/table.html' ) %>
<TR>
  <% foreach my $field ( keys %fields ) { %>
    <TH>
      <%= $fields{$field}->{name} %><BR>
      <FONT SIZE=-1><%= $fields{$field}->{attrib} %></FONT>
    </TH>
  <% } %>
</TR>
<% foreach my $session (
  @{ $part_export->usage_sessions( $beginning, $ending, $cgi_svc_acct, $ip ) }
) { %>
  <TR>
    <% foreach my $field ( keys %fields ) { %>
      <TD ALIGN="right">
        <%= &{ $fields{$field}->{fmt} }( $session->{$field},
                                         $session,
                                         $part_export,
                                       )
        %>
      </TD>
    <% } %>
  </TR>
<% } %>

</TABLE>
<BR><BR>

<% } %>

--- NEW FILE: sqlradius.html ---
<%= include( '/elements/header.html', 'Search RADIUS sessions', '', '', '
<LINK REL="stylesheet" TYPE="text/css" HREF="../elements/calendar-win2k-2.css" TITLE="win2k-2">
<SCRIPT TYPE="text/javascript" SRC="../elements/calendar_stripped.js"></SCRIPT>
<SCRIPT TYPE="text/javascript" SRC="../elements/calendar-en.js"></SCRIPT>
<SCRIPT TYPE="text/javascript" SRC="../elements/calendar-setup.js"></SCRIPT>
') %>
<FORM NAME="OneTrueForm" ACTION="sqlradius.cgi" METHOD="POST">
<% #include( '/elements/table.html' ) %>
<%= ntable('#cccccc') %>
<TR>
  <TD ALIGN="right">Username: </TD>
  <TD><INPUT TYPE="text" NAME="username"></TD>
</TR>
<TR>
  <TD></TD>
  <TD><FONT SIZE="-1"><I>(leave blank to show all users)</I></FONT></TD>
</TR>
<TR>
  <TD ALIGN="right">IP address: </TD>
  <TD><INPUT TYPE="text" NAME="ip"></TD>
</TR>
<TR>
  <TD></TD>
  <TD><FONT SIZE="-1"><I>(leave blank to show all IPs)</I></FONT></TD>
</TR>
<TR>
  <TD ALIGN="right">From: </TD>
  <TD>
    <INPUT TYPE="text" NAME="beginning" ID="beginning_text" VALUE="" SIZE=11 MAXLENGTH=10> <IMG SRC="../images/calendar.png" ID="beginning_button" STYLE="cursor: pointer" TITLE="Select date">
  </TD>
  <SCRIPT TYPE="text/javascript">
    Calendar.setup({
      inputField: "beginning_text",
      ifFormat:   "%m/%d/%Y",
      button:     "beginning_button",
      align:      "BR"
    });
  </SCRIPT>
</TR>
<TR>
  <TD></TD>
  <TD><i>m/d/y</i></TD>
</TR>
<TR>
  <TD ALIGN="right">To: </TD>
  <TD>
    <INPUT TYPE="text" NAME="ending" ID="ending_text" VALUE="" SIZE=11 MAXLENGTH=10> <IMG SRC="../images/calendar.png" ID="ending_button" STYLE="cursor:pointer" TITLE="Select date">
  </TD>
  <SCRIPT TYPE="text/javascript">
    Calendar.setup({
      inputField: "ending_text",
      ifFormat:   "%m/%d/%Y",
      button:     "ending_button",
      align:      "BR"
    });
  </SCRIPT>
</TR>
<TR>
  <TD></TD>
  <TD><i>m/d/y</i>
  <BR><FONT SIZE="-1">(leave one or both dates blank for an open-ended search)</FONT>
  </TD>
</TR>
</TABLE>
<BR><INPUT TYPE="submit" VALUE="View sessions">
</FORM>
</BODY>
</HTML>






More information about the freeside-commits mailing list