Schlagwort-Archive: Gist

maildrop-Fallstricke und was man dagegen tun kann

Wenn maildrop-Filter mit der Zeit wachsen und komplexer werden steigt das Risiko, dass sich irgendwo ein Fehler einschleicht. Da die Debugging und Fehlererkennungsmechanismen von maildrop eher rudimentär ausfallen – besonders bei verteilten Filtern in mehreren Dateien – kann ein solcher Fehler schnell zum Verlust von E-Mails führen.

Probleme mit den Dateirechten

maildrop ist sehr empfindlich was die Dateirechte der Hauptfilterdatei (~/.mailfilter) angeht. Sind diese nicht auf 0600 gesetzt, verweigert maildrop jeglichen Dienst. Da ich meine Filter über git versioniere und git Dateirechte schlicht aus der umask generiert (Ausnahme ist das +x-Flag) kam es hier gelegentlich zu Problemen.

Die Lösung ist so einfach wie wirkungsvoll. Über die .qmail-Datei rufe ich ein Wrapper-Script maildrop-wrapper.sh auf, welches die Übergabe an maildrop versucht. Sollte ein Fehler auftreten, wird versucht die Rechte zu korrigieren und anschließend ein weiterer Versuch gestartet.

[shell]
#!/bin/bash
#
# maildrop-wrapper.sh

maildrop ~/.mailfilter

if [ $? -ne 0 ]; then
# Try to correct file permissions and retry
chmod 0600 ~/.mailfilter
maildrop ~/.mailfilter
fi
[/shell]

Der Vollständigkeit halber hier auch die entsprechende .qmail-Datei:

[generic]
# .qmail
# Deliver email via maildrop-wrapper.sh
|~/bin/maildrop-wrapper.sh
[/generic]

Fehler im Filter

Um bei Fehlern im Filtercode dennoch zumindest eine Zustellung zu ermöglichen, habe ich eine grundlegende Filterkonfiguration in die ~/.mailfilter gepackt. Daher sollte es an dieser eigentlich keine Änderungen geben, die Fehler verursachen können.

[generic]
# mailfilter
# Maildrop filter
#
# This file is just for data integrity, it includes the
# actual mailfilter in file „main“
# If any exception occurs while executing main, this file
# makes sure that the affected mail is not dropped

# DO NOT ADD ANY ADDIDTIONAL CODE OUTSIDE THE EXCEPTION SCOPE
# Catch exceptions in actual filter
exception {

# Include the actual filter
CONFIG_DIR=“$HOME/etc/maildrop“
include „$CONFIG_DIR/main“

# If anything worked until now, exiting with success
# is quite fine
EXITCODE=0
exit
}
# DO NOT ADD ANY ADDIDTIONAL CODE OUTSIDE THE EXCEPTION SCOPE

# If anything goes wrong, deliver mail to Maildir
to „$HOME/Maildir“
[/generic]

Der simple aber wirkungsvolle Gedanke dahinter – packe alles was irgendwie kritisch werden könnte in einen exception-Block, der alle möglichen Fehler auffängt. Wird die E-Mail innerhalb dieses Blocks zugestellt, passiert nichts mehr. Kann jedoch nicht zugestellt werden, wird die E-Mail in (fast) jedem Fall ins Standard-Maildir ~/Maildir zugestellt.

Mein persönliches Uberspace-Init Script

Ich habe mir ein kleines Script gebastelt, mit dem ich neuen Uberspaces mit wenigen Befehlen einge Voreinstellungen verpassen kann.

Die Funktion in Kürze:

  • Einen Symlink für das Übergeordnete Verzeichnis der Pseudo-DOCUMENT_ROOTs. Zwar nicht unbedingt notwendig aber cd www ist schneller getippt wie cd /var/www/virtual/$USER
  • Vorbereitung für die Daemontools: uberspace-setup-svscan
  • Ein bin– und ein git-Verzeichnis – benötige ich öfters.
  • E-Mail Weiterleitung zu einer auszuwählenden E-Mail-Adresse, oder ins Maildir.
  • Außerdem hole ich mir noch angepasste bash Konfigurationsdateien, die ich bei github abgelegt habe.

Mit dem Parameter bash-config-update wird nur der letzte Punkt ausgeführt. Mit dem Parameter cleanup werden Sicherungskopien der bash Konfiguration von bash-config-update nach /dev/null befördert.

[shell]
#!/bin/bash
#
# uberspace-init.sh
#
# Init-Script to init new Uberspaces and to Update bash-config
#
#
# Copyright 2014-2015 GOLDERWEB – Jonathan Golder
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see
#

# Make sure we are in $HOME
cd $HOME;

# Download my personal default bash configuration files from github
bash-config-update() {

# Download modified bash-config from github
( test -f .bash_profile && mv .bash_profile .bash_profile.save || test -d . ) && wget -q https://gist.githubusercontent.com/golderweb/d910ae1edbe853377da5/raw/.bash_profile
( test -f .bashrc && mv .bashrc .bashrc.save || test -d . ) && wget -q https://gist.githubusercontent.com/golderweb/e912ccfafda58470e51a/raw/.bashrc
( test -f .bash_functions && mv .bash_functions .bash_functions.save || test -d . ) && wget -q https://gist.github.com/golderweb/3dbb4f897339cf5c74e7/raw/.bash_functions
( test -f .bash_aliases && mv .bash_aliases .bash_aliases.save || test -d . ) && wget -q https://gist.github.com/golderweb/79a4a2cc2cb126d30d4a/raw/.bash_aliases

echo „Test if everything works right, then run \“uberspace-init cleanup\““
}
case „$1″ in

init|““)
# Set up some predefinitions on new uberspace

# Create Symlink for www
test -e ~/www || ln -s /var/www/virtual/$USER www

# Prepare ubespace for using daemontools
test -d ~/service || uberspace-setup-svscan

# Create several dirs
test -d ~/bin || mkdir bin
test -d ~/git || mkdir git

# Enable E-Mail redirection
read -p „Enter E-Mail-Adress for redirection, leave empty for use Maildir of this uberspace:“ mail

if [ -n „$mail“ ]; then
echo -e „#Redirect incomming E-Mails on ${USER} to ${mail}\n$mail“ > .qmail || echo „ERROR: .qmail-file couldn’t be wrote! E-Mails will be delivered to Maildir“
else
echo „No E-Mail-adress was provided, E-Mails will be delivered to Maildir“
fi

#Get bash-config files from github
bash-config-update
;;

bash-config-update)

#Get bash-config files from github
bash-config-update
;;

cleanup)

#Remove backup files
rm .bash_profile.save .bashrc.save .bash_functions.save .bash_aliases.save
;;

*) echo „Invalid parameter“
;;

esac
[/shell]

Wenn dir das Uberspace-Init Script gefällt darfst du es gerne unter den Bedingungen der GNU GPLv3 weiterverwenden. Du findest es unter https://gist.github.com/golderweb/4feb43ed41b49bd7bc27. Einfach den Quelltext kopieren, mit git clonen oder einen Github-Fork erstellen.