Temperatur/Luftfeuchteüberwachung für 50€

Falls jemand eine günstige Lösung für die Überwachung von Luftfeuchte und Temperatur sucht, der sollte sich mal DLP-TH1b von FTDIChip ansehen. Das Teil wird per USB angeschlossen. Soll’s im Netzwerk hängen, dann würde ich einfach ein Alix-Board nehmen und x-Sensoren dran hängen. Günstiger geht’s nicht…

OpenNMS überwacht NTP

NTP zu überwachen ist relativ komplex. Dabei ist die Überwachung der Zeitdifferenz zu einer NTP Quelle relativ einfach. Was das ganze komplex macht ist NTP selbst. D.h. die beste NTP Überwachung nützt nichts, wenn man NTP nicht verstanden hat und NTP auf den jeweiligen Servern nicht richtig konfiguriert hat. Hier geht’s aber nur um die Basisüberwachung von NTP per OpenNMS.

Bei der NTP-Überwachung nehme ich ntpq. Dabei nutze ich, dass das Tool den aktuell besten peer mit einem Stern „*“ markiert. Das ganze packe ich in ein kleines Skript /usr/local/bin/ntp-time.sh :

#!/bin/sh
ntpq -pn localhost | /usr/bin/awk 'BEGIN { delay=1000; offset=1000; jitter=1000; stratum=16 } $1 ~ /\*/ { delay=$8; offset=$9; jitter=$10; stratum=$3 } END { print int(delay)"\n"int(offset)"\n"int(jitter)"\n"stratum }'

Dieses Skript wiederum integriere ich in den snmp daemon (snmpd.conf):

extend ntp-time /usr/local/bin/ntp-tim.sh 

Kurzer lokaler Test nach dem „/etc/init.d/snmpd reload“ ob es funktioniert:

snmpwalk -v2c -cpublic localhost -On .1.3.6.1.4.1.8072.1.3.2.4.1.2.8.110.116.112.45.116.105.109.101
.1.3.6.1.4.1.8072.1.3.2.4.1.2.8.110.116.112.45.116.105.109.101.1 = STRING: 14
.1.3.6.1.4.1.8072.1.3.2.4.1.2.8.110.116.112.45.116.105.109.101.2 = STRING: 0
.1.3.6.1.4.1.8072.1.3.2.4.1.2.8.110.116.112.45.116.105.109.101.3 = STRING: 0
.1.3.6.1.4.1.8072.1.3.2.4.1.2.8.110.116.112.45.116.105.109.101.4 = STRING: 2

Funktioniert das, dann kann es in OpenNMS eingebaut werden:
datacollection-config.xml

            
                
                
                
                
            

snmp-graph.properties

reports=ntp.overview, ntp.stratum \

report.ntp.overview.name=NTP Overview
report.ntp.overview.columns=NTPdelay, NTPoffset, NTPjitter
report.ntp.overview.type=nodeSnmp
report.ntp.overview.command=--title="NTP Overview" --units-exponent=0 \
 --vertical-label="miliseconds" \
 DEF:delay={rrd1}:NTPdelay:AVERAGE \
 DEF:mindelay={rrd1}:NTPdelay:MIN \
 DEF:maxdelay={rrd1}:NTPdelay:MAX \
 DEF:offset={rrd2}:NTPoffset:AVERAGE \
 DEF:minoffset={rrd2}:NTPoffset:MIN \
 DEF:maxoffset={rrd2}:NTPoffset:MAX \
 DEF:jitter={rrd3}:NTPjitter:AVERAGE \
 DEF:minjitter={rrd3}:NTPjitter:MIN \
 DEF:maxjitter={rrd3}:NTPjitter:MAX \
 LINE2:delay#0000ff:"Delay " \
 GPRINT:delay:AVERAGE:"Avg \\: %10.2lf" \
 GPRINT:delay:MIN:"Min \\: %10.2lf" \
 GPRINT:delay:MAX:"Max \\: %10.2lf\\n" \
 LINE2:offset#00ff00:"Offset" \
 GPRINT:offset:AVERAGE:"Avg \\: %10.2lf" \
 GPRINT:offset:MIN:"Min \\: %10.2lf" \
 GPRINT:offset:MAX:"Max \\: %10.2lf\\n" \
 LINE2:jitter#ff0000:"Jitter" \
 GPRINT:jitter:AVERAGE:"Avg \\: %10.2lf" \
 GPRINT:jitter:MIN:"Min \\: %10.2lf" \
 GPRINT:jitter:MAX:"Max \\: %10.2lf\\n" 

report.ntp.stratum.name=NTP Stratum
report.ntp.stratum.columns=NTPstratum
report.ntp.stratum.type=nodeSnmp
report.ntp.stratum.command=--title="NTP Stratum" --units-exponent=0 \
 --vertical-label="stratum" \
 DEF:stratum={rrd1}:NTPstratum:AVERAGE \
 DEF:minstratum={rrd1}:NTPstratum:MIN \
 DEF:maxstratum={rrd1}:NTPstratum:MAX \
 LINE2:stratum#0000ff:"Stratum" \
 GPRINT:stratum:AVERAGE:"Avg \\: %10.2lf" \
 GPRINT:stratum:MIN:"Min \\: %10.2lf" \
 GPRINT:stratum:MAX:"Max \\: %10.2lf\\n" 

Fertig!

Ein paar Bemerkungen dazu:

  1. Ich bin mittlerweile ein Fan von SNMP. Ruckzuck ist der lokale snmp daemon erweitert und dank extend muss man sich nicht um OIDs sorgen. Die OID für „extend ntp-time“ bekommt man mit
    snmptranslate NET-SNMP-EXTEND-MIB::nsExtendOutLine."ntp-time"
    
  2. Thresholds und damit die Alarme muss man natürlich wie gewohnt in OpenNMS anlegen
  3. Mit dem Skript überwache ich nur auf Milisekunden genau. Das Reicht mir

OpenNMS neue Configfiles (.xml.rpmnew) einspielen

Wenn man wie ich OpenNMS immer die neueste OpeNMS Version benutzt, dann muss man damit leben, dass ständig neue Configfiles von OpenNMS kommen. Ich lass OpenNMS auf CentOS laufen. Damit kommen die neuen Files als .xml.rpmnew an. Nachdem ich nun auch viel an den Configfiles an meine Bedürfnisse anpasse ist das Update immer ein Merge der beiden Files. Ich habe dafür eine ganz einfache Methode, die ich mir hier mal aufschreiben, dann muss ich nicht immer den Befehl suchen :):

  1. Configfiles standardisieren
    Nachdem beide XML Files immer komplett verschieden formatiert sind, standardisiere ich sie erstmal. Hier ein Beispiel:

    /opt/opennms/bin/xml.reader.pl -w jmx-datacollection-config.xml.rpmnew
    /opt/opennms/bin/xml.reader.pl -w jmx-datacollection-config.xml
    
  2. Diff/Merge
    Danach erstelle ich mir einen Merge

    sdiff -o jmx-datacollection-config.xml.new jmx-datacollection-config.xml.rpmnew jmx-datacollection-config.xml
    
  3. Config austauschen
    Anschließend sichere ich mir jmx-datacollection-config.xml.rpmnew und jmx-datacollection-config.xml und benenne jmx-datacollection-config.xml.new in jmx-datacollection-config.xml um. Fertig

PL2303 Udev Abenteuer

Ich habe mir einen 4fach USB zu serial Adapter gekauft. Das Teil ist super einfach. Es hat einen Hub eingebaut an dem 4 PL2303 Adapter hängen. Die werden der Reihenfolge im System eingehängt. Doof nur, dass ich machmal auch andere Geschichten mit FTDI oder PL2303 anschließe. So kann es vorkommen, dass die Ports nicht brav immer am Anfang der Reihenfolge geladen werden, sondern diverse Ports haben. Logischerweise will ich aber immer den richtigen Port direkt ansprechen. Daher habe ich mir ein UDEV Regel mit einem kleinen Skript gebastelt:

  1. UDEV
    KERNEL=="ttyUSB*", SYSFS{product}=="USB-Serial Controller", RUN="/usr/local/bin/comdevice.pl %p %k"
    
  2. Skript
    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    my $device = $ARGV[0];
    my $path = $ARGV[1];
    exit if($device !~ /devices/);
    
    my $newcomport = "0";
    $newcomport = $1 if($device =~ m/(\d+):[^:]+\/[^\/]+$/);
    
    symlink "/dev/".$path, "/dev/com".$newcomport if(! -e "/dev/com".$newcomport);
    

Das ganze erstellt dann Devices (/dev/com1 für den ersten Anschluß, /dev/com2 für den zweiten, ….)

dd Statistik

dd ist ja für mache Tasks ganz praktisch. Was ich aber ein wenig schande finde ist, dass es nur am Ende die Statistik ausgibt und man damit sozusagen im Blindflug unterwegs ist. D.h. währen des Kopierens sieht man nicht wie weit er schon ist. Es gibt aber einen Trick, der sogar in den manpages steht 🙂

$ dd if=/dev/zero of=/dev/null& pid=$!
$ kill -USR1 $pid; sleep 1; kill $pid
18335302+0 records in
18335302+0 records out
9387674624 bytes (9.4 GB) copied, 34.6279 seconds, 271 MB/s

Wann schaffe ich mal 271MB/s