Initial version of import list script.
[clinton/scripts.git] / import-list
diff --git a/import-list b/import-list
new file mode 100755 (executable)
index 0000000..14e7edb
--- /dev/null
@@ -0,0 +1,143 @@
+#!/bin/bash
+#
+# Import a mailing list from a user.
+#
+# This must be run as root.
+
+MMDIR=/var/lib/mailman
+ARCHIVEDIR=$MMDIR/archives
+BINDIR=$MMDIR/bin
+LISTDIR=$MMDIR/lists
+WORKDIR=/tmp/mmdir
+
+function usage() {
+    echo "Usage: import-list [--new] [--archive MBOX-FILE] [--conf CONF-FILE]"
+    echo "                   [--url WEB-PAGE-URL] LIST"
+}
+
+function newlist() {
+    if test -z "$1" || test -n "$2"; then
+        echo "Programmer error"
+        exit 1
+    fi
+
+    local LIST=$1
+
+    mkdir $MMDIR/lists/$LIST
+    chown list:list $MMDIR/lists/$LIST
+    chmod g+rwx $MMDIR/lists/$LIST
+
+    mkdir $MMDIR/archives/private/$LIST
+    chown list:list $MMDIR/archives/private/$LIST
+    chmod g+rwx $MMDIR/archives/private/$LIST
+
+    echo "Created list $LIST"
+    echo
+}
+
+# Argument processing
+ARCH=
+CONF=
+NEW=n
+URL=
+
+while test "forever"; do
+    if test "$1" = "--archive"; then
+       shift
+       ARCH=$1
+       shift
+    elif test "$1" = "--conf"; then
+        shift
+       CONF=$1
+       shift
+        continue
+    elif test "$1" = "--new"; then
+        NEW=y
+        shift
+        continue
+    elif test "$1" = "--url"; then
+        shift
+       URL=$1
+       shift
+        continue
+    else
+        break
+    fi
+done
+
+if test -z "$1"; then
+    echo "Not enough arguments"
+    usage
+    exit 1
+elif test -n "$2"; then
+    echo "Too many arguments"
+    usage
+    exit 1
+else
+    LIST=$1
+    URL=$2
+fi
+
+# Create list if --new passed
+if test "$NEW" = "y"; then
+    newlist $LIST
+fi
+
+# Check to see whether list exists yet
+if test ! -d $LISTDIR/$LIST; then
+    echo "List $LIST does not exist yet.  Please make it using the" \
+        "web interface."
+    exit 1
+fi
+
+# Make working directory
+if test ! -d $WORKDIR; then
+    mkdir -p $WORKDIR
+    chown list:list $WORKDIR
+    chmod ug=rwX,o= $WORKDIR
+fi
+
+# Import configuration
+if test -n "$CONF"; then
+    echo "Importing list configuration ..."
+    cp $CONF $WORKDIR/$LIST.cfg
+    chown list:list $WORKDIR/$LIST.cfg
+    chmod u=rw,g=rw,o= $WORKDIR/$LIST.cfg
+    mv $WORKDIR/$LIST.cfg $LISTDIR/$LIST/config.pck
+    echo
+fi
+
+# Change URL for web interface
+if test -n "$CONF" && test -n "$URL"; then
+    echo "Changing web page URL for $LIST to $URL ..."
+    echo "web_page_url = '$URL'" >  $WORKDIR/$LIST.cfg
+    chown list:list $WORKDIR/$LIST.cfg
+    sudo -u list $BINDIR/config_list -i $WORKDIR/$LIST.cfg $LIST
+    rm -f $WORKDIR/$LIST.cfg
+    echo
+fi
+
+# Import list archives
+if test -n "$ARCH"; then
+    echo "Importing list archives ..."
+    cp $ARCH $WORKDIR/$LIST.mbox
+    rm -fr $ARCHIVEDIR/private/$LIST.mbox
+    mkdir $ARCHIVEDIR/private/$LIST.mbox
+    mv $WORKDIR/$LIST.mbox $ARCHIVEDIR/private/$LIST.mbox
+    chown -R list:list $ARCHIVEDIR/private/$LIST.mbox
+    chmod ug=rw,o=r $ARCHIVEDIR/private/$LIST.mbox/$LIST.mbox
+    sudo -u list $BINDIR/arch --quiet --wipe $LIST
+    echo
+fi
+
+echo "Reloading mailman ..."
+/etc/init.d/mailman reload
+echo
+
+if test -n "$CONF"; then
+    echo "Updating mailman definitions for Exim ..."
+    /afs/hcoop.net/common/etc/scripts/mailman-update-exim-db
+    echo
+fi
+
+echo "Sucessfully imported list $LIST"