use SNMP::Multi and reformat consumables
[snmp-json.git] / printer-multi.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4
5 use SNMP::Multi;
6 use Data::Dump qw(dump);
7
8 my $community = 'public';
9 my @printers = qw(
10 10.60.3.15
11 10.60.3.17
12
13 10.60.3.19
14 10.60.3.21
15
16 10.60.3.23
17 10.60.3.25
18
19 10.60.3.27
20 10.60.3.29
21
22 10.60.3.31
23 10.60.3.33
24
25 10.60.3.35
26 10.60.3.37
27 );
28
29 @printers = @ARGV if @ARGV;
30
31 my %vars = qw[
32 model           .1.3.6.1.2.1.25.3.2.1.3.1
33 serial          .1.3.6.1.2.1.43.5.1.1.17
34 pages           .1.3.6.1.2.1.43.10.2.1.4.1.1
35 @message        .1.3.6.1.2.1.43.18.1.1.8
36 @message        .1.3.6.1.2.1.43.16
37 @consumable_name        .1.3.6.1.2.1.43.11.1.1.6.1
38 @consumable_max         .1.3.6.1.2.1.43.11.1.1.8.1
39 @consumable_curr        .1.3.6.1.2.1.43.11.1.1.9.1
40 ];
41
42 my @oids = sort { length $a <=> length $b } values %vars;
43 my $oid2name;
44 $oid2name->{ $vars{$_} } = $_ foreach keys %vars;
45
46 my $sm = SNMP::Multi->new(
47         Method    => 'bulkwalk',
48         Community => $community,
49         Requests  => SNMP::Multi::VarReq->new(
50                 hosts => [ @printers ],
51                 vars  => [ map { [ $_ ] } values %vars ],
52     ),
53         Timeout     => 1,
54         Retries     => 0,
55 ) or die $SNMP::Multi::error;
56
57 warn "# working on: ", join(' ', @printers),$/;
58
59 my $resp = $sm->execute() or die $sm->error();
60
61 foreach my $host ( $resp->hosts ) {
62         my $status;
63
64         foreach my $result ( $host->results ) {
65                 if ( $result->error ) {
66                         warn "ERROR: $host ", $result->error;
67                         next;
68                 }
69
70                 foreach my $v ( $result->varlists ) {
71                         foreach my $i ( @$v ) {
72                                 my ( $oid, undef, $val, $fmt ) = @$i;
73                                 $oid =~ s/^iso/.1/;
74                                 if ( my $name = $oid2name->{$oid} ) {
75                                         $status->{$name} = $val;
76                                 } else {
77                                         my $oid_base;
78                                         foreach ( @oids ) {
79                                                 my $oid_part = substr($oid,0,length($_));
80                                                 if ( $oid_part eq $_ ) {
81                                                         $oid_base = $oid_part;
82                                                         last;
83                                                 }
84                                         }
85
86                                         my $name = $oid2name->{$oid_base} || die "no name for $oid_base in ",dump( $oid2name );
87                                         if ( $name =~ s/^\@// ) {
88                                                 push @{ $status->{$name} }, $val;
89                                         } else {
90                                                 $status->{$name} = $val;
91                                         }
92                                 }
93                         }
94                 }
95
96         }
97
98         foreach my $group ( grep { /\w+_\w+/ } keys %$status ) {
99                 my ( $prefix,$name ) = split(/_/,$group,2);
100                 foreach my $i ( 0 .. $#{ $status->{$group} } ) {
101                         $status->{$prefix}->[$i]->{$name} = $status->{$group}->[$i];
102                 }
103                 delete $status->{$group};
104         }
105
106         print "$host = ",dump($status);
107 }
108