5 # pull info from SNMP enabled printers and dump JSON
7 # dump all snmp data on printer with:
8 # snmpwalk -c public -v 1 10.60.3.15
11 use Data::Dump qw(dump);
13 my $dir = 'public/json/monitor/printers';
14 die "output directory $dir: $!" unless -d $dir;
18 my ( $ip, $json ) = @_;
19 my $path = "$dir/$ip";
20 open(my $fh, '>', $path) || die "$path: $!";
21 print $fh encode_json $json;
23 warn "# $path ", -s $path, " bytes\n";
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;
31 my $log_path = join('.', $dir, (split(/T/,iso_datetime,2))[0], 'json');
32 open(my $log, '>>', $log_path) || die "$log_path: $!";
34 my $debug = $ENV{DEBUG} || 0;
36 my $community = 'public';
74 @printers = @ARGV if @ARGV;
76 # remove final .1 since we are using bulkwalk to get values!
78 info iso.3.6.1.2.1.1.1.0
79 hostname iso.3.6.1.2.1.43.5.1.1.16.1
80 serial iso.3.6.1.2.1.43.5.1.1.17.1
81 pages iso.3.6.1.2.1.43.10.2.1.4.1
82 @message iso.3.6.1.2.1.43.18.1.1.8
83 @consumable_name iso.3.6.1.2.1.43.11.1.1.6.1
84 @consumable_max iso.3.6.1.2.1.43.11.1.1.8.1
85 @consumable_curr iso.3.6.1.2.1.43.11.1.1.9.1
86 @tray_max iso.3.6.1.2.1.43.8.2.1.9.1
87 @tray_capacity iso.3.6.1.2.1.43.8.2.1.10.1
88 @tray_name iso.3.6.1.2.1.43.8.2.1.13.1
89 @tray_dim_x iso.3.6.1.2.1.43.8.2.1.4.1
90 @tray_dim_y iso.3.6.1.2.1.43.8.2.1.5.1
95 while ( my ($name,$oid) = each %vars ) {
96 $oid =~ s/\.[0-1]$// if $name !~ /^\@/;
98 $oid2name->{$oid} = $name;
100 my @oids = sort { length $a <=> length $b } keys %$oid2name;
101 warn "# vars = ",dump(@vars) if $debug;
103 my $sm = SNMP::Multi->new(
104 Method => 'bulkwalk',
105 Community => $community,
106 Requests => SNMP::Multi::VarReq->new(
107 hosts => [ @printers ],
112 ) or die $SNMP::Multi::error;
114 warn "# working on: ", join(' ', @printers),$/;
116 my $resp = $sm->execute() or die $sm->error();
120 foreach my $host ( $resp->hosts ) {
123 foreach my $result ( $host->results ) {
124 if ( $result->error ) {
125 warn "ERROR: $host ", $result->error;
129 warn "## result = ", dump($result) if $debug;
131 foreach my $v ( $result->varlists ) {
132 foreach my $i ( @$v ) {
133 my ( $oid, undef, $val, $fmt ) = @$i;
134 if ( my $name = $oid2name->{$oid} ) {
135 $status->{$name} = $val;
139 my $oid_part = substr($oid,0,length($_));
140 if ( $oid_part eq $_ ) {
141 $oid_base = $oid_part;
146 my $name = $oid2name->{$oid_base} || die "no name for $oid in ",dump( $oid2name );
147 if ( $name =~ s/^\@// ) {
148 push @{ $status->{$name} }, $val;
150 $status->{$name} = $val;
158 foreach my $group ( grep { /\w+_\w+/ } keys %$status ) {
159 my ( $prefix,$name ) = split(/_/,$group,2);
160 foreach my $i ( 0 .. $#{ $status->{$group} } ) {
161 $status->{$prefix}->[$i]->{$name} = $status->{$group}->[$i];
163 delete $status->{$group};
166 $status->{ip} = $host->hostname;
167 $status->{date} = iso_datetime;
168 print "$host = ",dump($status);
169 save_json $host => $status;
170 $collected->{$host} = $status;
172 print $log encode_json($status),"\n";
176 warn "# log $log_path ", -s $log_path, " bytes\n";