Frühlingsgruß auf dem Balkon

April 19th, 2011

Wir hatten am Wochenende eine Biene als Gast auf unserem Balkon. Die Heidelbeerblüten enthalten anscheinend schmackhaften Nektar.

Feste IP-Adresse mit Cisco EEM sicherstellen

April 19th, 2011

codswollop / photocase.comEin ADSL-Anschluss mit fester IP-Adresse hat den Vorteil, sowohl relativ preiswert aber dennoch sehr flexibel einsetzbar zu sein. Wenn wenig Upstream-Bandbreite benötigt wird, aber dennoch Serverdienste oder ein VPN betrieben werden soll.

Leider hat mindestens ein ADSL-Anbieter das Problem, dass gelegentlich zwar die Neueinwahl nach der Zwangstrennung funktioniert, aber nicht die korrekte feste IP-Adresse übermittelt wird. Um dieses Problem automatisch zu beheben habe ich dieses Skript für den Cisco Event Manager (EEM) entwickelt. Es prüft nach erneuter Einwahl, ob das Dialer-Interface die korrekte IP-Adresse erhalten hat. Falls nicht, wird eine neue Einwahl erzwungen.

Zuerst definiere ich ein paar Variablen, nämlich den Interfacenamen des Dialer-Interfaces sowie die zugeteilte feste IP-Adresse:

event manager environment _dialer_interface Dialer0
event manager environment _static_ip 192.0.2.47

Um den Code zu testen, habe ich folgendes EEM-Skript auf dem Router hinterlegt:

event manager applet showIP 
 event none sync yes
 action 100 cli command "enable"
 action 110 cli command "show ip interface brief | include $_dialer_interface"
 action 120 puts "CLI-Result: *$_cli_result*"
 action 130 set result "unknown"
 action 140 regexp " [0-9.]+ " "$_cli_result" result
 action 150 puts "IP address=*$result*"
!

Dieses kann man folgendermassen aufrufen, um sicherzustellen, dass das Ermitteln der IP-Adresse funktioniert:

router#event manager run showIP
CLI-Result: *Dialer0                    192.0.2.47   YES IPCP   up                    up      
router#*
IP address=* 192.0.2.47 *

Das sieht doch sehr gut aus! Nun können wir das eigentliche EEM-Skript installieren, das auf die Logzeile reagiert, die das Einwählen verkündet:

Mar 14 23:47:42.123: %DIALER-6-BIND: Interface Vi1 bound to profile Di0

Dieses Skript lautet wie folgt:

event manager applet DialerUp 
 event syslog occurs 1 pattern "%DIALER-6-BIND:"
 action 100 cli command "show ip interface brief | include $_dialer_interface"
 action 110 set ipaddress "unknown"
 action 120 regexp " ([0-9.]+) " "$_cli_result" match ipaddress
 action 130 if $ipaddress ne $_static_ip
 action 140  syslog priority errors msg "clearing $_dialer_interface because $ipaddress is not $_static_ip"
 action 150  cli command "enable"
 action 160  cli command "clear interface $_dialer_interface"
 action 170 else
 action 180  syslog priority errors msg "correct address on $_dialer_interface: $ipaddress"
 action 190 end
!

Testen lässt sich dies, indem man temporär die Variable _static_ip auf eine andere als die eigentlich zuzuteilende setzt. Wenn man dann eine Einwahl erzwingt sollte der Router sie jedes Mal wieder zurücksetzen, bis man die Variable wieder auf den korrekten Wert gesetzt hat.

Da wir auf unseren Routern Tacacs einsetzen, muss ein Benutzername gesetzt werden, unter dem die Kommandos ausgeführt werden. Dies macht man mit der folgenden Zeile:

event manager session cli username "cisco"

Netzwerk-Kabel-Automat

April 1st, 2011

Als Netzwerktechniker ist man im Rechenzentrum manchmal ein wenig aufgeschmissen. Man hat alle Geräte dabei, die eingebaut werden sollen, die Schränke sind vorbereitet und der Strom ist gelegt. Aber dann fehlen einem Kleinteile im Wert von wenigen Cent, die einen Strich durch die Rechnung und die Zeitplanung machen.

Wir buchen, Sie fluchenDie Kollegen von FlexOptix haben kürzlich auf der CeBit den Gearomat vorgestellt. Ein ähnliches Produkt haben wir, ebenfalls unter größter Geheimhaltung, für unser Rechenzentrum entwickelt. Den Automatic Cable Dispenser können Sie demnächst in unseren Rechenzentren finden und benutzen. Nach der Testphase unserer Prototypen werden wir sie auch anderen Interessenten anbieten.

Am Automatic Cable Dispenser können Sie eingeben, welche Länge das gewünschte Netzwerkkabel haben soll, von welchem Typ und mit welchen Steckern es ausgestattet sein soll. Je nach Kabeltyp haben Sie ausserdem die Wahl zwischen verschiedenen Farben. Nach Eingabe dieser Parameter wird das Kabel in gewünschter Länge ausgegeben. Ein zweiter Ausgabeschacht liefert den benötigten Stecker und eventuelles Zubehör aus.

Mit Hilfe der am Automaten befestigten Crimpzange können Sie dann den oder die Stecker montieren. Hierbei wird auf dem Mehrfarbdisplay eine bebilderte Anleitung angezeigt. Ausserdem bietet der Automatic Cable Dispenser Testanschlüsse für alle angebotenen Stecker- und Kabeltypen. Das Ergebnis dieser Kabelmessung wird gespeichert und auf Wunsch auf Thermopapier ausgedruckt.

Die Zahlung erfolgt Bargeldlos, entweder per Kredit- oder Geldkarte, oder mit der Rechenzentrums-Zugangskarte über die nächste Rechnung.

kreative Transportsicherung

März 29th, 2011

Diesen LKW-Autotransport konnten wir kürzlich aus unserem Bürofenster beobachten — Kreativ, aber offenbar für die Polizei nicht sicher genug.

Porträt vom Mann im Mond

März 22nd, 2011

Kleine Kompaktkameras werden immer besser – größere Auflösung, mehr Zoom, besserer Weitwinkel. Aber es gibt immer noch Bereiche, in denen es einfach unmöglich ist, mit einem solchen Taschenknipskasten annähernd das einzufangen, was das menschliche Auge sieht.

Ein Motiv, bei dem ich früher gar nicht erst versucht habe ein Photo zu machen, war der Mond. Hier kapitulieren die meisten kleinen Kameras, nur mit den Einstellmöglichkeiten einer digitalen Spiegelreflexkamera kann man dieses Motiv einfangen. Hier meine zwei bisher besten Resultate. Aber ich werde sicher weiter probieren.


Tipps von Sysadmin zu Webentwickler

März 15th, 2011

Als Systemadministrator beobachtet man bestimmte Fallen immer wieder, in die unerfahrene Entwickler von Webanwendungen tappen. Ich habe hier die Top Ten der mißachteten Punkte zusammengestellt:

  1. Ruft regelmässige Aufgaben über richtige Cronjobs auf, nicht mit Curl/wget/lynx per HTTP, setzt eine E-Mail-Adresse als Empfänger der obigen Cronjobs, die ganz sicher immer funktioniert, und produziert in euren Cronjobs nur dann eine Ausgabe, wenn Fehler auftreten. Keine Debuginfos, zwischen denen echte Fehler einfach untergehen, weil die Mail eh jeden Tag kommt — kurz, schreibt ordentliche Cronjobs
  2. Entwickelt von vornherein in UTF-8, früher oder später kommen Finnen, Franzosen, Dänen, Asiaten, mit lustigen Sonderzeichen
  3. Achtet auf sinnvolle Rechtevergabe, prüft, unter welchem User die Webanwendung per Webserver aufgerufen wird, und mit welchen Privilegien ihr per SSH oder FTP auf die Daten zugreift. Setzt sinnvolle Gruppenrechte oder veranlasst, dass alles unter der selben UID läuft — z.B. per suPHP
  4. Kalkuliert die Datensicherung ein, vor allem daß während eines Datenbank-Snapshots z.B. per mysqldump oft ein globales Write-Lock verhängt wird
  5. Legt gerade bei ausfallsicheren Plattformen auch die Cronjobs entsprechend an — entweder mit globalem Locking oder so, daß auch mehrere gleichzeitig arbeiten können
  6. Baut von vornherein vernünftige Fehlerseiten und Fehlerbehandlung, die so wenig Abhängigkeiten wie möglich haben. Nichts ist peinlicher als die Meldung Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
  7. Bereitet eine Wartungsseite vor, die alle Anfragen sauber beantwortet, wenn die Anwendung mal aktualisiert wird oder aufgrund von technischen Problemen deaktiviert werden muss. Teilt eurem Hoster mit, wie diese Seite aktiviert werden kann, falls mal etwas schlimmes schiefgeht
  8. Stellt sicher, dass zumindest eure Kollegen und der Hoster die Fehlerseite von der Wartungsseite unterscheiden können. Sonst wird im Ernstfall der Sysadmin die Fehler-Wartungsseite zu sehen bekommen und von Wartungsarbeiten ausgehen, wenn vielleicht gerade die Datenbank Probleme macht
  9. Legt nur solche Infos im Cache ab, deren Erzeugung wirklich Rechenzeit spart — Datenbankabfragen sind schneller als ein Festplattenbasierter Cache, und eine Datenbank ist Backup-tauglicher
  10. Räumt von vornherein eure Daten auf — wenn z.B. die an User verschickten Mails erstmal dreistellige Gigabyte in der Datenbank belegen, ist es zu spät

Ich hoffe, damit dem ein oder anderen angehenden Programmierer hilfreiche Tipps gegeben zu haben, und vielleicht auch die Nerven manches Sysadmins zu schonen…

Objektivwechsel leichtgemacht

März 8th, 2011

Wer, wie ich, ein bisschen Gefallen an der digitalen Spiegelreflexfotographie gefunden hat, besitzt früher oder später mehr als ein Objektiv. Dann kommt irgendwann der Moment, in dem man unterwegs einen Objektivwechsel vornehmen will. Im Normalfall bedeutet das folgende Arbeitsschritte:

  1. Schutzkappe aus der Tasche kramen
  2. Objektiv abnehmen
  3. Schutzkappe an Objektiv anbringen
  4. Objektiv verstauen
  5. Austauschobjektiv aus der Tasche nehmen
  6. Schutzkappe vom Austauschobjektiv abnehmen
  7. Objektiv anbringen
  8. Schutzkappe verstauen

Das sind viele Schritte, und wenn man keine zusätzliche Schutzkappe lose in der Tasche haben möchte braucht man zwischendurch theoretisch drei Hände. Da man aber bisher nur dreiköpfige Affen, aber nicht dreiarmige Menschen kennt, ist das ein Problem.

Im auch ansonsten trotz des etwas altmodischen Designs sehr zu empfehlenden Striewisch Fotolehrgang im Internet habe ich aber einen guten Tipp gefunden: Man klebt einfach zwei Objektivkappen aneinander. Damit reduziert sich der Objektivwechsel auf folgende Schritte:

  1. Objektiv aus der Tasche nehmen
  2. Objektiv von der Kamera entfernen
  3. bisheriges Objektiv auf die Kappe am Austauschobjektiv schrauben
  4. Austauschobjektiv von der Kappe abschrauben
  5. Objektiv an der Kamera befestigen
  6. bisheriges Objektiv in der Tasche verstauen

Hierbei reicht das normalerweise vorhandene Paar Arme aus, und man verkürzt die Zeit, in der die Kamera objektivlos den Elementen ausgesetzt ist. Für diejenigen, die sich das bildlich nicht vorstellen können, habe ich beim letzten Mal alle Arbeitsschritte photographiert.

Kleiner Tipp am Ende: Die benötigten Objektivdeckel kann man natürlich als Originalzubehör kaufen. Günstiger ist allerdings der Direktimport aus Asien, z.B. über FocalPrice

Cisco SFP mit DDM

Februar 22nd, 2011

Bei einer Glasfaser-Leitung fragt sich der Netzwerkadministrator oft, ob das Signal nur gerade so eben ausreicht, um einen Link zu bekommen, oder ob die Faser noch ausreichend Budget für zusätzliche Patches oder Spleiße hat. Hilfreich hierbei ist es, wenn Glasfaser-Optiken zum Einsatz kommen, die anzeigen, wie stark das ankommende Signal ist. Diese Funktion nennt man Digital Diagnostics Monitoring (DDM) oder Digital Optical Monitoring (DOM).

Hier die Ausgabe eines Cisco 2960S-Switches mit entsprechendem SFP:

#sh int gi1/0/28 transceiver  
ITU Channel not available (Wavelength not available),
Transceiver is internally calibrated.
If device is externally calibrated, only calibrated values are printed.
++ : high alarm, +  : high warning, -  : low warning, -- : low alarm.
NA or N/A: not applicable, Tx: transmit, Rx: receive.
mA: milliamperes, dBm: decibels (milliwatts).

                                 Optical   Optical
           Temperature  Voltage  Tx Power  Rx Power
Port       (Celsius)    (Volts)  (dBm)     (dBm)
---------  -----------  -------  --------  --------
Gi1/0/28     28.1       3.28      -2.3     -15.2   

Wir sehen hier, dass der Empfangspegel (Rx Power) bei -15.2dB liegt. Um das optische Budget des konkreten SFP zu ermitteln hilft uns folgendes Kommando:

switch#sh int gi1/0/28 transceiver detail 
ITU Channel not available (Wavelength not available),
Transceiver is internally calibrated.
mA: milliamperes, dBm: decibels (milliwatts), NA or N/A: not applicable.
++ : high alarm, +  : high warning, -  : low warning, -- : low alarm.
A2D readouts (if they differ), are reported in parentheses.
The threshold values are calibrated.

                              High Alarm  High Warn  Low Warn   Low Alarm
          Temperature         Threshold   Threshold  Threshold  Threshold
Port       (Celsius)          (Celsius)   (Celsius)  (Celsius)  (Celsius)
--------- ------------------  ----------  ---------  ---------  ---------
Gi1/0/28    28.6                80.0        75.0        -5.0      -10.0

                              High Alarm  High Warn  Low Warn   Low Alarm
           Voltage            Threshold   Threshold  Threshold  Threshold
Port       (Volts)            (Volts)     (Volts)    (Volts)    (Volts)
---------  ---------------    ----------  ---------  ---------  ---------
Gi1/0/28   3.28                  3.60        3.50        3.00       2.90

           Optical            High Alarm  High Warn  Low Warn   Low Alarm
           Transmit Power     Threshold   Threshold  Threshold  Threshold
Port       (dBm)              (dBm)       (dBm)      (dBm)      (dBm)
---------  -----------------  ----------  ---------  ---------  ---------
Gi1/0/28    -2.3                 2.0         1.0        -6.0       -7.0

           Optical            High Alarm  High Warn  Low Warn   Low Alarm
           Receive Power      Threshold   Threshold  Threshold  Threshold
Port       (dBm)              (dBm)       (dBm)      (dBm)      (dBm)
-------    -----------------  ----------  ---------  ---------  ---------
Gi1/0/28   -15.2                 0.0        -1.0       -21.0      -22.0

Wir sehen hier, dass bei -22.0 dB ein Alarm ausgelöst wird. Wir haben also noch 6.8dB Puffer. Das ist beachtlich viel, wenn man bedenkt dass die Leitung ca. 15km lang ist. Als Vergleich habe ich hier noch eine Ausgabe für eine kurze Strecke von ca. 10m.

#sh int gi1/0/25 transceiver detail 
ITU Channel not available (Wavelength not available),
Transceiver is internally calibrated.
mA: milliamperes, dBm: decibels (milliwatts), NA or N/A: not applicable.
++ : high alarm, +  : high warning, -  : low warning, -- : low alarm.
A2D readouts (if they differ), are reported in parentheses.
The threshold values are calibrated.

                              High Alarm  High Warn  Low Warn   Low Alarm
          Temperature         Threshold   Threshold  Threshold  Threshold
Port       (Celsius)          (Celsius)   (Celsius)  (Celsius)  (Celsius)
--------- ------------------  ----------  ---------  ---------  ---------
Gi1/0/25    29.1                80.0        75.0        -5.0      -10.0

                              High Alarm  High Warn  Low Warn   Low Alarm
           Voltage            Threshold   Threshold  Threshold  Threshold
Port       (Volts)            (Volts)     (Volts)    (Volts)    (Volts)
---------  ---------------    ----------  ---------  ---------  ---------
Gi1/0/25   3.28                  3.60        3.50        3.00       2.90

           Optical            High Alarm  High Warn  Low Warn   Low Alarm
           Transmit Power     Threshold   Threshold  Threshold  Threshold
Port       (dBm)              (dBm)       (dBm)      (dBm)      (dBm)
---------  -----------------  ----------  ---------  ---------  ---------
Gi1/0/25    -2.3                 2.0         1.0        -6.0       -7.0

           Optical            High Alarm  High Warn  Low Warn   Low Alarm
           Receive Power      Threshold   Threshold  Threshold  Threshold
Port       (dBm)              (dBm)       (dBm)      (dBm)      (dBm)
-------    -----------------  ----------  ---------  ---------  ---------
Gi1/0/25    -8.8                 0.0        -1.0       -21.0      -22.0

Nagios: Check-Ergebnis invertieren mit negate

Februar 8th, 2011

Schon seit längerer Zeit hatte ich eine Idee im Hinterkopf, einen speziellen Nagios-Check zu schreiben, der das Ergebnis eines anderen Checks invertiert, d.h. meldet der Check “OK”, ist das Ergebnis “Critical” und umgekehrt. “Unknown” und “Warning” bleiben erhalten.

Dieser Check war zum Beispiel dafür gedacht, dass ein Router sich, wenn eine Standleitung ausfällt, über eine alternative Verbindung einwählt. Diese soll aber, wenn sie nutzungsabhängige Kosten verursacht, nicht ständig aufgebaut sein. Es ist also ein Ping-Check nötig, der dann alarmiert, wenn die Verbindung aufgebaut ist. Ein anderes Beispiel ist, dass man auf einem SSH-fähigen Cisco-Router sicherstellen möchte, dass telnet deaktiviert ist.

Jetzt habe ich festgestellt, dass ich nicht der einzige mit dieser Idee war, und sie offenbar schon vor einiger Zeit in dem “negate“-Check umgesetzt wurde. Dieser macht genau das oben beschriebene, und kann zusätzlich noch im Ergebnis die Zeichenketten “OK” und “WARNING” entsprechend ersetzen.

Hier ein Konfigurationsbeispiel. Man nimmt die ursprüngliche Konfiguration, um Telnet zu checken:

define command{
	command_name	check_telnet
	command_line	/usr/lib/nagios/plugins/check_tcp -H '$HOSTADDRESS$' -p 23
}

Vor die command_line stellt man dann das negate-Plugin:

define command {
        command_name    check_telnet_disabled
        command_line    /usr/lib/nagios/plugins/negate /usr/lib/nagios/plugins/check_tcp -H '$HOSTADDRESS$' -p 23
}

Und fertig ist ein Check-Command, das Alarm gibt, sobald Telnet aktiviert ist.

Nachts in Ottensen

Januar 14th, 2011

Diese Photos habe ich noch letztes Jahr auf einer kleinen Nachtrunde durch Ottensen gemacht. Die Runde war quasi der erste Testlauf für mein Tamron 10-24mm Weitwinkelobjektiv. Da ich frei Hand photographiert habe bitte ich die leichten Verwackler zu entschuldigen.