first version of callback based on Net::SNMP
authorDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 29 Nov 2010 19:38:25 +0000 (20:38 +0100)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 29 Nov 2010 19:38:25 +0000 (20:38 +0100)
printer-callbacks.pl [new file with mode: 0755]

diff --git a/printer-callbacks.pl b/printer-callbacks.pl
new file mode 100755 (executable)
index 0000000..43816dc
--- /dev/null
@@ -0,0 +1,91 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+
+use Net::SNMP;
+use Data::Dump qw(dump);
+
+my $community = 'public';
+my @printers = qw(
+10.60.0.20
+
+10.60.0.40
+
+10.60.3.15
+10.60.3.17
+);
+
+@printers = @ARGV if @ARGV;
+
+my %vars = qw[
+info                           iso.3.6.1.2.1.1.1.0
+hostname                       iso.3.6.1.2.1.43.5.1.1.16.1
+serial                         iso.3.6.1.2.1.43.5.1.1.17.1
+pages                          iso.3.6.1.2.1.43.10.2.1.4.1
+@message                       iso.3.6.1.2.1.43.18.1.1.8
+@consumable_name       iso.3.6.1.2.1.43.11.1.1.6.1.1
+@consumable_max                iso.3.6.1.2.1.43.11.1.1.8.1
+@consumable_curr       iso.3.6.1.2.1.43.11.1.1.9.1
+@tray_dim_x                    iso.3.6.1.2.1.43.8.2.1.4.1
+@tray_dim_y                    iso.3.6.1.2.1.43.8.2.1.5.1
+@tray_max                      iso.3.6.1.2.1.43.8.2.1.9.1
+@tray_capacity         iso.3.6.1.2.1.43.8.2.1.10.1
+@tray_name                     iso.3.6.1.2.1.43.8.2.1.13.1
+];
+
+our $response;
+
+sub columns_cb {
+       my ( $session, $oid, $name ) = @_;
+
+       if ( ! defined $session->var_bind_list ) {
+               warn "ERROR: ",$session->hostname, " $oid $name ", $session->error, "\n";
+               warn dump($session);
+               return;
+       }
+
+
+       warn "# $oid $name var_bind_list ", dump( $session->var_bind_list );
+       my $results = $session->var_bind_list;
+       while ( my ($r_oid,$val) = each %$results ) {
+               if ( $name =~ m{^\@} ) {
+                       my $offset = $1 - 1 if $r_oid =~ m{^\Q$oid\E\.?(\d+)};
+                       $response->{ $session->hostname }->{ $name }->[ $offset ] = $results->{$r_oid};
+               } else {
+                       $response->{ $session->hostname }->{ $name } = $results->{$r_oid};
+               }
+       }
+}
+
+foreach my $host ( @printers ) {
+
+       my ( $snmp, $err ) = Net::SNMP->session(
+               -hostname => $host,
+               -version => 1,
+               -community => $community,
+               -timeout => 2,
+               -retries => 0,
+               -nonblocking => 1,
+       );
+
+       if ( ! $snmp ) {
+               warn "ERROR: $host $err\n";
+               next;
+       }
+
+       while ( my ($name,$oid) = each %vars ) {
+               warn "# $name $oid\n";
+               $oid =~ s{^iso}{.1};
+               if ( $name =~ m/^\@/ ) {
+                       $snmp->get_entries( -columns => [ $oid ], -callback => [ \&columns_cb, $oid, $name ] );
+               } else {
+                       $snmp->get_request( -varbindlist => [ $oid ], -callback => [ \&columns_cb, $oid, $name ] );
+               }
+       }
+
+}
+
+warn "# dispatch requests for ",dump(@printers);
+snmp_dispatcher;
+
+print dump($response);