Raspberry Pi / Rasbian und SNMP

Aus FHEMWiki


Clock - Under Construction.svg An dieser Seite wird momentan noch gearbeitet.


Raspberry Pi / Rasbian und SNMP (IN ARBEIT)

Dieses Howto beschreibt die Installation des SNMP Daemons und der SNMP Tools am Raspberry Pi.

Weiters wird beschrieben, wie man SNMP konfiguriert, um damit einen laufenden Prozess zu überwachen und bei Bedarf neu zu starten. Auch ein kompletter Neustart des Mini-Rechners über SNMP wird hier gezeigt.

Einleitung

Das SNMP (Simple Network Management Protocol) läuft über das verbindungslose UDP Protokoll Port 161(SNMP) und Port 162(TRAP) und wurde entwickelt, um Netzwerkgeräte entfernt zu überwachen und zu steuern.

Installation Debian/Rasbian und MIBS laden

Wenn man nicht als root unterwegs ist, muss noch ein sudo bei jedem Befehl vorangestellt werden.

apt-get install snmpd snmp snmp-mibs-downloader

Sollten die MIB's (Management Information Base) nicht automatisch geladen werden, wird der Download initiert.

download-mibs 

SNMPD Konfiguration

Zuerst werden Einstellungen wie Systemname, Systemadmin usw.. gemacht.

Datei: /etc/snmp/snmpd.conf

###############################################################################
#
#  AGENT BEHAVIOUR
#
#  Listen for connections from the local system only
# agentAddress  udp:127.0.0.1:161
#  Listen for connections on all interfaces (both IPv4 *and* IPv6)
# agentAddress udp:161,udp6:[::1]:161
agentAddress udp:161

###############################################################################
#
#  SYSTEM INFORMATION
#
#  Note that setting these values here, results in the corresponding MIB objects being 'read-only'
#  See snmpd.conf(5) for more details
sysLocation    Haus1-Heizkeller
sysContact     Administrator meinemail@gmail.com

# Application + End-to-End layers
sysServices    72

Erklärung: Wichtig ist agentAddress. Wird nur udp:161 angegeben, ist der Zugriff von jeder IP aus möglich.

SNMPD Prozessüberwachung

Konfiguration in Datei /etc/snmp/snmpd.conf

          # readonly community
rocommunity public     

          # write from 192.168.x.x subnets
rwcommunity writesecret       192.168.0.0/16 

          # write from localhost
rwcommunity writesecret       localhost         

#  Process Monitoring
#
#  init process dummy for reboot
proc  init                
procfix init /usr/bin/sudo /sbin/reboot

#  process ser2net / at least one   process
proc  ser2net                     
procfix ser2net  /usr/bin/sudo  /etc/init.d/ser2net restart  

Erklärung: Diese Infos beziehen sich auf die Protokoll Version 1 und 2c.

  • rocommunity = Name für den Zugriff im "Nur Lesemodus". Wird sonst nichts angegeben, ist der Zugriff von jeder IP aus möglich.
  • rwcommunity = Name für den "Schreibzugriff". Hier sind 2 Einträge vorhanden. 192.168.0.0/16 erlaubt das Schreiben von jeder IP, die mit 192.168 anfängt. Die 2. Zeile localhost erlaubt das auch dem Rechner selbst.
  • proc = Prozessname wie er mit der Befehlszeile ps -aux angezeigt wird.
  • procfix = Befehl der ausgeführt wird, wenn auf die dazugehörige OID (Object Identifier) schreibend zugegriffen wird.

Sudo Rechtevergabe

Wird procfix verwendet, muß noch diese Einstellung gemacht werden.

Konfiguration in Datei /etc/sudoers

Eine Zeile wie folgt hinzufügen.

### for snmp procfix scripts as root
snmp ALL=(ALL) NOPASSWD: ALL 

Erklärung: Der SNMP Dienst läuft auf Rasbian standardmäßig unter dem user:snmp und group:snmp.

Dieser User darf keine Prozesse starten oder beenden und schon gar nicht den gesamten Rechner neu starten.

Um das zu ermöglichen, müssen dem Benutzer snmp root Rechte per sudo vergeben werden. Dazu ist der gezeigte Eintrag nowendig.

Nach jeder Änderung muss zum Aktivieren der Einstellung der snmpd-Dienst neu gestartet werden.

service snmpd restart 

SNMP Client - Verwendung von OID-Namen aktivieren

Um OID Namen statt der kryptischen 1.3.x.x.x.x. Nummern zu verwenden ist noch dieser Schritt nötig.

Aus-Kommentieren mibs : in Datei /etc/snmp/snmp.conf

#
# As the snmp packages come without MIB files due to license reasons, loading
# of MIBs is disabled by default. If you added the MIBs you can reenable
# loaging them by commenting out the following line.

#### mibs :   


SNMP Befehle

Nach einem abschliessenden Neustart des snmpd-Daemons mit service snmpd restart können auf dem lokalen Rechner snmpwalk und snmpget Befehle eingeben werden.

Der genaue Syntax kann auf der Konsole mit man <Befehl> angezeigt werden.

snmpwalk
Lesender Zugriff auf SNMP Variblen mit allen im Baum darunter liegenden Werten.
snmpget
Lesender Zugriff auf nur einen einzigen Wert.
snmpwrite
Schreibender Zugriff auf einen Wert.

Mit snmpget sehen wir uns nun Werte zu dem System an.

root@fhem1:~# snmpget -v1 -c public localhost   .1.3.6.1.2.1.1.4.0
SNMPv2-MIB::sysContact.0 = STRING: Administrator meinemail@gmail.com

root@fhem1:~# snmpget -v2c -c public localhost  .1.3.6.1.2.1.1.6.0
SNMPv2-MIB::sysLocation.0 = STRING: Haus1-Heizkeller



root@fhem1:~# snmpget -v1 -c public -On localhost  .1.3.6.1.2.1.1.4.0
.1.3.6.1.2.1.1.4.0 = STRING: Administrator meinemail@gmail.com

root@fhem1:~# snmpget -v1 -c public -On localhost  .1.3.6.1.2.1.1.6.0
.1.3.6.1.2.1.1.6.0 = STRING: Haus1-Heizkeller
 

Erklärung: Hier sehen wir unsere in der beschriebenen Konfiguration eingetragenen Werte.

snmpget
-v1 = SNMP Version 1
-v2 = SNMP Version 2
-c public = Zugriff mit dem Namen public - meistens wird dieser Name für "Nur-Lese" Zugriff verwendet.
-0n = Ausgabe der OID-Zahlenwerte anstatt der MIB-Namen
localhost = Zugriff auf den lokalen Rechner. Hier die IP des Rechners einsetzen, wenn remote abgefragt werden soll.
.1.3.6.1.2.1.1.4.0 = OID mit dem Wert

Mit snmpwalk sehen wir uns den gesamten Baum eines Wertes an.

root@fhem1:~# snmpwalk -v1 -c public -On localhost .1.3.6.1.2.1.1
.1.3.6.1.2.1.1.1.0 = STRING: Linux fhem1.local 3.18.9+ #768 PREEMPT Sun Mar 15 18:59:03 GMT 2015 armv6l
.1.3.6.1.2.1.1.2.0 = OID: .1.3.6.1.4.1.8072.3.2.10
.1.3.6.1.2.1.1.3.0 = Timeticks: (292649) 0:48:46.49
.1.3.6.1.2.1.1.4.0 = STRING: Administrator meinemail@gmail.com
.1.3.6.1.2.1.1.5.0 = STRING: fhem1.local
.1.3.6.1.2.1.1.6.0 = STRING: Haus1-Heizkeller
.1.3.6.1.2.1.1.7.0 = INTEGER: 72
.1.3.6.1.2.1.1.8.0 = Timeticks: (7) 0:00:00.07
.1.3.6.1.2.1.1.9.1.2.1 = OID: .1.3.6.1.6.3.10.3.1.1
.1.3.6.1.2.1.1.9.1.2.2 = OID: .1.3.6.1.6.3.11.3.1.1
.1.3.6.1.2.1.1.9.1.2.3 = OID: .1.3.6.1.6.3.15.2.1.1
.1.3.6.1.2.1.1.9.1.2.4 = OID: .1.3.6.1.6.3.1
.1.3.6.1.2.1.1.9.1.2.5 = OID: .1.3.6.1.2.1.49
.1.3.6.1.2.1.1.9.1.2.6 = OID: .1.3.6.1.2.1.4
.1.3.6.1.2.1.1.9.1.2.7 = OID: .1.3.6.1.2.1.50
.1.3.6.1.2.1.1.9.1.2.8 = OID: .1.3.6.1.6.3.16.2.2.1
.1.3.6.1.2.1.1.9.1.3.1 = STRING: The SNMP Management Architecture MIB.
.1.3.6.1.2.1.1.9.1.3.2 = STRING: The MIB for Message Processing and Dispatching.
.1.3.6.1.2.1.1.9.1.3.3 = STRING: The management information definitions for the SNMP User-based Security Model.
.1.3.6.1.2.1.1.9.1.3.4 = STRING: The MIB module for SNMPv2 entities
.1.3.6.1.2.1.1.9.1.3.5 = STRING: The MIB module for managing TCP implementations
.1.3.6.1.2.1.1.9.1.3.6 = STRING: The MIB module for managing IP and ICMP implementations
.1.3.6.1.2.1.1.9.1.3.7 = STRING: The MIB module for managing UDP implementations
.1.3.6.1.2.1.1.9.1.3.8 = STRING: View-based Access Control Model for SNMP.
.1.3.6.1.2.1.1.9.1.4.1 = Timeticks: (5) 0:00:00.05
.1.3.6.1.2.1.1.9.1.4.2 = Timeticks: (5) 0:00:00.05
.1.3.6.1.2.1.1.9.1.4.3 = Timeticks: (5) 0:00:00.05
.1.3.6.1.2.1.1.9.1.4.4 = Timeticks: (6) 0:00:00.06
.1.3.6.1.2.1.1.9.1.4.5 = Timeticks: (6) 0:00:00.06
.1.3.6.1.2.1.1.9.1.4.6 = Timeticks: (6) 0:00:00.06
.1.3.6.1.2.1.1.9.1.4.7 = Timeticks: (6) 0:00:00.06
.1.3.6.1.2.1.1.9.1.4.8 = Timeticks: (7) 0:00:00.07
 

Einige nützliche OIDs. Wenn der Parameter -On weg gelassen wird, ist der Wert "Human Readable".

Filesysteme
snmpwalk -v2c -c public -On localhost .1.3.6.1.2.1.25.2.3
snmpwalk -v2c -c public localhost .1.3.6.1.2.1.25.2.3
Systeminfo
snmpget -v2c -c public localhost .1.3.6.1.2.1.1.1.0
snmpget -v1 -c public localhost .1.3.6.1.2.1.1.4.0
snmpget -v1 -c public localhost .1.3.6.1.2.1.1.6.0
Uptime
snmpget -v1 -c public localhost .1.3.6.1.2.1.25.1.1.0
Netzwerk Daten / Transfer
snmpwalk -v2c -c public localhost .1.3.6.1.2.1.2.2.1
snmpwalk -v2c -c public -On localhost .1.3.6.1.2.1.2.2.1
Prozesse
snmpwalk -v1 -c public localhost .1.3.6.1.2.1.25.4.2.1

Prozesse neu starten / Reboot Raspi über SNMP

Um auf Ereignisse der überwachten Prozesse zu reagieren, fragen wir die Daten wie folgt ab. Wie schon unter #SNMPD Prozessüberwachung beschrieben, bekommt man mit dem zusätzlichen Parameter -On die OIDs angezeigt.

snmpwalk -v2c -c public localhost .1.3.6.1.4.1.2021.2.1

 
root@fhem1:~# snmpwalk -v2c -c public localhost .1.3.6.1.4.1.2021.2.1
UCD-SNMP-MIB::prIndex.1 = INTEGER: 1
UCD-SNMP-MIB::prIndex.2 = INTEGER: 2
UCD-SNMP-MIB::prNames.1 = STRING: init
UCD-SNMP-MIB::prNames.2 = STRING: ser2net                <- Das ist der Prozess (ID .2)
UCD-SNMP-MIB::prMin.1 = INTEGER: 0
UCD-SNMP-MIB::prMin.2 = INTEGER: 0
UCD-SNMP-MIB::prMax.1 = INTEGER: 0
UCD-SNMP-MIB::prMax.2 = INTEGER: 0
UCD-SNMP-MIB::prCount.1 = INTEGER: 1
UCD-SNMP-MIB::prCount.2 = INTEGER: 1
UCD-SNMP-MIB::prErrorFlag.1 = INTEGER: noError(0)
UCD-SNMP-MIB::prErrorFlag.2 = INTEGER: noError(0)        <- Das ist der Status (0=Prozess läuft)
UCD-SNMP-MIB::prErrMessage.1 = STRING:
UCD-SNMP-MIB::prErrMessage.2 = STRING:
UCD-SNMP-MIB::prErrFix.1 = INTEGER: noError(0)
UCD-SNMP-MIB::prErrFix.2 = INTEGER: noError(0)
UCD-SNMP-MIB::prErrFixCmd.1 = STRING: /usr/bin/sudo  /sbin/reboot
UCD-SNMP-MIB::prErrFixCmd.2 = STRING: /usr/bin/sudo  /etc/init.d/ser2net restart     <- Damit wird der daemon neu gestartet

# bereinigte Ausgabe
root@fhem1:~# snmpwalk -v2c -c public -On localhost .1.3.6.1.4.1.2021.2.1
.1.3.6.1.4.1.2021.2.1.2.1 = STRING: init
.1.3.6.1.4.1.2021.2.1.2.2 = STRING: ser2net
.....
.1.3.6.1.4.1.2021.2.1.100.1 = INTEGER: noError(0)
.1.3.6.1.4.1.2021.2.1.100.2 = INTEGER: noError(0)     <- Das ist der Status von ser2net (ID .2 = 2. zu überwachender Prozess in der snmpd.conf)
.....
.1.3.6.1.4.1.2021.2.1.102.1 = INTEGER: noError(0)
.1.3.6.1.4.1.2021.2.1.102.2 = INTEGER: noError(0)     <- Hierher wird der Wert 1 geschrieben, um den Befehl auszulösen
.1.3.6.1.4.1.2021.2.1.103.1 = STRING: /usr/bin/sudo  /sbin/reboot
.1.3.6.1.4.1.2021.2.1.103.2 = STRING: /usr/bin/sudo  /etc/init.d/ser2net restart
 

Dienst ser2net neu starten

Um nun den Status des Prozesses ser2net, welcher in /etc/snmp/snmpd.conf unter proc eingetragen ist, abzufragen, gilt folgendes Kommando. Mit dem Parameter -OvQw bekommt man nur den Wert!

root@fhem1:~# snmpget -v2c -c public localhost .1.3.6.1.4.1.2021.2.1.100.2
UCD-SNMP-MIB::prErrorFlag.2 = INTEGER: noError(0)

root@fhem1:~# snmpget -v2c -c public -OvQe localhost .1.3.6.1.4.1.2021.2.1.100.2
0 

Zum Auslösen des procfix Befehles für ser2net wird der Wert 1 in die OID .1.3.6.1.4.1.2021.2.1.102.2 geschrieben. In dem gezeigten Fall wird /usr/bin/sudo /etc/init.d/ser2net restart ausgeführt.

root@fhem1:~# snmpset -v2c -c writesecret localhost .1.3.6.1.4.1.2021.2.1.102.2 i 1
UCD-SNMP-MIB::prErrFix.2 = INTEGER: runFix(1) 

Wenn man nun den Dienst entfernt neu starten möchte, geht das aus dem eigenen LAN ganz einfach. <LAN-IP-RPI> wird z.b durch lokale IP 192.168.0.160 vom Raspberry ersetzt.

snmpset -v2c -c writesecret <LAN-IP-RPI> .1.3.6.1.4.1.2021.2.1.102.2 i 1

Rechner neu starten

Weiters wurde in dem Beispiel noch ein Prozess zur Überwachung definiert. Der erste konfigurierte proc lautet init und der dazu passende procfix wurde mit /usr/bin/sudo /sbin/reboot eingestellt.

Damit wird der Rechner neu gestartet, wenn man die Zahl 1 per snmpwrite in die passende OID schreibt.

... In Arbeit .... ... to be continued ....

Raspberry Pi

https://sites.google.com/site/ghidit/how-to-2/using-snmp-as-a-process-watchdog