|   | 
   
  
System Utilities / RadiusSplit
Source Text 
#!/usr/bin/perl # # radiussplit - Split the Radius logs into per user logs. # # This program should be run as a 'pipe', e.g. in a script: # tail -f /etc/raddb/detail | radiussplit #  #  # Author:       Paul Gregg <pgregg@pgregg.com> # Date:         10 July 1998 # Summary:      Radius,  User's activity,  Port usage, Log/Detail files. # Version:      1.0 # Copyright:    1997,1998,1999,2000 Paul Gregg <pgregg@pgregg.com> # Copy Policy:  Free to copy and distribute provided all headers are left #               intact and no charge is made for this program.  I would #               appreciate copies of any modifications to the script. # URL:          http://www.pgregg.com/projects/ # FTP:          None yet (I'm lazy) # # # Supported:    Livingston Radius V2.0+, V1.16 #               Merit Radius #               Ascend Radius #               Dale Reed's RadiusNT #               Radiator Perl Radius Server
 
  #require "ctime.pl"; #use POSIX;
  #Unbuffered output $| = 1;
  # gzcat - 'cat for .gz / gzip files' # If you don't have gzcat and do have gzip then use: ln gzip gzcat $GZCAT = "/usr/local/bin/gzcat";
  # zcat - 'cat for .Z / compressed files' $ZCAT = "/usr/bin/zcat";
  # Livingston Radius V1.16+, RadiusNT, Merit Radius, and some Ascend: # e.g. Record stamp of type: Tue Jul  1 00:28:34 1997 $RECORD_DATE_FMT = "DAY MON MDAY HH:MM:SS YEAR";
  # Ascend Radius: # e.g. Record stamp of type: 23-07-1997 00:02:55 #$RECORD_DATE_FMT = "MDAY-MON-YEAR HH:MM:SS";
  #### You should not have to modify anything below here
 
  @weekdays = ( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ); %weekhash = ( "Sun", 0, "Mon", 1, "Tue", 2, "Wed", 3, "Thu", 4,                 "Fri", 5, "Sat", 6 ); @months = (     "Jan", "Feb", "Mar", "Apr", "May", "Jun",                 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ); %monthshash = ( "Jan", 0, "Feb", 1, "Mar", 2, "Apr", 3, "May", 4, "Jun", 5,                 "Jul", 6, "Aug", 7, "Sep", 8, "Oct", 9, "Nov", 10, "Dec", 11);
 
  #Extract all command line arguments $args=1 if ( $#ARGV > 0 ); while ($args) {   $flag = shift(@ARGV);   if ($flag eq "--help") { &help; exit; }   if (substr($flag, 0, 1) eq '-') {     #if ($flag =~ /[tbharsH]/) {     #  $arg{'s'} = TRUE if ($flag =~ /s/);     #} else {       $arg{substr($flag, 1, 1)} = shift(@ARGV);     #}   } else {     die "Usage: $usage\n Error in $flag - not a valid flag.\n";   }   $args = 0 if (!$ARGV[0]); }
  $DEFOUT = "/var/adm/radacct/portmaster1/users";
  if ( (!defined($arg{'o'})) ) {   warn "No output directory specified - using $DEFOUT/YYYY/MM/\n";   $arg{'o'} = "THISMONTH"; }
  printf ( "Sending output to directory: %s\n", $arg{'o'} ) if ($DEBUG ge 1);
  $/=""; # 'line' split on single blank lines
 
  while ( $file_record = <STDIN> ) {   $DIR = $arg{'o'};   @record = ();   @record = split(/\n/, $file_record);   process_record(@record);
    if ( $AcctStatusType eq "Stop" && $UserName) {
      if ($DIR eq "THISMONTH") {       my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =                         localtime($Timestamp);       $year += 1900;       $DIR = sprintf("%s/%4d/%02d", $DEFOUT, $year, $mon+1);       if ( ! -d "$DIR" ) { makedirs($DIR); }     }
      $line = join ("\n", @record) . "\n\n";     print ".";     if ( -f "$DIR/$UserName" ) {       open(OUT, ">>$DIR/$UserName") || die "Can't open file $DIR/$UserName: $!\n";     } else {       open(OUT, ">$DIR/$UserName") || warn "Can't open file $DIR/$UserName: $!\n";     }     #for (@record) {     #  print OUT "$_\n";     #}     ##print OUT @record;     #print OUT "\n";     print OUT $line;     close(OUT);   } }
  exit;
  sub process_record {   my @new_record = @_;
    $AcctSessionId = ""; $UserName = ""; $NASPort=""; $NASPortType="";   $NASIPAddress = "";   $AcctStatusType=""; $AcctSessionTime=""; $AcctInputOctets="";   $AcctOutputOctets=""; $AcctTerminateCause=""; $ServiceType="";   $FramedProtocol=""; $FramedIPAddress=""; $Timestamp=""; $AcctDelayTime="";   $ConnectInfo=""; $REC=""; $VALUE="";   foreach (@new_record) {  # Collect data     s/^\s+//;  #Strip leading spaces.     print " -> $_" if ($DEBUG ge 3);     chomp;     ($REC, $VALUE) = split(" = ", $_, 2);     next if ( ! $VALUE ); # line isn't a REC = VALUE type.     $REC =~ s/-//g;  # Strip the '-'s from the REC name.
 
      ${$REC} = $VALUE; # Store this REC = VALUE     print ":$REC: - :$VALUE:\n" if ($DEBUG ge 2);
      return if ($REC eq "AcctStatusType" && $VALUE eq "Start");   }
    # Check for a valid Timestamp - if none, generate one from record stamp   if ($Timestamp == "") {     my $recdate = $record[0];     chomp $recdate;     $recdate =~ s/ +/ /g;     $recdate =~ s/:/ /g;     my @recdates = split(/ /, $recdate);     my $stdfmt = $RECORD_DATE_FMT;     $stdfmt =~ s/:/ /g;     my @stds = split(/ /, $stdfmt);     while ($foo = shift (@stds)) {       $val = shift(@recdates);       $$foo = $val;     }     #print "$DAY, $MON, $MDAY, $HH, $MM, $SS, $YEAR\n";     $Timestamp = calendar_time( $DAY, $MON, $MDAY, $HH, $MM, $SS, $YEAR );     #print "TIMESTAMP = $Timestamp\n";   }
    # Remove "" marks from $AcctSessionId, $UserName and $ConnectInfo   $UserName =~ s/\"//g;   $AcctSessionId =~ s/\"//g;   $ConnectInfo =~ s/\"//g;
    # And correct the Timestamp backwards if there was an accounting delay   $Timestamp -= $AcctDelayTime;   $AcctDelayTime = 0;
    # Generate a Unique ID from AcctSessionId, UserName, NASPort and NASIPAddress   $UniqueId = "$UserName/$AcctSessionId/$NASPort/$NASIPAddress";
  }
  sub calendar_time {   my $day = shift;   my $month = shift;   my $mday = shift;   my $hour = shift;   my $min = shift;   my $sec = shift;   my $year = shift;   $year -= 1900 if ($year >= 1900);   #printf "$sec:$min:$hour $mday, $month=$monthshash{$month}, $year, $day=$weekhash{$day}\n";   #my $cal = mktime($sec, $min, $hour,  $mday, $monthshash{$month}, $year,   #              $weekhash{$day}, 0, 0);   return $cal; }
 
  sub makedirs {   # Ensure the directory exists   my $dir = shift;   return if ( -d $dir );   print "  Making directory $dir\n";   if ( ! mkdir($dir,0755) ) { # Failed, lets recurse upwards to fix     my $lastslashpos = rindex ($dir, "/"); # Find the last / in the dir     my $dirup = substr( $dir, 0, $lastslashpos );     makedirs($dirup);     mkdir($dir,0755)   } }
  
 |  | 
  
 |