Berlin:Standorte:Melanchthon Gemeinde Berlin-Spandau/Collectd-Exec-Plugins
Erweiterung der Monitoring Funktionen auf http://monitor.berlin.freifunk.net
Monitoring per Exec-Plugin
Das collectd-exec-plugin lässt sich gut benutzen, um eine schnelle Komplettübersicht der angeschlossenen Router zu bekommen.
Bei den Routern mit Freifunk-Firmware spart man sich so das Durchklicken durch die verschiedenen Monitoring URLs und für Router mit Originalfirmware (5GHz Geräte wg. DFS) bräuchte man weitere Tricks (z.B. externe SNMP Relays), um sie ins Monitoring einzubinden.
Für die Einrichtung werden grundlegende Kenntnisse im Umgang mit der Linux Konsole und dem Editor "vi" vorausgesetzt. Einstiegshilfen finden sich z.B. hier (vi) und hier (Konsole)
Exec-Plugin installieren
Das Exec-Plugin steht als Package für die Berliner Firmware bereits zur Verfügung, muss aber noch installiert werden:
opkg update && opkg install collectd-mod-exec
Zur allgemeinen Erheiterung ist es aber noch nicht aktiviert und in der Weboberfläche fehlt die dafür dringend benötigte Checkbox. Es muss erst per Editor folgender Abschnitt zur Konfigurationsdatei zugefügt werden:
/etc/config/luci_statistics
config statistics 'collectd_exec' option enable '1'
Ab jetzt sollte in der Weboberfläche unter Statistiken => Setup => General Plugins => Exec die Konfigurationsseite (inkl. "Plugin aktivieren" Häckchen) zur Verfügung stehen.
Wichtig: Prüfen, ob die Aktivierungs-Checkbox wirklich vorhanden ist. |
Skripte für Exec-Plugin installieren
Als erstes sollte man einen Ordner für die Skripte anlegen und dort hineinwechseln:
mkdir /etc/collectd cd /etc/collectd
Dann sind die Skripte in dieses Verzeichnis zu kopieren, z.B. durch
cat > name_des_skripts
Danach das Skript in die Zwischenablage kopieren und aus dieser in die Konsole einfügen, abschließen mit ctrl-d.
Das Setzen der Ausführungsberechtigung gehört zum guten Ton:
chmod +x name_des_skripts
Nun ist das Skript dem Exec-Plugin in der Weboberfläche unter Statistiken => Setup => General Plugins => Exec zuzufügen. In die Eingabefelder sind die entsprechenden Werte einzutragen:
Skript | /etc/collectd/name_des_skripts |
Nutzer | nobody |
Gruppe | nogroup |
Zusätzliche Eingabefelder für weitere Skripte können mit dem Button "Zufügen" erzeugt werden.
Wichtig: Das Exec-Plugin führt Skripte nicht als Benutzer "root" aus. Als non-Root funktionieren aber einige Befehle nicht. |
Gauge: assocs
Beispiel
Skript: /etc/collectd/assocs
#!/bin/sh logger "starting collectd assocs-addon" HOSTNAME="${COLLECTD_HOSTNAME:-$(uci get system.\@system[0].hostname)}" INTERVAL="${COLLECTD_INTERVAL:-60}" INTERVAL="${INTERVAL/\.[0-9]*}" LEASEFILE="$(uci get dhcp.@dnsmasq[0].leasefile)" while sleep $INTERVAL; do LEASES=$(cat ${LEASEFILE}|grep 10\.36\.92 | wc -l) ASSOCS_N2=$(wget -q -O - http://mela-n2.olsr/cgi-bin/assoc) ASSOCS_O2=$(wget -q -O - http://mela-o2.olsr/cgi-bin/assoc) ASSOCS_S2=$(wget -q -O - http://mela-s2.olsr/cgi-bin/assoc) ASSOCS_W2=$(wget -q -O - http://mela-w2.olsr/cgi-bin/assoc) SUM=$(expr 0$LEASES + 0$ASSOCS_N2 + 0$ASSOCS_O2 + 0$ASSOCS_S2 + 0$ASSOCS_W2) echo "PUTVAL \"$HOSTNAME/exec-assocs/gauge-dhcp-leases\" interval=$INTERVAL N:$LEASES" echo "PUTVAL \"$HOSTNAME/exec-assocs/gauge-assocs-n2\" interval=$INTERVAL N:$ASSOCS_N2" echo "PUTVAL \"$HOSTNAME/exec-assocs/gauge-assocs-o2\" interval=$INTERVAL N:$ASSOCS_O2" echo "PUTVAL \"$HOSTNAME/exec-assocs/gauge-assocs-s2\" interval=$INTERVAL N:$ASSOCS_S2" echo "PUTVAL \"$HOSTNAME/exec-assocs/gauge-assocs-w2\" interval=$INTERVAL N:$ASSOCS_W2" echo "PUTVAL \"$HOSTNAME/exec-assocs/gauge-sum\" interval=$INTERVAL N:$SUM" done
Skript: /www/cgi-bin/assoc
#!/bin/sh echo -e "Content-type: text/plain\n" iwinfo wlan0-dhcp-2 assoclist|grep ago|wc -l
Dokumentation
Bei unserem Setup haben die 2Ghz Router jeweils zwei APs:
1. mela-n2.freifunk.net: Privater kleiner DHCP Bereich, vom Router selbst verwaltet.
2. berlin.freifunk.net: Zentraler DHCP auf dem Core, zusammengeschaltet per Batman.
Das Skript zeigt die Anzahl der verbundenen Clients an den privaten APs (1), die Anzahl der Leases auf dem Core (2) und die Summe. So lässt sich erkennen, über welche APs wie viele User verbunden sind.
Um die Anzahl der Clients an den privaten APs zu ermitteln, wird hier ein kleines CGI-Skript auf den zu überwachenden Routern installiert ("/www/cgi-bin/assoc": Skript in den Ordner kopieren und mit "chmod +x" ausführbar machen). Der Core-Router kann dann per "wget" die Client-Anzahl erfragen.
(Grundsätzlich ginge das auch über "ssh", was die Installation des Skripts auf den zu überwachenden Routern ersparen würde, allerdings kommen dann dafür andere Probleme auf einen zu (deutlich langsamerer Verbindungsaufbau mit hoher CPU-Last, SSH-Rückfragen nach Firmware-Updates, ...)
Zu beachten ist das "grep" in der "LEASES="-Zeile: Es werden nur die Leases aus dem Batman-DHCP Bereich (IP=10.36.92.x) gezählt.
Gauge: devicestats
Beispiel
Skript: /etc/collectd/devicestats
#!/bin/sh logger "starting collectd devicestats-addon" HOSTNAME="${COLLECTD_HOSTNAME:-$(uci get system.\@system[0].hostname)}" INTERVAL="${COLLECTD_INTERVAL:-60}" INTERVAL="${INTERVAL/\.[0-9]*}" DEVICES=" TOUGH_HINTEN=2 TOUGH_VORNE=3 TOUGH_EMPORE=4 MELA_N5=34 MELA_O5=38 MELA_S5=42 MELA_W5=46 MELA_ESHELTER=50 MELA_RBB=54 MELA_TBERG=58 " while sleep $INTERVAL; do NR="0" for dev in $DEVICES; do NR=$(expr $NR + 1) NAME=$(printf "%02d" $NR)_${dev%=*} IP=${dev#*=} CHECKCMD="echo -e \"GET / HTTP/1.1\n\" | nc 10.36.70.$IP 80" VALUE="0" eval $CHECKCMD >/dev/null 2>&1 && VALUE=$NR echo "PUTVAL \"$HOSTNAME/exec-devicestat/gauge-$NAME\" interval=$INTERVAL N:$VALUE" done done
Dokumentation
Das "devicestats" Skript prüft per HTTP-Zugriff, ob die weiteren Router per TCP erreichbar sind. Mit "ping" ist das nicht möglich, da das Busybox ping root-Rechte erfordert, was aber das Exec-Plugin nicht zulässt. Auch "wget" führt nicht zum Erfolg, weil die Originalfirmware der 5Ghz-Router die HTTP Zugriffe auf HTTPS umleitet, was unser "wget" aber nicht unterstützt (gibt einen Fehlercode zurück, als wäre der Router nicht erreichbar).
Die Abzufragenden Router sind im Skript unter "DEVICES" einzutragen. Die Zahl nach dem "=" ist die Hostadresse. Die zugehörige Netzwerkadresse ist in der Zeile mit "CHECKCMD" anzupassen.
Damit die einzelnen Router optisch unterscheidbar sind, geben sie nicht alle "1" für "erreichbar" zurück (das ergäbe nur eine einzige Linie), sondern eine laufende Nummer.
Gauge: olsrneighbours
Beispiel
Skript: /etc/collectd/olsrneighbours
#!/bin/sh logger "starting collectd olsr-neighbours-addon" HOSTNAME="${COLLECTD_HOSTNAME:-$(uci get system.\@system[0].hostname)}" INTERVAL="${COLLECTD_INTERVAL:-60}" INTERVAL="${INTERVAL/\.[0-9]*}" NEIGHTMP=/tmp/neigh.sh.txt while sleep $INTERVAL; do neigh.sh > $NEIGHTMP for ap in n5 o5 s5 w5 eshelte rbb tberg; do # extract IP-Addr, convert "." to "\." for grep IPREGEX=$(ifconfig br-link_$ap|sed -n "/inet addr/ { s/[^:]*:\([^ ]*\).*/\1/; s/\./\\\./g; p }") NEIGHBOURCNT=$(grep "^$IPREGEX" $NEIGHTMP | wc -l) echo "PUTVAL \"$HOSTNAME/exec-olsr-neighbours-5ghz/gauge-$ap\" interval=$INTERVAL N:$NEIGHBOURCNT" done rm -f $NEIGHTMP done
Dokumentation
Das "olsrneighbours" Skript zeigt an, wie viele Verbindungen zu den 5Ghz-Linkstrecken bestehen.
Dazu schaut es in der OLSR Umgebung (Ausgabe von "neigh.sh") nach, wie oft die zu dem entsprechenden Router gehörige IP-Adresse dort auftaucht.
Um diese IP-Adresse zu ermitteln, wird die Ausgabe von "ifconfig" zum entsprechenden Interface ausgewertet. Um andere Router anzugeben, ist die Auflistung in der "for ap in"-Zeile anzupassen, sowie das Prefix in der "IPREGEX="-Zeile (unser Prefix ist "br-link_").