Migration réalisée sur bulbe par quidame le 2017-07-28, lors du passage de la machine à Stretch.

Préliminaires

Le passage de Schleuder 2 à Schleuder 3 est marqué par une récriture complète du code, donc pas mal de changements (petits et gros) à prendre en compte.

Tout d'abord, Schleuder 3 n'est pas disponible dans Debian Stretch (nouvelle stable au moment de l'écriture), mais dans Buster (testing), alors que Schleuder 2 est maintenu sur bulbe à partir des dépôts de Wheezy (oldoldstable). Schleuder 3 a aussi au moins une dépendance (versionnée) dans testing : rake.

Ensuite, la documentation du paquet Debian nous apprend que la migration des listes éxistantes depuis une version inférieure à 3.0 est prise en charge par par la commande schleuder migrate /chemin/de/la/liste. Difficile de faire plus simple.

Enfin, les fichiers globaux de configuration ont conservé le même format (yaml) mais ont changé de nom, alors que les fichiers de configuration propres aux listes (id de clef de la liste, phrase de passe de cette clef, ACL, liste des membres et leurs attribruts) ont été remplacés par une base de données sqlite. Le comportement de certaines options a évolué sans que ces options aient changé de nom, alors que d'autres options ont changé de nom sans changer de comportement.

Contrairement à leurs prédécesseurs, qui étaient entièrement commentés, les nouveaux fichiers fournis par le paquet contiennent trois douzaines d'options déclarées. La plupart vont être gardées en l'état parce que :

  • le programme a changé et on va faire confiance aux nouveaux paramètres par défaut tant qu'on ne comprend pas ou ne maîtrise pas ces paramètres ;
  • elles correspondent déjà à nos usages (des options plus ou moins identiques sont explicitement déclarées dans les fichiers de configuration des listes)

Bref, on met toutes les chances de notre côté pour que :

  • ça fonctionne
  • ça fonctionne comme avant (plutôt mieux, même)

Préparation de l'installation de Schleuder 3

Cette migration a été réalisée en même temps que celle du système lui-même, qui impliquait déjà des changements dans la configuration d'APT. On y ajoute :

/etc/apt/preferences.d/schleuder

# schleuder dependency
Package: rake
Pin: release n=buster
Pin-Priority: 999

/etc/apt/sources.list.d/buster.list

deb http://ftp.nl.debian.org/debian/ buster main

Préparation des nouveaux fichiers de configuration

Après la mise à jour du système, et donc aussi de schleuder.

/etc/schleuder/schleuder.yml

Ce fichier remplace schleuder.conf dans le même répertoire.

Ajouter, décommenter œt/ou modifier les options suivantes :

  • log_level: info (c'est temporaire, on reviendra à error quand il n'y aura plus d'erreur, justement)
  • keyserver: hkps://hkps.pool.sks.keyservers.net
  • superadmin: schleuder-admins@nos-oignons.net (remplace superadminaddr)

/etc/schleuder/list-defaults.yml

Ce fichier remplace default-list.conf dans le même répertoire. On le garde en l'état.

Migration des listes

Lors de la mise à jour, le script postinst du nouveau paquet effectue une sauvegarde des listes éxistantes, dans /var/backup/schleuder. Cependant, comme nos listes étaient configurées à partir de fichiers se trouvant dans /etc/schleuder/lists, il a fallu tout de même copier ces fichiers en tant que list.conf dans les répertoires correspondants de /var/backup/schleuder pour que la commande de migration des listes fonctionne.

Toutes les opérations sont effectuées en tant que schleuder. Les commandes sont données ici dans une boucle, mais en réalité, la liste adminsys@ a été traitée séparément, pour servir de test.

sudo -Hsu schleuder
for list in adminsys ca deontologie machines; do
    mv /etc/schleuder/lists/nos-oignons.net/${list}.conf \
       /var/backup/schleuder/nos-oignons.net/${list}/list.conf
    schleuder migrate /var/backup/schleuder/nos-oignons.net/${list}/
done

Chacune de ces migrations réussies renvoie une notice :

Please note: the following options have been *removed*:
* `default_mime` for lists (we only support pgp/mime for now),
* `archive` for lists,
* `gpg_passphrase` for lists,
* `log_file`, `log_io`, `log_syslog` for lists (we only log to
         syslog (before list-creation) and a file (after it) for now),
* `mime` for subscriptions/members (we only support pgp/mime for now),
* `send_encrypted_only` for members/subscriptions.

If you really miss any of them please tell us.

Please also note that the following keywords have been renamed:
* list-members  => list-subscriptions
* add-member    => subscribe
* delete-member => unsubscribe

Please notify the users and admins of this list of these changes.

List adminsys@nos-oignons.net migrated to schleuder v3.

Intégration avec Postfix et SpamAssassin

Le transport schleuder défini dans /etc/postfix/master.cf passe par un script ruby maison, /usr/local/bin/schleuder-spamc qui ne fonctionne plus. En attendant que ce script soit mis à jour, on a modifié le transport dans master.cf :

schleuder unix  -       n       n       -       -       pipe
    flags=DRhu user=schleuder argv=/usr/bin/schleuder work ${recipient}

À noter que même si on n'utilisait pas ce script, il aurait fallu modifier master.cf quand même, pour y ajouter la commande interne work de schleuder, qui n'existait pas avant.

Puis un petit script shell /usr/local/bin/spamc-schleuder est venu remplacer l'autre :

#!/bin/sh

# This script is going to be called by Postfix master(8) with stderr
# so we must be careful to capture any error messages in a log file.

# Exit on errors
set -e

# As we must process the email multiple times, let's capture it in 
# a temporary file (and ensure it gets deleted once we're done).
trap 'rm -f "$MESSAGE"' EXIT
MESSAGE="$(mktemp --tmpdir=/var/lib/schleuder spamc-schleuder.XXXXXXX)"
cat > "$MESSAGE"

(
echo "$(date --iso-8601=seconds) --- spamc-schleuder called for ${1} ---"
echo

# ensure message is no spam, log spam report otherwise
if ! spamc --full-spam < "$MESSAGE" | grep --text ^; then
    # send the message to schleuder for processing
    schleuder work "$1" < "$MESSAGE"
fi

echo
) >>/var/log/schleuder/spamc-schleuder.log 2>&1

On l'appelle alors depuis master.cf :

schleuder unix  -       n       n       -       -       pipe
    flags=DRhu user=schleuder argv=/usr/local/bin/spamc-schleuder ${recipient}

Pour que cette solution fonctionne correctement, il faut que debian-spamd puisse écrire dans le répertoire .spamassassin de schleuder, mais c'est pas tout à fait ce qu'on veut. On a donc fait en sorte de satisfaire tout le monde : debian-spamd continuera d'écrire dans SON répertoire .spamassassin en pensant écrire dans celui de schleuder. Cela nécessite une ACL et un lien symbolique :

sudo setfacl -m group:debian-spamd:x /srv/schleuder
sudo -u schleuder ln -s /var/lib/spamassassin/.spamassassin /srv/schleuder

Autres

Cette mise à jour a rendu obsolètes les scripts maison schleuder-gen-revoke et schleuder-refresh-keys. La tâche cron qui lançait régulièrement le second a été supprimée. Cette fonctionnalité est intégrée à la version 3.