switches |
Subversion Repositories: |
Compare with Previous - Blame - Download
#!/usr/bin/perl -w
use strict;
#
# Petr Simandl, www.simandl.cz
#require "/home/www/cgi-bi"/home/www/cgi-bin/switches_definitions.pl"n/switches_definitions.pl";
my %map = do("/etc/switches_definitions.conf");
my $snmpwalk = "/usr/bin/snmpwalk";
my @ports = ();
my @sw = ();
my %sw_d = ();
my $portlist = "";
my $p = 0;
my $d = "";
my ($fnc,$mac,$if,$ver,$bin,$geom,$desc);
print "Content-type: text/html\n\n";
print "<HTML><HEAD>\n<META HTTP-EQUIV=Pragma CONTENT=no-cache>\n<style type=\"text/css\" media=\"screen\"> \@import \"../style.css\" ;</style>\n";
print "<META http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-2\">\n";
print "<script type=\"text/javascript\" src=\"../overlib.js\"><!-- overLIB (c) Erik Bosrup --></script>\n";
print "</HEAD><BODY>\n";
#nocache!
print "<div id=\"overDiv\" style=\"position:absolute; visibility:hidden; z-index:1000;\"></div>";
#print "<a href=\"javascript:void(0);\" onmouseover=\"return overlib('This is an ordinary popup.');\" onmouseout=\"return nd();\">here</a>";
open(CONF,"< /etc/switches.conf") || die("can't open datafile: $!");
while (<CONF>) {
chomp;
next if (/^#/);
next if (/^$/);
if (/^draw_/) { push @sw, $_; next; }
if (/^([0-9a-fA-F]{2}:[0-9a-fA-F]{2}:)|(([0-9]{1,3}\.){3}[0-9]{1,3})/) {
($mac, $portlist) = split(/\|/, $_, 2);
@ports = ();
foreach ( split(/\|/, $portlist) ) {
($p, $d) = split /;/;
$ports[$p] = $d;
}
$sw_d{$mac} = [ @ports ];
}
}
close CONF;
foreach (@sw) {
($fnc, $mac, $if, $ver, $bin, $geom, $desc) = split /\|/;
SWITCH: {
if ($fnc eq "draw_rrcp_switch") {
draw_rrcp_switch($mac,$if,$bin,$desc,$map{$geom},\%sw_d);
last SWITCH;
}
if ($fnc eq "draw_snmp_switch") {
draw_snmp_switch($mac,$if,$ver,$bin,$desc,$map{$geom},\%sw_d);
last SWITCH;
}
}
print "<br>\n";
}
my $date = `date`;
print "<BR>$date\n<BR>";
print "</center></BODY></HTML>";
################################################################################
sub print_port_graph {
my $ip = shift(@_);
my $page = shift(@_);
my $graph = shift(@_);
my $caption = shift(@_);
my $text = shift(@_);
print "<a href=\"http://${ip}/hotsanic/traffic/${page}\" onmouseover=\"return overlib('<img src=http://${ip}/hotsanic/traffic/${graph}>',DELAY,250,HAUTO,VAUTO,CAPTION,'${caption}');\" onmouseout=\"return nd();\" shape=\"rect\">$text</a>";
} # end print_port_graph
sub draw_rrcp_switch {
my $mac = shift(@_);
my $if = shift(@_);
my $bin = shift(@_);
my $desc = shift(@_);
my @map = @{shift(@_)};
my $sw_d = shift(@_);
my $w = scalar( @{$map[0]} );
my $h = scalar @map;
my $hmac = "";
my $x = 0;
my $y = 0;
my $e = "";
my $f = "";
my $sirka = 70;
my $label = "";
my $bg = "";
my $enab = "";
my $mod = "";
my $stat = "";
my $link = "";
my $flow = "";
my $port = 0;
my @row = ();
my @pole = ();
my $porty=`sudo $bin $mac\@$if show int | grep ^$if | sed 's/://g' | sed 's/$if\\///g'`;
print "<b>$desc</b> $mac";
# print "<pre>$porty\n</pre>";
foreach (split("\n",$porty)) {
s/auto1000M-/auto 1000M-/;
@row = split ;
@pole[$row[0]] = [ @row[1..5] ];
}
print "<table border=1>\n";
for ($y = 0; $y < $h; $y++) {
print "<tr>\n";
for ($x = 0; $x < $w; $x++) {
$bg = "\"#FFFFFF\"";
print " <td valign=top width=\"$sirka\" ";
if ($port = $map[$y][$x]) {
($enab,$mod,$stat,$link,$flow) = @{$pole[$port]}[0..4];
if ($link eq "LINK") { $bg = "\"#00FF00\""; }
if ($mod eq "1000M") { $bg = "\"#FFFF00\""; }
}
print "bgcolor=$bg>";
if ($port) {
$e = substr($enab,0,1);
if (defined($sw_d->{$mac}[$port])) {$label = $sw_d->{$mac}[$port];}
else { $label = ""; }
if ($flow eq "flowctl") { $f = "Y"; } else { $f = "N"; }
$hmac = $mac;
$hmac =~ s/:/_/g;
print_port_graph("10.33.0.2","${hmac}_${port}.html","${hmac}_${port}-day.png","$mac port $port $label","$port $label");
print "<br />$e $mod $stat $f</td>\n";
} else {
print " </td>\n";
}
}
print "</tr>\n";
}
print "</table>";
}
sub draw_snmp_switch {
my $myip = shift(@_);
my $com = shift(@_);
my $ver = shift(@_);
my $dhcp = shift(@_);
my $desc = shift(@_);
my @map = @{shift(@_)};
my $sw_d = shift(@_);
my @pole_operstatus = ();
my @pole_adminstatus = ();
my @pole_speed = ();
my %pole_dhcpdhosts = ();
my %hash_mac = ();
my %mactab = ();
my $macind = 0;
my $port = 0;
my $w = scalar( @{$map[0]} );
my $h = scalar @map;
my $x = 0;
my $y = 0;
my $sirka = 70;
my $label = "";
my $bg = "";
my $enab = "";
my $e = "";
my $mod = "";
my $stat = "";
my $link = "";
my $flow = "";
my $barva = "";
my $title = "";
my $popis = "";
my $macinfo = "";
my $macip = "";
my $hip = "";
my @row = ();
print "<b>$desc</b> <a href=http:\/\/$myip>$myip</a>";
# my $speedall = `$snmpwalk -Os -c $com -v $ver $myip .1.3.6.1.2.1.2.2.1.5`;
my $speedall = `$snmpwalk -On -c $com -v $ver $myip .1.3.6.1.2.1.31.1.1.1.15`;
my $adminstatusall = `$snmpwalk -Os -c $com -v $ver $myip .1.3.6.1.2.1.2.2.1.7`;
my $operstatusall = `$snmpwalk -Os -c $com -v $ver $myip .1.3.6.1.2.1.2.2.1.8`;
my $mactable = `$snmpwalk -Os -c $com -v $ver $myip atPhysAddress`;
my $mactableport = `$snmpwalk -Os -c $com -v $ver $myip ipNetToMediaIfIndex`;
my $dhcpdconf = `wget -t 1 -T 1 http://$dhcp/cgi-bin/dhcp.cgi -q -O -`;
# $arpn = `wget -t 1 -T 1 http://$dhcp/cgi-bin/arpn.cgi -q -O -`;
foreach (split("\n",$operstatusall)) {
s/^ifOperStatus\.([0-9]+) = INTEGER: (.*)$/$1 $2/;
@row = split ;
$pole_operstatus[$row[0]] = $row[1];
}
foreach (split("\n",$adminstatusall)) {
s/^ifAdminStatus\.([0-9]+) = INTEGER: (.*)$/$1 $2/;
@row = split ;
$pole_adminstatus[$row[0]] = $row[1];
}
foreach (split("\n",$speedall)) {
s/^.1.3.6.1.2.1.31.1.1.1.15\.([0-9]+) = Gauge32: (.*)$/$1 $2/;
@row = split ;
$row[1] =~ s/10$/10M/;
$row[1] =~ s/100$/100M/;
$row[1] =~ s/1000$/1G/;
$row[1] =~ s/10000$/10G/;
$row[1] =~ s/40000$/40G/;
$row[1] =~ s/25000$/25G/;
$row[1] =~ s/100000$/100G/;
$pole_speed[$row[0]] = $row[1];
}
foreach (split("\n",$mactable)) {
s/ = Hex-STRING://;
($macind, my $tmpmac) = split(" ", $_, 2);
$tmpmac =~ s/ $//g;
$tmpmac =~ s/ /:/g;
$hash_mac{$macind} = $tmpmac;
}
foreach (split("\n",$mactableport)) {
s/ = INTEGER://;
($macind, $port) = split ;
$macind =~ s/^mib-2\.17\.4\.3\.1\.2/mib-2.17.4.3.1.1/;
if (exists $mactab{$port} ) {
push @{ $mactab{$port} }, $hash_mac{$macind}; # pridam do pole k portu
} else {
$mactab{$port} = [ $hash_mac{$macind} ]; # zalozim nove pole pro port
}
}
#@pole_arpn = split("\n",$arpn);
$dhcpdconf =~ s/\n/ /g;
$dhcpdconf =~ s/\s+/ /g;
$dhcpdconf =~ s/host /\nhost /g;
$dhcpdconf =~ s/}/}\n/g;
$dhcpdconf =~ s/\^host //g;
my @pole_dhcpdconf = split("\n",$dhcpdconf);
for (@pole_dhcpdconf) {
if (/^host/) {
s/^host ([^\s]+) {\s*hardware\s+ethernet\s+(([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2})\s*;\s*fixed-address\s+(([0-9]{1,3}\.){3}[0-9]{1,3})\s*;\s*}/$2 $1 $4/;
(my $mac, my $host, my $ip) = split;
$mac =~ tr/a-f/A-F/;
$pole_dhcpdhosts{$mac} = "$host $ip";
}
}
print "<table border=1>\n";
for ($y = 0; $y < $h; $y++) {
print "<tr>\n";
for ($x = 0; $x < $w; $x++) {
$bg = "\"#FFFFFF\"";
print " <td valign=top width=\"$sirka\" ";
if ($port = $map[$y][$x]) {
if (defined($pole_adminstatus[$port])) { $enab = $pole_adminstatus[$port]; } else { $enab = ""; }
$mod = "";
if (defined($pole_speed[$port])) { $stat = $pole_speed[$port]; } else { $stat = ""; }
if (defined($pole_operstatus[$port])) { $link = $pole_operstatus[$port]; } else { $link = ""; }
$flow = "";
if ($enab eq "up(1)") { $bg = "\"#FFFFFF\""; } else { $bg = "\"#FF0000\""; }
if ($link eq "up(1)") {
if ($stat eq "1G") { $bg = "\"#00FF00\""; } else { $bg = "\"#FFFF00\""; }
if ($stat eq "10G" ) { $bg = "\"#AAFF00\""; }
if ($stat eq "40G" ) { $bg = "\"#00FFA5\""; }
if ($stat eq "100G") { $bg = "\"#00d9FF\""; }
}
}
print "bgcolor=$bg>";
if ($port) {
if ($enab =~ /^up/) {$e = "E";} else {$e = "D";}
if (defined($sw_d->{$myip}[$port])) {$label = $sw_d->{$myip}[$port];}
else { $label = ""; }
$hip = $myip;
$hip =~ s/\./_/g;
print_port_graph("$dhcp","${hip}_Ethernet${port}.html","${hip}_Ethernet${port}-day.png","$myip port $port $label","$port $label");
print "<br />$e $stat<br />\n";
foreach $mac (@{ $mactab{$port} }) {
if (exists $pole_dhcpdhosts{$mac}) {
$barva = "black";
$title = "$mac " . $pole_dhcpdhosts{$mac};
$popis = $pole_dhcpdhosts{$mac};
} else {
$barva = "red";
$popis = $mac;
$macinfo = `wget -t 1 -T 1 http://$dhcp/cgi-bin/macinfo.cgi?$mac -q -O -`;
if ($macinfo) { ($macip) = split(" ", $macinfo, 1) } else { $macip = "none" };
$title = "$mac je neznama MAC adresa! Nalezena IP : $macip";
}
print "<font color=$barva title=\"$title\">$popis</font><br>"
};
print "</td>";
} else {
print " </td>\n";
}
}
print "</tr>\n";
}
print "</table>";
};