#!/usr/bin/env python3
"""
Imunify integration script for ISPManager.
Collects users and domains with mgrctl and
prints data appropriate to be consumed by imunify on stdout.

integration.conf example:
[integration_scripts]
...
users = /etc/sysconfig/imunify360/ispmanager_integration.py users
domains = /etc/sysconfig/imunify360/ispmanager_integration.py domains
...


Return codes:
0 - ok
1 - runtime error (e.g. mgrctl is missing, or can't parse its output, ...),
    see more in metadata['error'] and metadata['message']
2 - script usage error (e.g. wrong args)
"""
from subprocess import check_output
import argparse
import json
import pwd
import re
import sys


def get_ispmgr_data(section):
    assert section in ('user', 'webdomain')
    ispmgr_output = check_output([
        '/usr/local/mgr5/sbin/mgrctl',
        '-m',
        'ispmgr',
        section,
    ]).decode().split('\n')
    return [
        dict(re.findall(r'(\w+)=(\S*)', line))
        for line in ispmgr_output
        if len(line) > 0
    ]


def get_domains():
    domains = {}
    data = get_ispmgr_data('webdomain')
    for entry in data:
        domain = entry['name']
        domain_info = {
            'document_root': entry['docroot'],
            'owner': entry['owner'],
        }
        domains[domain] = domain_info
    return domains


def get_users():
    users = []
    data = get_ispmgr_data('user')
    for entry in data:
        username = entry['name']
        users.append({
            'id': pwd.getpwnam(username).pw_uid,
            'username': username,
        })
    return users


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        dest='cmd', choices=(
            'users',
            'domains'
        )
    )
    args = parser.parse_args()
    result = {
        'data': {},
        'metadata': {
            'result': 'ok'
        }
    }
    try:
        retval = 0
        if args.cmd == 'domains':
            cmd_result = get_domains()
        elif args.cmd == 'users':
            cmd_result = get_users()
    except Exception as e:
        result['metadata']['result'] = e.__class__.__name__
        result['metadata']['message'] = str(e)
        retval = 1
    else:
        result['data'] = cmd_result
    finally:
        print(json.dumps(result))
        return retval


if __name__ == "__main__":
    sys.exit(main())
