[BACK]Return to su.cgi CVS log [TXT][DIR] Up to [local] / trango / Net-Telnet-Trango / scripts

Diff for /trango/Net-Telnet-Trango/scripts/su.cgi between version 1.2 and 1.5

version 1.2, 2007/02/07 17:42:56 version 1.5, 2008/09/04 21:38:06
Line 1 
Line 1 
 #!/usr/bin/perl  #!/usr/bin/perl
 # $RedRiver: su.cgi,v 1.1 2007/02/07 16:55:12 andrew Exp $  # $RedRiver: su.cgi,v 1.4 2007/02/07 19:25:21 andrew Exp $
 ########################################################################  ########################################################################
 # su.cgi *** a CGI for Trango SU utilities.  # su.cgi *** a CGI for Trango SU utilities.
 #  #
 # 2007.02.07 #*#*# andrew fresh <andrew@mad-techies.org>  # 2007.02.07 #*#*# andrew fresh <andrew@mad-techies.org>
 ########################################################################  ########################################################################
 # Copyright (C) 2007 by Andrew Fresh  # Copyright (C) 2007 by Andrew Fresh
 #  #
 # This program is free software; you can redistribute it and/or modify  # This program is free software; you can redistribute it and/or modify
 # it under the same terms as Perl itself.  # it under the same terms as Perl itself.
 ########################################################################  ########################################################################
 use strict;  use strict;
Line 15 
Line 15 
   
 my $host_file = 'su.yaml';  my $host_file = 'su.yaml';
   
 my $default_mac  = '0001DE';  my $default_mac     = '0001DE';
 my $default_suid = 'all';  my $default_suid    = 'all';
 my $default_cir  = 256;  my $default_cir     = 256;
 my $default_mir  = 9999;  my $default_mir     = 9999;
 my $Start_SUID = 3;  my $Start_SUID      = 3;
   
 use CGI qw/:standard/;  use CGI qw/:standard/;
 use File::Basename;  use File::Basename;
Line 30 
Line 30 
   
 my $aps = get_aps($host_file);  my $aps = get_aps($host_file);
   
 print header,  print header, start_html('Trango SU Utilities'), h1('Trango SU Utilities');
       start_html('Trango SU Utilities'),  
       h1('Trango SU Utilities');  
   
 if (param()) {  if ( param() ) {
   
         my $AP = param('AP');      my $AP = param('AP');
   
         unless (exists $aps->{$AP}) {      unless ( exists $aps->{$AP} ) {
                 print h3("AP '$AP' does not exist!");          print h3("AP '$AP' does not exist!");
                 print end_html;          print end_html;
                 exit;          exit;
         }      }
   
         my $sumac = param('sumac');      my $sumac = param('sumac');
   
         $sumac =~ s/[^0-9A-Fa-f]//g;      $sumac =~ s/[^0-9A-Fa-f]//g;
         $sumac = uc($sumac);      $sumac = uc($sumac);
   
         my $suid = param('suid');      my $suid = param('suid');
   
         if (length $sumac == 12) {      if ( length $sumac == 12 ) {
                 add_su($aps->{$AP}, $sumac);          add_su( $aps->{$AP}, $sumac );
         } elsif (length $suid) {      }
                 testrflink($aps->{$AP}, $suid);      elsif ( length $suid ) {
         } else {          testrflink( $aps->{$AP}, $suid );
                 print h3("Invalid SUID '$suid' and MAC '$sumac'");      }
                 show_form($aps, $default_mac);      else {
         }          print h3("Invalid SUID '$suid' and MAC '$sumac'");
           show_form( $aps, $default_mac );
       }
   
 } else {  
         show_form($aps, $default_mac);  
 }  }
   else {
       show_form( $aps, $default_mac );
   }
   
   
 print end_html;  print end_html;
   
   sub get_aps {
       my $file = shift;
   
 sub get_aps      my $conf = LoadFile($file);
 {  
         my $file = shift;  
   
         my $conf = LoadFile($file);      my %aps;
   
         my %aps;      my @hosts;
       foreach my $ap ( keys %{$conf} ) {
           next if $ap eq 'default';
           my $h = $conf->{$ap};
   
         foreach my $ap (keys %{ $conf }) {          if ( $h->{name}
                 next if $ap eq 'default';              =~ /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.)(\d{1,3})-(\d{1,3})/ )
                 $aps{ $ap } = $conf->{$ap};          {
                 if (ref $conf->{default} eq 'HASH') {              for ( $2 .. $3 ) {
                         foreach my $k (keys %{ $conf->{default} }) {                  my %cur_host;
                                 $aps{ $ap }{$k} ||= $conf->{default}->{$k};                  foreach my $k ( keys %{$h} ) {
                         }                      $cur_host{$k} = $h->{$k};
                 }                  }
         }                  $cur_host{name} = $1 . $_;
                   if ( !grep { $cur_host{name} eq $h->{name} } values %aps ) {
                       my $ap_name = $ap . $_;
                       $aps{$ap_name} = \%cur_host;
                   }
               }
           }
           else {
               $aps{$ap} = $conf->{$ap};
               push @hosts, $h;
           }
       }
   
         return \%aps;      if ( ref $conf->{default} eq 'HASH' ) {
           foreach my $ap ( keys %aps ) {
               foreach my $k ( keys %{ $conf->{default} } ) {
                   $aps{$ap}{$k} ||= $conf->{default}->{$k};
               }
           }
       }
   
         return {      return \%aps;
                 'rrlhcwap0000' => {  
                         name     => '192.168.1.1',  
                         password => 'trango',  
                 }  
         };  
   
       return {
           'rrlhcwap0000' => {
               name     => '192.168.1.1',
               password => 'trango',
           }
       };
   
 }  }
   
 sub show_form  sub show_form {
 {      my $aps = shift;
         my $aps  = shift;  
   
         my %cache = ();      my %cache    = ();
         my @ap_names = sort {      my @ap_names = sort {
                 my @a = $a =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/;          my @a = $a =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/;
                 my @b = $b =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/;          my @b = $b =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/;
   
                 if (@a) {          if (@a) {
                         $cache{$a} ||= pack('C4' => @a);              $cache{$a} ||= pack( 'C4' => @a );
                 } else {          }
                         $cache{$a} ||= lc($a);          else {
                 }              $cache{$a} ||= lc($a);
                 if (@b) {          }
                         $cache{$b} ||= pack('C4' => @b);          if (@b) {
                 } else {              $cache{$b} ||= pack( 'C4' => @b );
                         $cache{$b} ||= lc($b);          }
                 }          else {
               $cache{$b} ||= lc($b);
           }
   
                 $cache{$a} cmp $cache{$b};          $cache{$a} cmp $cache{$b};
         } keys %{ $aps };      } keys %{$aps};
   
     print p(start_form(-method => 'GET'),      print p(
                 'AP:    ', popup_menu(-name=>'AP',    -values=>\@ap_names),br,          start_form( -method => 'GET' ),
             'SUMAC: ', textfield( -name=>'sumac', -default=>$default_mac),br,          'AP:    ',
             'SUID:  ', textfield( -name=>'suid',  -default=>$default_suid),br,          popup_menu( -name => 'AP', -values => \@ap_names ),
           br,
           'SUMAC: ',
           textfield( -name => 'sumac', -default => $default_mac ),
           br,
           'SUID:  ',
           textfield( -name => 'suid', -default => $default_suid ),
           br,
         submit,          submit,
         end_form);          end_form
       );
   
         print p('Fill in the SUMAC if you wish to add an SU ',      print p(
           'or fill in the SUID to run an rflinktest.');          'Fill in the SUMAC if you wish to add an SU ',
           'or fill in the SUID to run an rflinktest.'
       );
   
         return 1;      return 1;
 }  }
   
 sub login  sub login {
 {      my $host     = shift;
         my $host     = shift;      my $password = shift;
         my $password = shift;  
   
         my $t = new Net::Telnet::Trango ( Timeout => 5 );      my $t = new Net::Telnet::Trango( Timeout => 5 );
   
         #$t->input_log('/tmp/telnet_log');      #$t->input_log('/tmp/telnet_log');
         #$t->dump_log('/tmp/telnet_log');      #$t->dump_log('/tmp/telnet_log');
   
         unless ($t->open( Host => $host )) {      unless ( $t->open( Host => $host ) ) {
                 print h3("Error connecting!");          print h3("Error connecting!");
                 $t->close;          $t->close;
                 return undef;          return undef;
         }      }
   
         unless ($t->login( $password ) ) {      unless ( $t->login($password) ) {
                 print h3("Couldn't log in: $!");          print h3("Couldn't log in: $!");
                 $t->exit;          $t->exit;
                 $t->close;          $t->close;
                 return undef;          return undef;
         }      }
   
         return $t;      return $t;
 }  }
   
 sub add_su  sub add_su {
 {      my $ap    = shift;
         my $ap  = shift;      my $sumac = shift;
         my $sumac = shift;  
   
         my $t = login($ap->{name}, $ap->{password});      my $t = login( $ap->{name}, $ap->{password} );
   
         my $cur_sus = $t->sudb_view;      my $cur_sus = $t->sudb_view;
   
         my $new_suid = next_suid($cur_sus);      my $new_suid = next_suid($cur_sus);
   
         foreach my $su (@{ $cur_sus }) {      foreach my $su ( @{$cur_sus} ) {
                 if ($sumac eq $su->{mac}) {          if ( $sumac eq $su->{mac} ) {
                         print h3("MAC '$sumac' already in AP '$ap->{name}' " .              print h3( "MAC '$sumac' already in AP '$ap->{name}' "
                           "with SUID '$su->{suid}'");                      . "with SUID '$su->{suid}'" );
                         $t->exit;              $t->exit;
                         $t->close;              $t->close;
                         return undef;              return undef;
                 }          }
         }      }
   
         unless ($t->sudb_add(      unless (
                 $new_suid, 'reg', $default_cir, $default_mir, $sumac          $t->sudb_add( $new_suid, 'reg', $default_cir, $default_mir, $sumac ) )
         ) ) {      {
                 print h3("Error adding SU!");          print h3("Error adding SU!");
                 $t->exit;          $t->exit;
                 $t->close;          $t->close;
                 return undef;          return undef;
         }      }
   
         my $new_sus = $t->sudb_view;      my $new_sus = $t->sudb_view;
         my $added = 0;      my $added   = 0;
         foreach my $su (@{ $new_sus }) {      foreach my $su ( @{$new_sus} ) {
                 if ($su->{suid} == $new_suid) {          if ( $su->{suid} == $new_suid ) {
                         $added = 1;              $added = 1;
                         last;              last;
                 }          }
         }      }
   
         unless ($added) {      unless ($added) {
                 print h3("Couldn't add su id: $new_suid");          print h3("Couldn't add su id: $new_suid");
                 $t->exit;          $t->exit;
                 $t->close;          $t->close;
                 return undef;          return undef;
         }      }
   
         unless ($t->save_sudb) {      unless ( $t->save_sudb ) {
                 print h3("Couldn't save sudb");          print h3("Couldn't save sudb");
                 $t->exit;          $t->exit;
                 $t->close;          $t->close;
                 return undef;          return undef;
         }      }
   
         print p(      print p(  "Added new SU with ID '$new_suid' "
                 "Added new SU with ID '$new_suid' " .              . "and MAC '$sumac' "
                 "and MAC '$sumac' " .              . "to '$ap->{name}'.  "
                 "to '$ap->{name}'.  " .              . '<a href="'
                 '<a href="' . $me . '?' .              . $me . '?' . 'AP='
                 'AP=' . $ap->{name} . '&' .              . $ap->{name} . '&' . 'suid='
                 'suid=' . $new_suid .              . $new_suid
                 '">Test SU RFLink</a>'              . '">Test SU RFLink</a>' );
         );  
   
         $t->exit;      $t->exit;
         $t->close;      $t->close;
         return 1;      return 1;
   
 }  }
   
 sub testrflink  sub testrflink {
 {      my $ap   = shift;
         my $ap  = shift;      my $suid = shift;
         my $suid = shift;  
   
         my $t = login($ap->{name}, $ap->{password});      my $t = login( $ap->{name}, $ap->{password} );
   
         my $result = $t->su_testrflink( $suid );      my $result = $t->su_testrflink($suid);
   
         unless ($result) {      unless ($result) {
                 print h3("Error testing SU rflink!");          print h3("Error testing SU rflink!");
                 $t->exit;          $t->exit;
                 $t->close;          $t->close;
                 return undef;          return undef;
         }      }
   
         my @keys = ('suid', 'AP Tx', 'AP Rx', 'SU Rx');      my @keys = ( 'suid', 'AP Tx', 'AP Rx', 'SU Rx' );
   
         my @table;      my @table;
         foreach my $su (@{ $result }) {      foreach my $su ( @{$result} ) {
                 next unless ref $su eq 'HASH';          next unless ref $su eq 'HASH';
                 next unless exists $su->{suid};          next unless exists $su->{suid};
                 $su->{suid} =~ s/\D//g;          $su->{suid} =~ s/\D//g;
                 next unless $su->{suid};          next unless $su->{suid};
   
                 push @table, td([ @{ $su }{ @keys } ]);          push @table, td( [ @{$su}{@keys} ] );
         }      }
   
         print table({-border=>1,-cellspacing=>0,-cellpadding=>1},      print table(
                 caption($ap->{name} . ': su testrflink ' . $suid),          { -border => 1, -cellspacing => 0, -cellpadding => 1 },
                 Tr({-align=>'CENTER', -valign=>'TOP'},          caption( $ap->{name} . ': su testrflink ' . $suid ),
                         [ th(\@keys), @table ]          Tr( { -align => 'CENTER', -valign => 'TOP' },
                 )              [ th( \@keys ), @table ]
         );          )
       );
   
         $t->exit;      $t->exit;
         $t->close;      $t->close;
         return 1;      return 1;
   
 }  }
   
 sub next_suid  sub next_suid {
 {      my $sudb = shift;
         my $sudb = shift;  
   
         my $next_id = $Start_SUID;      my $next_id = $Start_SUID;
   
         my %ids = map { $_->{suid} => 1 } @{ $sudb };      my %ids = map { $_->{suid} => 1 } @{$sudb};
   
         my $next_key = sprintf('%04d', $next_id);      my $next_key = sprintf( '%04d', $next_id );
         while (exists $ids{$next_key}) {      while ( exists $ids{$next_key} ) {
                 $next_id++;          $next_id++;
                 $next_key = sprintf('%04d', $next_id);          $next_key = sprintf( '%04d', $next_id );
         }      }
   
         return $next_id;      return $next_id;
 }  }

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.5

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>