6 use Data::Dump qw(dump);
10 my ( $path, $json ) = @_;
12 open(my $fh, '>', $path);
13 print $fh encode_json $json;
15 warn "# $path ", -s $path, " bytes\n";
18 my $debug = $ENV{DEBUG} || 0;
20 my $community = 'public';
43 @printers = @ARGV if @ARGV;
45 # remove final .1 since we are using bulkwalk to get values!
47 info iso.3.6.1.2.1.1.1.0
48 name iso.3.6.1.2.1.43.5.1.1.16.1
49 serial iso.3.6.1.2.1.43.5.1.1.17.1
50 pages iso.3.6.1.2.1.43.10.2.1.4.1
51 @message iso.3.6.1.2.1.43.18.1.1.8
52 @consumable_name iso.3.6.1.2.1.43.11.1.1.6.1
53 @consumable_max iso.3.6.1.2.1.43.11.1.1.8.1
54 @consumable_curr iso.3.6.1.2.1.43.11.1.1.9.1
55 @tray_max iso.3.6.1.2.1.43.8.2.1.9.1
56 @tray_capacity iso.3.6.1.2.1.43.8.2.1.10.1
57 @tray_name iso.3.6.1.2.1.43.8.2.1.13.1
58 @tray_dim_x iso.3.6.1.2.1.43.8.2.1.4.1
59 @tray_dim_y iso.3.6.1.2.1.43.8.2.1.5.1
64 while ( my ($name,$oid) = each %vars ) {
65 $oid =~ s/\.[0-1]$// if $name !~ /^\@/;
67 $oid2name->{$oid} = $name;
69 my @oids = sort { length $a <=> length $b } keys %$oid2name;
70 warn "# vars = ",dump(@vars) if $debug;
72 my $sm = SNMP::Multi->new(
74 Community => $community,
75 Requests => SNMP::Multi::VarReq->new(
76 hosts => [ @printers ],
81 ) or die $SNMP::Multi::error;
83 warn "# working on: ", join(' ', @printers),$/;
85 my $resp = $sm->execute() or die $sm->error();
89 foreach my $host ( $resp->hosts ) {
92 foreach my $result ( $host->results ) {
93 if ( $result->error ) {
94 warn "ERROR: $host ", $result->error;
98 warn "## result = ", dump($result) if $debug;
100 foreach my $v ( $result->varlists ) {
101 foreach my $i ( @$v ) {
102 my ( $oid, undef, $val, $fmt ) = @$i;
103 if ( my $name = $oid2name->{$oid} ) {
104 $status->{$name} = $val;
108 my $oid_part = substr($oid,0,length($_));
109 if ( $oid_part eq $_ ) {
110 $oid_base = $oid_part;
115 my $name = $oid2name->{$oid_base} || die "no name for $oid in ",dump( $oid2name );
116 if ( $name =~ s/^\@// ) {
117 push @{ $status->{$name} }, $val;
119 $status->{$name} = $val;
127 foreach my $group ( grep { /\w+_\w+/ } keys %$status ) {
128 my ( $prefix,$name ) = split(/_/,$group,2);
129 foreach my $i ( 0 .. $#{ $status->{$group} } ) {
130 $status->{$prefix}->[$i]->{$name} = $status->{$group}->[$i];
132 delete $status->{$group};
135 print "$host = ",dump($status);
136 save_json $host => $status;
137 $collected->{$host} = $status;
142 foreach my $ip ( sort keys %$collected ) {
143 my $status = $collected->{$ip};
145 push @$json, $status;
147 save_json 'printers' => $json;