1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
#!@@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;
my $host = exists $ENV{'host'} ? $ENV{'host'} : "127.0.0.1";
my $port = exists $ENV{'port'} ? $ENV{'port'} : "3551";
# We connect early: the connection is used for every operation: autoconf, config and data fetch.
my $sock = new IO::Socket::INET (
PeerAddr => $host,
PeerPort => $port,
Proto => 'tcp'
);
if($ARGV[0] and $ARGV[0] eq "autoconf") {
if ($sock) {
# we successfully opened a connected to the configured daemon
print "yes\n";
} else {
print "no (failed to connect to $host:$port)\n";
}
exit 0;
}
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 "graph_category sensors\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 "line_freq.label line (Hz)\n";
print "line_freq.type GAUGE\n";
print "line_freq.max 65\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 =~ /\WLINEFREQ /) {
$line =~ s/.* (\d+.\d+).*/$1/;
print "line_freq.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);
|