2012-02-06 Koichiro Kikuchi <koichiro@rworks.jp>

* lib/PandoraFMS/SNMPServer.pm: Added SNMPv2 Trap support!



git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@5489 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f
This commit is contained in:
koichirok 2012-02-06 09:09:40 +00:00
parent 0278a10400
commit 5ee794be88
2 changed files with 47 additions and 13 deletions

View File

@ -1,3 +1,7 @@
2012-02-06 Koichiro Kikuchi <koichiro@rworks.jp>
* lib/PandoraFMS/SNMPServer.pm: Added SNMPv2 Trap support!
2012-02-03 Ramon Novoa <rnovoa@artica.es>
* lib/PandoraFMS/Core.pm: Added support for ff interval. Small

View File

@ -64,7 +64,11 @@ sub new ($$;$) {
}
}
if (system ($config->{'snmp_trapd'} . ' -t -On -n -a -Lf ' . $config->{'snmp_logfile'} . ' -p ' . $pid_file . ' -F %4y-%02.2m-%l[**]%02.2h:%02.2j:%02.2k[**]%a[**]%N[**]%w[**]%W[**]%q[**]%v\\\n >/dev/null 2>&1') != 0) {
my $snmptrapd_args = ' -t -On -n -a -Lf ' . $config->{'snmp_logfile'} . ' -p ' . $pid_file;
$snmptrapd_args .= ' --format1=SNMPv1[**]%4y-%02.2m-%l[**]%02.2h:%02.2j:%02.2k[**]%a[**]%N[**]%w[**]%W[**]%q[**]%v\\\n';
$snmptrapd_args .= ' --format2=SNMPv2[**]%4y-%02.2m-%l[**]%02.2h:%02.2j:%02.2k[**]%b[**]%v\\\n';
if (system ($config->{'snmp_trapd'} . $snmptrapd_args . ' >/dev/null 2>&1') != 0) {
logger ($config, " [E] Could not start snmptrapd.", 1);
print_message ($config, " [E] Could not start snmptrapd.", 1);
return undef;
@ -138,27 +142,53 @@ sub pandora_snmptrapd {
print INDEXFILE $last_line . ' ' . $last_size;
close INDEXFILE;
# Skip Headers
next if ($line =~ m/NET-SNMP/);
# Skip lines other than SNMP Trap logs
next unless ($line =~ m/^SNMPv[12]\[\*\*\]/);
# Unknown data
next if ($line !~ m/\[\*\*\]/ || matches_filter ($dbh, $pa_config, $line) == 1);
(my $trap_ver, $line) = split(/\[\*\*\]/, $line, 2);
# Process SNMP filter
next if (matches_filter ($dbh, $pa_config, $line) == 1);
logger($pa_config, "Reading trap '$line'", 10);
my ($date, $time, $source, $oid, $type, $type_desc, $value, $data) = ('', '', '', '', '', '', '', '');
($date, $time, $source, $oid, $type, $type_desc, $value, $data) = split(/\[\*\*\]/, $line);
my $timestamp = $date . ' ' . $time;
if ($trap_ver eq "SNMPv1") {
($date, $time, $source, $oid, $type, $type_desc, $value, $data) = split(/\[\*\*\]/, $line, 8);
$value = limpia_cadena ($value);
# Try to save as much information as possible if the trap could not be parsed
$oid = $type_desc if ($oid eq '' || $oid eq '.');
} elsif ($trap_ver eq "SNMPv2") {
($date, $time, $source, $data) = split(/\[\*\*\]/, $line, 4);
my @data = split(/\t/, $data);
# extract IP address from %b part:
# * destination part appears in Net-SNMP > 5.3
# * protocol name part and bracketted IP addr w/ port number appear in
# Net-SNMP > 5.1 (Net-SNMP 5.1 has IP addr only).
# * port number is signed in Net-SNMP 5.2
$source =~ s/(?:(?:TCP|UDP):\s*)?\[?([^] ]+)\]?(?::-?\d+)?(?:\s*->.*)?$/$1/;
shift @data; # Drop unused 1st data.
$oid = shift @data;
if (!defined($oid)) {
logger($pa_config, "[W] snmpTrapOID not found (Illegal SNMPv2 trap?)", 1);
next;
}
$oid =~ s/.* = OID: //;
$data = join("\t", @data);
}
my $timestamp = $date . ' ' . $time;
my ($custom_oid, $custom_type, $custom_value) = ('', '', '');
# custom_type, custom_value is not used since 4.0 version, all custom data goes on custom_oid
$custom_oid = $data;
# Try to save as much information as possible if the trap could not be parsed
$oid = $type_desc if ($oid eq '' || $oid eq '.');
# Insert the trap into the DB
if (! defined(enterprise_hook ('snmp_insert_trap', [$pa_config, $source, $oid, $type, $value, $custom_oid, $custom_value, $custom_type, $timestamp, $self->getServerID (), $dbh]))) {
my $trap_id = db_insert ($dbh, 'id_trap', 'INSERT INTO ttrap (timestamp, source, oid, type, value, oid_custom, value_custom, type_custom) VALUES (?, ?, ?, ?, ?, ?, ?, ?)',