• Sy chevron_right

      Правка service-файла snmptrapd

      noreply@blogger.com (morbo) · pubsub.slavino.sk / sysadmblog · Sunday, 2 August, 2020 - 08:00 edit · 1 minute

    После обновления на одном из серверов 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, как и было до этого.

    Značky: #debian, #linux, #snmp, #stretch, #systemd, #Linux

    • Sy chevron_right

      Отключение сообщений об ошибках на стандартный ввод-вывод в net-snmp

      noreply@blogger.com (morbo) · pubsub.slavino.sk / sysadmblog · Sunday, 26 July, 2020 - 08:00 edit

    Есть у меня один скрипт на Python, использующий привязки к библиотеке Net-SNMP. Скрипт отмечает результаты своей работы в базе данных и выводит сообщения об ошибках только при каких-то совсем уж неожиданных ошибках, например, при отсутствии связи с этой базой данных. Если же скрипт отработал шататно, он не должен выводить никаких сообщений. Поскольку сркипт регулярно запускался через планировщик задач cron, то при ошибках весь вывод скрипта отправлялся мне по почте. В общем, всё как обычно.

    Раньше скрипт выполнял запросы только по протоколам SNMP первой и второй версии. Когда же в сети появились устройства, доступные только по протоколу SNMP третьей версии, скрипт начал выводить ошибки такого вида:
    Authentication failed for backup
    backup - это имя пользователя SNMPv3, под которым не удавалось выполнить SNMP-запросы.

    Поскольку скрипт анализирует результаты запросов SNMP, то эти диагностические сообщение лишь засоряют вывод скрипта. Как оказалось, эти сообщения выводит сама библиотека Net-SNMP и я не нашёл никаких способов для того, чтобы их отключить, например, через конфигурацию /etc/snmp/snmp.conf. Чтобы отключить эти сообщения, потребуется поправить исходный текст библиотеки. Скачаем и распакуем пакет с исходными текстами net-snmp:
    $ apt-get source net-snmp
    Наши правки к исходному коду оформим в виде заплатки при помощи инструмента quilt, подробнее о котором я писал в заметке Использование quilt для подготовки заплат . Создадим новую заплатку:
    $ quilt new removed-redundant-log-message
    Добавим в будущую заплатку файл:
    $ quilt add snmplib/snmpusm.c
    Открываем файл snmplib/snmpusm.c в текстовом редакторе, находим и удаляем две строчки с вызовом функции snmp_log:
                snmp_log(LOG_WARNING, "Authentication failed for %s\n",
    user->name);
    В этом же файле при подобных ошибках функции snmp_log не вызываются и это единственный вызов snmp_log в этом файле. Скорее всего этот вызов функции был оставлен по ошибке, а не удалён вместе с другими подобными вызовами.

    Чтобы изменения в файле snmplib/snmpusm.c попали в заплатку, обновляем заплатку:
    $ quilt refresh
    Можно прокомментировать сделанные в пакете изменения и изменить версию пакета:
    $ dch -i
    В запустившемся редакторе описываем последние изменения:
    net-snmp (5.7.3+dfsg-5-stupin1) UNRELEASED; urgency=medium

    * Fixed SNMPv3 time widnow logic to work with D-Link switches
    * Removed redundant log message "Authentication failed from"

    -- Vladimir Stupin <vladimir@stupin.su> Fri, 15 May 2020 16:01:26 +0500
    Теперь можно пересобрать deb-пакеты, выполнив команду:
    $ debuild -us -uc
    В вышестоящем каталоге появятся готовые deb-пакеты, которые можно установить в систему командой dpkg -i или поместить в репозиторий пакетов при помощи aptly. Почитать об использовании aptly можно в другой моей заметке Создание своего репозитория Debian при помощи aptly .

    После установки исправлений надоедливые сообщения об ошибках пропали.

    Značky: #buster, #debian, #linux, #snmp, #Linux