Categories
Programmierung

Google Maps: direction of a polyline

JavaScript-Schnipsel um mit Google Maps API die Himmelsrichtung einer Linie aus einem Polygon zu bestimmen, lässt sich auch noch einfach erweitern um auch noch die Nord/Süd Richtung zu bekommen (“lat()”) – ich brauchte aber nur West/Ost ;) :

var p1 = polyline.getVertex(0);
var p2 = polyline.getVertex(1);
var direction = false;

if (p1.lng() < p2.lng()) {
    direction = "east";
} else if (p1.lng() > p2.lng()) {
    direction = "west";
}
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
Software

Thunderbird QuickArchiver

Installation/Download

Offizielle Add-On Seite bei Mozilla: QuickArchiver Add-On. Die von dort installierte Version wird automatisch in Thunderbird auf die neueste Version aktualisiert.

Development

Please check everything related to QuickArchiver now on GitHub: https://github.com/otto802/quickarchiver

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.