Perl SNMPv3至SNMPv2胶层
我被要求在远程Unix平台上安装HP OpenView代理,以捕获客户端应用程序转发的SNMP陷阱 我发现客户端应用程序只能转发SNMPv3陷阱,而我们使用的代理程序只能接受SNMPv2陷阱 我发现,通过使用Perl模块,我可能能够解决这个问题,但我不清楚这是如何设置的,或者如何/如果可以将v3陷阱转换为v2陷阱Perl SNMPv3至SNMPv2胶层,perl,snmp,Perl,Snmp,我被要求在远程Unix平台上安装HP OpenView代理,以捕获客户端应用程序转发的SNMP陷阱 我发现客户端应用程序只能转发SNMPv3陷阱,而我们使用的代理程序只能接受SNMPv2陷阱 我发现,通过使用Perl模块,我可能能够解决这个问题,但我不清楚这是如何设置的,或者如何/如果可以将v3陷阱转换为v2陷阱 我的目标是捕获v3陷阱,并希望通过脚本或工具将其转换为v2陷阱,然后将其发送回另一个端口。我现在有同样的任务。因此,我对NetSNMP::trapreciver的决定如下: #!/us
我的目标是捕获v3陷阱,并希望通过脚本或工具将其转换为v2陷阱,然后将其发送回另一个端口。我现在有同样的任务。因此,我对NetSNMP::trapreciver的决定如下:
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use Net::SNMP;
use SNMP;
use Switch;
my $snmpTrapDestHost = "127.0.0.1";
my $snmpTrapRemotePort = 16162; #other than default trap port or we got infinite trap loop
my $snmpTrapCommunity = "public";
my $snmpTrapVersion = "2c";
my $sess = new SNMP::TrapSession(DestHost => $snmpTrapDestHost, Community => $snmpTrapCommunity, Version => $snmpTrapVersion, RemotePort => $snmpTrapRemotePort);
sub my_receiver {
print "********** PERL RECEIVED A NOTIFICATION:\n";
my @bunchOfVarbinds;
foreach my $x (@{$_[1]})
{
printf "'%s' type='%d' value='%s'\n", $x->[0], $x->[2], $x->[1];
my $lsOid = $x->[0];
my $liOid = &SNMP::translateObj($lsOid);
my $lsVal = $x->[1];
my $lType = $x->[2];
my $lVal;
# You need some convertion here, cause we got data in "human readable" format
switch($lType)
{
case Net::SNMP::OBJECT_IDENTIFIER
{
$lType = "OBJECTID";
if ($lsVal =~ /OID\:\s+(.*)$/)
{
$lVal = $1
}
else
{
$lVal = $lsVal;
}
$lVal = &SNMP::translateObj($lVal);
}
case Net::SNMP::TIMETICKS
{
$lType = "TICKS";
if($lsVal =~ /Timeticks\:\s+\((\d+)\)\s+.*$/)
{
$lVal = $1;
}
else
{
my ($d, $h, $m, $s) = split(/\:/, $lsVal);
$lVal = $d * 24;
$lVal = ($lVal + $h)*60;
$lVal = ($lVal + $m)*60;
$lVal = ($lVal + $s)*100;
}
}
case Net::SNMP::OCTET_STRING
{
$lType = "OCTETSTR";
my $isHex;
($isHex, $lVal) = split(/STRING\:\s*/, $lsVal);
if (!defined($lVal))
{
$lVal = $lsVal;
}
$lVal =~ s/"//g;
if (defined($isHex))
{
if($isHex eq "Hex-")
{
$lVal =~ s/\n//g;
$lVal =~ s/ //g;
}
}
}
case Net::SNMP::INTEGER
{
$lType = "INTEGER";
$lVal = $lsVal;
}
case Net::SNMP::IPADDRESS
{
# IPADDR
# NETADDR
$lType = "IPADDR";
$lVal = $lsVal;
}
case Net::SNMP::COUNTER
{
# COUNTER
$lType = "COUNTER";
$lVal = $lsVal;
}
case Net::SNMP::COUNTER64
{
# COUNTER64
$lType = "COUNTER64";
$lVal = $lsVal;
}
case Net::SNMP::GAUGE
{
# GAUGE
$lType = "GAUGE";
$lVal = $lsVal;
}
case Net::SNMP::NULL
{
# NULL
$lType = "NULL";
$lVal = $lsVal;
}
else
{
# UINTEGER
# OPAQUE
$lVal = $lsVal;
}
}
push @bunchOfVarbinds, new SNMP::Varbind([$liOid, undef, $lVal, $lType]);
}
my $vl = new SNMP::VarList(@bunchOfVarbinds);
$sess->trap(
oid => $initiTrapProxyServiceOid,
uptime => $trapUptimeValue,
$vl
);
return NETSNMPTRAPD_HANDLER_OK;
}
$SNMP::use_numeric = 1;
NetSNMP::TrapReceiver::register("all", \&my_receiver) ||
warn "failed to register perl trap handler\n";
print STDERR "Loaded perl snmptrapd handler\n";
我是perl方面的新手,因此非常感谢任何修复。抱歉,这太宽泛了,无法给出有意义的回答。应该可以捕获一个SNMPv3陷阱并创建一个新的SNMPv2陷阱,其中包含大致相似的信息。@Sobrique我不同意它太宽。也许换句话会有帮助:“我如何使用捕获SNMP v3陷阱并将它们作为v2陷阱转发?”由于snmptrapd可以运行任意Perl代码,我希望解决方案不会太长。我对您的结构感到困惑:您没有提到任何网络管理器。您的“客户端应用程序”是指新的HP OpenView代理吗?在这种情况下,“我们使用的代理”是什么?在这种情况下,发布一个图像会很有用。我不打算投票结束,但我确实觉得,如果您展示一些您迄今为止在Perl模块中尝试过的东西,这将是一个更好的问题。你链接到的页面似乎有很多很好的信息,包括示例代码,其中缺少了什么,你无法开始讨论?抱歉,伙计,我意识到我可能是在这方面开了枪,现在我已经确定了一个SNMP陷阱拦截器,它迎合v3陷阱。我将结束这个问题-很抱歉浪费了大家的时间