From b7619322258503c787586d246e19fefe8d54166b Mon Sep 17 00:00:00 2001 From: nd Date: Mon, 8 Mar 2021 22:11:38 +0100 Subject: [PATCH] add mailman_list module --- defaults/main.yml | 1 + library/mailman_list.py | 70 +++++++++++++++++++++++++++++++++++++++++ tasks/main.yml | 4 +++ 3 files changed, 75 insertions(+) create mode 100644 library/mailman_list.py diff --git a/defaults/main.yml b/defaults/main.yml index 9943d6f..6085b67 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -4,6 +4,7 @@ mailman: api: hostname: localhost port: 8001 + version: "3.1" admin: name: restadmin pw: "{{ lookup('password', '/dev/null length=32') }}" diff --git a/library/mailman_list.py b/library/mailman_list.py new file mode 100644 index 0000000..310fac1 --- /dev/null +++ b/library/mailman_list.py @@ -0,0 +1,70 @@ +import urllib + +from mailmanclient import Client + +from ansible.module_utils.basic import AnsibleModule + +MAILMAN_SUPPORTED_API_VERSION = '3.1' + +def run_module(): + module_args = dict( + api_url=dict(type='str', default='http://localhost:8001/3.1'), + api_user=dict(type='str', default='restapi'), + api_password=dict(type='str', required=True, no_log=True), + name=dict(type='str', required=True), + settings=dict(type='dict', default={}) + ) + + result = dict( + changed=False, + message='', + diff={'before': '', 'after': ''} + ) + + module = AnsibleModule( + argument_spec=module_args, + supports_check_mode=True + ) + + client = Client(module.params['api_url'], module.params['api_user'], module.params['api_password']) + if not client.system['api_version'] == MAILMAN_SUPPORTED_API_VERSION: + module.fail_json(msg='API version {} is not supported, only {} is supported'.format(client.system['api_version'], MAILMAN_SUPPORTED_API_VERSION)) + + ml = None + try: + ml = client.get_list(module.params['name']) + except urllib.error.HTTPError as e: + if e.code != 404: + raise + result['changed'] = True + if module.check_mode: + module.exit_json(**result) + addr_domain =module.params['name'].split('@')[-1] + addr_local = '@'.join(module.params['name'].split('@')[0:-1]) + domain = client.get_domain(addr_domain) + ml = domain.create_list(addr_local) + + ml_settings = ml.settings + result['diff']['before'] = dict(ml_settings) + + for i in module.params['settings']: + if ml_settings[i] != module.params['settings'][i]: + result['changed'] = True + ml_settings[i] = module.params['settings'][i] + + if module.check_mode: + result['diff']['after'] = dict(ml.settings) + result['diff']['after'].update(module.params['settings']) + else: + ml_settings.save() + result['diff']['after'] = dict(ml.settings) + + module.exit_json(**result) + + +def main(): + run_module() + + +if __name__ == '__main__': + main() diff --git a/tasks/main.yml b/tasks/main.yml index eb30bfd..8bbe3da 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -8,6 +8,7 @@ - python3-wheel - python3-pip - python3-django-auth-ldap + - python3-mailmanclient - name: install mailman addons via pip notify: restart mailman @@ -49,3 +50,6 @@ mode: 0640 owner: root group: list + +- name: flush handlers to get mailman ready + meta: flush_handlers