init
authorHIROSE Masaaki <hirose31@gmail.com>
Wed, 13 Jan 2010 17:14:23 +0000 (02:14 +0900)
committerHIROSE Masaaki <hirose31@gmail.com>
Wed, 13 Jan 2010 17:14:23 +0000 (02:14 +0900)
apcupsd_pct [new file with mode: 0755]
apcupsd_time [new symlink]
apcupsd_volt [new symlink]

diff --git a/apcupsd_pct b/apcupsd_pct
new file mode 100755 (executable)
index 0000000..2bf17c5
--- /dev/null
@@ -0,0 +1,204 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use Carp;
+use Pod::Usage;
+
+our $APCACCESS = $ENV{apcaccess} || "/sbin/apcaccess";
+our $UPS_MODEL = $ENV{ups_model} || "ES 725";
+my  %Graph;
+my  %Metric;
+
+MAIN: {
+    decide_monitor_type();
+
+    my $mode = $ARGV[0] || "fetch";
+    $mode =~ /^-/ && pod2usage();
+
+    ### $mode
+    eval "do_${mode}();"
+        or croak "do_${mode}: $@";
+
+    ### end
+    exit 0;
+}
+
+=begin comment
+
+pct
+  LOADPCT   is the percentage of load capacity as estimated by the UPS.
+    15.0 Percent Load Capacity
+  BCHARGE   is the percentage charge on the batteries.
+    100.0 Percent
+
+volt
+  LINEV     is the current line voltage as returned by the UPS.
+    102.0 Volts
+  BATTV     is the battery voltage as supplied by the UPS.
+    13.5 Volts
+
+time
+  TIMELEFT  is the remaining runtime left on batteries as estimated by the UPS.
+    38.4 Minutes
+
+=end comment
+
+=cut
+
+sub decide_monitor_type {
+    my $type = $0 =~ /_pct/  ? "pct"  :
+               $0 =~ /_volt/ ? "volt" :
+               $0 =~ /_time/ ? "time" : undef
+                   or croak "unknown monitor type: $0";
+
+    # common
+    %Graph = (
+        graph_title => "APC Status".($UPS_MODEL?" ($UPS_MODEL)":"")." - ",
+        graph_category => "ups",
+        graph_info     => "This graph shows information about your APC UPS",
+       );
+
+    if ($type eq "pct") {
+        $Graph{graph_title} .= "Percentage";
+        %Metric =(
+            LOADPCT => {
+                label    => "load capacity pct",
+            },
+            BCHARGE => {
+                label    => "charge on the batteries pct",
+            },
+           );
+    } elsif ($type eq "volt") {
+        $Graph{graph_title} .= "Voltage";
+        %Metric =(
+            LINEV => {
+                label    => "line voltage as returned by the UPS",
+            },
+            BATTV => {
+                label    => "battery voltage as supplied by the UPS",
+            },
+           );
+    } elsif ($type eq "time") {
+        $Graph{graph_title} .= "Time";
+        %Metric =(
+            TIMELEFT => {
+                label    => "remaining runtime left on batteries",
+            },
+           );
+    }
+}
+
+sub do_fetch {
+    ### do_fetch
+
+    my @status_data = retrieve_apcupsd_status()
+        or croak "failed: retrieve_apcupsd_status";
+    ### status_data: \@status_data
+
+    my $status = parse_status_data(@status_data);
+    ### status: $status
+
+    my $FIELD;
+    while (my($field,$attr) = each %Metric) {
+        $field = lc $field;
+        $FIELD = uc $field;
+        printf "%s.value %.1f\n", $field, (exists $status->{$FIELD} ? ($status->{$FIELD} =~ /([\d]+\.?[\d]*)/) : 0);
+    }
+
+    return 1;
+}
+
+sub do_config {
+    ### do_config
+
+    while (my($k,$v) = each %Graph) {
+        printf "%s %s\n", $k, $v;
+    }
+    while (my($field,$attr) = each %Metric) {
+        $field = lc $field;
+        while (my($k,$v) = each %$attr) {
+            printf "%s.%s %s\n", $field, $k, $v;
+        }
+    }
+
+    return 1;
+}
+
+sub do_autoconf {
+    ### do_config
+    print "yes\n";
+}
+
+sub retrieve_apcupsd_status {
+    open my $apc, '-|', $APCACCESS
+        or croak $!;
+    my @status_data = <$apc>;
+    close $apc;
+    chomp @status_data;
+    return @status_data;
+}
+
+sub parse_status_data {
+    my $status = {};
+    my($k,$v);
+    for (@_) {
+        ($k,$v) = split /\s*:\s*/, $_, 2;
+        $status->{$k} = $v;
+    }
+    return $status;
+}
+
+
+__END__
+
+=head1 NAME
+
+B<apcupsd_pct>, B<apcupsd_volt>, B<apcupsd_time> - munin plugin for APC UPS
+
+=head1 SYNOPSIS
+
+B<apcupsd_pct>  [ I<config>|I<fetch> ]
+
+B<apcupsd_volt> [ I<config>|I<fetch> ]
+
+B<apcupsd_time> [ I<config>|I<fetch> ]
+
+
+=head1 DESCRIPTION
+
+munin plugin to monitor APC UPS via apcupsd by apcaccess.
+
+=head1 REPOSITORY
+
+L<http://github.com/hirose31/munin-apcupsd-fixme/tree/master>
+
+  git clone git://github.com/hirose31/fixme.git
+
+patches and collaborators are welcome.
+
+=head1 SEE ALSO
+
+L<http://munin.projects.linpro.no/wiki/HowToWritePlugins>,
+L<http://munin.projects.linpro.no/wiki/protocol-config>
+
+=head1 AUTHOR
+
+HIROSE, Masaaki E<lt>hirose31 _at_ gmail.comE<gt>
+
+=head1 COPYRIGHT & LICENSE
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
+# for Emacsen
+# Local Variables:
+# mode: cperl
+# cperl-indent-level: 4
+# indent-tabs-mode: nil
+# coding: utf-8
+# End:
+
+# vi: set ts=4 sw=4 sts=0 :
diff --git a/apcupsd_time b/apcupsd_time
new file mode 120000 (symlink)
index 0000000..c60f1e2
--- /dev/null
@@ -0,0 +1 @@
+apcupsd_pct
\ No newline at end of file
diff --git a/apcupsd_volt b/apcupsd_volt
new file mode 120000 (symlink)
index 0000000..c60f1e2
--- /dev/null
@@ -0,0 +1 @@
+apcupsd_pct
\ No newline at end of file