
C'est nul le Perl :) Donc au lieu de passer par la lib snmp qui fait pas de TCP, a passe par snmpget... N. darcs-hash:20030222122957-a279a-46df5cd2a49952e5a8e846eb968ce2fef7ade718.gz
804 lines
22 KiB
Perl
Executable file
804 lines
22 KiB
Perl
Executable file
#!/usr/bin/perl
|
||
#
|
||
# IOG v1.0 - Input/Output Grapher
|
||
# Copyright (c) 2000-2002 James Dogopoulos <jd@dynw.com>
|
||
#
|
||
# Please read the "Artistic" license included.
|
||
#
|
||
# E-mail iog@dynw.com with any bug reports,
|
||
# fixes or comments.
|
||
#
|
||
|
||
BEGIN{
|
||
if ($ARGV[0] eq "NT") { $main::OS = 'NT'; } else { $main::OS = 'UNIX'; }
|
||
|
||
$main::SL = { UNIX=>'/', NT=>'\\' }->{$main::OS};
|
||
$main::PS = { UNIX=>':', NT=>';' }->{$main::OS};
|
||
|
||
$main::binpath ="";
|
||
if ($0 =~ /^(.+\Q${main::SL}\E)/) { $main::binpath="$1";
|
||
}
|
||
else {
|
||
foreach $pathname ( split ${main::PS}, $ENV{'PATH'}) {
|
||
if ((($main::OS eq 'NT') && (-e "$pathname${main::SL}$0")) ||
|
||
(-x "$pathname${main::SL}$0")) {
|
||
$main::binpath=$pathname;
|
||
last;
|
||
}
|
||
}
|
||
}
|
||
unshift (@INC,$main::binpath);
|
||
}
|
||
|
||
use SDBM_File;
|
||
use BER;
|
||
use SNMP_Session;
|
||
use Fcntl;
|
||
|
||
my($inoid,$outoid,$host,$community,$snmpget,$datafile,$cfgfile,%inf);
|
||
my($inoctets,$outoctets,$path,$iogver,$hostreset,$kbsize,$mbsize,$gbsize);
|
||
|
||
$cfgfile="/etc/iog.cfg";
|
||
$iogver="v1.0";
|
||
|
||
# Default Byte Sizes
|
||
|
||
$kbsize="1024";
|
||
$mbsize="1048576";
|
||
$gbsize="1073";
|
||
|
||
# Date/Time stuff
|
||
#
|
||
|
||
my @weekdays = qw(Sunday Monday Tuesday Wednesday Thursday Friday Saturday);
|
||
|
||
my @months = qw(January February March April May June July August September
|
||
October November December);
|
||
|
||
my %days = (1 => "1st", 2 => "2nd", 3 => "3rd", 21 => "21st", 22 => "22nd",
|
||
23 => "23rd", 31 => "31st");
|
||
|
||
my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
|
||
$lday = $mday - 1;
|
||
|
||
sub last_mday {
|
||
my ($month, $year) = @_;
|
||
( qw(31 0 31 30 31 30 31 31 30 31 30 31) )[$month] ||
|
||
28 + (($year % 100 && !($year % 4))|| !($year % 400));
|
||
}
|
||
|
||
if ($days{$mday}) { $pday = $days{$mday}; $nday = $days{$lday}; }
|
||
else { $pday = $mday."th"; $nday = $lday."th"; }
|
||
|
||
# Read config file.
|
||
#
|
||
|
||
open(CONFIG,$cfgfile) || die("Cannot open $cfgfile!");
|
||
|
||
while (<CONFIG>) {
|
||
s/\s+$//g; # remove whitespace at the end of the line
|
||
s/\s/ /g; # replace whitespace by space
|
||
next if /^\s*\#/; # ignore comment lines
|
||
next if /^\s*$/; # ignore empty lines
|
||
if ($_ =~ /\[.*.\]/) { chkuptime($_); next; }
|
||
my($name,$host,$community,$inoid,$outoid,$path) = split(/:/, $_);
|
||
$path =~ s/\n//;
|
||
$datafile = "$name".".dat";
|
||
my @results = snmpget2($host,$community,$inoid,$outoid);
|
||
next if ($results[0] eq "error");
|
||
$inoctets = $results[0];
|
||
$outoctets = $results[1];
|
||
main($name,$host,$community,$inoid,$outoid,$path,$datafile);
|
||
}
|
||
|
||
close(CONFIG);
|
||
|
||
|
||
# SNMP Get routine. Thanks to Simon Leinen for the SNMP module.
|
||
# http://www.switch.ch/misc/leinen/snmp/perl/
|
||
#
|
||
|
||
sub snmpget {
|
||
my($host, $community, $inoid, $outoid) = @_;
|
||
my($response, $bindings, $binding, $value, $oid, $session, @results);
|
||
|
||
my %oidnames = qw(ifInOctets 1.3.6.1.2.1.2.2.1.10
|
||
ifOutOctets 1.3.6.1.2.1.2.2.1.16
|
||
ifHCInOctets 1.3.6.1.2.1.31.1.1.1.6
|
||
ifHCOutOctets 1.3.6.1.2.1.31.1.1.1.10);
|
||
|
||
my ($inoidname,$inoidport) = split(/\./, $inoid);
|
||
my ($outoidname,$outoidport) = split(/\./, $outoid);
|
||
|
||
$inoid = encode_oid(split(/\./, ($oidnames{$inoidname} . ".$inoidport")));
|
||
$outoid = encode_oid(split(/\./, ($oidnames{$outoidname} . ".$outoidport")));
|
||
|
||
my @oids = ($inoid,$outoid);
|
||
|
||
if ($inoidname =~ /HC/i or $outoidname =~ /HC/i) {
|
||
$session = SNMPv2c_Session->open($host, $community, 161) or return "error";
|
||
} else {
|
||
$session = SNMP_Session->open($host, $community, 161) or return "error";
|
||
};
|
||
|
||
if ($session->get_request_response (@oids)) {
|
||
$response = $session->pdu_buffer;
|
||
($bindings) = $session->decode_get_response ($response);
|
||
|
||
while ($bindings ne '') {
|
||
($binding,$bindings) = decode_sequence ($bindings);
|
||
($oid,$value) = decode_by_template ($binding, "%O%@");
|
||
push (@results, pretty_print($value));
|
||
}
|
||
return @results;
|
||
} else { warn "SNMP Error: $SNMP_Session::errmsg\n";
|
||
return "error"; }
|
||
}
|
||
|
||
sub snmpgetup {
|
||
my($host, $community, $inoid) = @_;
|
||
my($response, $bindings, $binding, $value, $oid, $result);
|
||
|
||
my %oidnames = qw(sysUpTime 1.3.6.1.2.1.1.3
|
||
sysUpTime.0 1.3.6.1.2.1.1.3.0);
|
||
|
||
$inoid = encode_oid(split(/\./, $oidnames{$inoid}));
|
||
|
||
my $session = SNMP_Session->open($host, $community, 161) or return "0";
|
||
|
||
if ($session->get_request_response ($inoid)) {
|
||
$response = $session->pdu_buffer;
|
||
($bindings) = $session->decode_get_response ($response);
|
||
|
||
while ($bindings ne '') {
|
||
($binding,$bindings) = decode_sequence ($bindings);
|
||
($oid,$value) = decode_by_template ($binding, "%O%@");
|
||
$result = pretty_print($value);
|
||
}
|
||
return $result;
|
||
} else { warn "SNMP Error: $SNMP_Session::errmsg\n";
|
||
return 0; }
|
||
|
||
}
|
||
|
||
|
||
#####################################################################################
|
||
# Section personnalis<69>e pour faire du SNMP en TCP.
|
||
# NS 22/02/03
|
||
#####################################################################################
|
||
sub snmpget2 {
|
||
my($host, $community, $inoid, $outoid) = @_;
|
||
|
||
open IN, "snmpget -T TCP $host $community interfaces.ifTable.ifEntry.$inoid |";
|
||
my $inresult = <IN>;
|
||
chomp($inresult);
|
||
close(IN);
|
||
|
||
open OUT, "snmpget -T TCP $host $community interfaces.ifTable.ifEntry.$outoid |";
|
||
my $outresult = <OUT>;
|
||
chomp($outresult);
|
||
close(OUT);
|
||
|
||
my @intable = split(/ /,$inresult );
|
||
my @outtable = split(/ /,$outresult );
|
||
|
||
my @results = ($intable[-1],$outtable[-1]);
|
||
|
||
return @results;
|
||
}
|
||
|
||
sub snmpgetup2 {
|
||
my($host, $community, $upoid) = @_;
|
||
|
||
open UP, "snmpget -T TCP $host $community $upoid |";
|
||
my $uptimeresult = <UP>;
|
||
chomp($uptimeresult);
|
||
close(UP);
|
||
|
||
$uptimeresult =~ s/^.*\) //;
|
||
$uptimeresult =~ s/...$//;
|
||
|
||
return $uptimeresult;
|
||
}
|
||
####################################################################################
|
||
|
||
|
||
sub chkuptime {
|
||
|
||
$_ =~ s/\[|\]//g;
|
||
my($uphost,$upip,$upcommunity,$upoid,$upfile) = split (/:/, $_);
|
||
my $upresult = snmpgetup2($upip,$upcommunity,$upoid);
|
||
|
||
tie(%inf, 'SDBM_File', ($upfile."$main::SL"."uptimes"), O_RDWR|O_CREAT, 0640)
|
||
or print "WARNING: Error opening uptime database file!\n";
|
||
|
||
if ($upresult < $inf{$uphost} && $upresult > "1") { $hostreset = "1"; }
|
||
else { $hostreset = "0"; }
|
||
|
||
if ($upresult > "1") { $inf{$uphost} = $upresult; }
|
||
|
||
untie(%inf);
|
||
|
||
}
|
||
|
||
sub main {
|
||
my($name,$host,$community,$inoid,$outoid,$path,$datafile) = @_;
|
||
|
||
tie(%inf, 'SDBM_File', ($path."$main::SL".$datafile), O_RDWR|O_CREAT, 0640) or
|
||
print "Error opening database file for $name at $host\n";
|
||
|
||
if (-s (($path."$main::SL".$datafile) . ".pag")) {
|
||
|
||
if ($inf{day} != $mday && $hour > "0") { newday();
|
||
dailyhtml($name,$host,$path); }
|
||
|
||
if ($inf{month} != $mon) {
|
||
$newmon = "1";
|
||
newday();
|
||
dailyhtml($name,$host,$path);
|
||
newmonth($name,$path);
|
||
monthlyhtml($name,$host,$path);
|
||
}
|
||
|
||
if ($inf{year} != ($year + "1900")) { newyear($name,$path); }
|
||
|
||
if (!$newmon) { updatedata(); }
|
||
|
||
if ($inf{day} != $mday) { $newday = "1"; } else { $newday = "0"; }
|
||
|
||
hourlyhtml($name,$host,$path,$newday);
|
||
|
||
} else { createdata(); hourlyhtml($name,$host,$path); }
|
||
|
||
untie(%inf);
|
||
}
|
||
|
||
# create data file if ! exist
|
||
#
|
||
|
||
sub createdata {
|
||
%inf = (lastin => $inoctets, lastout => $outoctets,
|
||
month => $mon, day => $mday, year => ($year + "1900"));
|
||
}
|
||
|
||
#
|
||
#
|
||
|
||
sub newyear {
|
||
|
||
my($name,$path) = @_;
|
||
my($count);
|
||
|
||
$count = 0;
|
||
|
||
while ($count <= "11") {
|
||
delete $inf{"m" . $count};
|
||
$count++;
|
||
}
|
||
|
||
# move yearly html file.
|
||
|
||
$oldfile="$path"."$main::SL"."$name"."-months".".html";
|
||
$newfile="$path"."$main::SL"."$name"."-year".($year).".html";
|
||
|
||
if ($main::OS eq "NT") { system("move /Y $oldfile $newfile"); }
|
||
else { system("mv $oldfile $newfile"); }
|
||
|
||
$inf{year} = ($year + "1900");
|
||
}
|
||
|
||
#
|
||
#
|
||
|
||
sub newmonth {
|
||
|
||
my($name,$path) = @_;
|
||
my($count,$intotal,$outtotal,$inoct,$outoct);
|
||
|
||
# get MB total for the month and store it.
|
||
|
||
$count = 1;
|
||
while ($count <= "31") {
|
||
if ($inf{"d" . $count}) {
|
||
($inoct,$outoct) = split(/:/, $inf{"d" . $count});
|
||
$intotal += $inoct;
|
||
$outtotal += $outoct;
|
||
}
|
||
$count++;
|
||
}
|
||
|
||
$intotal = ($intotal / $mbsize);
|
||
$outtotal = ($outtotal / $mbsize);
|
||
|
||
$inf{"m" . $inf{month}} = "$intotal:$outtotal";
|
||
|
||
# clear days
|
||
|
||
$count = 1;
|
||
while ($count <= "31") {
|
||
delete $inf{"d" . $count};
|
||
$count++;
|
||
}
|
||
|
||
# move monthly html file.
|
||
|
||
$oldfile="$path"."$main::SL"."$name"."-days".".html";
|
||
$newfile="$path"."$main::SL"."$name"."-month".($mon).".html";
|
||
|
||
if ($main::OS eq "NT") { system("move /Y $oldfile $newfile"); }
|
||
else { system("mv $oldfile $newfile"); }
|
||
|
||
# set $inf{month} to the new month.
|
||
$inf{month} = $mon;
|
||
}
|
||
|
||
|
||
# newday:
|
||
# run every time the day of the month changes on the system.
|
||
#
|
||
|
||
sub newday {
|
||
|
||
my($count,$nmday,$intotal,$outtotal,$inoct,$outoct);
|
||
|
||
# get megabyte total for the day and store it.
|
||
#
|
||
|
||
$count = 0;
|
||
while ($count <= "23") {
|
||
if ($inf{$count}) {
|
||
($inoct,$outoct) = split(/:/, $inf{$count});
|
||
$intotal += $inoct;
|
||
$outtotal += $outoct;
|
||
}
|
||
$count++;
|
||
}
|
||
|
||
if ($newmon) { $nmday = last_mday($inf{month}, $inf{year}); }
|
||
else { $nmday = ($mday - 1); }
|
||
|
||
$inf{"d" . $nmday} = "$intotal:$outtotal:" . ($intotal + $outtotal);
|
||
|
||
# clear hours
|
||
#
|
||
|
||
$count = 0;
|
||
while ($count <= "23") {
|
||
delete $inf{$count};
|
||
$count++;
|
||
}
|
||
|
||
$inf{day} = $mday;
|
||
}
|
||
|
||
|
||
# update DBM file.
|
||
#
|
||
|
||
sub updatedata {
|
||
my ($lasthour,$wrapin,$wrapout);
|
||
my $intwrap="4294967296";
|
||
|
||
if ($hour eq "0") { $lasthour = "23"; } else { $lasthour = ($hour - "1"); }
|
||
|
||
if ($hostreset == "1") { $inf{lastin} = $inf{lastout} = "0"; }
|
||
|
||
# detect if a counter has wrapped and adjust.
|
||
#
|
||
if ($inoctets < $inf{lastin}) {
|
||
$wrapin = $inoctets;
|
||
$inoctets = ($intwrap - $inf{lastin}) + $inoctets;
|
||
$inf{lastin} = "0";
|
||
}
|
||
|
||
if ($outoctets < $inf{lastout}) {
|
||
$wrapout = $outoctets;
|
||
$outoctets = ($intwrap - $inf{lastout}) + $outoctets;
|
||
$inf{lastout} = "0";
|
||
}
|
||
|
||
$inf{$lasthour} = (($inoctets - $inf{lastin}).":".($outoctets - $inf{lastout}));
|
||
if ($wrapin) { $inf{lastin} = $wrapin } else { $inf{lastin} = $inoctets }
|
||
if ($wrapout) { $inf{lastout} = $wrapout } else { $inf{lastout} = $outoctets }
|
||
}
|
||
|
||
sub footer {
|
||
print DHTML "<br><br><br></td></tr></table><table cellpadding=3 align=left>
|
||
<tr><td><a href=http://www.dynw.com/iog/><img src=ioglogo.gif border=0></a></td>
|
||
<td>IOG $iogver - <a href=http://www.dynw.com/iog/>Input Output Grapher</a><br>
|
||
-<br>James Dogopoulos <<a href=mailto:jd\@dynw.com>jd\@dynw.com</a>><br>
|
||
Questions or comments to <a href=mailto:iog\@dynw.com>iog\@dynw.com</a>
|
||
</td></tr></table><br>";
|
||
}
|
||
|
||
# make the hourly html
|
||
#
|
||
|
||
sub hourlyhtml {
|
||
|
||
my($name,$host,$path,$newday) = @_;
|
||
|
||
# make todays graph
|
||
#
|
||
|
||
my $enddays = last_mday($mon, ($year + "1900"));
|
||
|
||
my $count = "0";
|
||
my ($besthour,$bestday,$inoct,$outoct) = "0";
|
||
|
||
# find busiest hour
|
||
#
|
||
while ($count <= "23") {
|
||
if ($inf{$count}) { ($inoct,$outoct) = split(/:/, $inf{$count}); }
|
||
else { $inoct = $outoct = "0"; }
|
||
if ($inoct > $besthour) { $besthour = $inoct; }
|
||
if ($outoct > $besthour) { $besthour = $outoct; }
|
||
$count++;
|
||
}
|
||
|
||
my $hscalemax = ($besthour / "1000000");
|
||
my ($hscaleunit,$intotal,$outtotal) = 0;
|
||
|
||
if ($hscalemax > "0") { $hscaleunit = ("450" / $hscalemax); }
|
||
|
||
open(DHTML, ">>$path".$main::SL."$name".".html") or print "can't open in $name $host $!";
|
||
flock(DHTML, 2) or print "can't flock $name $host: $!";
|
||
truncate(DHTML, 0);
|
||
|
||
print DHTML "<html><title>IOG $iogver - $host</title>
|
||
<META HTTP-EQUIV=Refresh CONTENT=3600><body bgcolor=#FFFFFF>
|
||
<table border=0><tr><td>";
|
||
|
||
my $dexist = (-f "$path".$main::SL."$name"."-days.html");
|
||
my $mexist = (-f "$path".$main::SL."$name"."-months.html");
|
||
|
||
if ($newday != "1") {
|
||
if ($dexist && $mexist) {
|
||
print DHTML "<font size=3> [ Today | <a href="."$name"."-days.html>This Month</a>
|
||
| <a href="."$name"."-months.html>Previous Months</a> ]</font><br><br>";
|
||
} else {
|
||
if ($dexist && !$mexist) {
|
||
print DHTML "<font size=3> [ Today | <a href="."$name"."-days.html>This
|
||
Month</a> | Previous Months ]</font><br><br>";
|
||
} else {
|
||
if (!$dexist && $mexist) {
|
||
print DHTML "<font size=3> [ Today | This Month
|
||
| <a href="."$name"."-months.html>Previous Months</a> ]</font><br><br>";
|
||
} else { print DHTML "[ Today | This Month | Previous Months ]"; }
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
if ($dexist && $mexist) {
|
||
print DHTML "<font size=3> [ <a href="."$name"."-days.html>This Month</a>
|
||
| <a href="."$name"."-months.html>Previous Months</a> ]</font><br><br>";
|
||
} else {
|
||
if ($dexist && !$mexist) {
|
||
print DHTML "<font size=3> [ <a href="."$name"."-days.html>This
|
||
Month</a> | Previous Months ]</font><br><br>";
|
||
} else {
|
||
if (!$dexist && $mexist) {
|
||
print DHTML "<font size=3> [ This Month
|
||
| <a href="."$name"."-months.html>Previous Months</a> ]</font><br><br>";
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
if ($newday eq "1") { $tday = "$nday"; } else { $tday = "$pday"; }
|
||
|
||
print DHTML "<h3>$months[$mon] $tday - Network I/O for $name ($host)</h3>";
|
||
print DHTML "<table cellpadding=5 border=1>";
|
||
|
||
$count = "0";
|
||
|
||
while ($count <= "23") {
|
||
my($inwidth,$outwidth);
|
||
|
||
if ($inf{$count}) {
|
||
($inoct,$outoct) = split(/:/, $inf{$count});
|
||
$intotal += $inoct;
|
||
$outtotal += $outoct;
|
||
$inwidth = ($inoct / "1000000" * $hscaleunit);
|
||
$outwidth = ($outoct / "1000000" * $hscaleunit);
|
||
} else { $count++; next; }
|
||
|
||
# if day is over 1gb, switch to GB/MB display.
|
||
#
|
||
my($gstring,$gbin,$gbout,$mbin,$mbout);
|
||
|
||
$mbin = sprintf("%.1f", $inoct / $mbsize);
|
||
$mbout = sprintf("%.1f", $outoct / $mbsize);
|
||
|
||
if ($mbin > $gbsize or $mbout > $gbsize) {
|
||
$gbin = sprintf("%.1f", $mbin / $gbsize);
|
||
$gbout = sprintf("%.1f", $mbout / $gbsize);
|
||
|
||
$gstring = "<td><font size=2><font color=#00CC00>In:</font> $gbin GB
|
||
($mbin MB)<br><font color=#0000FF>Out:</font> $gbout GB ($mbout MB)
|
||
</font></td></tr>";
|
||
}
|
||
else {
|
||
$gstring = "<td><font size=2><font color=#00CC00>In:</font> $mbin MB (".
|
||
sprintf("%.f", $inoct / $kbsize)." KB)<br><font color=#0000FF>Out:</font> $mbout
|
||
MB (".sprintf("%.f", $outoct / $kbsize)." KB)";
|
||
}
|
||
|
||
$inwidth = (sprintf("%.f", $inwidth) + 1);
|
||
$outwidth = (sprintf("%.f", $outwidth) + 1);
|
||
|
||
print DHTML "<tr><td><b>"."$count".":00</b></td><td width=455><img src=in.gif height=12 width=$inwidth><br>\n";
|
||
print DHTML "<img src=out.gif height=12 width=$outwidth><br></td>\n";
|
||
|
||
print DHTML $gstring;
|
||
|
||
$count++;
|
||
}
|
||
|
||
$intotal = sprintf("%.f", ($intotal / $mbsize));
|
||
$outtotal = sprintf("%.f", ($outtotal / $mbsize));
|
||
|
||
print DHTML "</table><br></td></tr><tr><td align=right>";
|
||
|
||
if ($intotal > $gbsize or $outtotal > $gbsize) {
|
||
my $gbtotal = sprintf("%.1f", ($intotal + $outtotal) / $gbsize);
|
||
print DHTML "Today's Total: <b>$gbtotal GB</b><br><font color=#00CC00>
|
||
In:</font> $intotal MB - <font color=#0000FF>Out:</font>
|
||
$outtotal MB<br>";
|
||
}
|
||
else {
|
||
print DHTML "Today's Total: <b>".($intotal + $outtotal)." MB</b><br>
|
||
<font color=#00CC00>In:</font> $intotal MB - <font color=#0000FF>Out:</font>
|
||
$outtotal MB<br>";
|
||
}
|
||
|
||
footer();
|
||
|
||
flock(DHTML, 8);
|
||
close(DHTML);
|
||
}
|
||
|
||
sub monthlyhtml {
|
||
|
||
my ($name,$host,$path) = @_;
|
||
my ($bestmonth,$m_intotal,$m_outtotal,$m_total);
|
||
my $count = 0;
|
||
|
||
# find busiest month
|
||
|
||
while ($count <= "11") {
|
||
if ($inf{"m" . $count}) {
|
||
($m_intotal,$m_outtotal) = split(/:/, $inf{"m" . $count});
|
||
if ($m_intotal > $bestmonth) { $bestmonth = $m_intotal; }
|
||
if ($m_outtotal > $bestmonth) { $bestmonth = $m_outtotal; }
|
||
}
|
||
$count++;
|
||
}
|
||
|
||
my $mscalemax = $bestmonth;
|
||
my ($mscaleunit,$intotal,$outtotal) = 0;
|
||
|
||
if ($mscalemax > "0") { $mscaleunit = ("450" / $mscalemax); }
|
||
|
||
open(DHTML, ">>$path".$main::SL."$name"."-months.html") or print "can't open $name $host $!";
|
||
flock(DHTML, 2) or print "can't flock $name $host : $!";
|
||
truncate(DHTML, 0);
|
||
|
||
print DHTML "<html><title>IOG $iogver - $host</title><body bgcolor=#FFFFFF>
|
||
<table border=0><tr><td>";
|
||
|
||
my $dexist = (-f "$path".$main::SL."$name"."-days.html");
|
||
|
||
if ($dexist) {
|
||
print DHTML "<font size=3>[ <a href="."$name".".html>Today</a> |
|
||
<a href="."$name"."-days.html>This Month</a> | Previous Months ]</font><br><br>";
|
||
} else {
|
||
print DHTML "<font size=3>[ <a href="."$name".".html>Today</a> |
|
||
This Month | Previous Months ]</font><br><br>";
|
||
}
|
||
|
||
print DHTML "<h3>Monthly Network I/O for $name ($host)</h3>";
|
||
print DHTML "<table cellpadding=5 border=1>";
|
||
|
||
$count = "0";
|
||
|
||
while ($count <= "11") {
|
||
my($inwidth,$outwidth,$intotal,$outtotal,$inoct,$outoct,$mtotal);
|
||
|
||
if ($inf{"m" . $count}) {
|
||
($inoct,$outoct,$mtotal) = split(/:/, $inf{"m" . $count});
|
||
$intotal += $inoct;
|
||
$outtotal += $outoct;
|
||
$inwidth = ($inoct * $mscaleunit);
|
||
$outwidth = ($outoct * $mscaleunit);
|
||
} else { $count++; next; }
|
||
|
||
# if day is over 1gb, switch to GB/MB display.
|
||
#
|
||
my($gstring,$gbin,$gbout,$gbtotal,$mbin,$mbout);
|
||
|
||
$mbin = sprintf("%.f", $inoct);
|
||
$mbout = sprintf("%.f", $outoct);
|
||
|
||
$gbin = sprintf("%.1f", $mbin / $gbsize);
|
||
$gbout = sprintf("%.1f", $mbout / $gbsize);
|
||
$gbtotal = sprintf("%.1f", ($gbin + $gbout));
|
||
|
||
$gstring = "<td><font size=2><font color=#00CC00>In:</font> $gbin GB
|
||
($mbin MB)<br><font color=#0000FF>Out:</font> $gbout GB ($mbout MB)
|
||
</font></td></tr>";
|
||
|
||
$inwidth = (sprintf("%.f", $inwidth) + 1);
|
||
$outwidth = (sprintf("%.f", $outwidth) + 1);
|
||
|
||
if (-f "$path".$main::SL."$name"."-month".($count + "1").".html") {
|
||
$mlink = "<a href=$name"."-month".($count + "1").".html>$months[$count]</a>";
|
||
} else { $mlink = "$months[$count]"; }
|
||
|
||
print DHTML "<tr><td><b>$mlink<br>$gbtotal GB</b></td><td width=455>
|
||
<img src=in.gif height=12 width=$inwidth><br>\n";
|
||
print DHTML "<img src=out.gif height=12 width=$outwidth><br></td>\n";
|
||
|
||
print DHTML $gstring;
|
||
|
||
$count++
|
||
}
|
||
|
||
print DHTML "</tr></td></table><br>";
|
||
|
||
footer();
|
||
|
||
flock(DHTML, 8);
|
||
close(DHTML);
|
||
}
|
||
|
||
sub dailyhtml {
|
||
|
||
my ($bestday,$d_intotal,$d_outtotal) = 0;
|
||
my ($name,$host,$path) = @_;
|
||
my $count = 1;
|
||
my $endday = last_mday($inf{month}, $inf{year});
|
||
|
||
if ($endday eq $mday) { $lastday="1"; } else { $lastday="0"; }
|
||
|
||
# fix math errors from previous sub
|
||
if ($newmon) { $mon--; }
|
||
|
||
# move Today's html file unless it's a new month.
|
||
|
||
if (!$newmon) {
|
||
$oldfile="$path"."$main::SL"."$name".".html";
|
||
$newfile="$path"."$main::SL"."$name"."-day".($mday - "1").".html";
|
||
if ($main::OS eq "NT") { system("move /Y $oldfile $newfile"); }
|
||
else { system("mv $oldfile $newfile"); }
|
||
}
|
||
|
||
# find busiest day (should be merged with totals)
|
||
|
||
while ($count <= $endday) {
|
||
if ($inf{"d" . $count}) {
|
||
($d_intotal,$d_outtotal) = split(/:/, $inf{"d" . $count});
|
||
if ($d_intotal > $bestday) { $bestday = $d_intotal; }
|
||
if ($d_outtotal > $bestday) { $bestday = $d_outtotal; }
|
||
}
|
||
$count++;
|
||
}
|
||
|
||
my $dscalemax = ($bestday / "1000000");
|
||
my ($dscaleunit,$intotal,$outtotal) = 0;
|
||
|
||
if ($dscalemax > "0") { $dscaleunit = ("450" / $dscalemax); }
|
||
|
||
open(DHTML, ">>$path".$main::SL."$name"."-days.html") or print "can't open $name $host $!";
|
||
flock(DHTML, 2) or print "can't flock $name $host : $!";
|
||
truncate(DHTML, 0);
|
||
|
||
print DHTML "<html><title>IOG $iogver - $host</title><body bgcolor=#FFFFFF>
|
||
<table border=0><tr><td>";
|
||
|
||
if (-f "$path".$main::SL."$name"."-months.html") {
|
||
print DHTML "<font size=3>[ <a href="."$name".".html>Today</a> |
|
||
This Month | <a href="."$name"."-months.html>Previous Months</a> ]</font><br><br>";
|
||
} else {
|
||
print DHTML "<font size=3>[ <a href="."$name".".html>Today</a> | This Month
|
||
| Previous Months ]</font><br><br>";
|
||
}
|
||
|
||
print DHTML "<h3>$months[$mon] - Network I/O for $name ($host)</h3>";
|
||
print DHTML "<table cellpadding=5 border=1>";
|
||
|
||
$count = "1";
|
||
|
||
while ($count <= $endday) {
|
||
my($inwidth,$outwidth,$inoct,$outoct,$pday);
|
||
|
||
if ($inf{"d" . $count}) {
|
||
($inoct,$outoct) = split(/:/, $inf{"d" . $count});
|
||
$intotal += $inoct;
|
||
$outtotal += $outoct;
|
||
$inwidth = ($inoct / "1000000" * $dscaleunit);
|
||
$outwidth = ($outoct / "1000000" * $dscaleunit);
|
||
} else { $count++; next; }
|
||
|
||
# if day is over 1gb, switch to GB/MB display.
|
||
#
|
||
my($gstring,$gbin,$gbout,$mbin,$mbout);
|
||
|
||
$mbin = sprintf("%.f", $inoct / $mbsize);
|
||
$mbout = sprintf("%.f", $outoct / $mbsize);
|
||
|
||
if ($mbin > $gbsize or $mbout > $gbsize) {
|
||
$gbin = sprintf("%.1f", $mbin / $gbsize);
|
||
$gbout = sprintf("%.1f", $mbout / $gbsize);
|
||
|
||
$gstring = "<td><font size=2><font color=#00CC00>In:</font> $gbin GB
|
||
($mbin MB)<br><font color=#0000FF>Out:</font> $gbout GB ($mbout MB)
|
||
</font></td></tr>";
|
||
}
|
||
else {
|
||
$gstring = "<td><font size=2><font color=#00CC00>In:</font> $mbin MB (".
|
||
sprintf("%.f", $inoct / $kbsize)." KB)<br><font color=#0000FF>Out:</font> $mbout
|
||
MB (".sprintf("%.f", $outoct / $kbsize)." KB)";
|
||
}
|
||
|
||
$inwidth = (sprintf("%.f", $inwidth) + 1);
|
||
$outwidth = (sprintf("%.f", $outwidth) + 1);
|
||
|
||
if ($days{$count}) { $pday = $days{$count}; } else { $pday = $count."th"; }
|
||
|
||
if (-f "$path".$main::SL."$name"."-day".$count.".html" && $lastday eq "0"
|
||
&& ($newmon ne "1")) {
|
||
$pday = "<a href=$name"."-day".$count.".html>$pday</a>";
|
||
}
|
||
|
||
print DHTML "<tr><td><b>$pday</b></td><td width=455>
|
||
<img src=in.gif height=12 width=$inwidth><br>\n";
|
||
print DHTML "<img src=out.gif height=12 width=$outwidth><br></td>\n";
|
||
print DHTML $gstring;
|
||
|
||
$count++;
|
||
}
|
||
|
||
$intotal = sprintf("%.f", ($intotal / $mbsize));
|
||
$outtotal = sprintf("%.f", ($outtotal / $mbsize));
|
||
|
||
my $gbtotal = sprintf("%.1f", (($intotal + $outtotal) / $gbsize));
|
||
|
||
print DHTML "</table><br></td></tr><tr><td align=right>";
|
||
print DHTML "Monthly Total: <b>$gbtotal GB</b><br><font color=#00CC00>
|
||
In:</font> $intotal MB - <font color=#0000FF>Out:</font> $outtotal MB<br>";
|
||
|
||
footer();
|
||
|
||
flock(DHTML, 8);
|
||
close(DHTML);
|
||
|
||
# reverse math errors
|
||
if ($newmon) { $mon++; }
|
||
|
||
}
|
||
|
||
|
||
# END
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
#
|
||
# IOG v1.0 - Input/Output Grapher
|
||
# Copyright 2000-2002 (c) James Dogopoulos
|
||
#
|
||
|
||
|