order oids as in response
[snmp-json.git] / printer-callbacks.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4
5 use Net::SNMP;
6 use Data::Dump qw(dump);
7
8 my $community = 'public';
9 my @printers = qw(
10 10.60.0.20
11
12 10.60.0.40
13
14 10.60.3.15
15 10.60.3.17
16 );
17
18 @printers = @ARGV if @ARGV;
19
20 my %vars = qw[
21 info                            iso.3.6.1.2.1.1.1.0
22 hostname                        iso.3.6.1.2.1.43.5.1.1.16.1
23 serial                          iso.3.6.1.2.1.43.5.1.1.17.1
24 pages                           iso.3.6.1.2.1.43.10.2.1.4.1
25 @message                        iso.3.6.1.2.1.43.18.1.1.8
26 @consumable_name        iso.3.6.1.2.1.43.11.1.1.6.1.1
27 @consumable_max         iso.3.6.1.2.1.43.11.1.1.8.1
28 @consumable_curr        iso.3.6.1.2.1.43.11.1.1.9.1
29 @tray_dim_x                     iso.3.6.1.2.1.43.8.2.1.4.1
30 @tray_dim_y                     iso.3.6.1.2.1.43.8.2.1.5.1
31 @tray_max                       iso.3.6.1.2.1.43.8.2.1.9.1
32 @tray_capacity          iso.3.6.1.2.1.43.8.2.1.10.1
33 @tray_name                      iso.3.6.1.2.1.43.8.2.1.13.1
34 ];
35
36 our $response;
37
38 sub columns_cb {
39         my ( $session, $oid, $name ) = @_;
40
41         if ( ! defined $session->var_bind_list ) {
42                 warn "ERROR: ",$session->hostname, " $oid $name ", $session->error, "\n";
43                 warn dump($session);
44                 return;
45         }
46
47
48         warn "# $oid $name var_bind_list ", dump( $session->var_bind_list );
49         my $results = $session->var_bind_list;
50         foreach my $r_oid ( sort {
51                         my ($af,$bf) = ($a,$b);
52                         $af =~ s{\.(\d+)$}{sprintf("%03d",$1)}eg;
53                         $bf =~ s{\.(\d+)$}{sprintf("%03d",$1)}eg;
54                         $af cmp $bf
55         } keys %$results ) {
56                 my $var = $results->{$r_oid};
57                 if ( $name =~ m{^\@} ) {
58                         my $no_prefix = $name;
59                         $no_prefix =~ s{^\@}{};
60                         push @{ $response->{ $session->hostname }->{ $no_prefix } }, $var;
61                 } else {
62                         $response->{ $session->hostname }->{ $name } = $var;
63                 }
64         }
65 }
66
67 foreach my $host ( @printers ) {
68
69         my ( $snmp, $err ) = Net::SNMP->session(
70                 -hostname => $host,
71                 -version => 1,
72                 -community => $community,
73                 -timeout => 2,
74                 -retries => 0,
75                 -nonblocking => 1,
76         );
77
78         if ( ! $snmp ) {
79                 warn "ERROR: $host $err\n";
80                 next;
81         }
82
83         while ( my ($name,$oid) = each %vars ) {
84                 warn "# $name $oid\n";
85                 $oid =~ s{^iso}{.1};
86                 if ( $name =~ m/^\@/ ) {
87                         $snmp->get_entries( -columns => [ $oid ], -callback => [ \&columns_cb, $oid, $name ] );
88                 } else {
89                         $snmp->get_request( -varbindlist => [ $oid ], -callback => [ \&columns_cb, $oid, $name ] );
90                 }
91         }
92
93 }
94
95 warn "# dispatch requests for ",dump(@printers);
96 snmp_dispatcher;
97
98 print dump($response);