iRedMail: DKIM-Signatur für weitere Domains

Bei der Installation von iRedMail wird automatisch eine DKIM-Signatur für die Haupt-Domain generiert, fügt man aber neue Domains hinzu, hat man über das Admin-Tool keine Möglichkeit, hier neue DKIM-Signaturen anzugeben oder gar zu generieren.

Hier hilft das offizielle iRedMail-Wiki: www.iredmail.org

Für mein System, eine Standard-iRedMail-Installation mit MySQL unter Debian Wheezy, bedeutete es folgende Vorgehensweise:

Zuerst einen Privaten Key in dem dafür vorgesehenen Ordner generieren (mit den entsprechenden Systemrechten):

cd /var/lib/dkim/
amavisd-new genrsa new_domain.com.pem
chmod 0644 new_domain.com.pem

Zu beachten ist hier nur, dass es in Wheery “amavisd-new” heisst.

Jetzt in der amavisd-Konfiguration /etc/amavis/conf.d/50-user die Signatur zuweisen:

dkim_key("new_domain.com", "dkim", "/var/lib/dkim/new_domain.com.pem");

Der nächste Punkt laut Wiki besagt, die Domain-Map noch anzupassen, aber die steht bei uns in der MySQL-Datenbank und sollte da schon aktuell sein, sobald man im Admin-Tool die neue Domain angibt.

Zuletzt den amavisd-Service neu starten:

service amavis restart

Um jetzt an den öffentlichen Key zu kommen, bzw. die entsprechende DNS-Konfiguration zu erhalten:

amavisd-new showkeys new_domain.com

Wie man mit der Ausgabe des letzten Kommandos weiter umgeht, sollte dem Leser hier schon bekannt sein – das ist eine Frage der DNS-Konfiguration, die mit dem Artikel hier nichts mehr zu tun hat.

iRedMail: Sieve in RoundCube und Thunderbird

Habe letztens nach einem Servercrash meinen Mailserver neu aufsetzen müssen und mich dazu entschlossen, iRedMail als Komplett-Paket auszuprobieren – mit MySQL auf einer dedizierten Debian Wheezy Maschine.

Die Installation ging recht zügig, sodass ziemlich schnell einen funktionsfähigen Mailserver mit allen möglichen Komponenten hatte. Dazu gehört der Webmail-Client RoundCube.
Was bei mir leider nicht out-of-the-box sofort funktioniert, ist der Sieve-Filter, mit dem man viele Möglichkeiten haben soll, Emails serverseitig beim Empfang zu behandeln (z.B. Spam direkt in den Spam-Ordner schieben, Vorsortierung, automatische Weiterleitung etc.). Laut System horcht Sieve zwar auf dem Port 4190, aber sowohl RoundCube, als auch die Thunderbird-Erweiterung für Sieve brachten keine Verbindung zustande.

Für RoundCube ist die Lösung in der Konfigurationsdatei für das managesieve-Plugin /usr/share/apache2/roundcubemail/plugins/managesieve/config.inc.php zu finden:
Hier musste ich die den Konfigurations-Wert für managesieve_auth_type von null auf ‘LOGIN’ setzen, da iRedCube systemweit mit diesem Authentifizierungs-Typ konfiguriert ist:

$config['managesieve_auth_type'] = 'LOGIN';

Beim Thunderbird sieht das etwas anders aus: zunächst musste ich meine Firewall anpassen. Die war nämlich noch auf den alten Port 2000 geeicht und hat somit sowieso keine Verbindung zum System zugelassen.
Aber selbst danach ging nichts, bis ich herausgefunden habe, dass die Thunderbird-Erweiterung Sieve, die über die normalen Kanäle zu bekommen ist, in der Version 0.2.2 vorliegt und mit einem aktuellen Thunderbird nicht mehr funktioniert.
Glücklicherweise hat der Entwickler aber eine GitHub-Seite, auf der man die aktuellen Entwicklungs-Versionen bekommt: https://github.com/thsmi/sieve/
Heruntergeladen, mit Thunderbird installiert (ich habe die letzte Version genommen: 0.2.3d) und fertig.

Jetzt klappts bei mir damit auch! :-)

@-Zeichen und Backslash in GitHub’s Editor Atom

Ich habe letztens den (inzwischen) OpenSource-Editor “Atom” von GitHub für mich entdeckt. Der steckt noch in der Beta-Phase, ist aber modular aufgebaut und es gibt schon zahlreiche Plugins dafür. Im Grossen und Ganzen ist er sehr an den Sublime Text Editor angelehnt und diverse Features, die man von Sublime noch vermissen könnte (wie z.B. die Minimap-Scroll-Leiste oder Highlighting von Wörtern) sind durch Plugins nachrüstbar.

Dass der Editor noch in der Betaphase ist, merkt man daran, dass z.B. Zeichen wie @ oder Backslash nicht out-of-the-box auf einer deutschen Tastatur (unter Windows) funktionieren, da die Standard-Tastaturbelegung des Editors (oder die Belegung von Standard-Plugins) diese Tastenkombinationen schon für diverse Funktionen beanspruchen.

Zuerst hatte ich die jeweiligen Core-Konfigurations-Dateien angepasst, wofür man aber teilweise ggf. Admin-Rechte benötigt. Ausserdem wird bei jedem Update möglicherweise die Datei wieder überschrieben.
Inzwischen habe ich aber herausgefunden, wie man vorhandene Tastenkombinationen nicht nur überschreiben kann, sondern auch auf den System-Zustand zurücksetzen kann. Dafür gib es die Keymap-Konfigurations-Datei im Benutzerverzeichnis (Benutzerverzeichnis\.atom\keymap.cson).

Ich habe folgende Konfigurationen (für die derzeit aktuelle Version 0.138.0) eingetragen um die Tasten wie gewohnt benutzen zu können:

'atom-workspace atom-text-editor:not(.mini)':
  'ctrl-alt-[': 'native!'
'.platform-darwin .editor, .platform-win32 .editor, .platform-linux .editor':
  'alt-ctrl-q': 'native!'
'.platform-win32 .editor, .platform-linux .editor':
  'ctrl-alt-shift-Q': 'autoflow:reflow-selection'

Danach AltGr-R (bzw. Strg-Alt-R) drücken, um die Konfiguration zu laden und fertig.

HTML-Entity-kodierten Text mit JavaScript in mailto-Uri umwandeln

Schneller/kurzer Workaround, um HTML-Entitiy-kodierten Text (zum Beispiel aus einem Service eines Drittanbieters) lesbar in einer mailto-URI unterzubringen:

var source = "Ich sag immer: "Schöner wär's so!"",
    text = $('<textarea />').html(source).text(),
    mailto = 'mailto:email@address.net?subject=' + encodeURIComponent(text);

Jetzt nur noch die Variable “mailto” in einen Link setzen und fertig.
Z.B. so:

$('body').append('<a href="mailto:' + mailto + '">test</a>');

Git: beliebige alte Version zur aktuellen Master-Branch-Version machen

Das Problem:
Letztens war es notwendig in einem Git-Projekt auf eine alte Version zurückzugehen und diese als den aktuellen Stand im Master-Branch zu machen.

Die Situation:
Aufgrund der Infrastruktur unserer Projekte war es mir nicht möglich einfach einen neuen Branch aufzumachen und diesen zu verwenden. Diverse Automatismen sorgen dafür, dass unser Master-Branch alleine dafür verantwortlich ist, den Live-Server zu beliefern. Normalerweise gibt es bei uns auch einen Develop-Branch, der den Test-Server beliefert und auf dem getestet wird. In diesem speziellen Projekt fällt dieser Branch weg – aus “Gründen”.

Ich habe inzwischen an zig Git-Projekten gearbeitet und durch die Möglichkeit sowohl lokal als auch auf einem Testserver testen zu können, bevor Änderungen in den Master-Branch fliessen (und somit gleich auf den Live-Server), hatte ich nie wirklich die Notwendigkeit gesehen, komplett auf einen alten Versionsstand zurückzugehen. Bis gestern.

Die Lösung:
Ich musste ein wenig im Internet suchen und habe etliche Lösungsansätze gesehen, die alle nicht zu der gewünschten Lösung führten. Irgendwo auf stackoverflow.com – gut versteckt zwischen vielen Antworten auf genau meine Frage – bin ich dann auf die Lösung gestossen. Und die ist eigentlich ziemlich einfach:

git revert --no-commit id_alte_version..HEAD
git commit -m "zurück zu (ur-)alter version"

Passwort in Kimai zurücksetzen

Habe gerade einem Admin-Kollegen geholfen, in seine Kimai-Installation wieder reinzukommen.
Datenbank- und File-Systemzugriff war vorhanden, von daher nur eine Frage, in welcher Form das Passwort gespeichert ist.

Die Lösung: In der Datei includes/autoconf.php gibt es eine Zeile, in der ein $password_salt gesetzt wird.
Dieses nehmen wir und schreiben es vor und hinter das gewünschte neue Passwort und jagen es durch die MD5-Funktion (z.B. in MySQL). Sodann tragen wir dieses zum gewünschten Benutzer in der Tabelle kimai_usr ins Feld pw ein.

Beispiel:
neues Passwort=meinpasswort
$password_salt in includes/autoconf.php: ABCDEFG

in MySQL:
select md5('ABCDEFGmeinpasswortABCDEFG');

liefert als Ergebnis: 4b42ec596d78e884beafbe29387b38a2

Diese Zeichenkette ins pw-Feld des gewünschten Benutzers der Tabelle kimai_usr eintragen und fertig. Jetzt sollte man sich mit dem Passwort ‘meinpasswort’ eintragen können.

tidy HTML per Konsole innerhalb von PHP verwenden

Die Ausgangssituation: Ich möchte auf einem Webserver mit PHP 5.3, der unter Gentoo-Linux läuft, meinen PHP-Output via tidy HTML ausgeben, damit der Code aufgeräumt bzw “sauber” ist.

Das Problem: Mir ist es aus “Gründen” nicht möglich die PHP-Library nachzuinstallieren.

Die Lösung: Ich habe mir die Sources von tidy bei sourceforge.net geholt: http://tidy.cvs.sourceforge.net/viewvc/tidy/?view=tar , dann im Home-Verzeichnis in einem temporären Ordner entpackt und kompiliert (“gmake” im Ordner /tidy/build/gmake/).

Wenn das geklappt hat, sollte im Verzeichnis /tidy/bin/ jetzt die ausführbare Datei “tidy” liegen.

Da das Home-Verzeichnis auf diesem System automatisch zur Umgebungsvariable zählt, habe ich diese Datei direkt ins Home-Verzeichnis kopiert und eine Konfigurations-Datei namens tidy.config dazu erstellt:

output-html: yes
drop-font-tags: yes
drop-empty-paras: yes
hide-comments: yes
join-classes: yes
join-styles: yes
show-body-only: yes
indent: yes
indent-spaces: 3
wrap: 300

So sieht meine Konfiguration für das Projekt aus. Falls jemand vor hat, seine eigene Konfiguration zu erstellen, sollte er sich insbesondere den Punkt “show-body-only” ansehen… da ist normalerweise gewünscht, dass das auf “false” steht ;-)

Damit ich nun unter PHP diese Datei verwenden kann, so wie ich es gewohnt bin, wenn die Library aktiviert ist, schreibe ich eine Funktion, die im Projekt global verfügbar ist:

if (!function_exists(tidy_parse_string))
{
function tidy_parse_string($string)
{
exec ('echo "' . addcslashes($string, '"') . '" | tidy -config ~/tidy.config', $array);
return implode("\n", $array);
}
}

Diese Lösung ist zwar nicht besonders elegant, aber für ein zu migrierendes System, das auf die Funktion tidy_parse_string() setzt, ist es zumindest ein work-around, das bei mir in diesem Fall (bis jetzt) funktioniert hat.

Value ‘0000-00-00′ can not be represented as java.sql.Date

Habe gestern das Problem gehabt, per Quantum DB in Eclipse auf eine MySQL-Datenbank zugreifen zu müssen, in der Date-Felder mit dem Wert ‘0000-00-00′ belegt waren, was anscheinend ein Problem für den MySQL-Connector darstellt. Der meldet sich dann nur noch mit dem Text aus der Überschrift und SQL State: S1009 und Error Code: 0 und verweigert die Ausgabe der Suchanfrage.

Die vorläufige Lösung für mich bestand darin, die Connection URL um den Parameter zeroDateTimeBehavior=convertToNull zu erweitern, sodass solche Datums-Werte in NULL umgewandelt werden, da ‘0000-00-00′ kein valides Datum ist.

Die Connection URL sieht dann etwa so aus:
jdbc:mysql://host:3306/database?zeroDateTimeBehavior=convertToNull

Das reicht mir aktuell, um damit weiterarbeiten zu können, da ich nur SELECTs auf die Datenbank absetzen muss. Wie sich diese Einstellung verhält, wenn man in die Datenbank schreibt, muss sich erst noch zeigen.

VMWare Server: Gast-System kann bei NAT zwar nach draussen pingen, bekommt aber ansonsten keine Verbindung zustande

Habe gerade das Problem gehabt, dass ein Debian-Gastsystem in VMWare (Windows 7 Host) von draussen erreichbar war, DNS auflösen und nach aussen pingen konnte, aber selbst keine Verbindungen aufbauen konnte (wget, telnet, ssh).

Nach vielen Stunden der Suche, konnte mein Kollege sich daran erinnern, dass er das Problem schonmal hatte und gelöst hatte, indem man die vmnat.exe im Verzeichnis c:\Windows\SysWOW64\ durch eine neuere Version ersetzt, die z.B. beim VMWare Player dabei ist.

Die Datei kann man sogar im laufenden System ersetzen, sofern man vorher den Dienst “VMWare NAT Service” beendet und nach dem Ersetzen wieder startet.
Danach klappts auch wieder mit dem Netzwerk. Ich musste dafür bei mir nichtmal das Gastsystem beenden.

Apache2 Reverse Proxy mit Client-IPs

Die Ausgangslage: Ich habe immer wieder mal das Problem, eine Webseite (bzw einen kompletten Virtual Host) auf einen neuen Server umzuziehen. Der häufigste Grund dafür ist eine veraltete Server-Software zu aktualisieren (z.B. von Debian Etch oder Lenny auf Debian Squeeze). In diesen Fällen gehe ich oft so vor, dass ich auf dem neuen Server die gleiche Virtual Host Konfiguration einrichte, wie auf dem Alten. Normalerweise habe ich hier auf beiden Systemen einen Apache2 Webserver, daher sollte das relativ einfach zu übertragen sein. Das hat zum einen den Vorteil, dass ich auf dem Zielsystem gleich testen kann, ob die Webseite noch so funktioniert, wie gewünscht, zum anderen kann ich per Reverse Proxy Konfiguration auf dem alten Server die Webseite schon vom neuen Server holen, obwohl die DNS-Einstellung der Domain noch nicht abgeschlossen ist – und zwar ohne dass der gemeine Webseiten-Besucher davon etwas mitbekommt.
Continue reading “Apache2 Reverse Proxy mit Client-IPs”