Mailing Lists Management in Savannah

All gnu and nongnu mailing lists are processed on using the Mailman package. This machine is managed by FSF admins. Savannah admins have only non-root access and are able to perform limited mailing-list related administration tasks.

This page describes the interface between Savannah PHP frontend and the Mailman package running on See also:

  • MailSystem - various email and mailing-list related details in Savannah and gnu systems.
  • ListServer - manually running mailing-list related commands.


Savannah provides mailing lists to hosted groups. Group admins can create as many mailing lists as needed through the web frontend.

The general workflow is as follows:

  1. A group admin on Savannah creates a new mailing list on Savannah website.
  2. The PHP frontend code runs on via ssh; runs appropriate Mailman scripts.
  3. The PHP frontend code updates the mailing list information in the mail_group_list table in the savane MySQL database and sends a notification with new mailing list password.


The mail_group_list table contains the following fields:

mysql> select * from mail_group_list where list_name = 'sed-devel' \G
*************************** 1. row ***************************
group_list_id: 3272
     group_id: 6711
    list_name: sed-devel
    is_public: 1
     password: NULL
   list_admin: 829
       status: 5
  description: Development discussion for GNU Sed

To see the mailing lists for a Savannah group:

mysql> select list_name from mail_group_list,groups
       where groups.unix_group_name = 'coreutils'
       and groups.group_id = mail_group_list.group_id ;
| list_name     |
| bug-coreutils |
| coreutils     |
2 rows in set (0.00 sec)

The meaning of the status field:

Status 0: obsolete.
Status 1: obsolete.
Status 2: obsolete.
Status 5: the only one used, so actually means nothing.

The password field means: nothing.

This script processes requests from frontend and translates them in Mailman script invocations. The requests are read from STDIN as a set of lines in form


The response is written to STDOUT; normal output looks like a similar set of


It includes the version of the script and the variables set in the process. Errors, if any, are reported in lines starting with 'Error', typically without the '=' sign.

The COMMAND variable is required, it may have values:

version: Report version and generated password and quit.
newlist: Create a list.  The parameters used are
  (all are required).
config: Make list public or private, change its description.
  Used parameters are VISIBILITY and DESCRIPTION (both optional).
change_pw: Request password reset. The parameters used are
  LIST_NAME and PASSWORD (both required).
rmlist: Remove the list. The parameter used is LIST_NAME (required).

The parameters used by commands are

DRY_RUN: Don't apply changes; the only valid value is 'yes'.
ADMIN_MAIL: Email of the administrator.
LIST_NAME: List name, e.g. pretest-users.
LIST_FULL_NAME: List name with domain, e.g.
DESCRIPTION: A line describing the list
PASSWORD: New password; when empty (which is the normal usage),
  the script generates a new password.
VISIBILITY: Whether the list is 'public' or 'private'.

Manual walk-through example - changing description

The frontend code connects to and transmits the commands as STDIN. Equivalent command (still on frontend):

# sudo -u www-data ssh -T <<EOF
DESCRIPTION=Test mailing list
EOF 0.1
description=Test mailing list

The script on reads the commands from STDIN and executes the needed programs.

Equivalent command (on

$ ssh
lists:~$ echo description='Test mailing list' \
  | config_list -i /dev/stdin pretest-users

Mailing list creation - FOR REFERENCE ONLY

The Following section describes the original setup. It is kept for historical purposes

I (Sylvain) basically installed sv_mailman on, modified it to support mailman virtual hosts (and use the proper admin mail instead of Then I wrote a fake /usr/sbin/newlist that connects to via SSH and call an helper script there ( This happens via a Savannah public key in authorized_keys with a command= restriction.

There is also an empty /usr/sbin/config_list on internal that does nothing; we don't want what Savane currently does there.

The cron job runs on internal every five minutes, file /etc/cron.d/sv. The script being run is named sv_mailman.

On, there is a script which can be used to create lists by hand. It duplicates what does for Savannah actions. (The scripts must be kept in sync by hand. They should be merged so there is only one.)