Archiv der Kategorie: Indianer, Kater und andere Serverbewohner

additiv

Ziel meines Kollegen war es, ein Programm mit einer Laufzeit von knapp 24 Stunden jeden ersten Samstag im Monat zu starten.

Lachen musste ich, als ich den cron-Eintrag sah:

0 20 1-7 * 6

Und da wundern sich die Leute, dass der Server alle paar Wochen mal einige mit sich selbst beschäftigt war :)

warum?

die hier schon erwähnte Groupware (also, nicht die aus Freiburg/Sofia, sondern aus *kotz* Nürnberg) hatte kürzlich ein unangenehmes Wiedererstehen in Form eines neuen Releases.

nicht nur, dass das dekompilierte (raubmörderkopierte?) Import-Tool nicht mehr lief war auch der Updatepfad selbst eher undurchsichtig. das Softwarehaus stellt zwar ein Debian-Repository zur Verfügung, dieses liefert allerdings keine lauffähige Software aus, sondern erfordert noch das Starten diverser Shell-Skripte und die manuelle Konfiguration des Apache-Servers. so weit so schlecht.

Schlecht wurde mir dann beim letzten Versionssprung (6.16 auf 6.18, sooo krass klang das nicht), bei dem sich der Hersteller etwas *ganz* besonderes ausdachte – an sich lief die Weboberfläche nach einem apt-get upgrade nicht mehr, es kam nur die nichtsagende Meldung, dass Javascript für den Betrieb notwendig sei. Erst nach langem rumstöbern fand ich dann im Apache-Log (was ich eigentlich ignorierte, da von dort nur statische Seiten kommen, der Rest wird per proxy_mod über ajp an den Java-Daemon weitergereicht) lauter 404-Fehler, auf kryptische Verzeichnisse mit Namen wie „v=Md2C7Aq“.

Ursache des Problems war dann etwas ganz abgefucktes – während des Build-Prozesses mit ant* wird ganz unscheinbar eine js.jar mit dem Argument timestamp.js aufgerufen (was ich beim Fehlersuchen so nicht bemerkte), die eben solche wirren Namen erzeugt wie „v=Md2FA1X“ oder „v=Md2FJJ6“ (gerade zwei Mal kurz hintereinander aufgerufen). Diese erzeugten Namen werden während des Paketbauens mit einem „replacefilter token=“#build.version#“ value=“${build.version}““** in alle erzeugten (statischen!) html-Files geworfen, um dann, was _sehr_versteckt in der Doku steht, mit der RewriteEngine des Apaches zur Laufzeit mit „RewriteRule v=\w+/(.+) $1 [L]“ wieder rausgestript zu werden.

Warum macht man so was? Gibt es irgendeinen sinnvollen Grund, recht aufwändig*** beim Paketbauen alle Links zu verändern, um diese dann noch aufwändiger und prozessorzyklenfressender _zur Laufzeit_ wieder rauszuwerfen? und wenn schon so etwas kreuzdämliches gemacht werden muss – warum wird dann nicht mit dem Debian-Paket eine deutliche Warnung verteilt (im Stil der abzunickenden Sun-Lizenz aus dem Java-Paket), dass eine Apache-Umkonfiguration zwingend erforderlich ist?

*) aus dem auch die deb-Dateien des Repositories rausfallen
**) da gehören spitze Klammern außenrum, aber weil WordPress so benutzerfreundlich ist kann ich diese Zeichen augenscheinlich nicht verwenden (hab aber auch zugegebenermaßen nur 10 Sek rumgespielt)
***) ich glaube so wird das heutzutage geschrieben, sieht aber irgendwie komisch aus…

Geschichte

…wiederholt sich, das erste mal als Tragödie, beim zweiten mal als Farce (ich glaube Marx sagte das – aber ob Karl oder Groucho vergesse ich immer; passen würde es zu beiden)

Heute war ich erstmals gezwungen, sehr lange im Büro zu bleiben – und was war die Ursache? Mit Xen* virtualisierte Windows**-Terminal***-Server. Das ganze Zeug ist so grottig, dagegen ist unlesbarer Code immer noch sehr entspanntes Arbeiten im Vergleich.

Wenn wenigstens die Hersteller von Close-Source-Software anfangen würden, ein brauchbares Logging zu implementieren – aber nein, selbst eine an sich solide Softwareschmiede wie Citrix nutzt ausgerechnet den Log-Daemon von Windows**** und dort landet im großen und ganzen nichts. Und die Fehlermeldung ist bisher im vom Google abgegrasten Bereich nicht verfügbar****.

Aber in Augsburg kann ich mich kaum alle vier Wochen einmal richtig über die Arbeit aufregen, in Freiburg war das gegen Ende eher andersrum. Alles ist gut.

*) statt Xen 3.3 XenServer 5.6
**) 2008R2 statt 2003
***) statt MS Terminal Services XenApp 6
****) eventvwr.exe. ARGH! ARGH!
*****) also, die deutsche Übersetzung. Unter anderer Sprache anmelden und dann den genauen Text in Englisch zu haben ist ja in der MS-Welt auch nicht gewollt

Code lesen hilft

im Heiseforum gibt es ja immer mal wieder Trolle*, die als Gegenargument von Open Source nennen, dass niemand diesen Code jemals lesen würde – besonders verbreitet ist dies dann, wenn mal wieder eine Sicherheitslücke in irgendeinem namhaften Projekt gefunden wurde. Nun, ich kompiliere nun weder mein Linux selbst noch lese ich den Code vor dem Nutzen einer Software; doch die Möglichkeit dazu ist Gold wert.

Folgendes spontan gewähltes Beispiel: Ich bin in einem Projekt bei $AG involviert, in dem die Groupware** aktualisiert werden soll – die Datenmigration von Postgres/Tomcat zu Mysql/eigene Serveranwendung läuft dabei über ein Tool, welches – im Unterschied zur Groupware selbst – nicht im Code vorliegt. Wie erwartet (und ob der Komplexität solcher Migrationen auch wahrscheinlich kaum anders möglich) spackt das Tool nun rum; bei den Versuchen brach mal der Export mit kaum aussagekräftigen Fehlermeldungen ab, der Import ist vollkommen inkonsistent – die selben Daten an unterschiedlichen Tagen eingespielt brechen mal inkonsequent ab, mal läuft es augenscheinlich größtenteils fehlerfrei durch; konstant ist nur, dass weder Kalendereinträge noch abgelegte Dateien beim Import mitgenommen werden.

Und ja – jetzt wäre es einfach nur genial, den Code einfach nachlesen zu können. Ich bin kein Programmierer (und will es auch nie werden), aber wenn ich in Freiburg bei der zurückgesourcten*** Qualitätssicherung der hauseigenen Software etwas gelernt habe ist es das Schätzen der Möglichkeit, einfach mal anzuschauen, was denn da die Coder dem Admin wieder auf den Tisch gelegt haben. Für mich wird Closed Source nie wieder eine Alternative sein, keine Doku kann im Falle des Falles mit dem stöbern im Quelltext mithalten.

Völlig themenfremde Nebenfrage (weil ich den Umschlag gerade aufmachte): Ist es normal, dass Headhunter-Unternehmen einem nach einer erfolgreichen Vermittlung handgeschriebene Geburtstagskarten schicken? Als (glücklicherweise nicht mehr) IT-Einkäufer kenne ich ja das Weihnachtskartendrama – aber auch bei sehr engen Lieferanten waren im Höchstfall nur die Unterschriften noch manuell erstellt.

*) nicht, dass nicht alle anderen auch Trolle sind…
**) der Laden sitzt auch in Nürnberg. diese Stadt wird irgendwann brennen.
***) an mich :) Geo: Schöne Grüße an Ivo :)

geht, geht nicht, geht gar nicht

Kein Problem habe ich damit, dass jemand sein iPhone jailbreakt und eine WLAN/UMTS-Router-Software drauf installiert. In Ordnung ist es auch, sein gejailbreaktes iPhone mit einer anderen MAC-Adresse zu versehen, um das Firmennetzwerk zu nutzen.

Die Kombination geht nicht – es ist recht desaströs, wenn das iPhone im Firmennetzwerk hängt und der DHCP-Server der Routersoftware den stabilen Netzwerkbetrieb beeinträchtigt.

Gar nicht geht ist leugnen, so eine Software habe ich nicht oder auch die Geschäftsführung verwendet iPhones sowie auch wintest6* ist ein virtueller Rechner, der hat keine MAC ist eine ganz schlechte Tour. Aber alle Vorurteile wieder bestätigt: Ein Windows-Admin, der auch Apple-Produkte verwendet kann einfach nur unbedarft sein.

*) der zur MAC-Adresse hinterlegte Rechnername im Netz

wirr.

ich frickel zur Zeit etwas am Monitoring* und habe da von einer USV ein *sehr* seltsames Verhalten.

Die Netzstruktur sieht ungefähr so aus

[LAN1 mit Monitoringserver] – [Router] – [LAN2 mit USV]

und das Gesamtsystem verhält sich – komisch.

Vom LAN2 aus kann ich alle Dienste (http, snmp, telnet) der USV problemlos erreichen, von LAN1 aus ist es, ähm, anders.

telnet geht, snmp nicht – so weit so einfach. bei http lädt (reproduzierbar von verschiedenen Rechnern aus) nur die index.html mit der Frameset-Definition, alle anderen Objekte (HTML-Seiten wie auch beispielsweise die Grafiken) laden nicht (bzw nur der HTTP-Header).

Mir sind die Ideen ausgegangen, der Router blockiert angeblich gar nichts, die Netzwerkeinstellungen auf der USV sind korrekt. Kennt irgendjemand ein Routingproblem, welches nur UDP/161 und TCP/80 (hier aber nur bei Ressourcen != index.html…) betrifft? ich scheue noch etwas davor zurück, der Technik-Abteilung zu sagen, dass sie im Standort von LAN2 mal alles runterfahren müssen um ein power cycle auf der USV zu fahren…

*) in gewisser Hinsicht fühlt sich das hier wie das Gegenteil von dem an. Kaum denke ich mal einen guten Überblick zu haben ploppen irgendwoher weitere Server in mein Gesichtsfeld…

Brenne Nürnberg, brenne

Was für eine beschissene Software. Wer Volldepp kommt auf die Idee, einen Deinstaller so zu programmieren, dass auch mit deaktivierter „Sicherheitsüberprüfung“ (die Deppenarschlöcher meinen damit wohl so etwas wie einen Dependency-Check) ein nicht funktionierendes Modul nicht einfach dateimäßig aus dem System gekickt werden kann?

Die Servermigration haben wir von einem Berater durchführen lassen, hätte ich doch mal drauf bestanden, auch die Workstation-Neuinstallationen durch diesen machen zu lassen: Ich weiß jetzt schon, dass ich den letzten Bus verpasse.

Diesen Dreck nie wieder anfassen zu müssen ist einer der größten Vorteile meines Arbeitgeberwechsels.

quis custodiet ipsos custodes?*

Das ganze Hardware-Drama die letzte Zeit hat mich dazu bewogen, etwas anzufangen, was ich mir eigentlich schon seit (beinahe :)) drei Jahren wünsche: Ein zeitgemäßes Servermonitoring bei $AG.

Hängengeblieben bin ich dann bei Zabbix, die Inbetriebnahme war so weit so schmerzlos (fertige Pakete in den Repos von Debian Etch und Lenny sowie CentOS 5.3), die grundsätzliche Konfiguration ist recht simpel und straightforward**, wobei ich bei weitem noch nicht die Möglichkeiten der Software ausnutze, an sich teste ich nur ob sich ein Server in die ewigen Jagdgründe verabschiedet hat und generiere daraus Panikbenachrichtigungen***. Sicher wäre das schneller mit einer Handvoll selbstgestrickten Skripten gegangen, aber ich wollte eine Lösung einführen, auf die ich langfristig aufbauen kann. NICHTS hält länger als ein Provisorium…

Das einzige wirklich fehlende war dann noch die Überwachung vom Überwachungsserver selbst – das ganze Ding soll dazu dienen, dass ich seit Wochen mal wieder in Ruhe schlafen kann ohne mich in Albträumen über abkackende Server zu stürzen; somit ist klar, dass ich auch den Wächter überwachen muß.

Prinzipiell lassen sich Zabbix-Server-Instanzen auch kaskadieren, aber für meine kaum 3 Dutzend Server wäre es absoluter Overkill, gleich zwei Zabbixe zu betreiben (und dann immer noch nicht mitkriegen, wenn der Strom ausfällt…), damit mußte etwas einfacheres her.

Was ich jetzt habe ist ein dreistufiges Monitoring:
1. Zabbix überwacht aktiv alle internen Server (entweder über den Agent-Dienst auf den Servern oder – wenn der nicht installierbar ist – ganz simpel von außen über Ping und offene Ports)
2. Auf dem Mailserver (auch im internen Netz) läuft per cron ein simples Skript, das den Zabbix-Agent auf dem Zabbix-Server abfragt (sinnigerweise nach der Anzahl laufender zabbix_server-Prozesse :)), Herzstück des ganzen ist das:

echo -e „proc.num[zabbix_server]“\n\n; sleep 5) | telnet [Zabbix-Server] 10050 2>&- | cut -s -d D -f 2 | cut -b 9-

Damit wird nur per Telnet auf dem Port 10050 (der Default bei Zabbix Agents) ein Item abgefragt, in diesem Fall die Anzahl laufender Prozesse mit dem Name „zabbix_server“. Der Rest dient nur dazu, die Ausgabe vom Zabbix-Agent in nutzbare Form zu bringen, die Ausgabe vom Telnet-Teil sieht ungefähr so aus:

Trying [IP-Adress]…
Connected to [Zabbix-Server].
Escape character is ‚^]‘.
ZBXD[ein paar Byte Binärschlonz]23

Das erste cut wirft die ersten 3 Zeilen raus (der Trenner „D“ ist ja nicht vorhanden) und splittet die vierte Zeile, Ergebnis ist dann [Binärschlonz]23. Das zweite cut erlöst mich dann noch von dem Zabbix-Protokoll-eigenen paar Bytes nichtdruckbare Zeichen und ich habe ein einfache Integerzahl. Und mit der lässt sich in einem Skript schon einiges anstellen :) Meine Benachrichtigungen habe ich dann so definiert, dass alles von >0 gut ist, kriege ich als Ergebnis eine 0 (kein laufender Zabbix-Server-Prozess) oder irgendwas anderes (ein leeres Ergebnis heißt, dass keine Verbindung aufgebaut werden konnte beispielsweise) stimmt was nicht und die Paniknachricht wird generiert.
3. Auf einem angemieteten Server bei $großemHostingAnbieter haben wir noch einen root-Server laufen, der fragt dann über ein ähnlich simplen Bash-Skript ab, ob Port 25 (=smtp) auf der externen Adresse von unserem Netz erreichbar ist.

So ist im großen und ganzen eine lückenlose Überwachung möglich, der Zabbix-Server selbst überwacht alle meine internen Boxen, der Mailserver hat ein Auge auf die Zabbix-Box und ein Rechner draußen in der Wolke bewacht den Mailserver. Nicht 100%ig valide, aber für die SLAs von uns (und meinem Schlaf :)) reicht das erst mal.

*) sorry wenn jemand was politisches erwartet hat, aber was sollte ich dem noch hinzufügen können?
**) im großen und ganzen, allerdings scheint sich das Übertragungsformat zwischen V 1.1.4 (bei Etch) und V 1.4.6 (Lenny) ziemlich geändert zu haben, für ein paar obskurere Monitoring-Sachen auf einigen Servern war ich gezwungen das Source-DEB von Lenny unter Etch neu zu backen
***) auch die sind so simpel wie möglich gestrickt: Es werden Mails an $großenFreemailProvider generiert und von da aus per Filter auf Absender und Betreff per SMS-Benachrichtigung an mich weitergeleitet