Chci přes snmp získávat hodnoty, které generuje nějaký můj skript nebo mi je běžný snmp MIB neumožňuje (např. teploměr na sériovém portu, nabití UPS, …). FreeBSD ve výchozím stavu používá bsnmp (jestli si dobře pamatuju, je to od verze 6.0, do té doby bylo možné ho nainstalovat z portů). Tento démon sám o sobě takovou věc nepodporuje, ale po doinstalování portu bsnmp-ucd (modul do bsnmpd) už je toto možné.
Samozřejmě můžete jako snmp démona použít např. net-snmpd, které stejnou věc také asi zvládne, ale při používání bsnmpd jsem narazil na některé jeho výhody. Nemusím ho instalovat, protože je součástí systému, umožňuje například monitorovat síťový provoz na tun/tap interface a např. při přidání VLANu není nutné démona restartovat. Toto net-snmp nezvládal. V současné verzi BSD (9.0) podporuje snmp v3, dříve pouze nižší verze protokolu.
Instalace modulu:
cd /usr/ports/net-mgmt/bsnmp-ucd
make install clean
Do /etc/snmpd.config stačí přidat na konec:
begemotSnmpdModulePath.„ucd“ = „/usr/local/lib/snmp_ucd.so“
%ucd
extNames.0 = „pocet procesu“
extCommand.0 = „ps ax | wc -l“
extNames.1 = „teplota“
extCommand.1 = „/usr/local/bin/teplomer.sh“
A restart bsnmpd:
/etc/rc.d/bsnmpd restart
V číslování názvů a příkazů nesmí být mezery. Naše výsledky najdeme zde UCD-SNMP-MIB::extTable.
snmpwalk -v2c -On -c public 127.0.0.1 UCD-SNMP-MIB::extTable
…
.1.3.6.1.4.1.2021.8.1.2.0 = STRING: pocet procesu
…
.1.3.6.1.4.1.2021.8.1.101.0 = STRING: 118
…
.1.3.6.1.4.1.2021.8.1.102.0 = INTEGER: noError(0)
Jak vidíte, bsnmpd umí ještě něco navíc. Ukládá i návratovou hodnotu externího příkazu, kterou též můžeme zjistit. Pokud je hodnota navíc nenulová, může démon spustit námi definovanou událost (více v man bsnmp-ucd):
extNames.1 = „apache“
extCommand.1 = „/usr/local/etc/rc.d/apache status“
extErrFix.1 = 1
extErrFixCmd.1 = „/usr/local/etc/rc.d/apache restart“
Externí příkazy jsou spouštěné periodicky, pokud chcete interval změnit, upravte si hodnotu v souboru /usr/ports/net-mgmt/bnsm-ucd/work/bsnm-ucd-{verze}/snmp-ucd.h:
#define EXT_UPDATE_INTERVAL 3000 /* ext commands rerun interval in ticks */
#define EXT_TIMEOUT 60 /* ext commands execution timeout interval in secs */
a znovu zkompilujte a nainstalujte modul:
cd /usr/ports/net-mgmt/bsnmp-ucd
make deinstall clean install
a opět restart démona.
Monitoruji několik desítek externích hodnot a funguje to bez problémů, ani při chybě skriptů nebo příliš dlouhé době běhu démon nepadá.
Unix (FreeBSD), Linux (Ubuntu), PHP, MySQL, OpenVPN, IPSec, …