X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/upsgraph/blobdiff_plain/6c1071ee6b37201ba1e39703a198c35d219fc647..e26b065f3d496edd6845b58c5a3598793315876f:/upsgraph.pl diff --git a/upsgraph.pl b/upsgraph.pl index 812de11..04a4f8c 100755 --- a/upsgraph.pl +++ b/upsgraph.pl @@ -6,7 +6,9 @@ if ((@ARGV != 1) && (@ARGV != 2)) { } use Net::SNMP; +use IO::Socket::INET; use RRDs; +use File::Copy; use Data::Dumper; $UPSGRAPH::outdir = ""; @@ -54,15 +56,43 @@ sub fetch_snmp(@) { (my $session, my $error) = Net::SNMP->session(Hostname => $address, Community => $community); - die "session error: $error" unless ($session); + if (!$session) { + print STDERR "session error: $error"; + } $session->translate(0); - my $val = $session->get_request($oid); + my $result = $session->get_request($oid); $session->close; - $val; + return undef if (!defined($result)); + + $result->{$oid}; +} + +sub fetch_tcp(@) { + my $address = shift; + my $port = shift; + + my $sock = IO::Socket::INET->new(PeerAddr => $address, + PeerPort => $port, + Proto => 'tcp', + Timeout => 1); + + return undef if (!$sock); + + chomp(my $value = <$sock>); + + close($sock); + + if (!$value) { + return undef; + } + + $value=~ s/\s//g; + + $value; } if ($> == 0) { @@ -78,6 +108,11 @@ if ($> == 0) { foreach my $host (@$hosts) { my $rrdfile = $host->{'rrdfile'}; + foreach my $var (keys(%{$host->{'vars'}})) { + $host->{'vars'}->{$var}->{'min'} = 'U' if (!defined($host->{'vars'}->{$var}->{'min'})); + $host->{'vars'}->{$var}->{'max'} = 'U' if (!defined($host->{'vars'}->{$var}->{'max'})); + } + if (-e "${rrdfile}") { print "Reading old ${rrdfile} to preserve data...\n"; @@ -144,6 +179,36 @@ foreach my $host (@$hosts) { exit 1; } + if (defined($rrdinfo->{"ds[${field}].min"})) { + if ($rrdinfo->{"ds[${field}].min"} ne $host->{'vars'}->{$field}->{'min'}) { + RRDs::tune("${rrdfile}.${field}","-i",$field.":".$host->{'vars'}->{$field}->{'min'}); + } + } else { + if ($host->{'vars'}->{$field}->{'min'} ne 'U') { + RRDs::tune("${rrdfile}.${field}","-i",$field.":".$host->{'vars'}->{$field}->{'min'}); + } + } + + if (RRDs::error) { + print "Error while setting min: " . RRDs::error . "\n"; + exit 1; + } + + if (defined($rrdinfo->{"ds[${field}].max"})) { + if ($rrdinfo->{"ds[${field}].max"} ne $host->{'vars'}->{$field}->{'max'}) { + RRDs::tune("${rrdfile}.${field}","-a",$field.":".$host->{'vars'}->{$field}->{'max'}); + } + } else { + if ($host->{'vars'}->{$field}->{'max'} ne 'U') { + RRDs::tune("${rrdfile}.${field}","-a",$field.":".$host->{'vars'}->{$field}->{'max'}); + } + } + + if (RRDs::error) { + print "Error while setting max: " . RRDs::error . "\n"; + exit 1; + } + if ($rrdinfo->{'rra[0].rows'} != $keep) { print "Resizing ${rrdfile}.${field} from " . $rrdinfo->{'rra[0].rows'} . " to ${keep} samples.\n"; @@ -212,10 +277,17 @@ exit 0 if ($child != 0); while(1) { open(HTML, ">${outdir}/index.html.new"); - print HTML 'USV status'; + print HTML 'Status'; print HTML ''; foreach my $host (@$hosts) { + print HTML "[{'name'}."\">".${host}->{'name'}."] "; + } + print HTML "
\n"; + + foreach my $host (@$hosts) { + print HTML "
\n"; + print HTML "{'name'}."\">\n"; my $vars = $host->{'vars'}; my $rrdfile = $host->{'rrdfile'}; my $hostname = $host->{'name'}; @@ -223,10 +295,19 @@ while(1) { foreach my $var (@{$host->{'fields'}}) { delete $vars->{$var}->{'value'}; - my $result = fetch_snmp($host->{'address'}, $host->{'community'}, $vars->{$var}->{'oid'}); + my $result; + + if ((!defined($vars->{$var}->{'proto'})) || + ($vars->{$var}->{'proto'} eq '') || + ($vars->{$var}->{'proto'} eq 'snmp')) { + $result = fetch_snmp($host->{'address'}, $host->{'community'}, $vars->{$var}->{'oid'}); + } elsif ($vars->{$var}->{'proto'} eq 'tcp') { + $result = fetch_tcp($host->{'address'}, $vars->{$var}->{'port'}); + } + next unless (defined $result); - $vars->{$var}->{'value'} = $result->{$vars->{$var}->{'oid'}}; + $vars->{$var}->{'value'} = $result; if (defined($vars->{$var}->{'factor'})) { $vars->{$var}->{'value'} *= $vars->{$var}->{'factor'}; } @@ -243,7 +324,7 @@ while(1) { } foreach my $var (@{$host->{'fields'}}) { - my @graphdef = ("-t", $hostname." - ".$vars->{$var}->{'name'}, "DEF:${var}=${rrdfile}.${var}:${var}:AVERAGE", "LINE1:${var}#FF0000"); + my @graphdef = ("--lazy", "-t", $hostname." - ".$vars->{$var}->{'name'}, "DEF:${var}=${rrdfile}.${var}:${var}:AVERAGE", "LINE1:${var}#FF0000"); (my $averages, my $width, my $height) = RRDs::graph("${outdir}/${hostname}.${var}.png.new", "-w", "720", @graphdef); @@ -251,10 +332,10 @@ while(1) { if (RRDs::error) { print "Error while graphing: " . RRDs::error . "\n"; } else { - rename("${outdir}/${hostname}.${var}.png.new", "${outdir}/${hostname}.${var}.png"); + copy("${outdir}/${hostname}.${var}.png.new", "${outdir}/${hostname}.${var}.png"); } - print HTML ""; + print HTML "
\n"; open (HTML2, ">${outdir}/${hostname}.${var}.html.new"); print HTML2 "" . $vars->{$var}->{'name'} . ""; @@ -280,7 +361,7 @@ while(1) { if (RRDs::error) { print "Error while graphing: " . RRDs::error . "\n"; } else { - rename("${outdir}/${hostname}.${var}.long.png.new", "${outdir}/${hostname}.${var}.long.png"); + copy("${outdir}/${hostname}.${var}.long.png.new", "${outdir}/${hostname}.${var}.long.png"); } print HTML2 "
"; @@ -292,7 +373,7 @@ while(1) { if (RRDs::error) { print "Error while graphing: " . RRDs::error . "\n"; } else { - rename("${outdir}/${hostname}.${var}.week.png.new", "${outdir}/${hostname}.${var}.week.png"); + copy("${outdir}/${hostname}.${var}.week.png.new", "${outdir}/${hostname}.${var}.week.png"); } print HTML2 "
"; @@ -304,7 +385,7 @@ while(1) { if (RRDs::error) { print "Error while graphing: " . RRDs::error . "\n"; } else { - rename("${outdir}/${hostname}.${var}.year.png.new", "${outdir}/${hostname}.${var}.year.png"); + copy("${outdir}/${hostname}.${var}.year.png.new", "${outdir}/${hostname}.${var}.year.png"); } print HTML2 "
";