Categories
Linux

PowerDNS Endlosschleife

PowerDNS läuft Amok wenn man eigene DB-Queries verwendet und sich dabei an die Dokumentation hält – dort heißt es im Punkt “Master-Slave Queries“:

update-lastcheck-query

Called to update the last time a slave domain was checked for freshness. Default: update domains set notified_serial=%d where id=%d

Es müsste aber heissen:

update-lastcheck-query

Called to update the last time a slave domain was checked for freshness. Default: update domains set last_update=%d where id=%d

Leider verleitet der “Bug” den Server alle 60s nach zuschauen ob alle Zonen noch “frisch” sind. Da die falsche Spalte aktualisiert wird, hält den Server auch nichts davon ab dies jetzt jede 60s bei sämtlichen Domains zu tun.

Vor ziemlich genau einem Jahr ist das schon jemandem aufgefallen. Leider wurde es noch nicht geändert :(. (Ich versuche auch nochmal die Entwickler zum ändern der Doku zu bewegen ;).

Categories
Linux

postfix: execute commands (virtual domains)

Nach und nach stelle ich alle Maschinen von qmail auf Postfix um. Ein letztes Thema bei der Migration war die Integration von diversen Scripten beim Mail-Empfang. Zwar kann man Postfix mittels einfacher Anweisung in der /etc/aliases das Ausführen von Scripten etc. beibringen – jedoch ist es nicht so einfach wenn man mehrere Domains (Virtual Domains) auf dem Server bedienen will. Dazu ist ein klein wenig mehr Aufwand notwendig…

Zunächst wird mittels einer Postfix-Datenbank gesteuert welche Mails beim Script landen sollen:

#/etc/postfix/transportregex
/trac-project-x@example.com/         trac:project-x
/trac-project-y@example.com/         trac:project-y

Man beachte die Strings hinter dem “:”, diese werden hinterher von unserem Script-Service (hier: trac) ausgewertet. Nach dem Erstellen der Datei muss diese in eine Postfix-DB umgewandelt werden (dies ist auch nach jeder Änderung der Datei nötig):

postmap /etc/postfix/transportregex

Die soeben erstellte Datei wird jetzt in die Postfix-Konfiguration eingebunden:

#/etc/postfix/main.cf
transport_maps = regexp:/etc/postfix/transportregex, hash:/var/spool/postfix/plesk/transport

Jetzt wird noch ein neuer Postfix-Service benötigt welcher das Script ansteuert:

#/etc/postfix/master.cf
trac unix - n n - 10 pipe flags=DRhu user=nobody argv=/usr/local/bin/email2trac -p ${nexthop}

Hier wird das Script “email2trac” angesteuert, welches Mails direkt in ein Trac-Ticket umwandelt. Hier ist praktisch, dass man jetzt mittels der Variable ${nexthop} direkt das ursprüngliche Transportziel auswerten kann (siehe oben).

Categories
Linux

LVM deaktivieren

Möchte man ein LVM kurzfristig deaktivieren hilft folgendes Kommando:

vgchange -a n vmdata #deaktiviert Volume Group "vmdata"

Kommt eher selten vor. Beispiel: man betreibt ein LVM in einem DRBD Laufwerk. Dann kann es nützlich sein, das LVM kurzfristig “zu beenden” um die DRBD Ressource neu zu Verbinden. Ist das LV noch aktiv, würde das von DRBD bemerkt und verhindert. “Beenden” ist übrigens nicht ganz die richtige Bezeichnung da es sich bei LVM nicht um einen Daemon o.Ä. handelt sondern um ein Kernel Subsystem.

Categories
Linux

OpenNMS: RRDs auf eine SSD

So wirkt sich das aus wenn man die RRDs (bzw. das ganze /var) auf eine SSD packt…

Categories
Linux

OpenNMS: Jabber/XMPP notifications

Das ist prinzipiell ganz einfach. Anleitung u.A. hier.

Allerdings hatte ich das Problem, dass irgendwann einfach keine Nachrichten mehr verschickt wurden. Wertvoll war ein Hinweis auf der Mailingliste: Man sollte darauf achten, dass jeder potentielle Empfänger auch eine Jabber-Adresse eingetragen hat. Ansonsten kommt es wohl intern zu Ungereimtheiten. Da ich bei den Benachrichtigungen im wesentlichen nur mit Benutzergruppen arbeite, gibt es jetzt eine extra Gruppe “Admins_Jabber” in welcher dann nur Empfänger sind welche auch eine Jabber-ID haben. Etwas unschön, aber seitdem funktionieren die Jabber Nachrichten zuverlässig.

Categories
Linux Programmierung

PHP/bash: Konsolenausgabe positionieren

Kürzlich benötigte ich für eine PHP Konsolenanwendung die Ausgabe einer Statuszeile. Die ausgegebene Zeile sollte jedoch nicht (wie sonst üblich) jeweils in einer neuen Zeile landen, sondern immer in der selben Zeile – so dass man einen schnellen Überblick über den Scriptstatus bekommt. Wie auch immer – ich habe mich dann etwas durch die Terminal ANSI Escape Sequenzen gekämpft und das ganze mit meinem PHP Script kombiniert. Folgend die entsprechende Funktion für die Ausgabe:

function echoFixedLine($string) {
     echo "\033[K" . $string . "\033[" . strlen ($string) . "D";
}

echo "TEST:";

for ($i=0; $i<=100; $i++) {
    echoFixedLine("Number: " . $i);
    sleep(1);
}

// Ausgabe nach ca. 101 Sekunden:
TEST:
Number: 100

Die Funktion löscht immer zunächst die ganze Zeile, schreibt dann den gewünschten String und positioniert anschließend den Cursor wieder an den Anfang für die eventuelle nächste Zeile. Denkbar wären damit z.B. auch "grafische" Fortschrittsanzeigen...

Hier ein paar weiter Informationen zu den Escape-Sequenzen - eine komplette Referenz haben ich leider noch nicht gefunden.

Categories
Linux

Chrooted ssh shell

Wenn man mal eine chrooted ssh shell unter Ubuntu/Debian braucht ist jailkit das Mittel der Wahl…

Categories
Linux

Puppet: MySQL user management

Kleines Puppet Rezept um zu überprüfen ob ein MySQL User bereits existiert und falls nicht, diesen anzulegen:

class mysql-management {

    $mysql_password = "verysecure"

    exec { "mysql-password_nms" :
        path => ["/bin", "/usr/bin", "/usr/sbin"],
        unless => "bash -c \"if [ `mysql -B -N -u admin -p$mysql_password -e \\"SELECT COUNT(*) FROM mysql.user WHERE user='manager' AND host='localhost'\\"`  == \\"1\\" ]; then exit 0; else exit 1; fi;\"",
        command => "mysql -u admin -p$mysql_password -e \"GRANT ALL ON *.* TO manager@'localhost' IDENTIFIED BY 'superpassword' WITH GRANT OPTION;\""
    }
}

Das Kommando bei “unless” finde ich etwas umständlich – aber mir ist nichts eleganteres eingefallen um auf einen User zu prüfen… Nachtrag: Das vorgesetzte Bash-Kommando ist notwendig damit das IF-Konstrukt auch auf allen Systemen funktioniert. Puppet setzt anscheinend je nach Distribution auf einen anderen Interpreter. Damit wird die Escape-Orgie aber nur noch schöner.

Categories
Linux

OpenNMS: Performance tuning

Nachdem OpenNMS zwei Jahre gelaufen ist wurde es zuletzt immer langsamer. Klar, neue Nodes, Services etc. erhöhen die Last. Also Zeit für eine Optimierung. Die in meinem Fall wichtigsten Punkte:

  • Postgres Konfiguration
  • eigene RRD Partition (noatime,nodiratime)
  • Events aufräumen

Generell ist die IO Performance der Bereich worauf es bei OpenNMS am meisten ankommt. Nebenbei bemerkt läuft OpenNMS hier in einer Virtuellen Maschine. Zwar wird generell davon abgeraten OpenNMS in einer VM laufen zu lassen, aber das bezieht sich hauptsächlich auf die meist geringere IO Performance. Da hier in diesem Fall KVM mit virtio (auf lokalem Storage) im Einsatz ist und nicht an einem NAS/SAN hängt ist ist die Warnung denke ich zu vernachlässigen ;).

Bzgl. der Postgres Performance habe ich im wesentlichen die Config von hier übernommen.

Wichtige Links:
http://www.opennms.org/wiki/Performance_tuning
http://www.opennms.org/wiki/RRD_performance_fundamentals
http://www.opennms.org/wiki/Event_Configuration_How-To#The_Database

Vorher/Nachher:

PS. das Nachlassen der Last hat natürlich nichts mit dem Wochenende zu tun…

Categories
Linux Tools

nmon: Linux Performance Monitor

Nmon ist ein gutes Tool um sich auf der Konsole schnell einen Überblick über eventuelle Performanceprobleme zu verschaffen. CPU Auslastung, Netzwerk, IO Daten/Laufwerke, Prozesse etc. werden übersichtlich und z.T. grafisch dargestellt. Es gibt sogar auch eine CPU Langzeitstatistik welche auf der Console (!) einen “schönen” Graphen zeichnet – nicht unbedingt ein Mehrwert aber nett anzusehen ;).

Bei Ubuntu ist “nmon” in den Standard-Repositories enthalten, bei Centos/RHEL leider nicht.