#!/usr/bin/env perl use strict; use warnings; my @PRINTERS = qw( printer1 printer2 etc ); use SNMP::Simple; BEGIN { eval { require Net::Ping; require Template; }; die "This script requires Net::Ping and Template, though they're not listed as SNMP::Simple's dependancies.\n" if $@; } use Net::Ping; use Template; $ENV{MIBS} = 'Printer-MIB'; my @printer_data = (); foreach my $host (@PRINTERS) { print STDERR "- querying $host...\n"; my %data = (); unless ( Net::Ping->new->ping( $host, 1 ) ) { warn "Couldn't ping $host\n"; next; } my $s = SNMP::Simple->new( DestHost => $host, Community => 'public', Version => 1, ); warn "No session for $host" && next unless $s; $data{name} = $s->get('sysName'); $data{location} = $s->get('sysLocation'); $data{status} = [ $s->get_list('hrPrinterStatus') ]->[0]; $data{model} = [ $s->get_list('hrDeviceDescr') ]->[0]; $data{messages} = $s->get_list('prtConsoleDisplayBufferText'); $data{lights} = $s->get_named_table( status => 'prtConsoleOnTime', color => 'prtConsoleColor', name => 'prtConsoleDescription', ); $data{trays} = $s->get_named_table( name => 'prtInputDescription', media => 'prtInputMediaName', status => 'prtInputStatus', level => 'prtInputCurrentLevel', max => 'prtInputMaxCapacity', ); $data{supplies} = $s->get_named_table( name => 'prtMarkerSuppliesMarkerIndex', type => 'prtMarkerSuppliesType', description => 'prtMarkerSuppliesDescription', level => 'prtMarkerSuppliesLevel', max => 'prtMarkerSuppliesMaxCapacity', units => 'prtMarkerSuppliesSupplyUnit', ); push @printer_data, \%data; } my $tt = Template->new(); $tt->process( \*DATA, { printers => \@printer_data } ) or die $tt->error; __DATA__ CCIS Printers [% FOREACH printer = printers %] [% END %]
Name & Info Console Status Lights Paper Ink

[% printer.name %]

[% printer.model %],
[% printer.location %]

[% FOREACH msg = printer.messages %] [% msg %]
[% END %]

[% printer.status %]

[% FOREACH light = printer.lights %] [% IF light.status %] [% light.name %] [% ELSE %] [% light.name %] [% END %]
[% END %]

[% FOREACH tray = printer.trays %] [% IF tray.level <= 0 %] [% ELSE %] [% END %] [% tray.name %]: [% tray.media %], [% tray.status %], [% tray.level %]/[% tray.max %]
[% END %]
[% FOREACH supply = printer.supplies %] Supply [% supply.name %]: [% supply.type %], [% supply.level %]/[% supply.max %] [% supply.units %]
([% supply.description %])
[% END %]