#!@@PERL@@ -w
# -*- cperl -*-
# vim: ft=perl

=head1 NAME

snmp__print_supplies - SNMP plugin to monitor supplies levels on 
printers adhering to RFC1759

=head1 APPLICABLE SYSTEMS

Any SNMP capable printer adhering to RFC1759.  Using a command such
as "munin-node-configure --snmp xerox.skillingstad.no --snmpversion 2c
--snmpcommunity public | sh -x" should auto-detect all applicable
interfaces.  

=head1 CONFIGURATION

As a rule SNMP plugins need site specific configuration.  The default
configuration (shown here) will only work on insecure sites/devices:

   [snmp_*]
        env.warning 10
	env.critical 5
        env.version 2
        env.community public

Warning and critical limits are in percentages, and default values are
10% for warnings and 5% for critical.

In general SNMP is not very secure at all unless you use SNMP version
3 which supports authentication and privacy (encryption).  But in any
case the community string for your devices should not be "public".

Please see 'perldoc Munin::Plugin::SNMP' for further configuration
information.

=head1 MAGIC MARKERS

  #%# family=snmpauto
  #%# capabilities=snmpconf
    
=head1 VERSION
    
 $Id: $
      
=head1 BUGS
      
None known.

=head1 AUTHOR

Copyright (C) 2006-2009 Rune Nordbøe Skillingstad, Sveinung Marvik.

=head1 LICENSE

GPLv2

=cut

use strict;
use Munin::Plugin;
use Munin::Plugin::SNMP;

my $MAXLABEL  = 24;

my $warning   = $ENV{warning}   || 10;
my $critical  = $ENV{critical}  || 5;

my %supplies;

if(defined $ARGV[0] and $ARGV[0] eq "snmpconf") {
    print "require 1.3.6.1.2.1.43.11.1.1.6.1.1\n";
    print "require 1.3.6.1.2.1.43.11.1.1.8.1.1 ^\\d\n";
    print "require 1.3.6.1.2.1.43.11.1.1.9.1.1 ^\\d\n";
    exit 0;
}


my ($session, $error); 

# SNMP needed for both config and fetch.
$session = Munin::Plugin::SNMP->session();

if(!defined ($session)) {
    die "Croaking: $error";
}

&get_multiple ($session, "1.3.6.1.2.1.43.11.1.1.6", "desc");
&get_multiple ($session, "1.3.6.1.2.1.43.11.1.1.8", "max");
&get_multiple ($session, "1.3.6.1.2.1.43.11.1.1.9", "level");
&wash_data;

# Configure
if(defined $ARGV[0] and $ARGV[0] eq "config") {
    my ($host,undef,$version) = Munin::Plugin::SNMP->config_session();
    
    print "host_name $host\n" unless $host eq 'localhost';
    print "graph_title Supply Level\n";
    print "graph_args --base 1000 -l 0 --upper-limit 100\n";
    print "graph_vlabel %\n";
    print "graph_scale no\n";
    print "graph_category print\n";
    print "graph_info This graph represents supplies level\n";
    
    foreach my $supply (keys(%supplies)) {
	print "supply$supply.label ".(length($supplies{$supply}{desc})<=$MAXLABEL ? 
	    $supplies{$supply}{desc} : substr($supplies{$supply}{desc},0,($MAXLABEL-3))."...");
	print "\n";
	print "supply$supply.draw LINE1\n";
	print "supply$supply.info ".$supplies{$supply}{desc}."\n";
	print "supply$supply.warning $warning:100\n";
	print "supply$supply.critical $critical:100\n";
    }
    
    exit 0;
}

# Values
if (keys(%supplies) > 0) {
    foreach my $supply (keys(%supplies)) {
	printf "supply%s.value %.2f\n",$supply,
	  ($supplies{$supply}{level}/$supplies{$supply}{max})*100;
    }
}

sub get_multiple {
    my $session = shift;
    my $oid     = shift;
    my $type    = shift;
    
    print "# Getting table $oid...\n" if $Munin::Plugin::SNMP::DEBUG;
    
    my $response = $session->get_table($oid);

    if(!defined($response)) {
	return "";
    } else {
	foreach my $key (keys(%{$response})) {
	    $supplies{&keyname($key)}{$type} = $response->{$key};
	    print "$key -> ".$response->{$key}."\n" if $Munin::Plugin::SNMP::DEBUG;
	}
    }
}

sub keyname {
    my $key = shift;
    $key =~ s/.*(\d+\.\d+)$/$1/;
    $key =~ s/\./_/;
    return $key;
}

sub wash_data {
    # Get rid of supply-levels reporting negative values
    foreach my $supply (keys (%supplies)) {
	if ($supplies{$supply}{level} < 0) {
	    delete $supplies{$supply};
	    print "# Deleting entry $supply: supply level unknown.\n" if $Munin::Plugin::SNMP::DEBUG;
	}
    }
}

