File: apc_nis.in

package info (click to toggle)
munin 2.0.76-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 7,068 kB
  • sloc: perl: 11,684; java: 1,924; sh: 1,632; makefile: 636; javascript: 365; python: 267
file content (135 lines) | stat: -rw-r--r-- 3,782 bytes parent folder | download | duplicates (6)
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);