Toon posts:

SNMP: extenden op de "nieuwe" manier

Pagina: 1
Acties:

Verwijderd

Topicstarter
Al jaren maak ik gebruik van net-snmp om servers te monitoren. Vooral extenden vind ik dan erg leuk, omdat je de meest vreemde dingen kunt monitoren door een eenvoudig shell scriptje te gebruiken. Zoals ingelogde gebruikers, de leeftijd van je antivirus updates (oftewel: is de update gelukt), de leeftijd van je backups, het aantal neighbours op je netwerk en zo voort.

Dat ging dan als bijv:
code:
1
$ date +%s > /timestamp

snmpd.conf
code:
1
sh .1.3.6.1.4.1.2021.52 age echo $((`date +%s` - `cat /timestamp`))

En opvragen als:
code:
1
2
3
4
5
6
7
8
$ snmpwalk -On  -c public -v 1 localhost .1.3.6.1.4.1.2021.51
.1.3.6.1.4.1.2021.51.1.1 = INTEGER: 1
.1.3.6.1.4.1.2021.51.2.1 = STRING: "age"
.1.3.6.1.4.1.2021.51.3.1 = STRING: "echo $((`date +%s` - `cat /timestamp`))"
.1.3.6.1.4.1.2021.51.100.1 = INTEGER: 0
.1.3.6.1.4.1.2021.51.101.1 = STRING: "16"
.1.3.6.1.4.1.2021.51.102.1 = INTEGER: 0
.1.3.6.1.4.1.2021.51.103.1 = ""

Echt perfecto, ik weet altijd waar de resultaten komen, namelijk in
oid.100.1 = shell exit code
oid.101.1 = output, regel 1
oid.102.1 = output, regel 2
oid.103.1 = output, regel 3

Noodgedwongen heb ik afgelopen week een server moeten updaten naar een distro waar 5.4rc2 bij zit. Deze ondersteunt opeens deze syntax niet meer. Dit wordt nu
code:
1
extend .1.3.6.1.4.1.2021.51 age /bin/sh /etc/snmp/libexec/shellscript

Ten eerste wordt er standaard geen shell meer aangeroepen, waardoor sh-specifieke dingen als backticks niet kunnen. Maar dat is geen probleem, maken we toch een shell scriptje aan. Vervelender is dat door deze syntax het opeens compleet onvoorspelbaar is geworden onder welke OID een resultaat terug komt.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ snmpwalk -On  -c public -v 1 localhost .1.3.6.1.4.1.2021.51
.1.3.6.1.4.1.2021.51.1.0 = INTEGER: 1
.1.3.6.1.4.1.2021.51.2.1.2.7.118.101.114.115.105.101.49 = STRING: "/bin/sh"
.1.3.6.1.4.1.2021.51.2.1.3.7.118.101.114.115.105.101.49 = STRING: "/etc/snmp/libexec/shellscript"
.1.3.6.1.4.1.2021.51.2.1.4.7.118.101.114.115.105.101.49 = ""
.1.3.6.1.4.1.2021.51.2.1.5.7.118.101.114.115.105.101.49 = INTEGER: 5
.1.3.6.1.4.1.2021.51.2.1.6.7.118.101.114.115.105.101.49 = INTEGER: 1
.1.3.6.1.4.1.2021.51.2.1.7.7.118.101.114.115.105.101.49 = INTEGER: 1
.1.3.6.1.4.1.2021.51.2.1.20.7.118.101.114.115.105.101.49 = INTEGER: 4
.1.3.6.1.4.1.2021.51.2.1.21.7.118.101.114.115.105.101.49 = INTEGER: 1
.1.3.6.1.4.1.2021.51.3.1.1.7.118.101.114.115.105.101.49 = STRING: "16"
.1.3.6.1.4.1.2021.51.3.1.2.7.118.101.114.115.105.101.49 = STRING: "16"
.1.3.6.1.4.1.2021.51.3.1.3.7.118.101.114.115.105.101.49 = INTEGER: 1
.1.3.6.1.4.1.2021.51.3.1.4.7.118.101.114.115.105.101.49 = INTEGER: 0
.1.3.6.1.4.1.2021.51.4.1.2.7.118.101.114.115.105.101.49.1 = STRING: "16"

Het resultaatgetal, 16, staat in bovenstaande lijst 3x. Welke moet ik nu nemen? En waarom verandert het oid rustig als ik een wijziging maak op een andere regel?

Ik wil gewoon just as usual zelf kunnen bepalen op welk oid een item uitkomt en dat er niet 11(!) getallen achter worden geplakt die me niets zeggen en die at random lijken te veranderen. Zo kan je toch niets monitoren? Who can help me out?

Verwijderd

Topicstarter
Nou... helaas, niemand wist een oplossing. Maar ik heb ook niet stilgezeten. Het resultaat (ter verrijking van de knowledge-base):

snmpd.conf:
code:
1
pass .1.3.6.1.4.1.2021.255 /etc/snmp/pass.sh .1.3.6.1.4.1.2021.255


/etc/snmp/pass.sh:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash

if [ "$3" == "" ]; then
        echo "Usage: $0 <base_oid> <request_type> <oid>"
        echo "Script should be run by net-snmp"
        exit 1
fi

base=$1
reqtype=$2
oid=$3

if [ "$reqtype" == "-n" ]; then
        newoid=""
        case "$oid" in
                $base)
                        newoid=$base.0
                ;;
                $base.0)
                        newoid=$base.1
                ;;
        esac
        oid=$newoid
fi

case "$oid" in
        $base)
                #Deze zou nooit moeten gebeuren
                echo -e "$oid\ninteger\n123"
        ;;
        $base".0")
                echo -e "$oid\ninteger\n456"
        ;;
        $base".1")
                echo -e "$oid\ninteger\n789"
        ;;
esac


En vervolgens:
snmpwalk -On -c public -v 1 localhost .1.3.6.1.4.1.2021.255
code:
1
2
.1.3.6.1.4.1.2021.255.0 = INTEGER: 456
.1.3.6.1.4.1.2021.255.1 = INTEGER: 789