#!/usr/bin/python3

import argparse
import datetime
import logging
import os
import sys
import syslog
import uuid

LOGFILE="/var/log/libvirt/libvirt.log"

logging.basicConfig(filename=LOGFILE, level=logging.DEBUG, format='%(asctime)s %(levelname)s %(message)s')

if __name__ == "__main__":
    syslog.openlog(ident="libvirtd")
    parser = argparse.ArgumentParser()
    parser.add_argument('namespace')
    parser.add_argument('--vm', help="VM Name")
    parser.add_argument('--perm', help="Permission")
    parser.add_argument('--user', help="User")
    parser.add_argument('--action', help="[allow|deny|add|revoke|OK|WRONG]")
    parser.add_argument('--role', help="Role name")
    parser.add_argument('--session-id', help="Session id")
    parser.add_argument('--cause', help='Shutdown or reboot cause')
    args = parser.parse_args()

    namespace = args.namespace
    if namespace == "RBAC":
        if args.vm and args.perm and args.user and args.action and args.session_id:
            vm, perm, user, action, session_id = args.vm, args.perm, args.user, args.action, args.session_id
            if not vm == "undefined":
                message = "id=%s, namespace=%s, permission=%s, (user=%s, session_id=%s), vm=%s, result=%s" % (uuid.uuid4(), namespace, perm, user, session_id, vm, action)
                syslog.syslog(syslog.LOG_INFO, message)
                logging.info(message)
            else:
                message = "id=%s, namespace=%s, permission=%s, (user=%s, session_id=%s), result=%s" % (uuid.uuid4(), namespace, perm, user, session_id, action)
                syslog.syslog(syslog.LOG_INFO, message)
                logging.info(message)
        else:
            pass
    elif namespace == "checksum":
        if args.vm and args.action:
            vm, action = args.vm, args.action
            if action == "deny":
                message = "id=%s, namespace=%s, vm=%s, result=%s" % (uuid.uuid4(), namespace, vm, action)
                syslog.syslog(syslog.LOG_CRIT, message)
                logging.critical(message)
            else:
                message = "id=%s, namespace=%s, vm=%s, result=%s" % (uuid.uuid4(), namespace, vm, action)
                syslog.syslog(syslog.LOG_INFO, message)
                logging.info(message)
        else:
            pass
    elif namespace == "journal-checksum":
        if args.action:
            action = args.action
            if action == "WRONG":
                message = "id=%s, namespace=%s, result=%s" % (uuid.uuid4(), namespace, action)
                syslog.syslog(syslog.LOG_CRIT, message)
                logging.critical(message)
            elif action == "OK":
                message = "id=%s, namespace=%s, result=%s" % (uuid.uuid4(), namespace, action)
                logging.info(message)
        else:
            pass

    elif namespace == "RoleModel":
        if args.vm and args.role and args.action and args.user:
            message = "id=%s, namespace=%s, vm=%s, user=%s, role=%s, action=%s" % (uuid.uuid4(), namespace, args.vm, args.user, args.role, args.action)
            syslog.syslog(syslog.LOG_WARNING, message)
            logging.warning(message)
        elif args.role and args.user and args.action:
            message = "id=%s, namespace=%s, user=%s, role=%s, action=%s" % (uuid.uuid4(), namespace, args.user, args.role, args.action)
            syslog.syslog(syslog.LOG_WARNING, message)
            logging.warning(message)
    elif namespace == "shutdown" or namespace == "reboot":
        if args.cause:
            message = "id=%s, namespace=%s, cause=%s" % (uuid.uuid4(), namespace, args.cause)
        else:
            message = "id=%s, namespace=%s, cause=\"shutdown or reboot by user request\"" % (uuid.uuid4(), namespace)
        syslog.syslog(syslog.LOG_WARNING, message)
        logging.warning(message)
    else:
        pass
    syslog.closelog()