Raspberry Pi / Rasbian und SNMP: Unterschied zwischen den Versionen
Pipp37 (Diskussion | Beiträge) |
Pipp37 (Diskussion | Beiträge) K (→Links) |
||
(29 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
{{Baustelle}} | {{Baustelle}} | ||
== Raspberry Pi / Rasbian und SNMP | == Raspberry Pi / Rasbian und SNMP == | ||
Dieses Howto beschreibt die Installation des SNMP Daemons und der SNMP Tools am '''Raspberry Pi'''. | Dieses Howto beschreibt die Installation des SNMP Daemons und der SNMP Tools am '''Raspberry Pi'''. | ||
Zeile 47: | Zeile 47: | ||
'''Erklärung:''' Wichtig ist ''agentAddress''. Wird nur ''udp:161'' angegeben, ist der Zugriff von jeder IP aus möglich. | '''Erklärung:''' Wichtig ist ''agentAddress''. Wird nur ''udp:161'' angegeben, ist der Zugriff von jeder IP aus möglich. | ||
== SNMPD Prozessüberwachung == | == SNMPD Community & Prozessüberwachung == | ||
Konfiguration in Datei /etc/snmp/snmpd.conf | Konfiguration in Datei /etc/snmp/snmpd.conf | ||
<nowiki> | <nowiki> | ||
Zeile 62: | Zeile 62: | ||
# | # | ||
# init process dummy for reboot | # init process dummy for reboot | ||
proc | proc init | ||
procfix init sudo /sbin/reboot | procfix init /usr/bin/sudo /sbin/reboot | ||
# process ser2net / at least one process | # process ser2net / at least one process | ||
proc | proc ser2net | ||
procfix ser2net /usr/bin/sudo /etc/init.d/ser2net restart </nowiki> | procfix ser2net /usr/bin/sudo /etc/init.d/ser2net restart </nowiki> | ||
Zeile 110: | Zeile 110: | ||
#### mibs : </nowiki> | #### mibs : </nowiki> | ||
== SNMP Befehle == | |||
Nach einem abschliessenden Neustart des snmpd-Daemons mit <code> service snmpd restart </code> können auf dem lokalen Rechner <code> snmpwalk </code> und <code> snmpget </code> Befehle eingeben werden. | |||
Der genaue Syntax kann auf der Konsole mit <code> man <Befehl> </code> 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 <code> snmpget </code> sehen wir uns nun Werte zu dem System an. | |||
<nowiki> | |||
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 | |||
</nowiki> | |||
'''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 <code> snmpwalk </code> sehen wir uns den gesamten Baum eines Wertes an. | |||
<nowiki> | |||
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 | |||
</nowiki> | |||
Einige nützliche OIDs. Wenn der Parameter -On weg gelassen wird, ist der Wert "Human Readable". | |||
;Filesysteme | |||
: <code>snmpwalk -v2c -c public -On localhost .1.3.6.1.2.1.25.2.3</code> | |||
: <code>snmpwalk -v2c -c public localhost .1.3.6.1.2.1.25.2.3</code> | |||
;Systeminfo | |||
: <code>snmpget -v2c -c public localhost .1.3.6.1.2.1.1.1.0</code> | |||
: <code>snmpget -v1 -c public localhost .1.3.6.1.2.1.1.4.0</code> | |||
: <code>snmpget -v1 -c public localhost .1.3.6.1.2.1.1.6.0</code> | |||
;Uptime | |||
: <code>snmpget -v1 -c public localhost .1.3.6.1.2.1.25.1.1.0</code> | |||
; Netzwerk Daten / Transfer | |||
: <code>snmpwalk -v2c -c public localhost .1.3.6.1.2.1.2.2.1</code> | |||
: <code>snmpwalk -v2c -c public -On localhost .1.3.6.1.2.1.2.2.1</code> | |||
; Prozesse | |||
: <code>snmpwalk -v1 -c public localhost .1.3.6.1.2.1.25.4.2.1</code> | |||
== Prozesse neu starten / Reboot Raspi über SNMP == | |||
Um auf Ereignisse der überwachten Prozesse zu reagieren, fragen wir die Daten wie folgt ab. | |||
Die Konfiguration der Prozesse ist unter [[#SNMPD Prozessüberwachung]] beschrieben. Mit dem zusätzlichen Parameter ''-On'' werden nur die OIDs angezeigt. | |||
<code> snmpwalk -v2c -c public localhost .1.3.6.1.4.1.2021.2.1 </code> | |||
<nowiki> 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 </nowiki> | |||
=== 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! | |||
<nowiki> | |||
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 </nowiki> | |||
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 <code> /usr/bin/sudo /etc/init.d/ser2net restart </code> ausgeführt. | |||
<nowiki>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) </nowiki> | |||
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. | |||
<code>snmpset -v2c -c writesecret <LAN-IP-RPI> .1.3.6.1.4.1.2021.2.1.102.2 i 1</code> | |||
=== 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 <code> /usr/bin/sudo /sbin/reboot </code> eingestellt. | |||
Damit wird der Rechner neu gestartet, wenn man die Zahl 1 per ''snmpwrite'' in die passende prErrFix-OID schreibt. | |||
<nowiki>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 | |||
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) | |||
UCD-SNMP-MIB::prErrMessage.1 = STRING: | |||
UCD-SNMP-MIB::prErrMessage.2 = STRING: | |||
UCD-SNMP-MIB::prErrFix.1 = INTEGER: noError(0) <- Hier eine 1 zum Auslösen des Reboots schreiben | |||
UCD-SNMP-MIB::prErrFix.2 = INTEGER: noError(0) | |||
UCD-SNMP-MIB::prErrFixCmd.1 = STRING: /usr/bin/sudo /sbin/reboot <- Dieser Befehl wird dann ausgelöst | |||
UCD-SNMP-MIB::prErrFixCmd.2 = STRING: /usr/bin/sudo /etc/init.d/ser2net restart | |||
# hier die OIDs - bereingte Augabe | |||
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) | |||
.. | |||
.1.3.6.1.4.1.2021.2.1.102.1 = INTEGER: noError(0) <- Hier eine 1 zum Auslösen des Reboots schreiben | |||
.1.3.6.1.4.1.2021.2.1.102.2 = INTEGER: noError(0) | |||
.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 | |||
</nowiki> | |||
Zum Neustart des Rechner schreibt man nun den Wert '''1''' in die OID .1.3.6.1.4.1.2021.2.1.'''102.1''' | |||
<code>snmpset -v2c -c writesecret localhost .1.3.6.1.4.1.2021.2.1.102.1 i 1</code> | |||
Es wird <code> /usr/bin/sudo /sbin/reboot </code> ausgeführt und der Rechner fährt neu hoch. | |||
Wenn man das remote machen möchte, einfach ''localhost'' durch die Raspberry-IP ersetzen und schon hat man einen einfachen Remote-Reboot mit Boardmitteln erstellt. | |||
<nowiki>root@fhem1:~# snmpset -v2c -c writesecret localhost .1.3.6.1.4.1.2021.2.1.102.1 i 1 | |||
Broadcast message from root@fhem1.local (Fri Oct 16 16:26:32 2015): | |||
The system is going down for reboot NOW! | |||
UCD-SNMP-MIB::prErrFix.1 = INTEGER: runFix(1) </nowiki> | |||
== Beispiel == | |||
=== Überwachung des Fhem Prozesses und Neustart per cron === | |||
Basierend auf die in diesem Artikel beschriebenen Mechanismen wird ein SNMP-Watchdog für Fhem erstellt. | |||
==== Konfiguration SNMP ==== | |||
* /etc/snmp/snmpd.conf | |||
<nowiki> | |||
############################################################################### | |||
# Port/NIC binding | |||
# | |||
agentAddress udp:161 | |||
# SYSTEM INFORMATION | |||
sysLocation Haus1-Heizkeller | |||
sysContact Administrator meinemail@gmail.com | |||
sysServices 72 | |||
# community | |||
nocommunity public | |||
rwcommunity writesecret 192.168.0.0/16 | |||
rwcommunity writesecret localhost | |||
########################################################################### | |||
# Process Monitoring | |||
# | |||
# | |||
# ID:1 init process dummy for reboot | |||
proc init | |||
procfix init /usr/bin/sudo /sbin/reboot | |||
# ID:2 process ser2net | |||
proc ser2net | |||
procfix ser2net /usr/bin/sudo /etc/init.d/ser2net restart | |||
# ID:3 process perl - at least one perl process, but no more than 5 | |||
proc perl 5 2 | |||
procfix perl /usr/bin/sudo /etc/init.d/fhem restart | |||
# EXTENDING THE AGENT | |||
extend fhemstatus /etc/init.d/fhem status | |||
</nowiki> | |||
;Erklärung | |||
<code> proc perl 5 2 </code> bedeutet, dass mindestens 2 Perl Prozesse laufen sollen. Das ist notwendig, wenn z.B. Webmin installiert ist. Dieses Tool hat auch einen Perl Prozess!. | |||
Wenn nur Fhem einen Perl Prozess belegt, reicht ein <code> proc perl </code>. | |||
<code> /bin/ps -e | grep perl </code> findet alle Perl Prozesse. | |||
<code> /bin/ps -ef | grep perl </code> zeigt genaue Daten an. | |||
* /etc/sudoers | |||
: Eine Zeile wie folgt hinzufügen. | |||
<nowiki> | |||
### for snmp procfix scripts as root | |||
snmp ALL=(ALL) NOPASSWD: ALL </nowiki> | |||
* /etc/snmp/snmp.conf | |||
: Aus-Kommentieren mibs | |||
<nowiki># | |||
# 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 : </nowiki> | |||
* Neustart snmpd Daemon | |||
<code> service snmpd restart </code> | |||
==== Testen mit Snmp-Tools ==== | |||
; Systeminfos | |||
<nowiki>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 -v1 -c public localhost .1.3.6.1.2.1.1.1.0 | |||
SNMPv2-MIB::sysDescr.0 = STRING: Linux fhem1.local 3.18.9+ #768 PREEMPT Sun Mar 15 18:59:03 GMT 2015 armv6l | |||
</nowiki> | |||
;Prozessüberwachung | |||
<nowiki> | |||
root@fhem1:~# snmpwalk -v1 -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::prIndex.3 = INTEGER: 3 | |||
UCD-SNMP-MIB::prNames.1 = STRING: init | |||
UCD-SNMP-MIB::prNames.2 = STRING: ser2net | |||
UCD-SNMP-MIB::prNames.3 = STRING: perl | |||
UCD-SNMP-MIB::prMin.1 = INTEGER: 0 | |||
UCD-SNMP-MIB::prMin.2 = INTEGER: 0 | |||
UCD-SNMP-MIB::prMin.3 = INTEGER: 2 | |||
UCD-SNMP-MIB::prMax.1 = INTEGER: 0 | |||
UCD-SNMP-MIB::prMax.2 = INTEGER: 0 | |||
UCD-SNMP-MIB::prMax.3 = INTEGER: 5 | |||
UCD-SNMP-MIB::prCount.1 = INTEGER: 1 | |||
UCD-SNMP-MIB::prCount.2 = INTEGER: 1 | |||
UCD-SNMP-MIB::prCount.3 = INTEGER: 1 | |||
UCD-SNMP-MIB::prErrorFlag.1 = INTEGER: noError(0) | |||
UCD-SNMP-MIB::prErrorFlag.2 = INTEGER: noError(0) | |||
UCD-SNMP-MIB::prErrorFlag.3 = INTEGER: error(1) <-- Fehler bei Perl | |||
UCD-SNMP-MIB::prErrMessage.1 = STRING: | |||
UCD-SNMP-MIB::prErrMessage.2 = STRING: | |||
UCD-SNMP-MIB::prErrMessage.3 = STRING: Too few perl running (# = 1) <-- Grund des Fehlers | |||
UCD-SNMP-MIB::prErrFix.1 = INTEGER: noError(0) | |||
UCD-SNMP-MIB::prErrFix.2 = INTEGER: noError(0) | |||
UCD-SNMP-MIB::prErrFix.3 = 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 | |||
UCD-SNMP-MIB::prErrFixCmd.3 = STRING: /usr/bin/sudo /etc/init.d/fhem restart | |||
</nowiki> | |||
oder als Table | |||
<nowiki> | |||
root@fhem1:~# snmptable -v1 -c public localhost .1.3.6.1.4.1.2021.2 | |||
SNMP table: UCD-SNMP-MIB::prTable | |||
prIndex prNames prMin prMax prCount prErrorFlag prErrMessage prErrFix prErrFixCmd | |||
1 init 0 0 1 noError noError /usr/bin/sudo /sbin/reboot | |||
2 ser2net 0 0 1 noError noError /usr/bin/sudo /etc/init.d/ser2net restart | |||
3 perl 2 5 1 error Too few perl running (# = 1) noError /usr/bin/sudo /etc/init.d/fhem restart | |||
</nowiki> | |||
;Extended Ausgabe | |||
: <code> snmpwalk -v1 -c public -On localhost nsExtendOutput1 </code> | |||
: oder mit OID | |||
: <code> snmpwalk -v1 -c public -On localhost .1.3.6.1.4.1.8072.1.3.2.3 </code> | |||
<nowiki> | |||
# Ausgabe bereinigt | |||
root@fhem1:~# snmpwalk -v1 -c public -On localhost .1.3.6.1.4.1.8072.1.3.2.3 | |||
.1.3.6.1.4.1.8072.1.3.2.3.1.1.10.102.104.101.109.115.116.97.116.117.115 = STRING: fhem is not running <-- Das ist die Ausgabe von /etc/init.d/fhem status | |||
.1.3.6.1.4.1.8072.1.3.2.3.1.1.13.115.101.114.50.110.101.116.115.116.97.116.117.115 = STRING: checking Serial port to network proxy...done (ser2net running). | |||
.1.3.6.1.4.1.8072.1.3.2.3.1.2.10.102.104.101.109.115.116.97.116.117.115 = STRING: fhem is not running | |||
.1.3.6.1.4.1.8072.1.3.2.3.1.2.13.115.101.114.50.110.101.116.115.116.97.116.117.115 = STRING: checking Serial port to network proxy...done (ser2net running). | |||
# lesbar | |||
root@fhem1:~# snmpwalk -v1 -c public localhost nsExtendOutput1 | |||
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."fhemstatus" = STRING: fhem is not running | |||
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."ser2netstatus" = STRING: checking Serial port to network proxy...done (ser2net running). | |||
NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."lm-syslog-size" = STRING: 500 /var/log/syslog | |||
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."fhemstatus" = STRING: fhem is not running | |||
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."ser2netstatus" = STRING: checking Serial port to network proxy...done (ser2net running). | |||
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."lm-syslog-size" = STRING: 500 /var/log/syslog | |||
NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."test1" = INTEGER: 1 | |||
NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."test2" = INTEGER: 2 | |||
NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."fhemstatus" = INTEGER: 1 | |||
NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."ser2netstatus" = INTEGER: 1 | |||
NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."lm-syslog-size" = INTEGER: 1 | |||
NET-SNMP-EXTEND-MIB::nsExtendResult."test1" = INTEGER: 0 | |||
NET-SNMP-EXTEND-MIB::nsExtendResult."test2" = INTEGER: 8960 | |||
NET-SNMP-EXTEND-MIB::nsExtendResult."fhemstatus" = INTEGER: 0 | |||
NET-SNMP-EXTEND-MIB::nsExtendResult."ser2netstatus" = INTEGER: 0 | |||
NET-SNMP-EXTEND-MIB::nsExtendResult."lm-syslog-size" = INTEGER: 0 | |||
</nowiki> | |||
;Fertiger Suchbefehl | |||
: <code> snmpwalk -v1 -c public -On localhost .1.3.6.1.4.1.8072.1.3.2.3 | grep "fhem is not running" | grep "8072.1.3.2.3.1.1." | head -1 </code> | |||
: <code> snmpwalk -v1 -c public -Ovq localhost .1.3.6.1.4.1.8072.1.3.2.3 | grep "fhem is not running" | head -1 </code> | |||
: oder | |||
;Finden über die SNMP-Prozess Liste | |||
: Damit lässt sich remote jeder Prozess finden. | |||
: Suche in den Parametern: | |||
: <code> snmpwalk -v1 -c public -OvQe localhost 1.3.6.1.2.1.25.4.2.1.5 | grep -i 'fhem.pl fhem.cfg' | grep -v '"-i' </code> | |||
: Suche in den Namen: | |||
: <code> snmpwalk -v1 -c public -OvQe localhost 1.3.6.1.2.1.25.4.2.1.2 | grep -i 'perl' </code> | |||
: <code> snmpwalk -v1 -c public -OvQe localhost 1.3.6.1.2.1.25.4.2.1.2 | grep -i 'ser2net' </code> | |||
... In Arbeit .... | ... In Arbeit .... | ||
... to be continued .... | |||
[[Raspberry Pi]] | [[Raspberry Pi]] | ||
== Hilfe/Support == | |||
* Fragen werden gerne im FHEM-Forum auf [http://forum.fhem.de http://forum.fhem.de] beantwortet. | |||
* Für Feedback ist [http://forum.fhem.de/index.php?topic=42348.msg345307 dieser Beitrag] im Forum vorgesehen. | |||
== Links == | |||
* Watchdog per SNMP [https://sites.google.com/site/ghidit/how-to-2/using-snmp-as-a-process-watchdog] | |||
* Net-SNMP snmpd.conf [http://net-snmp.sourceforge.net/docs/man/snmpd.conf.html] | |||
[[Kategorie:Raspberry Pi]] | [[Kategorie:Raspberry Pi]] | ||
[[Kategorie:HOWTOS]] | [[Kategorie:HOWTOS]] |
Aktuelle Version vom 16. Oktober 2015, 22:41 Uhr
An dieser Seite wird momentan noch gearbeitet. |
Raspberry Pi / Rasbian und SNMP
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 Community & 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.
Die Konfiguration der Prozesse ist unter #SNMPD Prozessüberwachung beschrieben. Mit dem zusätzlichen Parameter -On werden nur 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 prErrFix-OID schreibt.
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 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) UCD-SNMP-MIB::prErrMessage.1 = STRING: UCD-SNMP-MIB::prErrMessage.2 = STRING: UCD-SNMP-MIB::prErrFix.1 = INTEGER: noError(0) <- Hier eine 1 zum Auslösen des Reboots schreiben UCD-SNMP-MIB::prErrFix.2 = INTEGER: noError(0) UCD-SNMP-MIB::prErrFixCmd.1 = STRING: /usr/bin/sudo /sbin/reboot <- Dieser Befehl wird dann ausgelöst UCD-SNMP-MIB::prErrFixCmd.2 = STRING: /usr/bin/sudo /etc/init.d/ser2net restart # hier die OIDs - bereingte Augabe 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) .. .1.3.6.1.4.1.2021.2.1.102.1 = INTEGER: noError(0) <- Hier eine 1 zum Auslösen des Reboots schreiben .1.3.6.1.4.1.2021.2.1.102.2 = INTEGER: noError(0) .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
Zum Neustart des Rechner schreibt man nun den Wert 1 in die OID .1.3.6.1.4.1.2021.2.1.102.1
snmpset -v2c -c writesecret localhost .1.3.6.1.4.1.2021.2.1.102.1 i 1
Es wird /usr/bin/sudo /sbin/reboot
ausgeführt und der Rechner fährt neu hoch.
Wenn man das remote machen möchte, einfach localhost durch die Raspberry-IP ersetzen und schon hat man einen einfachen Remote-Reboot mit Boardmitteln erstellt.
root@fhem1:~# snmpset -v2c -c writesecret localhost .1.3.6.1.4.1.2021.2.1.102.1 i 1 Broadcast message from root@fhem1.local (Fri Oct 16 16:26:32 2015): The system is going down for reboot NOW! UCD-SNMP-MIB::prErrFix.1 = INTEGER: runFix(1)
Beispiel
Überwachung des Fhem Prozesses und Neustart per cron
Basierend auf die in diesem Artikel beschriebenen Mechanismen wird ein SNMP-Watchdog für Fhem erstellt.
Konfiguration SNMP
- /etc/snmp/snmpd.conf
############################################################################### # Port/NIC binding # agentAddress udp:161 # SYSTEM INFORMATION sysLocation Haus1-Heizkeller sysContact Administrator meinemail@gmail.com sysServices 72 # community nocommunity public rwcommunity writesecret 192.168.0.0/16 rwcommunity writesecret localhost ########################################################################### # Process Monitoring # # # ID:1 init process dummy for reboot proc init procfix init /usr/bin/sudo /sbin/reboot # ID:2 process ser2net proc ser2net procfix ser2net /usr/bin/sudo /etc/init.d/ser2net restart # ID:3 process perl - at least one perl process, but no more than 5 proc perl 5 2 procfix perl /usr/bin/sudo /etc/init.d/fhem restart # EXTENDING THE AGENT extend fhemstatus /etc/init.d/fhem status
- Erklärung
proc perl 5 2
bedeutet, dass mindestens 2 Perl Prozesse laufen sollen. Das ist notwendig, wenn z.B. Webmin installiert ist. Dieses Tool hat auch einen Perl Prozess!.
Wenn nur Fhem einen Perl Prozess belegt, reicht ein proc perl
.
/bin/ps -e | grep perl
findet alle Perl Prozesse.
/bin/ps -ef | grep perl
zeigt genaue Daten an.
- /etc/sudoers
- Eine Zeile wie folgt hinzufügen.
### for snmp procfix scripts as root snmp ALL=(ALL) NOPASSWD: ALL
- /etc/snmp/snmp.conf
- Aus-Kommentieren mibs
# # 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 :
- Neustart snmpd Daemon
service snmpd restart
Testen mit Snmp-Tools
- Systeminfos
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 -v1 -c public localhost .1.3.6.1.2.1.1.1.0 SNMPv2-MIB::sysDescr.0 = STRING: Linux fhem1.local 3.18.9+ #768 PREEMPT Sun Mar 15 18:59:03 GMT 2015 armv6l
- Prozessüberwachung
root@fhem1:~# snmpwalk -v1 -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::prIndex.3 = INTEGER: 3 UCD-SNMP-MIB::prNames.1 = STRING: init UCD-SNMP-MIB::prNames.2 = STRING: ser2net UCD-SNMP-MIB::prNames.3 = STRING: perl UCD-SNMP-MIB::prMin.1 = INTEGER: 0 UCD-SNMP-MIB::prMin.2 = INTEGER: 0 UCD-SNMP-MIB::prMin.3 = INTEGER: 2 UCD-SNMP-MIB::prMax.1 = INTEGER: 0 UCD-SNMP-MIB::prMax.2 = INTEGER: 0 UCD-SNMP-MIB::prMax.3 = INTEGER: 5 UCD-SNMP-MIB::prCount.1 = INTEGER: 1 UCD-SNMP-MIB::prCount.2 = INTEGER: 1 UCD-SNMP-MIB::prCount.3 = INTEGER: 1 UCD-SNMP-MIB::prErrorFlag.1 = INTEGER: noError(0) UCD-SNMP-MIB::prErrorFlag.2 = INTEGER: noError(0) UCD-SNMP-MIB::prErrorFlag.3 = INTEGER: error(1) <-- Fehler bei Perl UCD-SNMP-MIB::prErrMessage.1 = STRING: UCD-SNMP-MIB::prErrMessage.2 = STRING: UCD-SNMP-MIB::prErrMessage.3 = STRING: Too few perl running (# = 1) <-- Grund des Fehlers UCD-SNMP-MIB::prErrFix.1 = INTEGER: noError(0) UCD-SNMP-MIB::prErrFix.2 = INTEGER: noError(0) UCD-SNMP-MIB::prErrFix.3 = 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 UCD-SNMP-MIB::prErrFixCmd.3 = STRING: /usr/bin/sudo /etc/init.d/fhem restart
oder als Table
root@fhem1:~# snmptable -v1 -c public localhost .1.3.6.1.4.1.2021.2 SNMP table: UCD-SNMP-MIB::prTable prIndex prNames prMin prMax prCount prErrorFlag prErrMessage prErrFix prErrFixCmd 1 init 0 0 1 noError noError /usr/bin/sudo /sbin/reboot 2 ser2net 0 0 1 noError noError /usr/bin/sudo /etc/init.d/ser2net restart 3 perl 2 5 1 error Too few perl running (# = 1) noError /usr/bin/sudo /etc/init.d/fhem restart
- Extended Ausgabe
snmpwalk -v1 -c public -On localhost nsExtendOutput1
- oder mit OID
snmpwalk -v1 -c public -On localhost .1.3.6.1.4.1.8072.1.3.2.3
# Ausgabe bereinigt root@fhem1:~# snmpwalk -v1 -c public -On localhost .1.3.6.1.4.1.8072.1.3.2.3 .1.3.6.1.4.1.8072.1.3.2.3.1.1.10.102.104.101.109.115.116.97.116.117.115 = STRING: fhem is not running <-- Das ist die Ausgabe von /etc/init.d/fhem status .1.3.6.1.4.1.8072.1.3.2.3.1.1.13.115.101.114.50.110.101.116.115.116.97.116.117.115 = STRING: checking Serial port to network proxy...done (ser2net running). .1.3.6.1.4.1.8072.1.3.2.3.1.2.10.102.104.101.109.115.116.97.116.117.115 = STRING: fhem is not running .1.3.6.1.4.1.8072.1.3.2.3.1.2.13.115.101.114.50.110.101.116.115.116.97.116.117.115 = STRING: checking Serial port to network proxy...done (ser2net running). # lesbar root@fhem1:~# snmpwalk -v1 -c public localhost nsExtendOutput1 NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."fhemstatus" = STRING: fhem is not running NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."ser2netstatus" = STRING: checking Serial port to network proxy...done (ser2net running). NET-SNMP-EXTEND-MIB::nsExtendOutput1Line."lm-syslog-size" = STRING: 500 /var/log/syslog NET-SNMP-EXTEND-MIB::nsExtendOutputFull."fhemstatus" = STRING: fhem is not running NET-SNMP-EXTEND-MIB::nsExtendOutputFull."ser2netstatus" = STRING: checking Serial port to network proxy...done (ser2net running). NET-SNMP-EXTEND-MIB::nsExtendOutputFull."lm-syslog-size" = STRING: 500 /var/log/syslog NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."test1" = INTEGER: 1 NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."test2" = INTEGER: 2 NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."fhemstatus" = INTEGER: 1 NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."ser2netstatus" = INTEGER: 1 NET-SNMP-EXTEND-MIB::nsExtendOutNumLines."lm-syslog-size" = INTEGER: 1 NET-SNMP-EXTEND-MIB::nsExtendResult."test1" = INTEGER: 0 NET-SNMP-EXTEND-MIB::nsExtendResult."test2" = INTEGER: 8960 NET-SNMP-EXTEND-MIB::nsExtendResult."fhemstatus" = INTEGER: 0 NET-SNMP-EXTEND-MIB::nsExtendResult."ser2netstatus" = INTEGER: 0 NET-SNMP-EXTEND-MIB::nsExtendResult."lm-syslog-size" = INTEGER: 0
- Fertiger Suchbefehl
snmpwalk -v1 -c public -On localhost .1.3.6.1.4.1.8072.1.3.2.3 | grep "fhem is not running" | grep "8072.1.3.2.3.1.1." | head -1
snmpwalk -v1 -c public -Ovq localhost .1.3.6.1.4.1.8072.1.3.2.3 | grep "fhem is not running" | head -1
- oder
- Finden über die SNMP-Prozess Liste
- Damit lässt sich remote jeder Prozess finden.
- Suche in den Parametern:
snmpwalk -v1 -c public -OvQe localhost 1.3.6.1.2.1.25.4.2.1.5 | grep -i 'fhem.pl fhem.cfg' | grep -v '"-i'
- Suche in den Namen:
snmpwalk -v1 -c public -OvQe localhost 1.3.6.1.2.1.25.4.2.1.2 | grep -i 'perl'
snmpwalk -v1 -c public -OvQe localhost 1.3.6.1.2.1.25.4.2.1.2 | grep -i 'ser2net'
... In Arbeit ....
... to be continued ....
Raspberry Pi
Hilfe/Support
- Fragen werden gerne im FHEM-Forum auf http://forum.fhem.de beantwortet.
- Für Feedback ist dieser Beitrag im Forum vorgesehen.