我有以下代码段应该通过snmp检索数据:
my $pl = Parallel::Loops->new(100);
$pl->share( $infohash, \%bounds);
$pl->foreach( \@servArray, sub {
my $server = $_;
my ($session, $error) = Net::SNMP->session(-hostname => $server, -community => $community_string);
if ($error) { die ("$error") };
if ($session) {
my $return = snmpwalk(
snmp => $session,
oids => $oidhash{$server},
-mycallback => sub {
my ($s, $host, $key, $val) = @_;
my @tempArray = split (/,/, $key);
$bounds{$host}{$tempArray[0]}{$$val[0][0]}{$tempArray[1]} = $$val[0][1];
}
);
$session->close();
}
else {
die ($error);
}
});
$ infohash是一个嵌套的hashref结构如下:
'hostname' => {
'hard_drives' => {
'serial_number' => 1
},
'system' => {
'service_tag' => 1
},
'ip_address' => {
'ip_address' => 1
},
'memory' => {
'serial_number' => 1
}
},
%oidhash包含相应的oid列表,如下所示:
'hostname' => {
'system,service_tag' => '1.3.6.1.4.1.674.10892.1.300.10.1.11.1',
'hard_drives,serial_number' => '1.3.6.1.4.1.674.10893.1.20.130.4.1.7',
'memory,serial_number' => '1.3.6.1.4.1.674.10892.1.1100.50.1.23.1',
'ip_address,ip_address' => '1.3.6.1.4.1.674.10892.1.1100.90.1.11.1'
},
现在,除了system / service_tag位之外,这个工作的所有元素都很好。这是我从@return获得的输出:
$VAR1 = \{
'memory,serial_number' => {
'10' => '874F72F8',
'12' => '874F73DF',
'11' => '874F73CD',
'1' => '874F7242',
'8' => '874F746C',
'2' => '874F7474',
'3' => '874F7477',
'5' => '874F743F',
'7' => '874F73D3',
'6' => '874F747F',
'9' => '874F73D9',
'4' => '874F7237'
},
'ip_address,ip_address' => {
'1' => '<public IP>',
'2' => '10.245.27.145'
},
'system,service_tag' => {},
'hard_drives,serial_number' => {
'6' => '9XF05FE0',
'4' => '9XF05LXB',
'1' => '9XF05GM0',
'2' => '9XF05FHH',
'3' => '9XF05FE8',
'5' => '9XF04JNK'
}
};
显然,这意味着snmpwalk并没有按原样检索所有数据,但如果我能找到原因,我会被诅咒。如果我手动snmpwalk服务标签OID,它会检索数据,因此它不是OID,而且它不是我能找到的任何东西,因为所有其他数据都在检索。
答案 0 :(得分:0)
我之前未提及的建议是Data :: Dumper在回调中的数据结构。这一行:
$bounds{$host}{$tempArray[0]}{$$val[0][0]}{$tempArray[1]} = $$val[0][1];
你可以一次淘汰这些:
print Dumper($bounds, $tempArray, $val );
只是为了验证每个人都在做你期望的事情。我不能动摇你被所有盲目的退化所欺骗的想法:
$$val[0][1]
我想你可能过度“过度解除引用”了。请记住,您希望代码尽可能干净和可读,您获得的[] [] [({})]级别越多,问题发生的可能性就越大,而且更难找到它们。