X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/upsgraph/blobdiff_plain/6c1071ee6b37201ba1e39703a198c35d219fc647..e0acc35a4f60d2641e71593713acfb32cafef751:/upsgraph.pl?ds=inline diff --git a/upsgraph.pl b/upsgraph.pl index 812de11..9887d0c 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,44 @@ 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"; + return undef; + } $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 +109,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 +180,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 +278,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 +296,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,24 +325,37 @@ 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 = ('-P', "--lazy", "-t", $hostname." - ".$vars->{$var}->{'name'}, "DEF:${var}=${rrdfile}.${var}:${var}:AVERAGE", "LINE1:${var}#FF0000"); + + push @graphdef, "VDEF:cur=${var},LAST"; + push @graphdef, 'GPRINT:cur:Current\\: %.2lf\\r'; + + my $mtime; + $mtime=(stat("${outdir}/${hostname}.${var}.png.work"))[9]; + (my $averages, my $width, my $height) = - RRDs::graph("${outdir}/${hostname}.${var}.png.new", + RRDs::graph("${outdir}/${hostname}.${var}.png.work", "-w", "720", @graphdef); + pop @graphdef; + pop @graphdef; + if (RRDs::error) { print "Error while graphing: " . RRDs::error . "\n"; } else { - rename("${outdir}/${hostname}.${var}.png.new", "${outdir}/${hostname}.${var}.png"); + my $newmtime=(stat("${outdir}/${hostname}.${var}.png.work"))[9]; + if ((!defined($mtime)) || ($newmtime != $mtime)) { + copy("${outdir}/${hostname}.${var}.png.work", "${outdir}/${hostname}.${var}.png.new"); + rename("${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'} . ""; + print HTML2 '' . $vars->{$var}->{'name'} . ''; print HTML2 ''; - push @graphdef, "VDEF:min=${var},MINIMUM"; push @graphdef, "GPRINT:min:Minimum\\: %.2lf"; @@ -273,38 +368,53 @@ while(1) { push @graphdef, "VDEF:cur=${var},LAST"; push @graphdef, "GPRINT:cur:Current\\: %.2lf"; + $mtime=(stat("${outdir}/${hostname}.${var}.long.png.work"))[9]; ($averages, $width, $height) = - RRDs::graph("${outdir}/${hostname}.${var}.long.png.new", + RRDs::graph("${outdir}/${hostname}.${var}.long.png.work", "-w", "1008", @graphdef); if (RRDs::error) { print "Error while graphing: " . RRDs::error . "\n"; } else { - rename("${outdir}/${hostname}.${var}.long.png.new", "${outdir}/${hostname}.${var}.long.png"); + my $newmtime=(stat("${outdir}/${hostname}.${var}.long.png.work"))[9]; + if ((!defined($mtime)) || ($newmtime != $mtime)) { + copy("${outdir}/${hostname}.${var}.long.png.work", "${outdir}/${hostname}.${var}.long.png.new"); + rename("${outdir}/${hostname}.${var}.long.png.new", "${outdir}/${hostname}.${var}.long.png"); + } } print HTML2 "
"; + $mtime=(stat("${outdir}/${hostname}.${var}.week.png.work"))[9]; ($averages, $width, $height) = - RRDs::graph("${outdir}/${hostname}.${var}.week.png.new", + RRDs::graph("${outdir}/${hostname}.${var}.week.png.work", "-w", "1008", "-e", "now", "-s", "end-1w", @graphdef); if (RRDs::error) { print "Error while graphing: " . RRDs::error . "\n"; } else { - rename("${outdir}/${hostname}.${var}.week.png.new", "${outdir}/${hostname}.${var}.week.png"); + my $newmtime=(stat("${outdir}/${hostname}.${var}.week.png.work"))[9]; + if ((!defined($mtime)) || ($newmtime != $mtime)) { + copy("${outdir}/${hostname}.${var}.week.png.work", "${outdir}/${hostname}.${var}.week.png.new"); + rename("${outdir}/${hostname}.${var}.week.png.new", "${outdir}/${hostname}.${var}.week.png"); + } } print HTML2 "
"; + $mtime=(stat("${outdir}/${hostname}.${var}.year.png.work"))[9]; ($averages, $width, $height) = - RRDs::graph("${outdir}/${hostname}.${var}.year.png.new", + RRDs::graph("${outdir}/${hostname}.${var}.year.png.work", "-w", "1008", "-e", "now", "-s", "end-1y", @graphdef); if (RRDs::error) { print "Error while graphing: " . RRDs::error . "\n"; } else { - rename("${outdir}/${hostname}.${var}.year.png.new", "${outdir}/${hostname}.${var}.year.png"); + my $newmtime=(stat("${outdir}/${hostname}.${var}.year.png.work"))[9]; + if ((!defined($mtime)) || ($newmtime != $mtime)) { + copy("${outdir}/${hostname}.${var}.year.png.work", "${outdir}/${hostname}.${var}.year.png.new"); + rename("${outdir}/${hostname}.${var}.year.png.new", "${outdir}/${hostname}.${var}.year.png"); + } } print HTML2 "
";