#!/usr/bin/python2 -s

from credmon.CredentialMonitors.OAuthCredmon import OAuthCredmon
from credmon.CredentialMonitors.LocalCredmon import LocalCredmon
from credmon.utils import setup_logging, get_cred_dir, drop_pid, credmon_incomplete, credmon_complete, create_credentials
import signal
import sys
from functools import partial
from threading import Event
from optparse import OptionParser, OptionGroup
import logging

parser = OptionParser()
parser.add_option('-c', '--cred-dir', action='store', type='string', dest='cred_dir',
                      help='Path to credential directory')
parser.add_option('-l', '--log-file', action='store', type='string',
                      dest='log_file', help='Path to log file')
parser.add_option('-d', '--debug', action='store_const', dest='log_level',
                      const=logging.DEBUG, default=logging.INFO,
                      help='Set log level to DEBUG')

sleeper = Event()

def signal_handler(logger, signum, frame):
    """
    Catch signals. Use SIGHUP as a sleep interrupt.
    Any other signals should exit the program.
    """
    if signum == signal.SIGHUP:
        logger.info('Got SIGHUP: Triggering READ of Credential Directory')
        sleeper.set()
        return
    exit_msg = 'Got signal {0} at frame {1} terminating.'
    logger.info(exit_msg.format(signum, frame))
    sys.exit(0)

def main():

    (options, args) = parser.parse_args()

    cred_dir = get_cred_dir(cred_dir = options.cred_dir)
    logger = setup_logging(log_path = options.log_file, log_level = options.log_level)
    logger.info('Starting condor_credmon and registering signals')

    # Try to create the signing credentials for the local credmon.
    create_credentials()

    # catch signals
    signal.signal(signal.SIGHUP, partial(signal_handler, logger))
    signal.signal(signal.SIGTERM, partial(signal_handler, logger))
    signal.signal(signal.SIGINT, partial(signal_handler, logger))
    signal.signal(signal.SIGQUIT, partial(signal_handler, logger))
    drop_pid(cred_dir)

    credmon_incomplete(cred_dir)

    credmons = [
        OAuthCredmon(cred_dir),
        LocalCredmon(cred_dir)
    ]

    # set up scan tokens loop
    while True:
        for credmon in credmons:
            try:
                credmon.scan_tokens()
            except Exception as e:
                logger.exception(e)
        credmon_complete(cred_dir)
        logger.info('Sleeping for 60 seconds')
        sleeper.clear()
        sleeper.wait(60)

if __name__ == '__main__':
    main()
