Skip to content
Snippets Groups Projects
manage_users.py 5.74 KiB
#!/bin/env python
from mailmanclient import Client
#from mailman.interfaces.usermanager import IUserManager
#from mailman.model.preferences import Preferences
#from mailman.testing.helpers import call_api, configuration
#from mailman.testing.layers import RESTLayer
#from urllib.error import HTTPError
#from zope.component import getUtility

import os
import sys
import time
import argparse

try:
    import json
except ImportError:
    import simplejson as json

def get_ml_fqdns(client):
    ml_fqdns = []
    for mlist in client.lists:
        ml_fqdns.append(mlist.fqdn_listname)
    return ml_fqdns

def print_all_members(client):
    # grabs users per page
    """Prints all the members of the mailman with pagination."""
    page = client.get_user_page(count=100, page=1)
    #members_hash['members'] = []

    # loop through each page
    while len(page) > 0:
        for member in page:
            print json.dumps(member.addresses.rest_data, indent=2)
            #TO DO add same json data ase print_fqdn_members
            # members_hash['members'].append({
            #     'list_fqdn': args.list_fqdn,
            #     'email': member.email,
            #     'display_name': member.user.display_name
            # })
            #time.sleep(.100) #pause between pages
        page = page.next

    #print json.dumps(members_hash, indent=2)
# end get_all_fqdns

def print_fqdn_members(client,ml_fqdn ):

    """Prints the members of a email list"""
    # Get members from email list
    member_list = client.get_list(ml_fqdn)
    members_hash = {}
    members_hash['members'] = []

    # Get json data from each member
    for member in member_list.members:
        prefs = member.preferences # obtain member prrivilges

        members_hash['members'].append({
            'list_fqdn': args.list_fqdn,
            'email': member.email,
            'display_name': member.user.display_name,
            'password': member.user.password,
            'preferences': {'delivery_mode':  prefs['delivery_mode'],
                            'acknowledge_posts': prefs['acknowledge_posts'],
                            'delivery_status': prefs['delivery_status'],
                            'hide_address': prefs['hide_address'],
                            'preferred_language': prefs['preferred_language'],
                            'receive_list_copy': prefs['receive_list_copy'],
                            'receive_own_postings': prefs['receive_own_postings']
                            }
        })
        #held_data[held.request_id] = held.rest_data
        #print json.dumps(member.rest_data, indent=2)
        #print json.dumps(member.user.rest_data, indent=2)
    print json.dumps(members_hash, indent=2)
# end print_fqdn_memberss

def restore_members( input_file ):

    """Creates Code to Restore Members"""
    members_hash = {}
    members_hash['members'] = []

    if input_file == '-':
        json_file = sys.stdin
    else:
        user_file = input_file
        with open(user_file) as json_file:
            data = json.load(json_file)
        #print json.dumps(datam, indent=2)
        for member in data['members']:
            #print(str(member))
            print('list_fqdn: '+ member['list_fqdn'])
            if( member['display_name'] is not None):
                print('display_name: '+ member['display_name'])
            print('email: '+ member['email'])
            print('password: '+ member['password'])
            for preference in member:
              if (member[preference] is not None):
                print ('preference: '+str(member)+'= '+str(member[preference]))
              else:
                print ('preference: '+str(member)+'= None')

            #new_member_list.append(member_email)
    if input_file != '-':
        json_file.close()
#end restore_members

def rebuild_user(list_fqdn, email, display_name, password_hash):
    pass
    #user_manager = getUtility(IUserManager)
    #with transaction():
        #new_user = user_manager.create_user(
    #        'nobody@where.com', 'Bob Nobody')
        #new_user.password = config.password_context.encrypt('abc123') #replace with hash
    #    new_user.password = '$6$rounds=656000$tS8sTX'

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="Manage Users in Mailman Email Lists.")

    CORE_URI = os.environ.get('MAILMAN_CORE_URI',
                              'http://mailman-core:8001/3.1')
    CORE_USER = os.environ.get('MAILMAN_REST_USER', 'restadmin')
    CORE_PASS = os.environ.get('MAILMAN_REST_PASSWORD', 'restpass')
    # Default Email list
    LIST_NAME = 'apachesvn@lists.med.stanford.edu'


    # user invoked variables
    parser.add_argument('-l','--list-fqdn')
    parser.add_argument('-r','--restore')
    # Add arguments for env variables
    parser.add_argument('--core-uri', dest='core_uri', default=CORE_URI)
    parser.add_argument('--rest-user', dest='core_user', default=CORE_USER)
    parser.add_argument('--rest-password', dest='core_password', default=CORE_PASS)


    # Parse out the command line arguments
    args = parser.parse_args()

    # Set the mailman client
    client = Client(args.core_uri, args.core_user, args.core_password)

    # append the mail lists to an array from client
    ml_fqdns = get_ml_fqdns(client)

    # lists members of a list
    if args.list_fqdn:
        # used to store members
        ml_fqdn = args.list_fqdn

        # get members from list
        if ml_fqdn in ml_fqdns:
            print_fqdn_members(client,ml_fqdn)
        # Get all the members
        elif ml_fqdn.upper() == 'ALL':
            print_all_members(client)
        else:
            sys.exit('Error: Email list"'+ml_fqdn+'" does not exist in domain '+args.core_uri +
                     "\nSee List\n"+str(ml_fqdns))
    #end if
    elif args.restore:
        restore_members( args.restore)