version 1.1, 2007/02/07 16:55:12 |
version 1.2, 2007/02/07 17:42:56 |
|
|
#!/usr/bin/perl |
#!/usr/bin/perl |
# $RedRiver$ |
# $RedRiver: su.cgi,v 1.1 2007/02/07 16:55:12 andrew Exp $ |
######################################################################## |
######################################################################## |
# su.cgi *** a CGI for Trango SU utilities. |
# su.cgi *** a CGI for Trango SU utilities. |
# |
# |
|
|
use strict; |
use strict; |
use warnings; |
use warnings; |
|
|
my $host_file = '/conf/wstationinfo/hosts.xml'; |
my $host_file = 'su.yaml'; |
|
|
my $default_mac = '0001DE'; |
my $default_mac = '0001DE'; |
my $default_suid = 'all'; |
my $default_suid = 'all'; |
|
|
my $Start_SUID = 3; |
my $Start_SUID = 3; |
|
|
use CGI qw/:standard/; |
use CGI qw/:standard/; |
use XML::Simple; |
use File::Basename; |
|
use YAML qw/ LoadFile Dump /; |
use Net::Telnet::Trango; |
use Net::Telnet::Trango; |
|
|
use File::Basename; |
|
|
|
my $me = basename($0); |
my $me = basename($0); |
|
|
|
my $aps = get_aps($host_file); |
|
|
print header, |
print header, |
start_html('Trango SU Utilities'), |
start_html('Trango SU Utilities'), |
h1('Trango SU Utilities'); |
h1('Trango SU Utilities'); |
|
|
my $aps = get_aps($host_file); |
|
|
|
if (param()) { |
if (param()) { |
|
|
my $AP = param('AP'); |
my $AP = param('AP'); |
|
|
{ |
{ |
my $file = shift; |
my $file = shift; |
|
|
my $conf = Read_Hosts($file); |
my $conf = LoadFile($file); |
|
|
my %aps; |
my %aps; |
|
|
foreach my $ap (@{ $conf }) { |
foreach my $ap (keys %{ $conf }) { |
if ($ap->{'group'} eq 'Trango') { |
next if $ap eq 'default'; |
my $name = $ap->{'comment'} || $ap->{'name'}; |
$aps{ $ap } = $conf->{$ap}; |
$aps{ $name } = $ap; |
if (ref $conf->{default} eq 'HASH') { |
|
foreach my $k (keys %{ $conf->{default} }) { |
|
$aps{ $ap }{$k} ||= $conf->{default}->{$k}; |
|
} |
} |
} |
} |
} |
|
|
|
|
|
|
return { |
return { |
'rrlhcwap0000' => { |
'rrlhcwap0000' => { |
group => 'Trango', |
name => '192.168.1.1', |
version => 1, |
password => 'trango', |
name => '192.168.1.1', |
|
port => 161, |
|
Read_Community => 'private', |
|
Write_Community => 'private', |
|
} |
} |
}; |
}; |
|
|
|
|
} keys %{ $aps }; |
} keys %{ $aps }; |
|
|
print p(start_form(-method => 'GET'), |
print p(start_form(-method => 'GET'), |
'AP: ', popup_menu(-name=>'AP', -values=>\@ap_names),br, |
'AP: ', popup_menu(-name=>'AP', -values=>\@ap_names),br, |
'SUMAC: ', textfield(-name=>'sumac',-default=>$default_mac),br, |
'SUMAC: ', textfield( -name=>'sumac', -default=>$default_mac),br, |
'SUID: ', textfield(-name=>'suid',-default=>$default_suid),br, |
'SUID: ', textfield( -name=>'suid', -default=>$default_suid),br, |
submit, |
submit, |
end_form); |
end_form); |
|
|
|
|
my $ap = shift; |
my $ap = shift; |
my $sumac = shift; |
my $sumac = shift; |
|
|
my $t = login($ap->{'name'}, $ap->{'Telnet_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'}' with SUID '$su->{'suid'}'"); |
print h3("MAC '$sumac' already in AP '$ap->{name}' " . |
|
"with SUID '$su->{suid}'"); |
$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; |
} |
} |
|
|
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="' . $me . '?' . |
'<a href="' . $me . '?' . |
'AP=' . $ap->{'name'} . '&' . |
'AP=' . $ap->{name} . '&' . |
'suid=' . $new_suid . |
'suid=' . $new_suid . |
'">Test SU RFLink</a>' |
'">Test SU RFLink</a>' |
); |
); |
|
|
my $ap = shift; |
my $ap = shift; |
my $suid = shift; |
my $suid = shift; |
|
|
my $t = login($ap->{'name'}, $ap->{'Telnet_Password'}); |
my $t = login($ap->{name}, $ap->{password}); |
|
|
my $result = $t->su_testrflink( $suid ); |
my $result = $t->su_testrflink( $suid ); |
|
|
|
|
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({-border=>1,-cellspacing=>0,-cellpadding=>1}, |
caption($ap->{'name'} . ': su testrflink ' . $suid), |
caption($ap->{name} . ': su testrflink ' . $suid), |
Tr({-align=>'CENTER', -valign=>'TOP'}, |
Tr({-align=>'CENTER', -valign=>'TOP'}, |
[ th(\@keys), @table ] |
[ th(\@keys), @table ] |
) |
) |
|
|
|
|
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}) { |
|
|
|
|
return $next_id; |
return $next_id; |
} |
} |
|
|
sub Read_Hosts |
|
{ |
|
my $file = shift; |
|
my $xs = XML::Simple->new(); |
|
|
|
my %Default_SNMP = ( |
|
Read_Community => 'public', |
|
Telnet_Password => 'password', |
|
port => 161, |
|
version => 1, |
|
); |
|
|
|
my @hosts; |
|
my $hosts = $xs->XMLin($file, |
|
keyattr => [ 'Station' ], |
|
ForceArray => qr/^Host$/, |
|
); |
|
|
|
foreach my $group (keys %{ $hosts }) { |
|
next if $group eq 'Read_Community'; |
|
|
|
foreach my $host (@{ $hosts->{$group}->{Host} }) { |
|
foreach my $item ('Read_Community', 'Telnet_Password', 'port', 'version') { |
|
$host->{$item} = |
|
$host->{$item} || |
|
$hosts->{$group}->{$item} || |
|
$hosts->{$item} || |
|
$Default_SNMP{$item}; |
|
} |
|
$host->{group} = $group; |
|
|
|
push @hosts, $host; |
|
} |
|
} |
|
|
|
return \@hosts; |
|
} |
|
|
|