POUR CREER DES LISTES SUR UNE CONFIG SYMPA Suppositions : dns : domain.tld et listes.domain.tld pointant en MX sur votre serveur. config postfix (feisty version 2.3.8-2) avec alias, domaines, utilisateurs virtuels sous mysql (Postfixadmin) une install de sympa via les packages ubuntu feisty (version 5.2.3-1.2) vous savez ce que vous faites en tapant les commandes ci-dessous n'allez pas vous plaindre après! Lisez ce document en entier avant de commencer à bidouiller Ce que ça fait : Paramètre votre postfix pour gérer non pas une mais plusieurs listes via le logiciel sympa (www.sympa.org) mais aussi des serveurs virtuels Crée les alias nécessaires au fonctionnement des listes. Ce que ça ne fait pas : Vous guider pour l'installation des packages (commencez par apt-get install sympa) Le café nécessaire à ce paramétrage Roadmap : I. Paramétrage de apache2... 2 II. Paramétrage de sympa... 3 III. Paramétrage de syslog... 4 IV. Paramétrage des hôtes virtuels... 4 V. Paramétrage de postfix... 5 VI. Création d'alias... 6 Première étape : les alias des robots virtuels... 6 Paramétrage des alias à définir... 6 Création des alias de liste config par défault... 7 Création des alias de liste config optionnelle... 10 VII. Lancement des services / Validation de la configuration... 15 VIII. Création d'une liste... 16 IX. Encore des problèmes?... 17 Réalisé par Vincent le 8 juin 2007 Page 1 / 17
I. Paramétrage de apache2 Pour faire tourner sympa, vous devez utiliser le module fast-cgi (mod-fastcgi je crois). On doit créer un hôte virtuel pour utiliser le module web de sympa (wwsympa) Pour ma part, j'ai fais une copie du fichier /etc/sympa/httpd.conf-fcgi que j'ai placée dans /etc/apache2/sites-available/sympa.conf Pour activer le site on crée un lien symbolique ln-s /etc/apache2/sites-available/sympa.conf /etc/apache2/sites-enabled/sympa.conf Bon sinon on a quoi dans ce fichier? L'activation pour un répertoire (/wws dans ce cas) du script fcgi fourni par sympa. /etc/apache2/sites-available/sympa.conf #-- WWSYMPA begin <IfModule mod_fastcgi.c> AddHandler fastcgi-script.fcg.fcgi.fpl FastCgiServer /usr/lib/cgi-bin/sympa/wwsympa.fcgi -processes 2 </IfModule> <VirtualHost *:80> ServerName ServerAdmin listes.domain.tld listes@domain.tld DocumentRoot /var/www/domain.tld/sympa # pas sûr que ça serve mais ca fait plus propre dans la définition d'un vhost. # j'ai placé un fichier index.html qui fait une redirection vers /wws # comme ca si un utilisateur va sur http://listes.domain.tld, il tombe sur /wws #Extrait du fichier /var/www/domain.tld/sympa/index.htlm #<html> #<head> #<meta HTTP-EQUIV="refresh" content="0; URL=http://listes.domain.tld/wws"> #</head> #<body></body> #</html> <Location /wws> SetHandler fastcgi-script </Location> Alias /wwsicons /usr/share/sympa/icons ScriptAlias /wws /usr/lib/cgi-bin/sympa/wwsympa.fcgi </VirtualHost> # Si on a plusieurs robots, il faut tous les définir. Par exemple : <VirtualHost *:80> ServerName listes.otherdomain.tld ServerAdmin listes@otherdomain.tld DocumentRoot /var/www/otherdomain.tld/sympa <Location /wws> SetHandler fastcgi-script </Location> Alias /wwsicons /usr/share/sympa/icons ScriptAlias /wws /usr/lib/cgi-bin/sympa/wwsympa.fcgi </VirtualHost> #-- WWSYMPA end Il faut maintenant faire une petite bidouille pour que ce script soit lancé par l'utilisateur sympa. Note : cet utilisateur a du être créé lors de l'install des packages. Si ce n'est pas le cas il faut le rajouter Réalisé par Vincent le 8 juin 2007 Page 2 / 17
Déjà on va attribuer le fichier wwsympa.fcgi à l'utilisateur sympa : sudo chown sympa /usr/lib/cgi-bin/sympa/wwsympa.fcgi Ensuite, on lui fixe le bit suid pour que lors de l'exécution, apache lance le script avec cet utilisateur (l'utilisateur qui est propriétaire du fichier) sudo chmod 4755 /usr/lib/cgi-bin/sympa/wwsympa.fcgi C'est à peu près bon pour le serveur apache. Mais on ne le relance pas encore II. Paramétrage de sympa On va maintenant modifier les fichiers de config de sympa. /etc/sympa/sympa.conf Les choses à voir dans ce fichier (le reste est paramétré par défaut lors de l'installation) # si vous avez des problèmes c'est par là qu'il faut commencer (remplacer '0' par '4') log_level 0 domain listes.domain.tld # votre adresse mail (vous pouvez aussi utiliser un alias ) listmaster listes@domain.tld lang fr # à vous de renseigner les paramètres de connexion à votre base de données... db_type mysql db_name <-base_sympa-> db_host localhost db_user <-user_sympa-> db_passwd <-pass_sympa-> # pour cette adresse, utiliser le même dossier que dans la définition du vhost # apache (dans notre cas /wws) wwsympa_url http://listes.domain.tld/wws # attention pas d'espace si vous utilisez plusieurs locales supported_lang en_us,fr Pour la création de la base de donnée, vous trouverez des scripts ici : /usr/lib/sympa/bin/create_db.mysql /usr/lib/sympa/bin/create_db.oracle /usr/lib/sympa/bin/create_db.pg /usr/lib/sympa/bin/create_db.sqlite /usr/lib/sympa/bin/create_db.sybase Pensez à créer un utilisateur et lui donner les droits sur la base Petite option : sympa utilise par défaut certains répertoires pour stocker les archives de vos listes ainsi que certains messages "bouce". Je ne saurais vous conseiller de modifier l'emplacement de ces répertoires s'ils sont sur une partition 'critique' de votre serveur (comme c'est le cas chez certains hébergeurs) Vous pouvez par exemple créer ces répertoires mkdir /home/sympa mkdir /home/sympa/wwsarchive mkdir /home/sympa/wwsbounce Réalisé par Vincent le 8 juin 2007 Page 3 / 17
Puis changer leur propriétaire chwon R sympa:sympa /home/sympa Et enfin modifier l'emplacement de ces répertoires soit en créant des liens symboliques rm rf /var/lib/sympa/wwsarchive rm rf /var/spool/sympa/wwsbounce ln s /var/lib/sympa/wwsarchive /home/sympa/wwsarchive ln s /var/spool/sympa/wwsbounce /home/sympa/wwsbounce Soit en modifiant le fichier de config /etc/sympa/wwsympa.conf arc_path bounce_path /home/sympa/wwsarchive /home/sympa/wwsbounce III. Paramétrage de syslog Il faut maintenant configurer les logs pour en avoir des spécifiques à sympa (plus pratique pour les phases de débug On édite le fichier : /etc/syslog.conf et on rajoute : local0.* /var/log/sympa.log IV. Paramétrage des hôtes virtuels Le staff sympa et moi-même vous conseillons de créer dès le début un hôte virtuel pour sympa. Non pas que ce soit nécéssaire, mais si dans 6 mois vous devez en rajouter un, vous aurez déjà tout oublié Alors autant le faire maintenant! Il suffit pour cela de créer un fichier robot.conf qui va reprendre le paramétrage de sympa.conf spécifique à votre hôte. Il faut créer ce fichier dans un répertoire qui porte le nom de votre robot : /etc/sympa/listes.domain.tld/robot.conf Si vous avez un autre robot virtuel : /etc/sympa/listes.otherdomain.tld/robot.conf Mais qu'est ce qu'on met dedans? # Le plus important http_host listes.domain.tld # Mais aussi wwsympa_url http://listes.domain.tld/wws listmaster listes@domain.tld # Et encore... title Mon Titre domain.tld # pour plus tard, rajoutez donc minidomain domain.tld Réalisé par Vincent le 8 juin 2007 Page 4 / 17
Vous pouvez reprendre quasi tous les paramètres définis dans sympa.conf que vous pouvez spécifier à votre robot. Pour tous ces détails, allez voir la documentation fournie sur www.sympa.org V. Paramétrage de postfix Maintenant, il va bien falloir se pencher sur la question : que vont faire mes messages? Tout d'abord, je suppose que vous avez une configuration de ce type pour la gestion des alias /etc/postfix/main.cf # NOTE : proxy: est optionnel. virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf On va donc rajouter quelques paramètres pour que postfix comprenne qu'il s'agit d'un mail destiné à sympa et non à un utilisateur local (ou autre alias). transport_maps = regexp:/etc/postfix/transport_regexp sympa_destination_recipient_limit = 1 sympabounce_destination_recipient_limit = 1 # et si ce n'est pas déjà le cas : recipient_delimiter = + On doit aussi créer quelques fichiers : /etc/postfix/transport_regexp Ce fichier va permettre à postfix d'analyser les messages et, en fonction du destinataire, soit le distribuer à sympa (ou sympabouce), soit le distribuer normalement. Il faut créer ces deux lignes pour chaque robot virtuel (voir la faq postfix sur www.sympa.org) /^.*\+owner@listes\.domain\.tld*$/ /^.*\@listes\.domain\.tld*$/ sympabounce: sympa: Donc si vous avez un autre robot appelé listes.otherdomain.tld il faut rajouter ces deux lignes. /^.*\+owner@listes\.otherdomain\.tld*$/ /^.*\@listes\.otherdomain\.tld*$/ sympabounce: sympa: Afin que postfix comprenne qui est sympa et sympabounce, on modifie : /etc/postfix/master.cf On rajoute : # # Configuration for Sympa Mailing Lists # sympa unix - n n - - pipe flags=r user=sympa argv=/usr/lib/sympa/bin/queue ${recipient sympabounce unix - n n - - pipe flags=r user=sympa argv=/usr/lib/sympa/bin/bouncequeue ${recipient On peut maintenant relancer postfix pour valider la config : sudo /etc/init.d/postfix reload Voilà qui est fait! Il faut maintenant créer quelques alias. Réalisé par Vincent le 8 juin 2007 Page 5 / 17
VI. Création d'alias Une étape plutôt chiante je dois le dire car sympa utilise par défaut un fichier d'alias indexé (comme postfix par défaut ) Mais si vous en êtes là, c'est bien pour contourner ce problème non? Tout d'abord, un petit rappel En utilisant une base sql pour la gestion des alias, postfix vérifie dans cette base, avant même de procéder à la distribution, que le destinataire existe. Il faut donc créer des alias pour la liste juste pour ca! Première étape : les alias des robots virtuels Pour fonctionner correctement et offrir toutes ses fonctionnalités, sympa a besoin de quelques alias : bounce+*@listes.domain.tld > bounce+*@listes.domain.tld listmaster@listes.domain.tld > listmaster@listes.domain.tld postmaster@listes.domain.tld > postmaster@domain.tld sympa-owner@listes.domain.tld > sympa-owner@listes.domain.tld sympa-request@listes.domain.tld > sympa-request@listes.domain.tld sympa@listes.domain.tld > sympa@listes.domain.tld Note : j'ai rajouté l'alias postmaster qui devrait exister pour tout domaine ou sous-domaine. A vous de le gérer pour le domaine principal (domain.tld). Vous n'avez à créer ces alias qu'à la création des robots virtuels. Les alias de chaque liste vont être créés automatiquement. A ce stade, on reste dans la configuration par défaut de sympa (gestion via listes.domain.tld). Mais comme je trouve plus pratique pour les utilisateurs d'envoyer un mail à maliste@domain.tld que maliste@listes.domain.tld on va créer des alias pour véhiculer les messages entre le domaine domain.tld et listes.domain.tld. Pour que ce soit plus clair par la suite, ce sera la 'config optionnelle'. bounce+*@domain.tld > bounce+*@listes.domain.tld listmaster@domain.tld > listmaster@listes.domain.tld sympa-owner@domain.tld > sympa-owner@listes.domain.tld sympa-request@domain.tld > sympa-request@listes.domain.tld sympa@domain.tld > sympa@listes.domain.tld Vous n'avez à créer ces alias qu'à la création des robots virtuels. Les alias de chaque liste vont être créés automatiquement. Paramétrage des alias à définir Pour chaque liste, on doit définir certains alias comme : maliste@listes.domain.tld ou encore malisteunsubscribe@listes.domain.tld Sympa utilise un fichier pour la définition de ces adresses : /usr/share/sympa/list_aliases.tt2 On va l'adapter à la configuration et au fonctionnement de postfix : [% list.name %]: "[% list.name %]" [% list.name %]-request: "[% list.name %]-request" [% list.name %]-editor: "[% list.name %]-editor" Réalisé par Vincent le 8 juin 2007 Page 6 / 17
#[% list.name %]-subscribe: "[% list.name %]-subscribe" [% list.name %]-unsubscribe: "[% list.name %]-unsubscribe" [% list.name %][% return_path_suffix %]: "[% list.name %][% return_path_suffix %]" Notez que j'ai conservé la même syntaxe mais que je ne rajoute pas l'extension '@listes.domain.tld' via ce fichier. Ce sera fait par le script alias_manager dans les sections suivantes. Aussi, la 4 ème ligne est commentée. Je n'ai pas cherché à comprendre le pourquoi du comment, mais elle ne doit pas être nécessaire Création des alias de liste config par défault Avant d'attaquer cette partie, lisez aussi la section suivante 'Création des alias de liste config optionnelle' pour savoir quelle configuration appliquer! Dans cette configuration il faut modifier ou remplacer le fichier /usr/lib/sympa/bin/alias_manager.pl Pensez à renseigner les paramètres de votre base de données utilisée pour la gestion des alias avec postfix! #!/usr/bin/perl ## This version of alias_manager.pl has been customized by Bea. ## Modified by Vinc for postfix support with virtual aliases stored in mysql database. ## It has the ability to add/remove list aliases in a MySQL database for postfix ## To make sympa use this script, you should install it as /home/sympa/bin/alias_manager.pl ## You should edit all the $mysql_xxx below to use your own mysql database ## Also, make sure the file /usr/share/sympa/list_aliases.tt2 has been modified $ENV{'PATH' = ''; ## Load Sympa.conf print STDERR "Load Sympa.conf\n"; use strict; use lib '/usr/lib/sympa/bin'; use Conf; use POSIX; require "tools.pl"; require "tt2.pl"; use DBI; ## For debugging purpose, set this to true, mysql insert nor delete will be performed ## it will only show the sql syntax my $onlytest = 'false'; #my $onlytest = 'true'; unless (Conf::load('/etc/sympa/sympa.conf')) { print STDERR gettext("the configuration file /etc/sympa/sympa.conf contains errors.\n"); exit(1); ## MYSQL configuration my $mysql_host = "localhost"; my $mysql_base = "db_name"; my $mysql_user = "db_user"; my $mysql_pass = "db_pass"; my $default_domain; my $return_path_suffix; my ($operation, $listname, $domain) = @ARGV; my $dbh; my $sql; my @enr; unless ($onlytest eq 'false') {print STDERR "-- ONLY TESTING --\n"; Réalisé par Vincent le 8 juin 2007 Page 7 / 18
if (($operation!~ /^(add) (del)$/) ($#ARGV < 2)) { print STDERR "Usage: $0 <add del> <listname> <robot>\n"; exit(2); $default_domain = $Conf{'domain'; $return_path_suffix = &Conf::get_robot_conf($domain, 'return_path_suffix'); #$return_path_suffix = $Conf{'return_path_suffix'; my %data; $data{'date' = &POSIX::strftime("%d %b %Y", localtime(time)); $data{'list'{'domain' = $data{'robot' = $domain; $data{'list'{'name' = $listname; $data{'default_domain' = $default_domain; $data{'is_default_domain' = 1 if ($domain eq $default_domain); #$data{'is_default_domain' = 1; $data{'return_path_suffix' = $return_path_suffix; my @aliases ; my $tt2_include_path = &tools::make_tt2_include_path($domain,'',,); my $aliases_dump; &tt2::parse_tt2 (\%data, 'list_aliases.tt2',\$aliases_dump, $tt2_include_path); @aliases = split /\n/, $aliases_dump; unless (@aliases) { print STDERR "No aliases defined\n"; exit(15); if ($operation eq 'add') { ## Check existing aliases print STDERR "Check existing aliases\n"; if (&already_defined(@aliases)) { print STDERR "Some alias already exist - Stopping script\n"; exit(13); if (!&initialize_mysql) { print STDERR "Can't connect to MySQL database\n"; exit(14); ## Adding default aliases for $domain (ie mylist@lists.domain.tld, mylistsubscribe@lists.domain.tld...) print STDERR "Creating alias for robot : $domain\n"; foreach my $alias (@aliases) { print STDERR "For each alias in robot $domain add\n"; if ($alias =~ /^\#/) { print STDERR "Line contains # : $alias - Skipping\n"; $alias =~ /^([^:]+):\s*(\".*\")$/; my $alias_value = $1."@".$domain; my $command_value = $1."@".$domain; $command_value =~ s/\"//g; print STDERR "Trying inserting alias $alias_value in domain $domain\n with command line $command_value\n"; # We create the new mysql alias. $sql = "INSERT INTO alias SET address = '".$alias_value."', domain = '".$domain."', goto = '".$command_value."', active = '1'"; print STDERR "SQL SYNTAX : $sql\n"; # We finally add the entry if ($onlytest eq 'false'){ $dbh->do($sql) or die "$DBI::errstr"; else {print STDERR "-- ONLY TESTING --\n"; &finalize_mysql; elsif ($operation eq 'del') { print STDERR "Operation DEL\n"; if (!&initialize_mysql) { Réalisé par Vincent le 8 juin 2007 Page 8 / 18
print STDERR "Can't connect to MySQL database\n"; exit(7); foreach my $alias (@aliases) { if ($alias =~ /^\#/) { print STDERR "Line contains # : $alias - Skipping DEL\n"; $alias =~ /^([^:]+):/; my $alias_value = $1."@".$domain; $alias_value =~ s/\+/\-/g; print STDERR "Trying deleting alias $alias_value from domain $domain\n"; $sql = "DELETE FROM alias WHERE address = '".$alias_value."' and domain = '".$domain."'"; print STDERR "SQL SYNTAX : $sql\n"; if ($onlytest eq 'false'){ $dbh->do($sql) or die "$DBI::errstr"; else {print STDERR "-- ONLY TESTING --\n"; &finalize_mysql; else { print STDERR "Action $operation not implemented yet\n"; exit(2); exit 0; ## Check if an alias is already defined sub already_defined { print STDERR "Check if an alias is already defined\n"; my @aliases = @_; ## Vinc : added a count for alias defined my $countrobot = '0'; &initialize_mysql; foreach my $alias (@aliases) { if ($alias =~ /^\#/) { print STDERR "Line contains # : $alias - Skipping Check\n"; $alias =~ /^([^:]+):/; my $alias_value = $1."@".$domain; $alias_value =~ s/\+/\-/g; print STDERR "Trying checking for alias $alias_value in domain $domain\n"; $sql = "SELECT COUNT(address) as address FROM alias where address = '".$alias_value."' and domain = '".$domain."'"; print STDERR "SQL SYNTAX : $sql\n"; $dbh->do($sql) or die "$DBI::errstr"; @enr = $dbh->selectrow_array($sql); if (@enr[0]!= 0) { print STDERR "Alias already defined : $alias_value - Trying next\n"; ## Vinc : i prefer checking all aliases instead of aborting operation # &finalize_mysql; # return 1; $countrobot +=1; print STDERR "After checking, $countrobot aliases where found in $domain\n"; &finalize_mysql; if ($countrobot){ return 1; else {return 0; ## Connect to MySQL Database sub initialize_mysql { print STDERR "Trying initialize mysql"; unless ($dbh = DBI->connect("DBI:mysql:dbname=$mysql_base;host=$mysql_host", $mysql_user, $mysql_pass)) { Réalisé par Vincent le 8 juin 2007 Page 9 / 18
print "Can't connect to Database :", $DBI::errstr; return 0 print STDERR " - Done\n"; return 1; ## Close the MySQL Connection sub finalize_mysql { print STDERR "Trying disconnecting mysql "; $dbh->disconnect; print STDERR "- Done\n"; En gros il va chercher une liste d'alias à créer (fichier /usr/share/sympa/list_aliases.tt2), va tester si les alias sont déjà définis pour ce domaine, et si ce n'est pas le cas, les insérer automatiquement. J'ai rajouté pas mal de commentaires sous la forme 'print STDERR' qui a pour effet d'afficher un débug quasi complet dans les logs apache : /var/log/apache2/error.log Création des alias de liste config optionnelle Par défault, si l'on créé une liste via l'interface web du domaine listes.domain.tld, seuls les alias de ce domaine seront créés. (maliste@listes.domain.tld, maliste-unsubscribe@listes.domain.tld, etc.) Pour créer les alias maliste@domain.tld, maliste-unsubscribe@domain.tld, etc. il fallait le faire à la main ce script le fera pour vous à condition de modifier quelques fichiers Les scripts modifiés ci-dessous permettent la création et suppression des alias de chaque liste pour le sous-domaine principal d'un robot (listes.domain.tld) mais aussi pour le domaine principal (domain.tld) Dans cette configuration on doit modifier le fichier alias_manager.pl mais aussi quelques autres fichiers de configuration de sympa. On s'écarte un peu des modifications mineures car on va modifier le fonctionnement du logiciel. Gardez bien cela à l'esprit! Dans un premier temps, il faut modifier ou remplacer le fichier /usr/lib/sympa/bin/alias_manager.pl La syntaxe de ce nouveau script est la suivante : /usr/lib/sympa/bin/alias_manager.pl <add del> <listname> <robot> <minidomain> Donc pour la création des alias 'add' pour la liste 'maliste' sur le robot 'listes.domain.tld' du domaine principal 'domain.tld' : /usr/lib/sympa/bin/alias_manager.pl add maliste listes.domain.tld domain.tld Si vous voulez les supprimer, remplacer 'add' par 'del'. Important : par défault wwsympa lance ce script à la création de liste et à la suppression. Il n'est donc pas utile de le lancer à la main Voici ce script. Notez que j'ai rajouté par mal de fonctions 'print STDERR' afin de voir ce qui se passe dans les logs apache (/var/log/apache2/error.log) Pensez à renseigner les paramètres de votre base de données utilisée pour la gestion des alias avec postfix! #!/usr/bin/perl ## This version of alias_manager.pl has been customized by Bea. ## Modified by Vinc for postfix support with virtual aliases stored in mysql database. Réalisé par Vincent le 8 juin 2007 Page 10 / 18
## It has the ability to add/remove list aliases in a MySQL database for postfix ## To make sympa use this script, you should install it as /home/sympa/bin/alias_manager.pl ## You should edit all the $mysql_xxx below to use your own mysql database ## Also, make sure the file /usr/share/sympa/list_aliases.tt2 has been modified $ENV{'PATH' = ''; ## Load Sympa.conf print STDERR "Load Sympa.conf\n"; use strict; use lib '/usr/lib/sympa/bin'; use Conf; use POSIX; require "tools.pl"; require "tt2.pl"; use DBI; ## For debugging purpose, set this to true, mysql insert nor delete will be performed ## it will only show the sql syntax my $onlytest = 'false'; #my $onlytest = 'true'; unless (Conf::load('/etc/sympa/sympa.conf')) { print STDERR gettext("the configuration file /etc/sympa/sympa.conf contains errors.\n"); exit(1); ## MYSQL configuration my $mysql_host = "localhost"; my $mysql_base = "db_name"; my $mysql_user = "db_user"; my $mysql_pass = "db_pass"; my $default_domain; my $return_path_suffix; my ($operation, $listname, $domain, $minidomain) = @ARGV; my $dbh; my $sql; my @enr; my $domaintld = &Conf::get_robot_conf($domain, 'minidomain'); unless ($onlytest eq 'false') {print STDERR "-- ONLY TESTING --\n"; print STDERR "$domaintld\n"; if (($operation!~ /^(add) (del)$/) ($#ARGV < 2)) { print STDERR "Usage: $0 <add del> <listname> <robot> <minidomain>\n"; exit(2); $default_domain = $Conf{'domain'; $return_path_suffix = &Conf::get_robot_conf($domain, 'return_path_suffix'); #$return_path_suffix = $Conf{'return_path_suffix'; my %data; $data{'date' = &POSIX::strftime("%d %b %Y", localtime(time)); $data{'list'{'domain' = $data{'robot' = $domain; $data{'list'{'name' = $listname; $data{'default_domain' = $default_domain; $data{'is_default_domain' = 1 if ($domain eq $default_domain); #$data{'is_default_domain' = 1; $data{'return_path_suffix' = $return_path_suffix; my @aliases ; my $tt2_include_path = &tools::make_tt2_include_path($domain,'',,); my $aliases_dump; &tt2::parse_tt2 (\%data, 'list_aliases.tt2',\$aliases_dump, $tt2_include_path); @aliases = split /\n/, $aliases_dump; unless (@aliases) { Réalisé par Vincent le 8 juin 2007 Page 11 / 18
print STDERR "No aliases defined\n"; exit(15); if ($operation eq 'add') { ## Check existing aliases print STDERR "Check existing aliases\n"; if (&already_defined(@aliases)) { print STDERR "Some alias already exist - Stopping script\n"; exit(13); if (!&initialize_mysql) { print STDERR "Can't connect to MySQL database\n"; exit(14); ## Adding default aliases for $domain (ie mylist@lists.domain.tld, mylistsubscribe@lists.domain.tld...) print STDERR "Creating alias for robot : $domain\n"; foreach my $alias (@aliases) { print STDERR "For each alias in robot $domain add\n"; if ($alias =~ /^\#/) { print STDERR "Line contains # : $alias - Skipping\n"; $alias =~ /^([^:]+):\s*(\".*\")$/; my $alias_value = $1."@".$domain; my $command_value = $1."@".$domain; $command_value =~ s/\"//g; print STDERR "Trying inserting alias $alias_value in domain $domain\n with command line $command_value\n"; # We create the new mysql alias. $sql = "INSERT INTO alias SET address = '".$alias_value."', domain = '".$domain."', goto = '".$command_value."', active = '1'"; print STDERR "SQL SYNTAX : $sql\n"; # We finally add the entry if ($onlytest eq 'false'){ $dbh->do($sql) or die "$DBI::errstr"; else {print STDERR "-- ONLY TESTING --\n"; ## Adding default aliases for $domaintld -> $domain (ie domain.tld -> lists.domain.tld) print STDERR "Creating alias for domain : $domaintld\n"; foreach my $alias (@aliases) { print STDERR "For each alias in domain $domaintld add\n"; if ($alias =~ /^\#/) { print STDERR "Line contains # : $alias - Skipping\n"; $alias =~ /^([^:]+):\s*(\".*\")$/; my $alias_value = $1."@".$minidomain; my $command_value = $1."@".$domain; $command_value =~ s/\"//g; print STDERR "Trying inserting alias $alias_value in domain $minidomain\n with command line $command_value\n"; # We create the new mysql alias. $sql = "INSERT INTO alias SET address = '".$alias_value."', domain = '".$minidomain."', goto = '".$command_value."', active = '1'"; print STDERR "SQL SYNTAX : $sql\n"; # We finally add the entry if ($onlytest eq 'false'){ $dbh->do($sql) or die "$DBI::errstr"; else {print STDERR "-- ONLY TESTING --\n"; &finalize_mysql; elsif ($operation eq 'del') { print STDERR "Operation DEL\n"; if (!&initialize_mysql) { print STDERR "Can't connect to MySQL database\n"; exit(7); foreach my $alias (@aliases) { Réalisé par Vincent le 8 juin 2007 Page 12 / 18
if ($alias =~ /^\#/) { print STDERR "Line contains # : $alias - Skipping DEL\n"; $alias =~ /^([^:]+):/; my $alias_value = $1."@".$domain; $alias_value =~ s/\+/\-/g; print STDERR "Trying deleting alias $alias_value from domain $domain\n"; $sql = "DELETE FROM alias WHERE address = '".$alias_value."' and domain = '".$domain."'"; print STDERR "SQL SYNTAX : $sql\n"; if ($onlytest eq 'false'){ $dbh->do($sql) or die "$DBI::errstr"; else {print STDERR "-- ONLY TESTING --\n"; foreach my $alias (@aliases) { if ($alias =~ /^\#/) { print STDERR "Line contains # : $alias - Skipping DEL\n"; $alias =~ /^([^:]+):/; my $alias_value = $1."@".$minidomain; $alias_value =~ s/\+/\-/g; print STDERR "Trying deleting alias $alias_value from domain $minidomain\n"; $sql = "DELETE FROM alias WHERE address = '".$alias_value."' and domain = '".$minidomain."'"; print STDERR "SQL SYNTAX : $sql\n"; if ($onlytest eq 'false'){ $dbh->do($sql) or die "$DBI::errstr"; else {print STDERR "-- ONLY TESTING --\n"; &finalize_mysql; else { print STDERR "Action $operation not implemented yet\n"; exit(2); exit 0; ## Check if an alias is already defined sub already_defined { print STDERR "Check if an alias is already defined\n"; my @aliases = @_; ## Vinc : added a count for alias defined my $countrobot = '0'; my $countdomain = '0'; &initialize_mysql; foreach my $alias (@aliases) { if ($alias =~ /^\#/) { print STDERR "Line contains # : $alias - Skipping Check\n"; $alias =~ /^([^:]+):/; my $alias_value = $1."@".$domain; $alias_value =~ s/\+/\-/g; print STDERR "Trying checking for alias $alias_value in domain $domain\n"; $sql = "SELECT COUNT(address) as address FROM alias where address = '".$alias_value."' and domain = '".$domain."'"; print STDERR "SQL SYNTAX : $sql\n"; $dbh->do($sql) or die "$DBI::errstr"; @enr = $dbh->selectrow_array($sql); if (@enr[0]!= 0) { print STDERR "Alias already defined : $alias_value - Trying next\n"; ## Vinc : i prefer checking all aliases instead of aborting operation # &finalize_mysql; # return 1; $countrobot +=1; Réalisé par Vincent le 8 juin 2007 Page 13 / 18
foreach my $alias (@aliases) { if ($alias =~ /^\#/) { print STDERR "Line contains # : $alias - Skipping Check\n"; $alias =~ /^([^:]+):/; my $alias_value = $1."@".$minidomain; $alias_value =~ s/\+/\-/g; print STDERR "Trying checking for alias $alias_value in domain $minidomain\n"; $sql = "SELECT COUNT(address) as address FROM alias where address = '".$alias_value."' and domain = '".$minidomain."'"; print STDERR "SQL SYNTAX : $sql\n"; $dbh->do($sql) or die "$DBI::errstr"; @enr = $dbh->selectrow_array($sql); if (@enr[0]!= 0) { print STDERR "Alias already defined : $alias_value\n"; ## Vinc : i prefer checking all aliases instead of aborting operation # &finalize_mysql; # return 1; $countdomain +=1; print STDERR "After checking, $countdomain aliases where found in $domaintld\n"; print STDERR "After checking, $countrobot aliases where found in $domain\n"; &finalize_mysql; if ($countrobot $countdomain){ return 1; else {return 0; ## Connect to MySQL Database sub initialize_mysql { print STDERR "Trying initialize mysql"; unless ($dbh = DBI->connect("DBI:mysql:dbname=$mysql_base;host=$mysql_host", $mysql_user, $mysql_pass)) { print "Can't connect to Database :", $DBI::errstr; return 0 print STDERR " - Done\n"; return 1; ## Close the MySQL Connection sub finalize_mysql { print STDERR "Trying disconnecting mysql "; $dbh->disconnect; print STDERR "- Done\n"; Comme je l'ai signalé précédemment, il faut toucher un peu au fonctionnement de sympa pour qu'il puisse créer les alias pour le 'domain.tld' aussi. Première modification, le fichier admin.pm qui contient la fonction install_aliases (qui va appeler notre script alias_manager.pl pour installer / créer les alias) J'ai rajouté une variable $minidomain aux arguments passés au script alias_manager.pl /usr/lib/sympa/bin/admin.pm (~ligne 600) sub install_aliases { my $list = shift; my $robot = shift; ++ my $minidomain = &Conf::get_robot_conf($robot, 'minidomain'); -- &do_log('debug', "admin::install_aliases($list->{'name',$robot)"); ++ &do_log('debug', "admin::install_aliases($list->{'name',$robot,$minidomain)"); Réalisé par Vincent le 8 juin 2007 Page 14 / 18
my $alias_installed = 0; my $alias_manager = '/usr/lib/sympa/bin/alias_manager.pl'; -- &do_log('debug2',"admin::install_aliases : $alias_manager add $list->{'name' $list ->{'admin'{'host'"); ++ &do_log('debug2',"admin::install_aliases : $alias_manager add $list->{'name' $list ->{'admin'{'host' $minidomain"); if (-x $alias_manager) { ++ system ("$alias_manager add $list->{'name' $list->{'admin'{'host' $minidomain") ; -- system ("$alias_manager add $list->{'name' $list->{'admin'{'host'") ; Ensuite, le fichier List.pm qui globalement fait la même chose mais pour la suppression des alias. /usr/lib/sympa/bin/list.pm (~ligne 13320) sub remove_aliases { my $self = shift; ++ my $minidomain = &Conf::get_robot_conf($self->{'domain', 'minidomain'); return undef unless ($self && ($list_of_lists{$self->{'domain'{$self->{'name')); my $alias_manager = '/usr/lib/sympa/bin/alias_manager.pl'; unless (-x $alias_manager) { &do_log('err','cannot run alias_manager %s', $alias_manager); return undef; ++ system ("$alias_manager del $self->{'name' $self->{'admin'{'host' $minidomain"); -- system ("$alias_manager del $self->{'name' $self->{'admin'{'host'"); my $status = $? / 256; unless ($status == 0) { do_log('err','failed to remove aliases ; status %d : %s', $status, $!); return undef; &do_log('info','aliases for list %s removed successfully', $self->{'name'); return 1; Enfin, comme j'ai créé une variable, il faut la définir en 'keyword' dans le fichier Conf.pm. Il faut juste rajouter une ligne en conservant la syntaxe. /usr/lib/sympa/bin/conf.pm (ligne 445+) sub load_robots { my %robot_conf ; my %valid_robot_key_words = ( 'http_host' => 1, ++ minidomain => 1, listmaster => 1, email => 1, host => 1, Avec tout ca, on peut maintenant créer une liste et envoyer les messages à maliste@domain.tld sans aucun problème VII. Lancement des services / Validation de la configuration Si vous ne l'avez pas fait : sudo /etc/init.d/postfix reload On relance sympa pour qu'il prenne en compte tous les nouveaux paramètres sudo /etc/init.d/sympa restart Réalisé par Vincent le 8 juin 2007 Page 15 / 18
On relance apache qui va démarrer le script fastcgi (wwsympa.fcgi) sudo /etc/init.d/apache2 restart On vérifie dans les logs apache que tout se passe bien, en particulier le lancement du script wwsympa.fcgi Vous pouvez maintenant vous connecter à : http://listes.domain.tld/wws et vérifier que le nom affiché en haut de la page correspond à celui définit dans votre fichier robot.conf. A ce stade, vous n'avez pas encore accès à l'interface complète (il faut vous enregister avec un mot de passe). Cliquez donc sur 'Premier login?', renseignez votre adresse définie comme 'listmaster' dans le fichier de config (soit sympa.conf soit robot.conf). Validez et normalement, sympa va vous envoyer votre mot de passe par mail. Vous pourrez le modifier via l'interface par la suite. VIII. Création d'une liste Une fois cette étape validée, vous pouvez créer votre première liste. Interface web > Création de liste (onglet en haut à gauche) Renseignez bien tous les champs : Le nom de la liste : maliste Le type de liste : <à vous de voir> L'objet Une description Tous ces champs sont obligatoires lors de la création, mais vous pourrez par la suite les modifier. Vérifier que les alias ont été créés (sur listes.domain.tld et éventuellement domain.tld) Vous pouvez abonner un utilisateur à la liste directement depuis l'interface ou sinon envoyez un message à maliste-subscribe@listes.domain.tld (ou maliste-subscribe@domain.tld) Validez cette inscription et postez votre premier message! mailto:maliste@listes.domain.tld (ou mailto:maliste@domain.tld) Vous devriez recevoir sous peu votre premier message! Notez qu'il rajoute dans le sujet : [maliste] que l'on peut modifier via l'interface. Allez faire un tour sur le code source du message : Reply-To: maliste@listes.domain.tld X-Loop: maliste@listes.domain.tld X-Sequence: 1 Errors-to: maliste-owner@listes.domain.tld Precedence: list X-no-archive: yes List-Id: <maliste.listes.domain.tld> List-Archive: <http://listes.domain.tld/wws/arc/maliste> Réalisé par Vincent le 8 juin 2007 Page 16 / 18
List-Help: <mailto:sympa@listes.domain.tld?subject=help> List-Owner: <mailto:maliste-request@listes.domain.tld> List-Post: <mailto:maliste@listes.domain.tld> List-Subscribe: <mailto:sympa@listes.domain.tld?subject=subscribe%20maliste> List-Unsubscribe: <mailto:sympa@listes.domain.tld?subject=unsubscribe%20maliste> Si vous avez suivi la configuration optionnelle, pour que le robot affiche maliste@domain.tld, vous devez quand même paramétrer votre liste via l'interface web et redéfinir l'hôte par défaut. Sinon, à chaque envoi d'un message, vous aurez comme adresses *@listes.domain.tld. Je n'ai pas cherché à le définir automatiquement pour l'instant. Rendez-vous sur l'interface web dans la partie 'Admin' de la liste créée puis : 'Admin > Configurer la liste > Définition de la liste' >>> ou plus rapidement : http://listes.domain.tld/wws/edit_list_request/test/description Modifier le champ intitulé 'Domaine internet (host)' -- listes.domain.tld ++ domain.tld Voilà qui est terminé! Le source d'un nouveau message doit maintenant avoir cet aspect : Reply-To: maliste@domain.tld X-Loop: maliste@domain.tld X-Sequence: 1 Errors-to: maliste-owner@domain.tld Precedence: list X-no-archive: yes List-Id: <maliste.domain.tld> List-Archive: <http://listes.domain.tld/wws/arc/maliste> List-Help: <mailto:sympa@listes.domain.tld?subject=help> List-Owner: <mailto:maliste-request@domain.tld> List-Post: <mailto:maliste@domain.tld> List-Subscribe: <mailto:sympa@listes.domain.tld?subject=subscribe%20maliste> List-Unsubscribe: <mailto:sympa@listes.domain.tld?subject=unsubscribe%20maliste> Je sais ce n'est pas encore parfait... Mais c'est déjà pas mal alors pour toute question ou remarque afin d'améliorer ce document, vous pouvez me contacter par mail à : tutosympa_at_vgsi_dot_fr IX. Encore des problèmes? Si vous avez encore des problèmes, regardez vos logs : Sympa : Postfix : Apache : /var/log/sympa.log /var/log/mail.log /var/log/apache2/error.log Si vous obtenez des erreurs sur des accès à queue ou bouncequeue, activez le bit suid : Je ne suis pas sûr que ce soit 100% nécessaire, mais j'ai eu des erreurs au début On change le propriétaire du fichier et on active le bit suid sudo chown sympa:sympa /usr/lib/sympa/bin/queue sudo chown sympa:sympa /usr/lib/sympa/bin/bouncequeue sudo chmod 4755 /usr/lib/sympa/bin/queue Réalisé par Vincent le 8 juin 2007 Page 17 / 18
sudo chmod 4755 /usr/lib/sympa/bin/bouncequeue Réalisé par Vincent le 8 juin 2007 Page 18 / 18