X-Git-Url: http://git.rot13.org/?p=snmp-json.git;a=blobdiff_plain;f=printer-callbacks.pl;h=38a76f7606a3ffc89dd8fc1f77b30639b21fccde;hp=30b0a7255e9bb0db1d249effdb7876aff1c95375;hb=24f509d82b933984c9666abe6c2b0d1e6cc2c270;hpb=9c6b66d58c7ae5a2061062f96c8e421ac78b14f3 diff --git a/printer-callbacks.pl b/printer-callbacks.pl index 30b0a72..38a76f7 100755 --- a/printer-callbacks.pl +++ b/printer-callbacks.pl @@ -5,6 +5,27 @@ use strict; use Net::SNMP; use Data::Dump qw(dump); +my $dir = 'public/json/monitor/printers/'; +$dir = "/tmp/printers-" unless -d $dir; + +use JSON; +sub save_json { + my ( $ip, $json ) = @_; + my $path = $dir . $ip; + open(my $fh, '>', $path) || die "$path: $!"; + print $fh encode_json $json; + close($fh); + warn "# $path ", -s $path, " bytes\n"; +} + +sub iso_datetime { + my ($ss,$mm,$hh,$d,$m,$y) = localtime(time); + return sprintf "%04d-%02d-%02dT%02d:%02d:%02d", $y+1900, $m, $d, $hh, $mm, $ss; +} + +my $log_path = join('.', $dir . (split(/T/,iso_datetime,2))[0], 'json'); +open(my $log, '>>', $log_path) || die "$log_path: $!"; + my $community = 'public'; my @printers = qw( 10.60.0.20 @@ -36,17 +57,20 @@ pages iso.3.6.1.2.1.43.10.2.1.4.1 our $response; sub columns_cb { - my ( $session, $oid, $name ) = @_; + my ( $session, $oid2name ) = @_; + + my $ip = $session->hostname; if ( ! defined $session->var_bind_list ) { - warn "ERROR: ",$session->hostname, " $oid $name ", $session->error, "\n"; + warn "ERROR: $ip ", $session->error, "\n"; warn dump($session); return; } - warn "# $oid $name var_bind_list ", dump( $session->var_bind_list ); + warn "# $ip var_bind_list ", dump( $session->var_bind_list ); my $results = $session->var_bind_list; + $response->{$ip} = { ip => $ip, utime => time() }; # oid_lex_sort would be wonderfull to use here, but it doesn't work foreach my $r_oid ( sort { my ($af,$bf) = ($a,$b); @@ -55,14 +79,23 @@ sub columns_cb { $af cmp $bf } keys %$results ) { my $var = $results->{$r_oid}; + my $oid = (grep { + substr($r_oid,0,length($_)) eq $_ + } keys %$oid2name)[0] || die "no name for $r_oid in ",dump($oid2name); + my $name = $oid2name->{$oid}; +warn "++ $oid $name $var\n"; if ( $name =~ m{^\@} ) { my $no_prefix = $name; $no_prefix =~ s{^\@}{}; - push @{ $response->{ $session->hostname }->{ $no_prefix } }, $var; + push @{ $response->{$ip}->{ $no_prefix } }, $var; } else { - $response->{ $session->hostname }->{ $name } = $var; + $response->{$ip}->{ $name } = $var; } } + + warn "## $ip response ",dump($response->{$ip}); + save_json $ip => $response->{$ip}; + print $log encode_json($response->{$ip}),"\n"; } foreach my $host ( @printers ) { @@ -81,15 +114,21 @@ foreach my $host ( @printers ) { next; } + my @columns; + my @vars; + my $oid2name; 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 ] ); + push @columns, $oid; } else { - $snmp->get_request( -varbindlist => [ $oid ], -callback => [ \&columns_cb, $oid, $name ] ); + push @vars, $oid; } + $oid2name->{$oid} = $name; } + $snmp->get_request( -varbindlist => [ @vars ], -callback => [ \&columns_cb, $oid2name ] ); + $snmp->get_entries( -columns => [ @columns ], -callback => [ \&columns_cb, $oid2name ] ); } @@ -101,11 +140,19 @@ foreach my $ip ( keys %$response ) { my $status = $response->{$ip}; foreach my $group ( grep { /\w+\.\w+/ } keys %$status ) { my ( $prefix,$name ) = split(/\./,$group,2); - foreach my $i ( 0 .. $#{ $status->{$group} } ) { - $status->{$prefix}->[$i]->{$name} = $status->{$group}->[$i]; + if ( ref $status->{$group} eq 'ARRAY' ) { # some consumables are non-repeatable on low-end devices + foreach my $i ( 0 .. $#{ $status->{$group} } ) { + $status->{$prefix}->[$i]->{$name} = $status->{$group}->[$i]; + } + } else { + $status->{$prefix}->[0]->{$name} = $status->{$group}; } delete $status->{$group}; } print "$ip ",dump($status); } + +close($log); +warn "# log $log_path ", -s $log_path, " bytes\n"; +