#!/usr/bin/env python
# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Run Chameleon Daemon."""

import argparse
import logging
import shlex

from chameleond.chameleon_server import ChameleonServer


def main():
  """The Main program, to run Chameleon Daemon."""
  parser = argparse.ArgumentParser(
      description='Launch a Chameleon daemon.',
      formatter_class=argparse.ArgumentDefaultsHelpFormatter)
  parser.add_argument('--driver', type=str, dest='driver', default='fpga_tio',
                      help='driver of Chameleond')
  parser.add_argument('--log', type=str, dest='log', metavar='PATH',
                      default='/var/log/chameleond',
                      help='write log to this file or - to stderr')
  parser.add_argument('--host', type=str, dest='host', default='0.0.0.0',
                      help='host address of RPC server')
  parser.add_argument('--port', type=int, dest='port', default=9992,
                      help='port number of RPC server')
  parser.add_argument('-v', '--verbose', action='count', dest='verbose',
                      default=0, help='increase message verbosity')
  parser.add_argument("driver_args", nargs=argparse.REMAINDER,
                      help='arguments passed to the driver')

  options = parser.parse_args()
  tokens = shlex.split(' '.join(options.driver_args))
  args = [t for t in tokens if '=' not in t]
  kwargs = dict(t.split('=') for t in tokens if '=' in t)

  verbosity_map = {0: logging.INFO, 1: logging.DEBUG}
  verbosity = verbosity_map.get(options.verbose or 0, logging.NOTSET)
  log_format = '%(asctime)s %(levelname)s '
  if options.verbose > 0:
    log_format += '(%(filename)s:%(lineno)d) '
  log_format += '%(message)s'

  log_config = {'level': verbosity,
                'format': log_format}
  if options.log != '-':
    log_config.update({'filename': options.log})
  logging.basicConfig(**log_config)

  ChameleonServer(options.driver, *args, **kwargs).RunServer(
      options.host, options.port)

if __name__ == '__main__':
  main()
