SNMP: Datenerhebung

Für die Erstellung einer KPI für Überwachungskameras von MOBOTIX mussten Daten beschafft werden.

Interessante Daten für Überwachung sind neben den elementaren Hardwaredaten wie Seriennummer, Hostname, VPN User und Temperatur, die Daten über Anzahl und Zeitpunkt von Alarmen. SNMP, die etablierte Allzweckwaffe, bietet sich an. Vom Schreibtisch aus läßt sich die Konfiguration auch einer im Betrieb befindlichen MOBOTIX Kamera um die nötigen Einträge für den SNMP Dienst einstellen.

curl -q -m 10 -u ‚user:passwort‘ –data-binary @befehl.txt „http://meineKamera/admin/remoteconfig“

Die Befehlszeile übergibt die Befehlssequenz aus der Textdatei befehl.txt an die Kamera:

helo
write params
snmp/SNMPD=1
snmp/V2C_RO_COM=“community“
update section snmp
store
reboot
quit

Mit der Befehlsfolge konfigurieren wir SNMP Version 2c mit dem Read-Only Community Namen „community“. Nach dem Neustart steht der Dienst zu Verfügung. Wie findet man nun die passende OID mit der ich die gefragten Werte auslesen kann? Nun – fragt man den Hersteller, ist man verloren. MOBOTIX verweist an den Händler, als sei die Antwort abhängig vom Umsatz. Auf erneute Nachfrage bekomme ich einen Link, der wenig befriedigend ist. Werte, die abgefragt werden können, belaufen sich je nach Firmwarestand auf cirka 1200 an der Zahl! Welche Werte tatsächlich mit welcher OID abgerufen werden kann, erfährt man mit der Abfrage

snmpwalk -v 2c -c community -m +MOBOTIX-MIB meineKamera .iso

Am Ende .(Punkt) iso. Der Punkt bedeutet, am Rootpunkt der hierarchisch aufgebauten OID Liste zu beginnen. Entgegen der OID Liste aus dem Link der Firma MOBOTIX wird beispielweise der Wert cameraModel nicht mit der OID cameraModel abgerufen. Gezielt lässt sich der Wert ohne Beschreibung, also in leicht weiter verwertbarer Form, mit dem Befehl ermitteln:

snmpget -v 2c -c community -Ovq -m +MOBOTIX-MIB meineKAMERA cameraModel.0

Dabei ist das Einbinden der OID Beschreibung MOBOTIX-MIB wichtig. Andernfalls muss über die ISO OID abgefragt werden. In dem Fall wäre das iso.3.6.1.2.1.1.5.0

In den über 1200 möglichen Abfragen befinden sich trotzdem nicht alle Daten. Daten wie, zum Beispiel, der VPN Benutzername oder die Anzahl der registrierten Alarmmeldungen sind unerreichbar. Mir zeigt das eine gewisse unorganisiertheit der Entwickler. Beim Abruf des letzten Alarmbildes lässt sich per URL Parameter ?output=m1img der Zeitpunkt des letzten Alarms und die Anzahl der Alarmmeldungen in Textform abfragen. Abenteuerlich, nicht wahr?!

curl -q -m 10 -u ‚user:pw‘ „http://IP/control/event.jpg?output=m1img“

Nicht empfehlenswert, da das Verhalten der Kamera je nach Firmwarestand sehr unterschiedlich und damit nicht berechenbar sind. Die Anzahl stelle ich über eine Datenbank fest, die einzelne Werte periodisch speichert und zählt. Fehlt noch der VPN User! Nach meiner Kenntnis muss er aus der Konfiguration ausgelesen werden. Der Befehl für die Konfiguration der Kamera, kann auch zum Auslesen der Selben genutzt werden (siehe erster Absatz). Die Befehlssequenz sieht dann so aus:

helo
view section ethernet vpn imageimprover
exit

Entscheident ist „view section vpn“. Hier werden die Konfigurationsdaten wie User, Passwort usw. ausgegeben. Die section imageprovider nutze ich um die konfigurierten Bildeinblendungen auszulesen. Einfach mal ausprobieren!

Apache2: BandWidth

Überwachungskameras in größerer Anzahl können das Netzwerk schon in die Knie zwingen.

Wenn 40 – 50 Kameras Livebilder produzieren, wird die Bandbreite des Internetanschlußes gerne mit ca. 250 MBit/s strapaziert. Es ist Unfug, wenn ein User alle Streams gleichzeitig nutzen will – kommt aber vor.

Das ist zu vermeiden. In einem Debian System kann das mod-bw bequem per Aptitude installiert werden.

In der conf des VHOSTs oder innerhalb der Location Konfiguration könnte es so aussehen:

Auch in dieser Konfiguration ist auf die Reihenfolge zu achten –> first match rules! In dem Fall begrenze ich die Bandbreite und die Anzahl der Verbindungen pro Session für das lokale Netztwerk nicht. Alle anderen Verbindungen haben nur eine Bandbreite von 1310762 Byte ( das sind 10 MBit ) auf 5 Verbindungen zur Verfügung. Im obigen iftop sieht man maximale 10 MBit/s für 5 Cams. Zum Vergleich, habe ich intern weitere 5 Cam Streams geöffnet:

30 MBit/s verbraucht die interne Verbindung. Selbe Anzahl an Streams, ist extern wirksam auf 10 MBit/s limitiert.

Weitere Verbindungsversuche enden mit dem Error 503

MOBOTIX Cam über Apache Proxy

Eine für mich exotische Aufgabe war, mehrere Überwachungskameras über eine Website verfügbar zu machen. Eine Cam über eine URL mit dem Apache Server zu installieren ist keine besondere Sache. Zahlreiche Anleitungen existieren, wie die Direktive „ProxyPass“ einzusetzen ist.

Interessanter ist es, beliebig viele Cams über eine URL – nur durch Path unterschieden – im Apache zu realisieren.

Das Userinterface der MOBOTIX Cam setzt direkte  und relative Links, weshalb das Umleiten über den Proxy schwierig ist. Der Proxy muss mit dem Wechsel der Art und Weise zurecht kommen.

Es soll also über eine URL, mit den Paths /CAM1/, /CAM2/ ….. usw. das Kamerainterface, Bild und Livestream dem User zur Verfügung gestellt werden. Das Menuesystem, jeder CAM ist in seiner Struktur zwei bis drei Stufen tief. Das ist zu beachten, da jeder User auch mehrere CAMs geöffnet haben kann.

Wie in dem Listing zu sehen, wird ein Mapping und Rewriting der Proxydaten vorgenommen. Sobald der User aber mehrere Funktionen oder Ebenen der Menüstruktur aufruft, fügt das Substitute mehrmals, je nach dem ob der Link relativ oder direkt ist, den Path hinzu. Hier steuere ich mit Substitute „s|/CAM1/CAM1/|/CAM1/|i“ gegen. Als so zu sagen“letzte“ Regel, verhindere ich die Path Kaskadierung der vorherigen Umschreibung.

Diese Konfiguration läuft für beliebig viele CAMS und durch alle Ebenen der Menüs.

<VirtualHost *:443>
 ..........

ProxyRequests off
ProxyPreserveHost Off
ProxyHTMLInterp On
ProxyPass         /CAM1/ http://URL.CAM1.INTERN/
ProxyPass         /CAM2/ http://URL.CAM2.INTERN/

ProxyHTMLURLMap http://URL.CAM1.INTERN/ /CAM1
ProxyHTMLURLMap http://URL.CAM2.INTERN/ /CAM2

<Location /CAM1/>
 RequestHeader unset Accept-Encoding
 setOutputFilter proxy-html
 AddOutputFilterByType SUBSTITUTE text/html

 Substitute "s|/admin/|/CAM1/admin/|i"
 Substitute "s|/cgi-bin/|/CAM1/cgi-bin/|i"
 Substitute "s|/control/|/CAM1/control/|i"
 Substitute "s|/decor/|/CAM1/decor/|i"
 Substitute "s|/help/|/CAM1/help/|i"
 Substitute "s|/record/|/CAM1/record/|i"
 Substitute "s|/webcam/|/CAM1/webcam/|i"
 Substitute "s|/server/|/CAM1/server/|i"
 Substitute "s|/CAM1/CAM1/|/CAM1/|i"

 ProxyHTMLURLMap / /CAM1/
 ProxyHTMLURLMap /CAM1 /CAM1
 ProxyPassReverse /
 </Location>

<Location /CAM2/>
 ..........

</Location>

### Livestreams

ProxyPass /CAM1STREAM http://URL.CAM1.INTERN/cgi-bin/faststream.jpg?stream=full&html
ProxyPass /CAM2STREAM http://URL.CAM2.INTERN/cgi-bin/faststream.jpg?stream=full&html

</VirtualHost>