#!/usr/bin/python2
import subprocess
import sys
MAILMAN_HOME="/usr/lib/mailman/bin"
MAILING_PREFIX="noel"


def getListUser(listName):
    cmd = MAILMAN_HOME+"/list_members "+listName
    proc = subprocess.Popen(cmd,
                            shell=True,
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE)

    (stdout, stderr) = proc.communicate()
    ret = proc.returncode
    if ret != 0:
        print "error when checking user %s list %s : %s"%(user, listName, stderr)
        return []
    return stdout.split('\n')



def getMailingLists (prefix):
    cmd = MAILMAN_HOME+"/list_lists -b"
    proc = subprocess.Popen(cmd,
                            shell=True,
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE)

    (stdout, stderr) = proc.communicate()
    ret = proc.returncode
    if ret != 0:
        print "error when getting mailing lists : %s"%stderr
        sys.exit(1)
    lists=[]
    for line in stdout.split('\n'):
        if line.startswith(prefix):
            lists.append(line)
    return lists

def createList(name):
    cmd = MAILMAN_HOME+"/newlist -l fr "+name
    proc = subprocess.Popen(cmd,
                            shell=True,
                            stdin=sys.stdin,
                            stdout=sys.stdout,
                            stderr=sys.stderr)

    (stdout, stderr) = proc.communicate()
    ret = proc.returncode
    if ret != 0:
        print "error when creating mailing lists : %s"%stderr
        sys.exit(1)

def listContainsUser(user, listName):
    return user in getListUser(listName)


def addUserToList(userEmail, listName):
    if listContainsUser(userEmail, listName):
        return
    print "Add %s to list %s"%(userEmail, listName)
    cmd = MAILMAN_HOME+"/add_members -w n -r - "+listName
    proc = subprocess.Popen(cmd,
                            shell=True,
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE)

    (stdout, stderr) = proc.communicate(input=""+userEmail)
    ret = proc.returncode
    if ret != 0:
        print "error when adding user %s to list %s : %s"%(userEmail, listName, stderr)
        sys.exit(1)


def delUserFromList(userEmail, listName):
    if not listContainsUser(userEmail, listName):
        return
    print "Remove %s to list %s"%(userEmail, listName)
    cmd = MAILMAN_HOME+"/remove_members "+listName+" "+userEmail
    proc = subprocess.Popen(cmd,
                            shell=True,
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE)

    (stdout, stderr) = proc.communicate()
    ret = proc.returncode

    
#--------------------MAIN--------------------
if len(sys.argv) < 3:
    print "Usage %s nom email [ancien_email]"%sys.argv[0]
    print "nom : nom de la mailing list de l'user sans prefix (ex: celine et pas %s-celine). Sera creee si elle n'exite pas"%MAILING_PREFIX
    print "email : email a ajouter dans toutes les mailing lists sauf dans %s-nom"%MAILING_PREFIX
    print "ancien_email : email a supprimer de toutes les mailing lists"
    sys.exit(1)

mailingName   = MAILING_PREFIX+"-"+sys.argv[1]
existingLists = getMailingLists(MAILING_PREFIX)

print "existing lists : %s"%existingLists
if mailingName not in existingLists:
    print "Create list %s "%mailingName
    createList(mailingName)
    #populate new mailing list with existing users
    users = getListUser(MAILING_PREFIX)
    for user in users:
        addUserToList(user, mailingName)

allButUserList = list(existingLists)

if mailingName in existingLists:
    allButUserList.remove(mailingName)

for listName in allButUserList:
    addUserToList(sys.argv[2], listName)

if len(sys.argv) == 4:
    for listName in existingLists:
        delUserFromList(sys.argv[3], listName)

