#!@@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 (sort(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; } } }