#! /usr/bin/env python
# -*- Mode: Python; tab-width: 4; indent-tabs-mode: nil; -*-

import argparse
import logging
import os
import sys
import signal

prefix = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]), os.pardir, os.pardir))
sys.path.insert(0, prefix)

from tako import configuration
from tako.coordinatorserver import CoordinatorServer
from tako.utils import debug

def makedirs(path):
    if not os.path.exists(path):
        os.makedirs(path)

def main():
    global prefix
    default_var_path = os.path.join(prefix, 'var', 'tako')

    parser = argparse.ArgumentParser(description="Tako Coordinator")
    parser.add_argument('-id', '--id', help='Server id. Default = 1', default='c1')
    parser.add_argument('-cfg','--config', help='Config file.', default='test/local_cluster.yaml')
    parser.add_argument('-d', '--debug', help='Enable debug logging.', action='store_true')
    parser.add_argument('-l', '--log-file', help='Log file.')
    parser.add_argument('-v', '--var', help='var directory. Default = %s' % default_var_path, default=default_var_path)

    try:
        args = parser.parse_args()
    except IOError, e:
        logging.error(e)
        exit(-1)

    level = logging.DEBUG if args.debug else logging.INFO
    debug.configure_logging('coordinatorserver', level, args.log_file)

    cfgpath = os.path.abspath(args.config)
    cfg = configuration.try_load_file(cfgpath)
    if not cfg:
        logging.error('Failed to load configuration.')
        exit(-1)

    coordinator = cfg.coordinators.get(args.id, None)
    if not coordinator:
        logging.error('Coordinator with id "%s" not found in configuration.', args.id)
        exit(-1)

    logging.info('Tako Coordinator starting (pid:%d)', os.getpid())
    logging.info('Coordinator id: %s', args.id)

    try:
        makedirs(os.path.join(args.var, 'data'))
        makedirs(os.path.join(args.var, 'etc'))
        makedirs(os.path.join(args.var, 'log'))
    except Exception, e:
        logging.critical("Failed to create var directories.")
        exit(1)

    logging.info('Serving up "%s" at %s:%d', cfgpath, coordinator.address, coordinator.port)

    server = CoordinatorServer(args.id, cfgpath)

    def signal_handler(signum, frame):
        logging.info('Received SIGUSR1. Reloading configuration.')
        try:
            server.reload_configuration()
            logging.info('Successfully reloaded configuration.')
        except Exception, e:
            logging.exception(e)
    signal.signal(signal.SIGUSR1, signal_handler)

    try:
        server.serve()
    except KeyboardInterrupt:
        pass

    logging.info('Exiting...')

if __name__ == '__main__':
    main()
