SNMPTT介绍
1. 什么是SNMPTT(SNMP Trap Translator)
SNMPTT是用perl写的SNMP trap处理器,它需要使用Net-SNMP/UCD-SNMP snmptrapd程序。SNMPTT支持Linux,Unix和Windows。
Net-SNMP程序的snmptrapd是收集和记录SNMP trap,并通过TCP/IP发送消息的程序。
snmptrapd程序接收到的告警的输出如下,一般格式为 variable name=value, variable name=value。
Feb 12 13:37:10 server11 snmptrapd[25409]: 192.168.110.192: Enterprise Specific Trap (3008) Uptime: 306 days, 23:13:24.29, .1.3.6.1.2.1.1.5.0 = SERVER08, .1.3.6.1.4.1.232.11.2.11.1.0 = 0, .1.3.6.1.4.1.232.3.2.3.1.1.4.8.1 = rebuilding(7)
or
Feb 12 13:37:10 server11 snmptrapd[25409]: 192.168.110.192: Enterprise Specific Trap (3008) Uptime: 306 days, 23:13:24.29, sysName.0 = SERVER08, cpqHoTrapFlags.0 = 0, cpqDaLogDrvStatus.8.1 = rebuilding(7)
使用SNMPTT的变量替换功能,消息可以变的更友好,如在SNMPTT 配置文件中定义如下的格式:
FORMAT Logical Drive Status Change: Status is now $3.
那么上面收到的消息将会显示为:
Feb 12 13:37:13 server11 TRAPD: .1.3.6.1.4.1.232.0.3008 Normal "XLOGONLY" server08 - Logical Drive Status Change: Status is now rebuilding
可以看出,第三个变量rebuilding被替换显示出来。
SNMPTT可以将输出记录到文本日志,NT event 日志,SQL数据库,或者通过外部程序传给Nagios,邮件客户端等。
除了变量替换,SNMPTT允许如下复杂的配置:
*接受或拒绝一个trap信息,基于主机名/IP地址/网络段/trap变量中的值
*执行外部程序来发送page,email等
*执行正则表达式来匹配和替换消息中的内容。
2. 前提需求
1. Perl 5.6.1 or higher. SNMPTT is developed with 5.6.1 and 5.8.0, but other versions may also work.
2. Required: Net-SNMP (formerly known as UCD-SNMP). Specifically snmptrapd.
3. Required: Text::ParseWords module (included with most distributions including ActivePerl)
4. Required: Getopt::Long module (included with most distributions including ActivePerl)
5. Required: Posix module (included with most if not all distributions including ActivePerl)
6. Required: Config::IniFiles module
7. Required: Time::HiRes module (only required when using SNMPTT in daemon mode - required by snmptthandler)
8. Required: Sys::Hostname module (included with most if not all distributions including ActivePerl).
9. Required: File::Basename module (included with most if not all distributions including ActivePerl).
10. Required: Text::Balanced module (included with most if not all distributions including ActivePerl).
Net-SNMP 5.1.1或者更高版本
3. 安装 概述
1. 安装Net-SNMP和SNMPTT
2. 手工创建snmptt.conf文件,或者使用snmpttconvertmib工具创建。
3. 更改snmptt.ini文件包含snmptt.conf文件,并设置选项
4. 启动snmptt
5. 配置网络设备发送traps到Net-SNMP/SNMPTT机器
6. 在网络设备上初始一个trap,检查SNMPTT日志文件
7. 安全化SNMPTT的安装。
安装 Unix
标准 handler
标准handler是一个小的perl程序。通过daemon模式,每当snmptrapd接收到一个trap就被调用一次。标准handler的限制如下:
*每一次接收到tarp,都会创建一个进程运行snmptthandler,snmptt.ini 文件每次都会读取
*snmptrapd不能传递SNMPv3 EngineID和名字给snmptthandler
标准handler的益处如下:
*snmptrapd不需要嵌入的perl
*满足大多数的安装。
安装
1. 读整个文件理解snmptt如何工作
2. 拷贝snmptt到/usr/sbin, 加可执行权限(chmod +x snmptt)
3. 拷贝snmptthandler到/usr/sbin,加可执行权限(chmod +x snmptthandler)
4. 拷贝snmptt.ini 到/etc/snmp或者/etc。更改文件中的选项。
5. 创建日志文件夹/var/log/snmptt
6. 对于standlone mode: 更改Net-SNMP的snmptrapd.conf配置文件,添加如下行:
traphandle default /usr/sbin/snmptt
7. 对于 daemon mode,更改Net-SNMP的snmptrapd.conf配置文件,增加如下行:
traphandle default /usr/sbin/snmptthandler
创建spool文件夹
mkdir /var/spool/snmptt/
拷贝启动脚本到init.d目录
cp snmptt.init.d /etc/rc.d/init.d/snmptt
增加启动项
chkconfig --add snmptt
chkconfig --level 2345 snmptt on
service snmptt start
或者手工执行snmpttt
snmptt --daemon
8. 拷贝日志轮训脚本cp snmptt.logrotate /etc/logrotate.d/snmptt
更改文件中的路径
9. 使用如下命令启动snmptrapd,snmptrapd -On.
如果存在/etc/rc.d/init.d/snmptrapd文件,则也要更改添加上选项”-On”。
Embedded handler
嵌入式handler是一个小的perl程序,它随着snmptrapd的启动而被装载入snmptrapd。嵌入式handler的限制如下:
*对于snmptrapd而言,需要嵌入式perl
*仅仅工作在daemon模式
嵌入式handler的益处如下:
*当snmptrapd启动时,handler被装载和初始化。相对创建新进程而言,更低负载,并且初始化只做一次。
*SNMPv3 EngineID和名字变量对snmptt可用。
安装
1. 读取整个文件,理解snmptt如何工作
2. 确保snmptrapd已经具有嵌入式perl的支持。编译Net-SNMP源代码时,使用” –enable-embedded-perl”配置选项。
Type snmptrapd -H 2>&1 | grep perl. It should give perl PERLCODE if embedded Perl is enabled.
3. 拷贝snmptt到/usr/sbin, 添加可执行权限(chmod +x snmptt )
4. 拷贝snmptthandler-embedded到/usr/sbin/。 不需要添加可执行权限
5. 拷贝snmptt.ini 到/etc/snmp/或者/etc。 并编辑其中的选项。
6. 创建日志目录 /var/log/snmptt/
7. 配置snmptrapd,并安装服务
更改Net-SNMP配置文件snmptrapd.conf,增加如下行:
perl do "/usr/sbin/snmptthandler-embedded";
创建spool文件夹
mkdir /var/spool/snmptt/
拷贝启动脚本到init.d目录
cp snmptt.init.d /etc/rc.d/init.d/snmptt
增加启动项
chkconfig --add snmptt
chkconfig --level 2345 snmptt on
service snmptt start
或者手工执行snmpttt
snmptt --daemon
8. 拷贝日志轮训脚本cp snmptt.logrotate /etc/logrotate.d/snmptt
更改文件中的路径
9. 使用如下命令启动snmptrapd,snmptrapd -On.
如果存在/etc/rc.d/init.d/snmptrapd文件,则也要更改添加上选项”-On”。
安装 windows
Net-SNMP trap接收器当前还不支持嵌入式perl,所以windows平台上只能使用标准 handler。
安装
1. 读取整个文件来理解snmptt如何工作
2. 创建目录C:\snmp,并将snmptt拷贝和snmptthandler拷贝到其中
3. 拷贝snmptt.ini-nt到%SystemRoot%\snmptt.ini (c:\winnt\snmptt.ini)。并编辑其中的选项。
4. 创建日志目录c:\snmp\log\
5. 对于standlone 模式。更改Net-SNMP的配置文件snmptrapd.conf,增加如下行:
traphandle default perl c:\snmp\snmptt
6. 对于daemon 模式,编辑Net-SNMP的配置文件snmptrapd.conf,增加如下行:
traphandle default perl c:\snmp\snmptthandler
创建spool目录,c:\snmptt\spool\
加载snmptt
snmptt --daemon
7. 启动snmptrapd
snmptrapd -On
Windows NT EventLog:
安装
1. 备份操作系统
2. 确保Event Viewer没有打开
3. 拷贝bin\snmptt-eventlog.dll到%windir%\system32
4. 启动注册表编辑器
5. 到'HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Eventlog\Application'
6. 创建一个子键,命名为SNMPTT
7. 在SNMPTT子键中,创建字符串叫EventMessageFile,其值为%windir%\system32\snmptt-eventlog.dll
8. 在SNMPTT自建中,创建一个DWORD叫TypesSupported,其值为7
卸载
1. 备份你的系统
2. 确保Event Viewer没有开启
3. 载入注册表编辑器
4. 到'HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Eventlog\Application'
5. 删除SNMPTT子键
6. 删除%windir%\system32\ snmptt-eventlog.dll
Windows NT Service
安装
1. 安装Wndwos NT resource kit
2. 从c:\Program Files\Resource Kit* 拷贝srvany.exe 到c:\winnt\system32
3. 安装SNMPTT服务
instsrv SNMPTT c:\winnt\system32\srvany.exe
4. 配置服务
启动regedit
到HKLM\SYSTEM\CurrentControlSet\SNMPTT
创建一个键:Parameters
在键中,创建一个REG_SZ,叫做Application,值为c:\perl\bin\perl.exe
在键中,创建一个REG_SZ,叫做AppParameters,值为:c:\snmp\snmptt --daemon
5. 从控制面板启动服务,或者执行命令 net start snmptt
为了删除服务,可以执行instsrv SNMPTT remove
Securing SNMPTT
像多数软件一样,SNMPTT应该使用非root或者非administrator权限运行。当使用非特权用户时,可以限制EXEC和REGEX所发生的动作。
对于Linux和Unix,如果你使用root启动SNMPTT,用户’snmptt’将被创建,snmpttt.ini文件中的选项daemon_uid也应该设置为snmptt用户的uid。仅当使用root启动snmptt时才需设置daemon_uid。
当在daemon 模式时使用daemon_uid,将会有两个SNMPTT进程。第一个以root运行,并创建pid文件。第二个进程以daemon_uid定义的用户来运行。如果系统日志(syslog_system_enable)开启,则日志中会根据从哪个进程处理的trap,而将相应的进程的uid记录到日志中。如,用户ID为500,syslog将会包含snmptt[500],如果是root,则为snmptt[0]。
对于Windows,创建一个本地或者域用户’snmptt’。如果作为NT服务运行,则服务应该配置为使用snmptt用户。要不然可以使用snmpt来本地登录,启动SNMPTT为deamon模式。
snmptthandler被Net-SNMP的snmptrapd调用,并运行在同snmptrapd相同的安全环境中。
snmptt用户需要配置如下的权限:
*读取/删除 读取spool目录中的新traps,删除旧的traps
*对snmptt.ini和所有的snmptt.conf文件的可读权限
*对日志目录/var/log/snmptt或者c:\snmp\log\的可写权限
*其他需要运行EXEC的权限
如果snmptrapd以非特权用户运行,则需要配置如下的权限:
* 对spool目录的可写权限
4. 配置选项 snmptt.ini
这个文档中提到的配置选项,通过更改snmptt.ini文件来实现。
对于Linux/Unix,如下的路径可用于定位snmptt.ini:
/etc/snmp/
/etc/
/usr/local/etc/snmp/
/usr/local/etc/
对于Windows,文件应该放置在%SystemRoot%\.例如, c:\winnt或者c:\windows。
4.1 日志
4.1.1 Logging Standard
转换后的traps可以被发送到标准输出和一个日志文件。输出格式为:
date trap-oid severity category hostname translated-trap
更改snmptt.ini文件中的如下变量:
enable_stdout
enable_log
log_file
4.1.2 Logging Unknown traps
记录未知的traps,主要目的是为了调试。需要更改snmptt.ini文件中的如下变量:
enable_unknown_trap_log
unknown_trap_log_file
4.1.3 Logging Syslog
转换的traps可以被发送到syslog,格式同上面相同,只是没有日期:
trap-oid severity category hostname translated-trap
日志文件中的条目通常以如下格式开始:date hostname snmptt[pid]:
为了实现syslog日志,更改snmptt.ini文件中的如下选项:
syslog_enable
syslog_facility
syslog_level
SNMPTT系统错误可以被发送到syslog,通过更改如下参数:
syslog_system_enable
syslog_system_facility
syslog_system_level
日志文件中的条目通常以如下格式开始:date hostname snmptt-sys[pid]:
4.1.4 Logging Eventlog
被转换后的traps可以被发送到NT EventLog中。所有的traps都被记录在SNMPTT下的E
vented 2。 日志格式同上面相同,只是没有日期:
trap-oid severity category hostname translated-trap
为了配置eventlog支持,更改snmptt.ini文件中的如下选项:
eventlog_enable
eventlog_type
SNMPTT 系统错误可以被发送到Event Log,通过更改snmptt.ini文件中如下选项:
eventlog_system_enable
4.1.5 Logging Database
处理过和未知的traps可以被发送到一个数据库。MySQL、PostgreSQL、ODBC。
为了配置未知trap日志记录,编辑snmptt.ini文件中的如下变量:
enable_unknown_trap_log
db_unknown_trap_format
DBD::MySQL
配置SNMPTT使用MySQL,更改snmptt.ini文件中的如下选项:
mysql_dbi_enable
mysql_dbi_host
mysql_dbi_port
mysql_dbi_database
mysql_dbi_table
mysql_dbi_table_unknown
mysql_dbi_username
mysql_dbi_password
如下的MySQL脚本可以创建数据库和表。权限也被定义。以root权限运行mysql,输入:
CREATE DATABASE snmptt;
USE snmptt;
DROP TABLE snmptt;
CREATE TABLE snmptt (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
eventname VARCHAR(50),
eventid VARCHAR(50),
trapoid VARCHAR(100),
enterprise VARCHAR(100),
community VARCHAR(20),
hostname VARCHAR(100),
agentip VARCHAR(16),
category VARCHAR(20),
severity VARCHAR(20),
uptime VARCHAR(20),
traptime VARCHAR(30),
formatline VARCHAR(255));
注:为了存储traptime为真实的date/time,改变’traptime VARCHAR(30)’ 为‘traptime DATETIME‘, 设置snmptt.ini文件中的date_time_format_sql选项值为%Y-%m-%d %H:%M:%S.
如果记录未知trap日志到数据库,则需要创建snmptt_unknow表:
USE snmptt;
DROP TABLE snmptt_unknown;
CREATE TABLE snmptt_unknown (
trapoid VARCHAR(100),
enterprise VARCHAR(100),
community VARCHAR(20),
hostname VARCHAR(100),
agentip VARCHAR(16),
uptime VARCHAR(20),
traptime VARCHAR(30),
formatline VARCHAR(255));
注:为了存储traptime为真实的date/time,改变’traptime VARCHAR(30)’ 为‘traptime DATETIME‘, 设置snmptt.ini文件中的date_time_format_sql选项值为%Y-%m-%d %H:%M:%S.
如果记录统计信息到数据库,则需要创建snmptt_statistics表:
USE snmptt;
DROP TABLE snmptt_statistics;
CREATE TABLE snmptt_statistics (
stat_time VARCHAR(30),
total_received BIGINT,
total_translated BIGINT,
total_ignored BIGINT,
total_unknown BIGINT);
注:为了存储traptime为真实的date/time,改变’traptime VARCHAR(30)’ 为‘traptime DATETIME‘, 设置snmptt.ini文件中的date_time_format_sql选项值为%Y-%m-%d %H:%M:%S.
增加一个用户’snmptt’,密码为’mytrap’,来供SNMPTT使用,使用如下的SQL语句:
GRANT ALL PRIVILEGES ON *.* TO IDENTIFIED BY 'mytrap';
4.2 执行一个外部程序
当一个trap接收到时,一个外部程序被载入。命令行被定义在配置文件中,如:使用APAGE发送一页,如下的命令行被使用:
qpage -f TRAP notifygroup1 "$r $x $X Compaq Drive Array Spare Drive on controller $4, bus $5, bay $6 status is $3."
$r替换为主机名,$x是当前日期,$X是当前时间,为了允许执行EXEC定义,在snmptt.ini文件中更改如下选项:
exec_enable
当接收到一个未知的trap时,也可以调用一个外部程序。这个可以通过snmptt.ini文件中的选项来设置:unknown_trap_exec。传给命令行的都是标准的变量。
5. 操作模式(Modes of Operation)
SNMPTT可以运行在两个模式:standalone模式和daemon模式
5.1 Standalone 模式
为了在standalone模式下使用SNMPTT,snmptrapd.conf文件需要包含如下行:
traphandle default /usr/sbin/snmptt
当SNMPTRAPD收到一个trap,将这个trap传递给/usr/sbin/snmptt脚本。SNMPTT执行如下的任务:
读取从snmptrapd传递的trap
载入包含trap定义的配置文件
查找trap的匹配
记录日志,执行EXEC语句等
退出
5.2 Daemon 模式
当SNMPTT运行在daemon模式时,需要在snmptrapd.conf文件中,添加如下行:
traphandle default /usr/sbin/snmptthandler
当SNMPTRAPD接收到一个trap时,trap被传递给/usr/sbin/snmptthandler脚本。SNMPTTHANDLER完成如下任务:
*读取从snmptrapd传递过来的trap
*将trap写到/var/spool/snmptt目录中的一个唯一文件
*退出
运行在daemon模式的SNMPTT完成如下任务:
*启动时,载入包含trap定义的配置文件
*从spool目录读取trap
*从trap中查找匹配
*日志记录,执行EXEC声明等
*休眠5秒钟
*loops back up to ‘从spool目录读取trap’.
使用SNMPTTHANDLER和SNMPTT在daemon模式下,可以轻松的处理大量的traps。在命令行使用--daemon参数或者在snmptt.ini文件中设置daemon变量,可以使SNMPTT运行在daemon模式下。
通过设置snmptt.ini文件中的use_trap_time变量为1(默认的),日志中的日期和时间为trap被传入spool文件的时间,如果变量设置为0,日志中的日期和时间为SNMPTT处理后的时间。
6. SNMPTT.CONF 配置文件格式
配置文件(通常/etc/snmp/snmptt.conf 或者c:\snmpsnmptt.conf)包含了一列已定义的traps。
如果你的snmptt.conf文件比较大,可以将其细分为多个文件,将这些配置文件包含在snmptt.ini文件中的snmptt_conf_files部分,如:
snmptt_conf_files = < /etc/snmp/snmptt.conf.generic
/etc/snmp/snmptt.conf.compaq
/etc/snmp/snmptt.conf.cisco
/etc/snmp/snmptt.conf.hp
/etc/snmp/snmptt.conf.3com
END
snmptt.conf文件的语法为:
EVENT event_name event_OID "category" severity
FORMAT format_string
[EXEC command_string]
[NODES sources_list]
[MATCH [MODE=[or | and]] | [$n:[!][( ) | n | n-n | > n | < n | x.x.x.x | x.x.x.x-x.x.x.x | x.x.x.x/x]]
[REGEX ( )( )[i][g][e]]
[SDESC]
[EDESC]
注:EVENT和FORMAT行是必须的。在[]中的命令是可选的。不要在配置文件中包含[]s
6.1 EVENT
EVENT event_name event_OID "category" severity
event_name:
不能包含空格。当使用snmpttconvertmib转换时,这个名字将与MIB文件中TRAP-TYPE或者NOTIFICATION-TYPE行的名字匹配
event_OID:
一般形式如:.1.3.6.1.4.1.232.0.11001
如果Net-SNMP perl模块安装,并且在snmptt.ini文件中设置了net_snmp_perl_enable为开启,则可以使用符号名,如:
linkDown
IF-MIB::linkDown
注:当翻译OID时,Net-SNMP 5.0.9 和更早的版本不支持包含模块名字(如:IF-MIB::) 。
SNMP V1 traps 的企业ID格式为(.1.3.6.1.4.1.232) ,后面跟上一个0,再跟上trap号(11001)。这样可能导致在配置文件中相同的trap OID存在多条定义。如果在snmptt.ini文件中允许了multiple_event,那么将处理所有匹配的traps。如果multiple_event禁止,只有第一个匹配的条目被使用
OID中可以使用通配符,例如:.1.3.6.1.4.1.232.1.2.*
category
特色字符串包含在双引号中。如果为“IGNORE”,则snmptt.conf中包含的FORMAT和EXEC都忽略。
如果类型为“LOGONLY”,则trap信息被日志记录,EXEC声明被忽略。
注:如果你打算使用Naigos等外部程序,则最好不要设置任何trap为LOGONLY,就好像不要使用EXEC来进行被动服务检查。
severity:
事件的级别,用于日志。如:Minor,Major,Normal,Critical,Warning。
6.2 FORMAT
FORMAT format_string
每个EVENT只能有一行FORMAT
使用如下的变量在字符串上进行变量替换:
$A - Trap agent host name (see Note 1)
$aA - Trap agent IP address
$Be - securityEngineID (snmpEngineID) (see Note 7)
$Bu - securityName (snmpCommunitySecurityName) (see Note 7)
$BE - contextEngineID (snmpCommunityContextEngineID) (see Note 7)
$Bn - contextName (snmpCommunityContextName) (see Note 7)
$c - Category
$C - Trap community string
$D - Description text from SNMPTT.CONF or MIB file (see Note 6)
$E - Enterprise trap OID in symbolic format
$e - Enterprise trap OID in number format
$Fa - alarm (bell) (BEL)
$Ff - form feed (FF)
$Fn - newline (LF, NL)
$Fr - return (CR)
$Ft - tab (HT, TAB)
$Fz - Translated FORMAT line (EXEC only)
$G - Generic trap number (0 if enterprise trap)
$H - Host name of the system running SNMPTT
$S - Specific trap number (0 if generic trap)
$N - Event name defined in .conf file of matched entry
$i - Event OID defined in .conf file of matched entry (could be a wildcard OID)
$O - Trap OID in symbolic format (see Note 4)
$o - Trap OID in numerical format (see Note 4)
$R, $r - Trap hostname (see Note 1)
$aR, $ar - IP address
$s - Severity
$T - Uptime: Time since network entity was initialized
$X - Time trap was spooled (daemon mode) or current time (standalone mode)
$x - Date trap was spooled (daemon mode) or current date (standalone mode)
$# - Number of (how many) variable-bindings in the trap
$$ - Print a $
$@ - Number of seconds since the epoch of when the trap was spooled (daemon mode) or the current time (standalone mode)
$n - Expand variable-binding n (1-n) (see Note 2,5)
$+n - Expand variable-binding n (1-n) in the format of variable name:value (see Note 2,3,5)
$-n - Expand variable-binding n (1-n) in the format of variable name (variable type):value (see Note 2,3,5)
$vn - Expand variable name of the variable-binding n (1-n)(see Note 3)
$* - Expand all variable-bindings (see Note 5)
$+* - Expand all variable-bindings in the format of variable name:value (see Note 2,3,5)
$-* - Expand all variable-bindings in the format of variable name (variable type):value (see Note 2,3,5)
注2: 如果snmptt.ini文件中的translate_integers被允许,SNMPTT将尝试查找MIB文件,将收到的trap中的数字转换为文本。为了使这个功能可用还有如下条件需要满足:必须安装了Net-SNMP/UCD-SNMP模块,并在snmptt.ini文件中开启了net_snmp_perl_enable选项。
另外,为了是该功能可用,需要确保Net-SNMP/UCD-SNMP配置正确。如果选项开启,却没有将数字转换成文本,数字将会使用。如果MIB文件存在,但是却没有转换,需要在snmp.conf文件中正确配置,来处理所有的mibs。或者,你可以在snmptt.ini文件中设置mibs_enviroment变量为ALL
注3:如果需要$vn,$+n,$-n变量名和类型转换为文本,则也需要在snmptt.ini文件中开启net_snmp_perl_enable选项。 这个其实和注2一样。
注4:如果需要将数字的OID转换为文本,需要在snmptt.ini文件中,开启translate_trap_oid选项和net_snmp_perl_enable选项,并安装了Net-SNMP/UCD-SNMP模块。
注6:snmptt.ini文件中必须设置description_mode值为1或者2。 如果设置为1,描述从SNMPTT.CONF文件中获取。如果设置为2,描述从MIB文件中获取。
6.3 EXEC
[EXEC command_string]
可以一个EVENT,多行EXEC。
当一个trap接收到后,则按照顺序执行命令。
EXEC使用的变量替换跟FORMAT行中的一样。 例如:
EXEC /usr/bin/qpage -f TRAP alex "$r: $x $X - NIC switchover to slot $3, port $4 from slot $5, port $6"
EXEC c:\snmp\pager netops "$r: $x $X - NIC switchover to slot $3, port $4 from slot $5, port $6"
6.4 PREEXEC
[PREEXEC command_string]
每个EVENT,可以有多行PREEXEC
当一个trap收到后,在FORMAT和EXEC声明执行之前,要执行得语句和命令。外部程序的输出将保存在$pn变量中,n从1开始计数。当有多行PREEXEC时,第一个PREEXEC存储结果到$p1,第二个PREEXEC将结果存在$p2。要开启这个功能,需要在snmptt.ini文件中,设置pre_exec_enable选项
例子:
EVENT linkDown .1.3.6.1.6.3.1.1.5.3 "Status Events" Normal
FORMAT Link down on interface $1($p1). Admin state: $2. Operational state: $3
PREEXEC /usr/local/bin/snmpget -v 1 -Ovq -c public $aA ifDescr.$1
6.5 NODES
[NODES sources_list]
可以限制哪些设备可以映射为事件定义
每个EVENT,可以有多个NODES行。
sources_list中可以包含任意主机名、IP地址、网络地址或者文件名的组合。如果这个字符串被省略,则所有的设备都被接受。
如果想192.168.1.0/24网段的设备可以触发这个EVENT, 你可以使用一条NODE语句:
NODES 192.168.1.0/24
这里有两种操作模式,POS(positive-默认)和NEG(negative)。如果设置为POS,那么NODES中的任何一行匹配,则允许。如果设置为NEG,只有当NODES中都不匹配时,才允许。为了改变操作模式,使用如下声明:
NODES MODE=POS
NODES MODE=NEG
这个特色经常用在,对于相同的事件,一些需要按照常规处理,一些需要按照特殊处理。如
例一
NODES fred barney betty wilma
例二
NODES fred barney betty wilma
NODES MODE=NEG
6.6 MATCH
[MATCH [MODE=[or | and]] | [$n:[!][( )[i] | n | n-n | > n | < n | x.x.x.x | x.x.x.x-x.x.x.x | x.x.x.x/x]]
匹配这个MATCH的trap,才可以引发相应的EVENT定义。
如果一条MATCH声明已经存在,没有trap匹配它,默认的,没有EVENT定义会被匹配。
如下的perl正则表达式被支持:
i – 忽略大小写
如下的命令模式可用:
MATCH MODE=[or | and]
MATCH $x: [!] (reg) [i]
MATCH $x: [!] n
MATCH $x: [!] n-n
MATCH $x: [!] < n
MATCH $x: [!] > n
MATCH $x: [!] & n
MATCH $x: [!] x.x.x.x
MATCH $x: [!] x.x.x.x-x.x.x.x
MATCH $x: [!] x.x.x.x/x
$x 是任意变量(如$3,$A等)
reg是正则表达式
! 是用于negate结果(非)
& 相当于AND
n 是一个数字
x.x.x.x 是IP地址
x.x.x.x-x.x.x.x 是IP地址段
x.x.x.x/x 是IP段
注:如果为了基于IP地址/主机名来限制可以映射的EVENT的设备,推荐使用NODES关 键字。
如果模式设置为’or’,只要有一条匹配,则认为结果是true;如果模式为and,只要有一 条匹配失败,则认为结果为false。
在表达式中使用圆括号(),需要跟在\号之后。
如果没有MATCH MODE=这样的行存在,默认为or。
每个EVENT,只能有一条match mode存在。如果多行MATCH MODE=存在,只有最后一样被使用。
例如:
$2必须在1000到2000之间:MATCH $2: 1000-2000
任何匹配(or):$3等于52,或者$4是IP地址段192.168.1.10-192.168.1.20,或者severity为Major:
MATCH $3: 52
MATCH $4: 192.168.1.10-192.168.1.20
MATCH $s: (Major)
全部匹配(and): $3大于20,$5不包含关键词alarm或者critical, $6 必须字符串’(1)remaining’ , $7 必须包含字符串’power’,不管是大写还是小写:
MATCH $3: >20
MATCH $5: !(alarm|critical)
MATCH $6: (\(1\) remaining)
MATCH $7: (power)i
MATCH MODE=and
6.7 REGEX
[REGEX( )( )[i][g][e]]
在translated FORMAT/ EXEC行 进行搜索和替换。
多个REGEX()()行被允许。
第一个()包含了查找的表达式;第二个()包含了替换的文本。
如下的Perl正则表达式被支持:
i - 当匹配左侧时忽略大小写
g - 替换所有匹配的部分,而不是仅替换查找到的第一个匹配
e - 执行右侧的代码
为了使用capture替换,或者e参数,需要在snmptt.ini文件中设置allow_unsafe_regex为1
如果有多行REGEX,那么从上到下的处理,并且结果是累加的。即第二行处理第一行产生的结果。
例1:
处理前的FORMAT行:UPS has detected a building alarm. Cause: UPS1 Alarm #14: Building alarm 3.
REGEX (Building alarm 3)(Computer room high temperature)
REGEX (Building alarm 4)(Moisture detection alarm)
REGEX (roOm)(ROOM)ig
REGEX (UPS)(The big UPS)
REGEX (\s+)( )g
处理后的FORMAT行:The big UPS has detected a building alarm. Cause: UPS1 Alarm #14: Computer ROOM high temperature
列2:在查找部分使用圆括号,需要前面加上\。替换部分不需要使用
处理前的FORMAT行:Alarm (1) and (2) has been triggered
REGEX (\(1\))(One)
REGEX (\(2\))((Two))
处理后的FORMAT行:Alarm One and (Two) has been triggered
列3: 如果设置了allow_unsafe_regex,那么captures可以在替换部分使用
处理前的FORMAT行:The system has logged exception error 55 for the service testservice
REGEX (The system has logged exception error (\d+) for the service (\w+))(Service $2 generated error $1)
处理后的FORMAT行:Service testservice generated error 55
列4:如果设置了allow_unsafe_regex允许,并且使用了e参数,右侧的部分被执行。
处理前的FORMAT行:Authentication Failure Trap from IP address: C0 A8 1 FE
REGEX (Address: (\w+)\s+(\w+)\s+(\w+)\s+(\w+))("address: ".hex($1).".".hex($2).".".hex($3).".".hex($4))ei
处理后的FORMAT行:Authentication Failure Trap from IP address: 192.168.1.254
6.8 SDESC EDESC
这两个标识符之间的是描述,会被snmptt忽略。
7. SNMPTT.CONF 配置文件Notes
当在配置文件中对相同的trap存在多个定义时,如下的规则被应用:
A match occurs when:
* 接收到的trap的OID匹配配置文件中定义的OID
* AND(当主机名匹配NODES中定义的主机名,或者没有NODES定义)
* AND(MATCH部分匹配为true ,或者没有MATCH条目)
如果在snmptt.ini文件中设置multiple_event为1:
一个trap匹配配置文件中的多个定义,则被处理多次
如果所有的精确匹配都符合,那么通配符匹配将不执行
如果一个精确匹配不存在,通配符匹配被执行,假如(主机名匹配NODES中定义的主机或者没有NODES定义)和(MATCH部分匹配为真或者没有MATCH定义)
如果snmptt.ini文件中设置multiple_event 为0:
trap匹配到的第一个定义被处理
如果一个精确匹配存在,通配符匹配将不执行
如果一个精确匹配不存在,通配符匹配被执行,假如主机名匹配NODES中定义的主机或者没有NODES定义)和(MATCH部分匹配为真或者没有MATCH定义)
8. 域名解析/DNS
如果配置选项dns_enable设置为0 (禁止),那么AGENT的主机名在变量$A , NODES匹配,数据库中的hostname列,中不可用。仅有一种例外,主机IP地址同agent IP地址相同,snmptrapd配了解析主机名。在这种情况下,主机名将会被agent名字替代。
如果配置选项dns_enable设置为1(允许),那么主机名和agent名都会通过dns解析。NODES中的条目将会在匹配前被转换为IP地址。
主机名可能为FQDN(Fully Qualified Domain Name),在/etc/hosts或者%systemroot%\system32\drivers\etc\hosts下添加条目,可能会导致短名被使用。你可以通过strip_domain/strip_domain_list选项设置去掉FQND名字中的域名。
9. 同Nagios的集成
9.1 Nagios Passive Servie Checks
被动检查允许Nagios处理由外部程序提交的检查结果。使用SNMPTT的EXEC声明,接收到的trap可以通过Nagios的submit_check_result脚本船体给Nagios。一旦Nagios收到,trap将会被记录日志,发邮件等。
所有的主机使用一个SNMPTT服务定义,你在Nagios console上只能看到收到的最后一个trap。每一个trap都被记录日志,发邮件等,但是只能在console上看到最后一个trap的告警或critical状态。
9.2 Nagios Volatile Services
收到SNMPTT转换的trap,当为这个定义了服务,服务必须定义为volatile。当一个服务的状态从OK变为non-OK,则联系人被通知。一般的,Nagios的一个服务,没有定义volatile,意味着,另一个服务检查被执行了,状态仍然为non-OK, 那么联系人不会被通知。因为这里为SNMP traps只定义一个服务条目,我们需要确保每次收到trap,我们都被通知。
9.3 创建Nagios服务条目
如下是一个Nagios服务条目
define service{ Description
host_name server01 Name of host
service_description TRAP Name of service. What you use here must match the same value for the submit_check_result script
is_volatile 1 Enables volatile services
check_command check-host-alive Used to reset the status to OK when 'Schedule an immediate check of this service' is selected.
max_check_attempts 1 Leave as 1.
normal_check_interval 1 Leave as 1.
retry_check_interval 1 Leave as 1.
active_checks_enabled 0 Prevent active checks from occuring as we are only using passive checks.
passive_checks_enabled 1 Enables passive checks
check_period 24x7 Required for freshness checking.
notification_interval 31536000 Notification interval. Set to a very high number to prevent you from getting pages of previously received traps (1 year - restart Nagios at least once a year! - do not set to 0!).
notification_period 24x7 When you can be notified. Can be changed
notification_options w,u,c Notify on warning, unknown and critical. Recovery is not enabled so we do not get notified when a trap is cleared.
notifications_enabled 1 Enable notifications
contact_groups cg_core Name of contact group to notify
}
9.4 Creating the SNMPTT EXEC statement
Nagios应该包含了脚本submit_check_result在contrib/eventhandlers目录。在libexec下(/usr/local/nagios/libexec)创建一个eventhandlers目录,拷贝submit_check_result脚本到这个目录中,并加上可执行权限(chmod a+x submit_check_result)
submit_check_result脚本需要如下参数:
host_name
svc_description
return_code
plugin_output
返会代码如下:0=OK, 1=WARNING, 2=CRITICAL, -1=UNKNOWN.
在snmptt.conf文件中,为每一个EVENT创建一条EXEC声明:
EXEC /usr/local/nagios/libexec/eventhandlers/submit_check_result $r TRAP 1 "xxxxxx"
“xxxxxx”是trap的文本,可以使用FORMAT声明,例如:
EXEC /usr/local/nagios/libexec/eventhandlers/submit_check_result $r TRAP 1 "Drive $1 in bay $2 has failed"
9.5 在Nagios中清除收到的traps
使用上面的配置,一旦收到某主机的trap,它将保持WARNING状态。为了从Nagios console中清除trap,打开TRAP服务,单击’Schedule an immediate check of this service’. 这将导致定义的服务检查被运行(check-host-alive),然后状态变为OK,warning被清除。
另外一种选择是使用check-host-alive创建一条新的命令,叫做reset-trap:
#!/bin/sh
/bin/echo "OK: No recent traps received"
exit 0
在你的 *commands.cfg中添加这条命令的定义。
Nagios2.0引入了服务结果和主机结果的freshness 检查。服务的freshness检查可以用来自动重置trap通知的告警为OK状态,这个需要在服务定义中添加check_freshness和freshness_threshold。推荐使用freshness检查,因为当服务状态改变时,normal_check_interval所引起的下一次检查时间没有变。对于freshness检查,检查命令会在最后一次被动检查后的freshness_threshold秒后运行
要使freshness检查启动,需要normal_check_interval为1,valid check_period 设置为24x7,并添加如下的定义:
check_freshness 1 Enable freshness checking
freshness_threshold 86400 Reset trap alert every 24 hours.