====== Snmptt ======
Der SNMP Trap Translator nimmt den jew. Trap entgegen und sucht in seiner Konfigdatei nach einem entsprechenden "traphandle" (eine Datei mit den MIB-Informationen).
Somit lassen sich die OIDs aus den Traps in verständlichen Text einfach und schnell übersetzen.
===== Installation =====
Installiert werden müssen:
- snmp
- Net-SNMP
- snmptt
- snmptranslate
==== snmp ====
apt-get install libsnmp-base libconfig-inifiles-perl
==== net-snmp ====
perl -MCPAN -e shell
install Net-SNMP Text::ParseWords Getopt::Long Posix Config::IniFiles Time::HiRes Sys::Hostname File::Basename Text::Balanced Socket Sys::Syslog DBI DBD::mysql Net-SNMP snmptranslate Perl Module Digest::MD5
==== snmptt installieren ====
Installation mit dem Embedded Handler der nicht so viel overhead, beim erhalten von Traps, erzeugt.
**Zuletzt habe ich den normalen Handler benutzt, die embedded Version hat nicht funktioniert.**
=== Embedded Handler ===
Prüfen ob der snmptrapd Perlfähig ist.
snmptrapd -H 2>&1 | grep perl
Wenn die Ausgabe unteranderem folgendes ausspuckt, dann ist dies somit der Fall:
''perl PERLCODE''
Nun kann SNMPTT installiert werden.
cp /snmptt /usr/sbin
chmod +x snmptt
cp /snmptthandler-embedded /usr/sbin
cp /snmpttconvertmib /usr/sbin/
Es sollte noch ein eigener User und eine Gruppe angelegt werden, mit der der SNMPTT-Daemon läuft.
useradd snmptt
Nun kopiert man noch die SNMPTT-Konfigurationsdatei nach ''/etc/snmp'' und passt den Besitzer an:
cp /snmptt.ini /etc/snmp
chown snmptt.snmptt /etc/snmp/snmptt.ini
Die Ini-Datei kann evtl. auch in ''/etc'' kopiert werden.
Auf jeden Fall müssen die Einträge der "ini" angepasst werden.
Weiterhin benötigt man noch ein Spool-Verzeichnis.
mkdir /var/spool/snmptt
chown snmptt:snmptt /var/spool/snmptt
Zuletzt fügt man SNMPTT zum Init-Start hinzu, oder startet es einfach mittels ''snmptt --daemon''.
Das beigefügte Init-Script ist nicht ganz mit Ubuntu kompatibel, daher hier eine angepasste Version.
vi /etc/init.d/snmptt
Inhalt:
#!/bin/bash
# init file for snmptt
# Alex Burger - 08/29/02
# - 09/08/03 - Added snmptt.pid support to Stop function
# - 05/17/09 - Added LSB init keywords, change priority, add
# INIT INFO.
#! /bin/sh -e
### BEGIN INIT INFO
# Provides: snmptt
# Required-Start: $syslog $local_fs
# Required-Stop: $syslog $local_fs
# Required-Start: $network snmptrapd
# Required-Stop: $network snmptrapd
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: SNMP Trap Translator daemon
### END INIT INFO
set -e
# source function library
. /lib/lsb/init-functions
export PATH=/sbin:/usr/sbin:/bin:/usr/bin
OPTIONS="--daemon"
prog="snmptt"
# cd to / before starting any daemons.
cd /
case "$1" in
start)
log_daemon_msg "Starting SNMP Trap Translator daemon:"
start-stop-daemon --quiet --start --oknodo \
--exec /usr/sbin/snmptt -- $OPTIONS
touch /var/lock/snmptt
log_progress_msg " $prog"
;;
stop)
log_daemon_msg "Stopping SNMP Trap Translator daemon:"
start-stop-daemon --quiet --stop --oknodo --exec /usr/sbin/snmptt
rm -f /var/lock/snmptt
if test -f /var/run/snmptt.pid ; then
rm -f /var/run/snmptt.pid
fi
log_progress_msg " $prog"
;;
reload)
log_daemon_msg "Reloading SNMP Trap Translator daemon:"
start-stop-daemon --quiet --stop --signal 1 \
--pidfile /var/run/snmptt.pid --exec /usr/sbin/snmptt
log_progress_msg " $prog"
;;
status)
status=0
status_of_proc /usr/sbin/snmptt snmptt || status=$?
exit $status
;;
*)
echo "Usage: /etc/init.d/snmpd {start|stop|reload|status}"
exit 1
esac
exit 0
Danach nicht vergessen:
chmod a+x /etc/init.d/snmptt
update-rc.d snmptt defaults
Hier auch als Upstart-Script (einfach unter ''/etc/init/'' die Datei ''snmptt.conf'' anlegen und ausführbar machen):
# SNMPTT Daemon
#
#
description "SNMPTT Daemon"
start on filesystem or runlevel [2345]
stop on runlevel [!2345]
#respawn
#respawn limit 10 5
#umask 022
pre-start script
test -x /usr/sbin/snmptt || { stop; exit 0; }
test -e /etc/snmp/snmptt.ini || { stop; exit 0; }
test -e /etc/snmp/snmptt.conf || { stop; exit 0; }
test -c /dev/null || { stop; exit 0; }
end script
#post-stop script
# # clean up
# rm -rf /var/run/snmptt.pid
#end script
exec /usr/sbin/snmptt --daemon
=== snmptrapd aktivieren ===
vi /etc/default/snmpd
Hier folgende Zeile auf ''on'' setzen:
''TRAPDRUN=no''
service snmpd restart
===== Konfiguration =====
Nun können die folgenden Komponenten konfiguriert werden.
==== snmptrapd ====
vi /etc/snmp/snmptrapd.conf
Folgendes einfügen:
traphandle default /usr/sbin/snmptthandler-embedded
disableAuthorization yes
ignoreAuthFailure yes
Oder wenn man nur bestimmte Traps empfangen möchte, folgendes anstatt "disableAuthorization yes" und "ignoreAuthFailure yes" einfügen:
authCommunity TYPES COMMUNITY
authCommunity TYPES COMMUNITY
authCommunity TYPES COMMUNITY
Als Types können "log", "execute" und "net" verwendet werden.
Hier ein Beispiel:
authCommunity log,execute,net public
authCommunity log,execute,net hpprocurve
authCommunity log,execute,net netscreen
==== snmptt ====
vi /etc/snmp/snmptt.ini
Hier folgende Zeilen hinzufügen bzw. anpassen.
mode = daemon
daemon_fork = 1
daemon_uid = snmptt
spool_directory = /var/spool/snmptt/
sleep = 5
dns_enable = 0
strip_domain = 1
log_enable = 1
syslog_enable = 0
exec_enable = 1
snmptt_conf_files = << END
/etc/snmp/snmptt.conf
END
==== Nagios ====
Nachdem man nun die Grundvoraussetzungen für den Empfang von SNMPTraps geschaffen hat, muss nun noch Nagios diese als Passiven Check annehmen.
Weiterhin muss Nagios externe Kommandos annehmen **Konfigvariable in nagios.cfg: "check_external_commands=1"**
Da es ja vorkommen kann, dass ein Host mehr als einen Trap direkt nacheinander versendet, müssen die Checks, von Nagios, sofort mit dem Status "OK" bestätigt werden.
Dies erreicht man durch flüchtige Checks (Service Parameter: "is_volatile"). Durch solche flüchtigen Checks ist es somit möglich nacheinander kommende Traps zu verarbeiten.
Am besten legt man sich dafür eine Servicevorlage an, die nur die Anpassungen für SNMPTraps beinhaltet und ansonsten auf einer anderen Vorlage aufbaut, oder man weißt einem Host einfach mehrere Vorlagen zu.
define service{
name tpl-svc-snmp-traps
use
register 0
service_description SNMP_Traps Template
is_volatile 1
check_command check-host-alive ;Zum Zurücksetzen des Status auf "OK" (über "Re-schedule the next check of this host")
flap_detection_enabled 0
process_perf_data 0
max_check_attempts 1 ; auf "1" belassen
normal_check_interval 1 ; auf "1" belassen
retry_check_interval 1 ; auf "1" belassen
passive_checks_enabled 1 ; passive Checks aktivieren
check_period 24x7
notification_interval 31536000 ; Auf eine hohe Zahl setzen, um die Anzahl an alten Traps klein zu halten (nicht auf "0" setzen)
active_checks_enabled 0
notification_options w,u,c
contact_groups sysadmins
}
Nun noch einen Service anlegen, welcher einem oder mehreren Hosts zugewiesen ist.
define service{
host_name
use tpl-svc-default,tpl-svc-snmp-traps
service_description shows SNMP Traps
}
===== MIBs Konvertieren =====
Damit die ankommenden Traps lesbar in Nagios dargestellt werden können, muß man die OIDs mit dem jew. Anzeigetext verknüpfen.
Das kann man zwar auch manuell machen, aber wenn man SNMP-MIBs hat, konvertiert das Tool ''snmpttconvertmib'' diese.
snmpttconvertmib --in= --out=/etc/snmp/snmptt.conf. --exec='/usr/local/nagios/libexec/eventhandlers/submit_check_result $r 1'
Oder wenn man eine MIB-Sammlung in einer Verzeichnisstruktur hat folgender Befehl:
find -type f -exec snmpttconvertmib --in={} --out=/etc/snmp/snmptt.conf --exec='/usr/local/nagios/libexec/eventhandlers/submit_check_result $r 1' \;
Mögliche Parameter in der Exec-Zeile (Quelle: [[http://snmptt.sourceforge.net/docs/snmptt.shtml#SNMPTT.CONF-EXEC|sourceforge.net]])
^ Parameter ^ Beschreibung ^
| $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) |
**ACHTUNG:** Wenn dieses ein zweites Mal ausgeführt wird, fügt es die neuen oder auch vorhandenen MIBs in der Datei "snmptt.conf" unten an. Es werden somit vorhandene Einträge nicht überschrieben.
Auf der Seite [[http://wiki.monitoring-portal.org/snmptt/start?s[]=mib|wiki.monitoring-portal.org]] findet man auch schon konvertierte MIBs.
Hier noch eine Erklärung der syntax für den Befehl "submit_check_result" von der [[http://sourceforge.net/p/nagios/nagioscore/ci/master/tree/contrib/eventhandlers/submit_check_result|sourceforge.net]] Seite:
#!/bin/sh
# SUBMIT_CHECK_RESULT
# Written by Ethan Galstad (egalstad@nagios.org)
# Last Modified: 02-18-2002
#
# This script will write a command to the Nagios command
# file to cause Nagios to process a passive service check
# result. Note: This script is intended to be run on the
# same host that is running Nagios. If you want to
# submit passive check results from a remote machine, look
# at using the nsca addon.
#
# Arguments:
# $1 = host_name (Short name of host that the service is
# associated with)
# $2 = svc_description (Description of the service)
# $3 = return_code (An integer that determines the state
# of the service check, 0=OK, 1=WARNING, 2=CRITICAL,
# 3=UNKNOWN).
# $4 = plugin_output (A text string that should be used
# as the plugin output for the service check)
#
echocmd="/bin/echo"
CommandFile="/usr/local/nagios/var/rw/nagios.cmd"
# get the current date/time in seconds since UNIX epoch
datetime=`date +%s`
# create the command line to add to the command file
cmdline="[$datetime] PROCESS_SERVICE_CHECK_RESULT;$1;$2;$3;$4"
# append the command to the end of the command file
`$echocmd $cmdline >> $CommandFile`
===== Logging =====
==== SNMPTT ====
Damit der Daemon auch loggen kann, erstellt man sich ein eigenes Verzeichnis und die Log-Datei:
mkdir /var/log/snmptt
touch /var/log/snmptt/snmptt.log
chown snmptt /var/log/snmptt/snmptt.log
Weiterhin fügt man noch dem Log-Rotation die Konfigurationsdatei von SNMPTT hinzu.
cp /snmptt.logrotate /etc/logrotate.d/snmptt
==== SNMPTrapd ====
Manchmal ist es sinnvoll die eingehenden Traps die SNMPTrapd annimmt, einzusehen.
vi /etc/default/snmpd
Hier folgende Zeile hinzufügen bzw. anpassen:
TRAPDOPTS='-Lf /var/log/snmptrap.log'
===== Debug =====
Um SNMPTT zu debuggen, startet man diesen im Debug-Modus
snmptt --debug=1 --debugfile=/var/log/snmptt/snmptt-debug.log