[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.4 and 1.5

version 1.4, 2007/02/07 19:25:21 version 1.5, 2008/09/04 21:38:06
Line 1 
Line 1 
 #!/usr/bin/perl  #!/usr/bin/perl
 # $RedRiver: su.cgi,v 1.3 2007/02/07 17:44:56 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;
Line 51 
Line 49 
   
     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 );
       }
       else {
         print h3("Invalid SUID '$suid' and MAC '$sumac'");          print h3("Invalid SUID '$suid' and MAC '$sumac'");
         show_form($aps, $default_mac);          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 {
 sub get_aps  
 {  
     my $file = shift;      my $file = shift;
   
     my $conf = LoadFile($file);      my $conf = LoadFile($file);
Line 77 
Line 75 
     my %aps;      my %aps;
   
     my @hosts;      my @hosts;
     foreach my $ap (keys %{ $conf }) {      foreach my $ap ( keys %{$conf} ) {
         next if $ap eq 'default';          next if $ap eq 'default';
                 my $h = $conf->{$ap};          my $h = $conf->{$ap};
   
         if ($h->{name} =~ /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.)(\d{1,3})-(\d{1,3})/) {          if ( $h->{name}
             for ($2..$3) {              =~ /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.)(\d{1,3})-(\d{1,3})/ )
           {
               for ( $2 .. $3 ) {
                 my %cur_host;                  my %cur_host;
                 foreach my $k (keys %{ $h }) {                  foreach my $k ( keys %{$h} ) {
                     $cur_host{$k} = $h->{$k};                      $cur_host{$k} = $h->{$k};
                 }                  }
                 $cur_host{name} = $1 . $_;                  $cur_host{name} = $1 . $_;
                 if (! grep { $cur_host{name} eq $h->{name} } values %aps) {                  if ( !grep { $cur_host{name} eq $h->{name} } values %aps ) {
                                         my $ap_name = $ap . $_;                      my $ap_name = $ap . $_;
                                 $aps{ $ap_name  } = \%cur_host;                      $aps{$ap_name} = \%cur_host;
                 }                  }
             }              }
         } else {          }
                 $aps{ $ap } = $conf->{$ap};          else {
               $aps{$ap} = $conf->{$ap};
             push @hosts, $h;              push @hosts, $h;
         }          }
     }      }
   
     if (ref $conf->{default} eq 'HASH') {      if ( ref $conf->{default} eq 'HASH' ) {
             foreach my $ap (keys %aps) {          foreach my $ap ( keys %aps ) {
             foreach my $k (keys %{ $conf->{default} }) {              foreach my $k ( keys %{ $conf->{default} } ) {
                 $aps{ $ap }{$k} ||= $conf->{default}->{$k};                  $aps{$ap}{$k} ||= $conf->{default}->{$k};
             }              }
         }          }
     }      }
   
     return \%aps;      return \%aps;
   
     return {      return {
         'rrlhcwap0000' => {          'rrlhcwap0000' => {
             name     => '192.168.1.1',              name     => '192.168.1.1',
             password => 'trango',              password => 'trango',
Line 118 
Line 119 
   
 }  }
   
 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 {          }
           else {
             $cache{$a} ||= lc($a);              $cache{$a} ||= lc($a);
         }          }
         if (@b) {          if (@b) {
             $cache{$b} ||= pack('C4' => @b);              $cache{$b} ||= pack( 'C4' => @b );
         } else {          }
           else {
             $cache{$b} ||= lc($b);              $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;
Line 180 
Line 191 
     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;
Line 211 
Line 221 
     }      }
   
     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;
         }          }
Line 226 
Line 236 
         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;
Line 249 
Line 258 
   
 }  }
   
 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!");
Line 265 
Line 273 
         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 ]
         )          )
     );      );
   
Line 290 
Line 299 
   
 }  }
   
 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.4  
changed lines
  Added in v.1.5

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