d12504d4d4133f288fc21e787abfe3f1917afba7
[angular-mojolicious.git] / scripts / snmp-printer.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4
5 # pull info from SNMP enabled printers and dump JSON
6 #
7 # dump all snmp data on printer with:
8 # snmpwalk -c public -v 1 10.60.3.15
9
10 use SNMP::Multi;
11 use Data::Dump qw(dump);
12
13 my $dir = 'public/json/monitor/printers';
14 die "output directory $dir: $!" unless -d $dir;
15
16 use JSON;
17 sub save_json {
18         my ( $ip, $json ) = @_;
19         my $path = "$dir/$ip";
20         open(my $fh, '>', $path) || die "$path: $!";
21         print $fh encode_json $json;
22         close($fh);
23         warn "# $path ", -s $path, " bytes\n";
24 }
25
26 sub iso_datetime {
27         my ($ss,$mm,$hh,$d,$m,$y) = localtime(time);
28         return sprintf "%04d-%02d-%02dT%02d:%02d:%02d", $y+1900, $m, $d, $hh, $mm, $ss;
29 }
30
31 my $debug = $ENV{DEBUG} || 0; 
32
33 my $community = 'public';
34 my @printers = qw(
35 10.60.0.20
36
37 10.60.3.15
38 10.60.3.17
39
40 10.60.3.19
41 10.60.3.21
42
43 10.60.3.23
44 10.60.3.25
45
46 10.60.3.27
47 10.60.3.29
48
49 10.60.3.31
50 10.60.3.33
51
52 10.60.3.35
53 10.60.3.37
54 );
55
56 @printers = @ARGV if @ARGV;
57
58 # remove final .1 since we are using bulkwalk to get values!
59 my %vars = qw[
60 info                            iso.3.6.1.2.1.1.1.0
61 hostname                        iso.3.6.1.2.1.43.5.1.1.16.1
62 serial                          iso.3.6.1.2.1.43.5.1.1.17.1
63 pages                           iso.3.6.1.2.1.43.10.2.1.4.1
64 @message                        iso.3.6.1.2.1.43.18.1.1.8
65 @consumable_name        iso.3.6.1.2.1.43.11.1.1.6.1
66 @consumable_max         iso.3.6.1.2.1.43.11.1.1.8.1
67 @consumable_curr        iso.3.6.1.2.1.43.11.1.1.9.1
68 @tray_max                       iso.3.6.1.2.1.43.8.2.1.9.1
69 @tray_capacity          iso.3.6.1.2.1.43.8.2.1.10.1
70 @tray_name                      iso.3.6.1.2.1.43.8.2.1.13.1
71 @tray_dim_x                     iso.3.6.1.2.1.43.8.2.1.4.1
72 @tray_dim_y                     iso.3.6.1.2.1.43.8.2.1.5.1
73 ];
74
75 my $oid2name;
76 my @vars;
77 while ( my ($name,$oid) = each %vars ) {
78         $oid =~ s/\.[0-1]$// if $name !~ /^\@/;
79         push @vars, [ $oid ];
80         $oid2name->{$oid} = $name;
81 }
82 my @oids = sort { length $a <=> length $b } keys %$oid2name;
83 warn "# vars = ",dump(@vars) if $debug;
84
85 my $sm = SNMP::Multi->new(
86         Method    => 'bulkwalk',
87         Community => $community,
88         Requests  => SNMP::Multi::VarReq->new(
89                 hosts => [ @printers ],
90                 vars  => [ @vars ],
91     ),
92         Timeout     => 1,
93         Retries     => 0,
94 ) or die $SNMP::Multi::error;
95
96 warn "# working on: ", join(' ', @printers),$/;
97
98 my $resp = $sm->execute() or die $sm->error();
99
100 my $collected;
101
102 foreach my $host ( $resp->hosts ) {
103         my $status;
104
105         foreach my $result ( $host->results ) {
106                 if ( $result->error ) {
107                         warn "ERROR: $host ", $result->error;
108                         next;
109                 }
110
111                 warn "## result = ", dump($result) if $debug;
112
113                 foreach my $v ( $result->varlists ) {
114                         foreach my $i ( @$v ) {
115                                 my ( $oid, undef, $val, $fmt ) = @$i;
116                                 if ( my $name = $oid2name->{$oid} ) {
117                                         $status->{$name} = $val;
118                                 } else {
119                                         my $oid_base;
120                                         foreach ( @oids ) {
121                                                 my $oid_part = substr($oid,0,length($_));
122                                                 if ( $oid_part eq $_ ) {
123                                                         $oid_base = $oid_part;
124                                                         last;
125                                                 }
126                                         }
127
128                                         my $name = $oid2name->{$oid_base} || die "no name for $oid in ",dump( $oid2name );
129                                         if ( $name =~ s/^\@// ) {
130                                                 push @{ $status->{$name} }, $val;
131                                         } else {
132                                                 $status->{$name} = $val;
133                                         }
134                                 }
135                         }
136                 }
137
138         }
139
140         foreach my $group ( grep { /\w+_\w+/ } keys %$status ) {
141                 my ( $prefix,$name ) = split(/_/,$group,2);
142                 foreach my $i ( 0 .. $#{ $status->{$group} } ) {
143                         $status->{$prefix}->[$i]->{$name} = $status->{$group}->[$i];
144                 }
145                 delete $status->{$group};
146         }
147
148         $status->{ip} = $host->hostname;
149         $status->{date} = iso_datetime;
150         print "$host = ",dump($status);
151         save_json $host => $status;
152         $collected->{$host} = $status;
153 }
154