После обновления на одном из серверов Debian Wheezy до Debian Stretch перестала работать обработка трапов демоном snmptrapd. Как выяснилось, проблема была в том, что snmptrapd был запущен не с теми опциями, которые были указаны в файле с его настройками. В файле /etc/default/snmptrapd была указана переменная с опциями:
TRAPDOPTS='-Lf /dev/null -n -t -Oqnet'
Реально же демон snmptrapd запускался с опциями -Lsd -f
Из-за этого в скрипт обработки трапов OID'ы попадали в символьном виде:
SNMPv2-SMI::enterprises.1332.3.1.1.4.5.0
А скрипт был расчитан на обработку OID'ов в числовом виде:
.1.3.6.1.4.1.1332.3.1.1.4.5.0
После обновления операционной системы на сервере с Debian Wheezy до Debian Stretch, в нём поменялась система инициализации с System V Init на Systemd.
В комплекте с Systemd поставляется такой service-файл /lib/systemd/system/snmptrapd.service для запуска snmptrapd:
[Unit] Description=Simple Network Management Protocol (SNMP) Trap Daemon. After=network.target ConditionPathExists=/etc/snmp/snmptrapd.conf [Service] Environment="MIBSDIR=/usr/share/snmp/mibs:/usr/share/snmp/mibs/iana:/usr/share/snmp/mibs/ietf:/usr/share/mibs/site:/usr/share/snmp/mibs:/usr/share/mibs/iana:/usr/share/mibs/ietf:/usr/share/mibs/netsnmp" Type=simple ExecStart=/usr/sbin/snmptrapd -Lsd -f ExecReload=/bin/kill -HUP $MAINPID [Install] WantedBy=multi-user.target
Как видно, опции, с которыми должен запускаться snmptrapd, в нём прошиты жёстко, а не берутся из файла /etc/default/snmptrapd.
Создал вместо этого стандартного service-файла свой собственный файл /etc/systemd/system/snmptrapd.service со следующим содержимым:
[Unit] Description=Simple Network Management Protocol (SNMP) Trap Daemon. After=network.target ConditionPathExists=/etc/snmp/snmptrapd.conf [Service] Environment="MIBSDIR=/usr/share/snmp/mibs:/usr/share/snmp/mibs/iana:/usr/share/snmp/mibs/ietf:/usr/share/mibs/site:/usr/share/snmp/mibs:/usr/share/mibs/iana:/usr/share/mibs/ietf:/usr/share/mibs/netsnmp" EnvironmentFile=/etc/default/snmptrapd Type=simple ExecStart=/usr/sbin/snmptrapd $TRAPDOPTS -f ExecReload=/bin/kill -HUP $MAINPID [Install] WantedBy=multi-user.target
Чтобы о новом service-файле узнал systemd, нужно выполнить следующую команду:
# systemctl daemon-reload
А чтобы демон snmptrapd запустился с новыми опциями, нужно его перезапустить:
# systemctl restart snmptrapd
Теперь опции для snmptrapd стали браться из файла /etc/default/snmptrapd, как и было до этого.