Berlin:Standorte:Melanchthon Gemeinde Berlin-Spandau/Collectd-Exec-Plugins

Aus wiki.freifunk.net
Zur Navigation springenZur Suche springen

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.

Important.png 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.

Important.png Wichtig: Das Exec-Plugin führt Skripte nicht als Benutzer "root" aus. Als non-Root funktionieren aber einige Befehle nicht.



Gauge: assocs

Beispiel

Assoc.png

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

Devicestat.png

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

Olsrneighbours.png

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_").