Domaines virtuels Sympa

Le but

L'objectif est double :

  • pouvoir créer des listes de diffusion dans les domaines de messagerie que nous gérons. Par exemple, si nous avons aussi à gérer les domaines @machin.net et @chose.net, il faut que nous puissions créer des listes @lists.machin.net et @lists.chose.net, comme nous l'avons fait avec @lists.nain-t.net ;
  • offrir une interface de gestion des listes propre à chaque domaine.

Sympa est prévu pour ça et nous aurons assez peu de choses à faire. L'idée est similaire à celle des domaines virtuels d'Apache. Allons-y progressivement.

La méthode

Etape 1

Nous commençons par créer dans /etc/sympa un sous répertoire que nous nommerons comme le domaine de listes à créer. Exemple :

mkdir /etc/sympa/lists.machin.net

Dans ce répertoire, il faudra créer un fichier nommé robot.conf assez similaire à /etc/sympa/sympa.conf

Faisons simple :

## This is a sample config file for a Virtual Robot in Sympa

## This hostname will be compared with 'SERVER_NAME' ENV var in wwsympa.fcgi
## To deduce which Virtual Robot is being queried
http_host  lists.machin.net

## Listmasters email addresses
listmaster sysop@machin.net

## Title for the ML service
## It is displayed as a title in the web interface
title Les listes de machin.net

create_list  listmaster

## The default action when entering the web interface
## Can be 'lists', 'home' or 'which'
default_home  home

Rendons sympa propriétaire de tout ceci :

chown -R sympa:sympa /etc/sympa/lists.machin.net

La première étape est finie. Le fichier est assez compréhensible. Les options indiquées dedans viennent surcharger ou compléter celles qui sont dans /etc/sympa/sympa.conf. Ainsi, sysop@machin.net sera « listmaster » @lists.machin.net mais attention, le ou les listmasters définis dans le domaine principal (ici @lists.nain-t.net) le seront aussi @lists.machin.net. En revanche, sysop@machin.net ne sera pas listmaster dans le domaine principal, ni dans les autres domaines virtuels, sauf mension contraire dans les robots.conf (ou sympa.conf).

Le domaine principal est hiérarchiquement supérieur à tous les domaines virtuels que nous pourrons créer par la suite.

Etape 2

SI vous allez faire un tour dans /var/lib/sympa/expl, vous constaterez que sympa y range des choses concernant les lites du domaine principal. Suivant la même logique nous allons y créer un répertoire du nom de notre nouveau domaine :

mkdir /var/lib/sympa/expl/lists.machin.net
chown sympa:sympa /var/lib/sympa/expl/lists.machin.net

Sympa pourra y stocker ses petites affaires concernant les listes @lists.machin.net

Etape 3

Il faut que le domaine machin.net soit enregistré sur nos DNS de manière à ce qu'ils sachent :

  • résoudre lists.machin.net ;
  • indiquer un MX pour le domaine machin.net ;
  • indiquer un MX pour le sous-domaine lists.machin.net.

Voici un exemple minimal pour la zone machin.net :

$ttl 38400
@		IN	SOA	cyrus. sysop.bts.net. (
			2008060702
			10800
			3600
			604800
			38400 )
machin.net.		IN	NS	cyrus.machin.net.
			MX	10	cyrus
cyrus.machin.net.	IN	A	192.168.10.7

lists.machin.net.	MX	10	cyrus
lists			IN	A	192.168.10.7

Etape 4

Il faut que notre Apache réponde correctement à http://lists.machin.net Pour ça, il suffit d'ajouter le paramètre ServerAlias lists.machin.net à notre serveur virtuel et demander à l'Apache de relire sa configuration :

apache2ctl graceful

Etape 5

A ce niveau, nous pouvons envisager de créer des listes @lists.machin.net, mais la diffusion des messages ne se fera pas, Postfix n'est pas encore complètement au courant.

Il est déjà informé de deux choses :

  • la destination lists.machin.net est acquise, puisque elle va venir par la base MySQL de sympa ;
  • les alias dans /etc/mail/sympa.aliases vont être automatiquement créés par le script cgi, mais voyons un peu…
#------------------------------ test0: list alias created 04 Jul 2008
test0: "| /usr/lib/sympa/bin/queue test0@lists.nain-t.net"
test0-request: "| /usr/lib/sympa/bin/queue test0-request@lists.nain-t.net"
test0-editor: "| /usr/lib/sympa/bin/queue test0-editor@lists.nain-t.net"
#test0-subscribe: "| /usr/lib/sympa/bin/queue test0-subscribe@lists.nain-t.net"
test0-unsubscribe: "| /usr/lib/sympa/bin/queue test0-unsubscribe@lists.nain-t.net"
test0-owner: "| /usr/lib/sympa/bin/bouncequeue test0@lists.nain-t.net"
#------------------------------ liste0: list alias created 04 Jul 2008
lists.machin.net-liste0: "| /usr/lib/sympa/bin/queue liste0@lists.machin.net"
lists.machin.net-liste0-request: "| /usr/lib/sympa/bin/queue liste0-request@lists.machin.net"
lists.machin.net-liste0-editor: "| /usr/lib/sympa/bin/queue liste0-editor@lists.machin.net"
#lists.machin.net-liste0-subscribe: "| /usr/lib/sympa/bin/queue liste0-subscribe@lists.machin.net"
lists.machin.net-liste0-unsubscribe: "| /usr/lib/sympa/bin/queue liste0-unsubscribe@lists.machin.net"
lists.machin.net-liste0-owner: "| /usr/lib/sympa/bin/bouncequeue liste0@lists.machin.net"

Dans le domaine principal, test0 correspond bien à la partie utilisateur de l'adresse test0@lists.nain-t.net. Ce n'est en revanche pas le cas dans notre domaine virtuel où il faudra faire correspondre lists.machin.net-liste0 à la partie utilisateur de liste0@lists.machin.net

L'astuce consiste à utiliser une « expression régulière » que Postfix consultera pour reconnaître ces alias virtuels. Nous créons donc par exemple un fichier /etc/postfix/sympa_virtual_regexp qui contiendra cette ligne :

/^(.*)@lists\.machin\.net$/ lists.machin.net-$1

Vous ne lisez pas les expressions régulière dans le texte ? Dommage…

Tout ce qui commence (^) par n'importe quel motif ((.*)) suivi de @lists.machin.net sans plus rien après ($) sera remplacé par lists.machin.net- suivi du premier (et unique) motif ($1) trouvé dans la partie gauche. Exemple :

Dans liste0@lists.machin.net, le motif, c'est liste0. Le tout sera donc remplacé par lists.machin.net-liste0, nous retombons bien sur nos pattes.

Il ne nous reste plus qu'à modifier dans le main.cf le paramètre virtual_alias_maps comme ceci :

virtual_alias_maps = mysql:/etc/postfix/db/virtual-alias.cf, regexp:/etc/postfix/sympa_virtual_regexp

Et à demander à Postfix de relire sa configuration. Tout devrait maintenant être opérationnel.

Bilan

Ces cinq étapes ne seront à refaire qu'à chaque création d'un nouveau domaine virtuel. Par la suite la gestion des listes dans ces domaines virtuels ne nécessitera aucune modification sur Postfix ni sur Cyrus, qui n'est pas concerné.

Compte tenu de la souplesse de Postfix, d'autres approches sont possibles bien entendu, mais elles nécessiteront beaucoup plus d'interventions sur la configuration de Postfix, à moins de modifier le script alias_manager.pl fourni avec Sympa, et probablement d'autres scripts aussi.