#!/usr/bin/env python
import sys
import os
import pwd
import grp
import stat
import logging.config

from aorta.process import Aorta


AORTA_USER = 'aorta'
AORTA_GROUP = 'aorta'
DEFAULT_DB_ALIAS = 'master'
AORTA_CONFIG_FILE = '/etc/aorta/aorta.conf'
AORTA_POLL_INTERVAL = 5.0
AORTA_CHANNELS = ['events.global','events.domain','events.system',
    'events.database']
AORTA_LOG_DIR = '/var/log/aorta'

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'verbose': {
            'format'    : '%(levelname)s\t%(asctime)s\t%(message)s',
            'datefmt'   : '%m/%d/%Y %H:%M:%S'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'null': {
            'level': 'DEBUG',
            'class': 'logging.NullHandler',
        },
        'console':{
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'logfile.notifications': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'formatter': 'verbose',
            'mode': 'a',
            'filename': os.path.join(AORTA_LOG_DIR, 'notifications.log'),
            'maxBytes': str(64 * 1024**2),
            'backupCount': '5',
        },
    },
    'loggers': {
        'aorta.main': {
            'handlers': ['console','logfile.notifications'],
            'propagate': True,
            'level': 'DEBUG',
        }
    }
}


if __name__ == '__main__':
    if os.getuid() != 0:
        print >> sys.stdout, "Aorta must be invoked by a privileged user."
        sys.exit(-1)

    # Get aorta user and group.
    try:
        user = pwd.getpwnam(AORTA_USER)
        group = grp.getgrnam(AORTA_GROUP)
    except KeyError:
        print >> sys.stdout, "No such user and/or group: {0}:{1}"\
            .format(AORTA_USER, AORTA_GROUP)
        sys.exit(-2)

    # Setup logging; ensure that log directory exists.
    if not os.path.exists(AORTA_LOG_DIR):
        os.makedirs(AORTA_LOG_DIR)
    os.chown(AORTA_LOG_DIR, user.pw_uid, group.gr_gid)
    os.chmod(AORTA_LOG_DIR,
        stat.S_IRUSR | stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH)
    logging.config.dictConfig(LOGGING)


    aorta_process = Aorta(AORTA_CONFIG_FILE, DEFAULT_DB_ALIAS,
        AORTA_CHANNELS, poll_interval=AORTA_POLL_INTERVAL)

    # Drop privileges.
    os.setgid(group.gr_gid)
    os.setuid(user.pw_uid)

    # Launch the main process.
    aorta_process.run()
