27 Apr 2019

Mailman Mailinglisten umziehen

Alle paar Jahre kommt es vor, dass man doch seinen Maling-Listen-Server auf einen neuen Host umstellen muss . Mit dieser Anleitung verliert das seinen Schrecken.

Achtung - diese Anleitungen und Skripte sind wie immer FreeBSD-zentrisch, aber es dürfte sich unter Linux analog verhalten.

Vorgehen:

  1. Auf dem Quell-Host die Listen anzeigen, und die Config der zu migrierenden Liste exportieren
    #  cd /usr/lib/mailman/bin/
    #  ./list_lists
    3 matching mailing lists found:
            List-1 - Just some mailing list
            List-2 - Just another mailing list
           TheList - The list we are interested in
    #  ./config_list -o /tmp/TheList.conf TheList
    
  2. Die Mitglieder dieser Liste exportieren: regular und digest
    #  cd /usr/lib/mailman/bin/
    #  ./list_members -o /tmp/TheList-regular.txt -r TheList
    #  ./list_members -o /tmp/TheList-digest.txt -d TheList
    
  3. Das Listen-Archiv sichern
    #  cd /var/lib/mailman/archives/private
    #  ls -lF
    total 32K
    drwxrwsr-x 12 root mailman 4.0K Jan 15  2011 List-1/
    drwxrwsr-x  2 root mailman 4.0K Apr  9  2010 List-1.mbox/
    drwxrwsr-x  4 root mailman 4.0K Nov 24  2010 List-2/
    drwxrwsr-x  2 root mailman 4.0K Nov 23  2010 List-2.mbox/
    drwxrwsr-x 55 root mailman 4.0K Sep  2 03:27 TheList/
    drwxrwsr-x  2 root mailman 4.0K Apr  8  2010 TheList.mbox/
    drwxrwsr-x  2 root mailman 4.0K Apr  7  2010 mailman/
    drwxrwsr-x  2 root mailman 4.0K Apr  7  2010 mailman.mbox/
    #  tar czf /tmp/TheList-archive.tgz TheList
    #  tar czf /tmp/TheList-mbox-archive.tgz TheList.mbox
    

Alle wichtigen Dateien einer Mailing-Liste sind nun nach /tmp/ exportiert. Von dort schaffen sie via scp auf den Ziel-Server, ebenfalls via scp. natürlich sind auch andere Methonden denkbar, YMMV.

Nun beginnt das importieren der Liste auf dem Ziel-Server. Dazu muss dort erst einmal die Liste angelegt werden:

...

Dach kann die Konfiguration der Liste importiert werden:

#  ./config_list -i /tmp/TheList.conf TheList

Jetzt müssen die Mitglieder importiert werden:

#  ./add_members -r /tmp/TheList-regular.txt TheList
#  ./add_members -d /tmp/TheList-digest.txt TheList

Wenn man beschwingt ist, kann man auch das Listen-Archiv importieren:

#  cd /var/lib/mailman/archives/private
#  tar xzf /tmp/TheList-archive.tgz
#  tar xzf /tmp/TheList-mbox-archive.tgz

Zum Schluss gilt es eventuell, die Berechtigungen anzupassen.

#  chown -R root:mailman TheList TheList.mbox

Dieser Vorgang funktioniert, ich habe das mehrmals so durchgespielt. Handelt es sich aber um viele Mailinglisten, so artet das in umfangreiche Handarbeit aus. Deshalb habe ich kurzerhand diese Shell-Skripte erstellt:

Mailman-Export-Skript Die zu Exportierenden Mailinglisten muss man aber von Hand einstellen. Und überhaupt sollte man das Skript ein bisschen verstehen.

!/usr/local/bin/bash

# commands
MPRE=/usr/local/mailman/bin
LIST_LISTS=$MPRE/list_lists
CONFIG_LIST=$MPRE/config_list
LIST_MEMBERS=$MPRE/list_members

TAR=/usr/bin/tar

#archive location
LIST_ARCHIVE=/usr/local/mailman/archives/private

#where to save export
OUT_DIR=~/lists

###
#[root@server ~]# /usr/local/mailman/bin/list_lists 
# ... matching mailing lists found:
#                  Baumlist - My Baumlist
#                  Bildung - [no description available]
# ...

declare -a lists=('Baumlist' 'Bildung' )

for i in `seq 0 $(( ${#lists[@]} - 1 ))`
do
list_lower=`echo ${lists[$i]}|tr '[:upper:]' '[:lower:]'` 
echo "Nr: $i - Name: ${lists[$i]} ($list_lower)"
$CONFIG_LIST -o ${OUT_DIR}/${lists[$i]}.conf ${lists[$i]}
$LIST_MEMBERS -o ${OUT_DIR}/${lists[$i]}-regular.txt -r ${lists[$i]}
$LIST_MEMBERS -o ${OUT_DIR}/${lists[$i]}-digest.txt -d ${lists[$i]}
$TAR czf  ${OUT_DIR}/${lists[$i]}-archive.tgz -C ${LIST_ARCHIVE} $list_lower
$TAR czf  ${OUT_DIR}/${lists[$i]}-mbox-archive.tgz -C ${LIST_ARCHIVE} ${list_lower}.mbox
done

Mailman-Import-Skript

#!/usr/local/bin/bash

#name of list host
LIST_HOST=mail.example.de

#archive location
LIST_ARCHIVE=/usr/local/mailman/archives/private

#where to get export to import
IN_DIR=~/lists

# commands
MPRE=/usr/local/mailman/bin
LIST_LISTS=$MPRE/list_lists
CONFIG_LIST=$MPRE/config_list
LIST_MEMBERS=$MPRE/list_members
NEWLIST=$MPRE/newlist
ADD_MEMBERS=$MPRE/add_members

TAR=/usr/bin/tar

# lists to handle, get with $LIST_LISTS and add which you want
declare -a lists=('Baumlist' 'Bildung' )

for i in `seq 0 $(( ${#lists[@]} - 1 ))`
do
list_lower=`echo ${lists[$i]}|tr '[:upper:]' '[:lower:]'`
echo "Nr: $i - Name: ${lists[$i]} ($list_lower)"

## newlist [options] [listname [listadmin-addr [admin-password]]]
$NEWLIST -u ${LIST_HOST} -e ${LIST_HOST} ${lists[$i]} admin@example.com secret

$CONFIG_LIST -i ${IN_DIR}/${lists[$i]}.conf ${lists[$i]}
$ADD_MEMBERS -r ${IN_DIR}/${lists[$i]}-regular.txt --welcome-msg=n ${lists[$i]}
#$ADD_MEMBERS -d ${IN_DIR}/${lists[$i]}-digest.txt --welcome-msg=n ${lists[$i]}

$TAR xzf  ${IN_DIR}/${lists[$i]}-archive.tgz -C ${LIST_ARCHIVE}/
$TAR xzf  ${IN_DIR}/${lists[$i]}-mbox-archive.tgz -C ${LIST_ARCHIVE}/
done