summaryrefslogtreecommitdiff
path: root/src/pmdas/simple/pmdasimple.perl
diff options
context:
space:
mode:
Diffstat (limited to 'src/pmdas/simple/pmdasimple.perl')
-rw-r--r--src/pmdas/simple/pmdasimple.perl158
1 files changed, 158 insertions, 0 deletions
diff --git a/src/pmdas/simple/pmdasimple.perl b/src/pmdas/simple/pmdasimple.perl
new file mode 100644
index 0000000..f6d2da4
--- /dev/null
+++ b/src/pmdas/simple/pmdasimple.perl
@@ -0,0 +1,158 @@
+#
+# Copyright (c) 2012 Red Hat.
+# Copyright (c) 2008,2012 Aconex. All Rights Reserved.
+# Copyright (c) 2004 Silicon Graphics, Inc. All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+
+use strict;
+use warnings;
+use PCP::PMDA;
+
+use vars qw( $pmda $red $green $blue $user $system );
+my ( $numfetch, $oldfetch ) = ( 0, -1 );
+my ( $color_indom, $now_indom ) = ( 0, 1 );
+my ( $red, $green, $blue ) = ( 0, 100, 200 );
+
+# simple.now instance domain stuff...
+my $simple_config = pmda_config('PCP_PMDAS_DIR') . '/simple/simple.conf';
+my %timeslices;
+my $file_error = 0;
+
+sub simple_instance # called once per ``instance request'' pdu
+{
+ &simple_timenow_check;
+}
+
+sub simple_fetch # called once per ``fetch'' pdu, before callbacks
+{
+ $numfetch++;
+ &simple_timenow_check;
+}
+
+sub simple_fetch_callback # must return array of value,status
+{
+ my ($cluster, $item, $inst) = @_;
+
+ return (PM_ERR_INST, 0) unless ( $inst == PM_IN_NULL
+ || ($cluster == 0 && $item == 1)
+ || ($cluster == 2 && $item == 4) );
+ if ($cluster == 0) {
+ if ($item == 0) { return ($numfetch, 1); }
+ elsif ($item == 1) {
+ if ($inst == 0) { return ($red = ($red+1) % 255, 1); }
+ elsif ($inst == 1) { return ($green = ($green+1) % 255, 1); }
+ elsif ($inst == 2) { return ($blue = ($blue+1) % 255, 1); }
+ else { return (PM_ERR_INST, 0); }
+ } else { return (PM_ERR_PMID, 0); }
+ }
+ elsif ($cluster == 1) {
+ if ($oldfetch < $numfetch) { # get current values, if needed
+ ($user, $system, undef, undef) = times;
+ $oldfetch = $numfetch;
+ }
+ if ($item == 2) { return ($user, 1); }
+ elsif ($item == 3) { return ($system, 1); }
+ else { return (PM_ERR_PMID, 0); }
+ }
+ elsif ($cluster == 2 && $item == 4) {
+ my $value = pmda_inst_lookup($now_indom, $inst);
+ return (PM_ERR_INST, 0) unless defined($value);
+ return ($value, 1);
+ }
+ return (PM_ERR_PMID, 0);
+}
+
+sub simple_store_callback # must return a single value (scalar context)
+{
+ my ($cluster, $item, $inst, $val) = @_;
+ my $sts = 0;
+
+ if ($cluster == 0) {
+ if ($item == 0) {
+ if ($val < 0) { $val = 0; $sts = PM_ERR_SIGN; }
+ $numfetch = $val;
+ }
+ elsif ($item == 1) {
+ if ($val < 0) { $sts = PM_ERR_SIGN; $val = 0; }
+ elsif ($val > 255) { $sts = PM_ERR_CONV; $val = 255; }
+
+ if ($inst == 0) { $red = $val; }
+ elsif ($inst == 1) { $green = $val; }
+ elsif ($inst == 2) { $blue = $val; }
+ else { $sts = PM_ERR_INST; }
+ }
+ else { $sts = PM_ERR_PMID; }
+ return $sts;
+ }
+ elsif ( ($cluster == 1 && ($item == 2 || $item == 3))
+ || ($cluster == 2 && $item == 4) ) {
+ return PM_ERR_PERMISSION;
+ }
+ return PM_ERR_PMID;
+}
+
+sub simple_timenow_check
+{
+ %timeslices = ();
+
+ if (open(CONFIG, $simple_config)) {
+ my %values;
+
+ ($values{'sec'}, $values{'min'}, $values{'hour'},
+ undef,undef,undef,undef,undef) = localtime;
+ $_ = <CONFIG>;
+ chomp; # avoid possible \n on last field
+ foreach my $spec (split(/,/)) {
+ $timeslices{$spec} = $values{$spec};
+ }
+ close CONFIG;
+ $file_error = 0;
+ }
+ else {
+ unless ($file_error == $!) {
+ $pmda->log("read failed on $simple_config: $!");
+ $file_error = $!;
+ }
+ }
+ $pmda->replace_indom( $now_indom, \%timeslices);
+}
+
+$pmda = PCP::PMDA->new('simple', 253);
+$pmda->connect_pmcd;
+
+$pmda->add_metric(pmda_pmid(0,0), PM_TYPE_U32, PM_INDOM_NULL,
+ PM_SEM_INSTANT, pmda_units(0,0,0,0,0,0),
+ 'simple.numfetch', '', '');
+$pmda->add_metric(pmda_pmid(0,1), PM_TYPE_32, $color_indom,
+ PM_SEM_INSTANT, pmda_units(0,0,0,0,0,0),
+ 'simple.color', '', '');
+$pmda->add_metric(pmda_pmid(1,2), PM_TYPE_DOUBLE, PM_INDOM_NULL,
+ PM_SEM_COUNTER, pmda_units(0,1,0,0,PM_TIME_SEC,0),
+ 'simple.time.user', '', '');
+$pmda->add_metric(pmda_pmid(1,3), PM_TYPE_DOUBLE, PM_INDOM_NULL,
+ PM_SEM_COUNTER, pmda_units(0,1,0,0,PM_TIME_SEC,0),
+ 'simple.time.sys', '', '');
+$pmda->add_metric(pmda_pmid(2,4), PM_TYPE_U32, $now_indom,
+ PM_SEM_INSTANT, pmda_units(0,0,0,0,0,0),
+ 'simple.now', '', '');
+
+$pmda->add_indom($color_indom, [0 => 'red', 1 => 'green', 2 => 'blue'], '', '');
+$now_indom = $pmda->add_indom($now_indom, {}, '', ''); # initialized on-the-fly
+$pmda->set_fetch( \&simple_fetch );
+$pmda->set_instance( \&simple_instance );
+$pmda->set_fetch_callback( \&simple_fetch_callback );
+$pmda->set_store_callback( \&simple_store_callback );
+
+$pmda->set_user('pcp');
+&simple_timenow_check;
+$pmda->run;