You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
3.7 KiB
116 lines
3.7 KiB
#!/usr/bin/env perl
|
|
|
|
#
|
|
# Zabbix
|
|
# Copyright (C) 2001-2023 Zabbix SIA
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
#
|
|
|
|
#########################################
|
|
#### ABOUT ZABBIX SNMP TRAP RECEIVER ####
|
|
#########################################
|
|
|
|
# This is an embedded perl SNMP trapper receiver designed for sending data to the server.
|
|
# The receiver will pass the received SNMP traps to Zabbix server or proxy running on the
|
|
# same machine. Please configure the server/proxy accordingly.
|
|
#
|
|
# Read more about using embedded perl with Net-SNMP:
|
|
# http://net-snmp.sourceforge.net/wiki/index.php/Tut:Extending_snmpd_using_perl
|
|
|
|
#################################################
|
|
#### ZABBIX SNMP TRAP RECEIVER CONFIGURATION ####
|
|
#################################################
|
|
|
|
### Option: SNMPTrapperFile
|
|
# Temporary file used for passing data to the server (or proxy). Must be the same
|
|
# as in the server (or proxy) configuration file.
|
|
#
|
|
# Mandatory: yes
|
|
# Default:
|
|
$SNMPTrapperFile = '/tmp/zabbix_traps.tmp';
|
|
|
|
### Option: DateTimeFormat
|
|
# The date time format in strftime() format. Please make sure to have a corresponding
|
|
# log time format for the SNMP trap items.
|
|
#
|
|
# Mandatory: yes
|
|
# Default:
|
|
$DateTimeFormat = '%H:%M:%S %Y/%m/%d';
|
|
|
|
###################################
|
|
#### ZABBIX SNMP TRAP RECEIVER ####
|
|
###################################
|
|
|
|
use Fcntl qw(O_WRONLY O_APPEND O_CREAT);
|
|
use POSIX qw(strftime);
|
|
|
|
sub zabbix_receiver
|
|
{
|
|
my (%pdu_info) = %{$_[0]};
|
|
my (@varbinds) = @{$_[1]};
|
|
|
|
# open the output file
|
|
unless (sysopen(OUTPUT_FILE, $SNMPTrapperFile, O_WRONLY|O_APPEND|O_CREAT, 0666))
|
|
{
|
|
print STDERR "Cannot open [$SNMPTrapperFile]: $!\n";
|
|
return NETSNMPTRAPD_HANDLER_FAIL;
|
|
}
|
|
|
|
# get the host name
|
|
my $hostname = $pdu_info{'receivedfrom'} || 'unknown';
|
|
if ($hostname ne 'unknown')
|
|
{
|
|
$hostname =~ /\[(.*?)\].*/; # format: "UDP: [127.0.0.1]:41070->[127.0.0.1]"
|
|
$hostname = $1 || 'unknown';
|
|
}
|
|
|
|
# print trap header
|
|
# timestamp must be placed at the beginning of the first line (can be omitted)
|
|
# the first line must include the header "ZBXTRAP [IP/DNS address] "
|
|
# * IP/DNS address is the used to find the corresponding SNMP trap items
|
|
# * this header will be cut during processing (will not appear in the item value)
|
|
printf OUTPUT_FILE "%s ZBXTRAP %s\n", strftime($DateTimeFormat, localtime), $hostname;
|
|
|
|
# print the PDU info
|
|
print OUTPUT_FILE "PDU INFO:\n";
|
|
foreach my $key(keys(%pdu_info))
|
|
{
|
|
if ($pdu_info{$key} !~ /^[[:print:]]*$/)
|
|
{
|
|
my $OctetAsHex = unpack('H*', $pdu_info{$key}); # convert octet string to hex
|
|
$pdu_info{$key} = "0x$OctetAsHex"; # apply 0x prefix for consistency
|
|
}
|
|
|
|
printf OUTPUT_FILE " %-30s %s\n", $key, $pdu_info{$key};
|
|
}
|
|
|
|
# print the variable bindings:
|
|
print OUTPUT_FILE "VARBINDS:\n";
|
|
foreach my $x (@varbinds)
|
|
{
|
|
printf OUTPUT_FILE " %-30s type=%-2d value=%s\n", $x->[0], $x->[2], $x->[1];
|
|
}
|
|
|
|
close (OUTPUT_FILE);
|
|
|
|
return NETSNMPTRAPD_HANDLER_OK;
|
|
}
|
|
|
|
NetSNMP::TrapReceiver::register("all", \&zabbix_receiver) or
|
|
die "failed to register Zabbix SNMP trap receiver\n";
|
|
|
|
print STDOUT "Loaded Zabbix SNMP trap receiver\n";
|