#!/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__
| Name & Info | Console | Status Lights | Paper | Ink |
|---|---|---|---|---|
[% printer.name %][% printer.model %], |
[% FOREACH msg = printer.messages %]
[% msg %] |
[% printer.status %]
[% FOREACH light = printer.lights %]
[% IF light.status %]
[% light.name %]
[% ELSE %]
[% light.name %]
[% 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 %] |