diff options
Diffstat (limited to 'files/munin/apc_nis')
-rw-r--r-- | files/munin/apc_nis | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/files/munin/apc_nis b/files/munin/apc_nis new file mode 100644 index 0000000..0bfcfaa --- /dev/null +++ b/files/munin/apc_nis @@ -0,0 +1,122 @@ +#!/usr/bin/perl -w +# -*- perl -*- + +=head1 NAME + +apc_nis - Plugin to monitor APC UPS via the nis port of apcupsd + +=head1 CONFIGURATION + +The following configuration parameters are used by this plugin + + [apc_nis] + env.host - hostname to connect to + env.port - port number to connect to + +=head2 DEFAULT CONFIGURATION + + [apc_nis] + env.host 127.0.0.1 + env.port 3551 + +=head1 MAGIC MARKERS + + #%# family=contrib + #%# capabilities=autoconf + +=cut + +use IO::Socket; +use strict; + +if($ARGV[0] and $ARGV[0] eq "autoconf") { + print "yes\n"; + exit 0; +} + +my $host = exists $ENV{'host'} ? $ENV{'host'} : "127.0.0.1"; +my $port = exists $ENV{'port'} ? $ENV{'port'} : "3551"; + +my $sock = new IO::Socket::INET ( + PeerAddr => $host, + PeerPort => $port, + Proto => 'tcp' + ); + +die "Could not create socket: $!\n" unless $sock; + +my $buf = pack("CC", 0, 6); +print $sock $buf; +print $sock "status\n"; + +if($ARGV[0] and $ARGV[0] eq "config") { + # Test for some capabilities. + my $has_temperature = 0, my $line_volt_min, my $line_volt_max; + my $line; + do { + $line = <$sock>; + chomp($line); + if ($line =~ /\WITEMP /) { + $has_temperature = 1; + } elsif ($line =~ /\WLOTRANS /) { + $line =~ s/.* (\d+.\d+).*/$1/; + $line_volt_min = $line; + } elsif ($line =~ /\WHITRANS /) { + $line =~ s/.* (\d+.\d+).*/$1/; + $line_volt_max = $line; + } + } while(!($line =~ /END APC/)); + + close($sock); + + print "graph_title APC UPS measurements\n"; + print "graph_args -l 0 --base 1000\n"; + print "graph_vlabel A bit of all (Volt, time, %)\n"; + print "graph_info Values received for apcupsd available at $host:$port\n"; + print "battery_volt.label batt volt (V)\n"; + print "battery_volt.type GAUGE\n"; + print "battery_volt.max 300\n"; + print "battery_charge.label batt charge (%)\n"; + print "battery_charge.type GAUGE\n"; + print "battery_charge.max 100\n"; + print "line_volt.label line (V)\n"; + print "line_volt.type GAUGE\n"; + print "line_volt.max 300\n"; + print "line_volt.warning ${line_volt_min}:${line_volt_max}\n"; + print "load.label ups load (%)\n"; + print "load.type GAUGE\n"; + print "time_left.label time left (min)\n"; + print "time_left.type GAUGE\n"; + if ($has_temperature) { + print "temperature.label internal temperature (°C)\n"; + print "temperature.type GAUGE\n"; + } + exit 0; +} + +my $line; +do { + $line = <$sock>; + chomp($line); + if($line =~ /\WBATTV /) { + $line =~ s/.* (\d+.\d+).*/$1/; + print "battery_volt.value $line\n"; + } elsif($line =~ /\WLINEV /) { + $line =~ s/.* (\d+.\d+).*/$1/; + print "line_volt.value $line\n"; + } elsif($line =~ /\WLOADPCT /) { + $line =~ s/.* (\d+.\d+).*/$1/; + print "load.value $line\n"; + } elsif($line =~ /\WBCHARGE /) { + $line =~ s/.* (\d+.\d+).*/$1/; + print "battery_charge.value $line\n"; + } elsif($line =~ /\WTIMELEFT /) { + $line =~ s/.* (\d+.\d+).*/$1/; + print "time_left.value $line\n"; + } elsif($line =~ /\WITEMP /) { + $line =~ s/.* (\d+.\d+).*/$1/; + print "temperature.value $line\n"; + } +} while(!($line =~ /END APC/)); + +close($sock); |