我有一台机器(基于Debian),附带了一些温度传感器,我想通过snmp从一个脚本查询它们。我可以使用一个传感器,但是当我插入另一个时,我正在努力。
我要做的是循环遍历每个设备,并给每个设备一个id,然后使用此ID作为OID的一部分,然后给它一个值。
我之前从未使用过snmp,而且我的perl并不是很好,所以任何帮助都会受到高度赞赏。以下是我的代码:
#!/usr/bin/perl
use NetSNMP::agent (':all');
use NetSNMP::ASN qw(ASN_OCTET_STR ASN_INTEGER);
$BASE_OID=".1.3.6.1.4.1.41050";
$dev_id=1;
$string_value;
$integer_value;
sub pimon_handler {
my ($handler, $registration_info, $request_info, $requests) = @_;
my $request;
my $oid_key;
for($request = $requests; $request; $request = $request->next()) {
$oid_key=$BASE_OID . '.' . $dev_id;
my $oid = $request->getOID();
if ($request_info->getMode() == MODE_GET) {
if ($oid == new NetSNMP::OID($oid_key . '.0')) {
$request->setValue(ASN_OCTET_STR, $string_value);
}
elsif ($oid == new NetSNMP::OID($oid_key . '.1')) {
$request->setValue(ASN_INTEGER, $integer_value);
}
} elsif ($request_info->getMode() == MODE_GETNEXT) {
if ($oid == new NetSNMP::OID($oid_key . '.0')) {
$request->setOID($oid_key . '.1');
$request->setValue(ASN_INTEGER, $integer_value);
}
elsif ($oid < new NetSNMP::OID($oid_key . '.0')) {
$request->setOID($oid_key . '.0');
$request->setValue(ASN_OCTET_STR, $string_value);
}
}
}
}
#location of where we are going to find the 1wire devices
@sensors = `cat /sys/bus/w1/devices/w1_bus_master1/w1_master_slaves`;
chomp(@sensors);
#loop through the sensors we find
foreach $line(@sensors) {
#work out the temp we have got. Need to change this for other sensor types
$output = `cat /sys/bus/w1/devices/$line/w1_slave`;
$output =~ /t=(?<temp>\d+)/;
$integer_value = sprintf "%.0f",$+{temp} / 1000;
$string_value = $line;
my $agent = new NetSNMP::agent();
$agent->register("Pimon$looptest", $BASE_OID . '.' . $dev_id,
\&pimon_handler);
print "Dev $dev_id temp $line temp is $integer_value\n";
$dev_id ++;
}
答案 0 :(得分:0)
您是否收到任何错误或输出?
我怀疑你的问题在于你通过对shell进行shelling-out来读取数据文件,而不是打开文件并循环遍历linewise内容。
尝试转储@sensors的值。如果它是单个条目数组,并且唯一的元素包含整个文件,那么只需将@sensors切换为标量。然后将$ sensors拆分成一个数组并循环遍历它。
my $sensors = `read something`
chomp $sensors;
my @sensors = split(/\n/, $sensors);
foreach $ line(@sensors){ ...