#!/usr/bin/env python2
# 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.

import logging
import sys
import time

import client
import pseudomodem
import pseudomodem_context

def main():
    """ Entry function to run pseudomodem standalone. """
    pmc = None
    flags = sys.argv[1:]
    cli_flag = (pseudomodem.CLI_FLAG in flags)

    # When run from the command line, override autotest logging defaults.
    root = logging.getLogger()
    for handler in root.handlers:
        root.removeHandler(handler)
    logging.basicConfig(
        format='%(asctime)s %(levelname)-5.5s|%(module)10.10s:%(lineno)4.4d| '
               '%(message)s',
        datefmt='%H:%M:%S')

    try:
        pmc = pseudomodem_context.PseudoModemManagerContext(
                True,
                block_output=cli_flag)
        pmc.cmd_line_flags = flags
        pmc.Start()
        if cli_flag:
            cli = client.PseudoModemClient()
            cli.Begin()  # Blocking
        else:
            # Block quietly till user interrupt.
            while True:
                time.sleep(30)
    except KeyboardInterrupt:
        print 'Terminating on user request.'
    finally:
        # This is always hit, even when SIGINT is received.
        if pmc:
            pmc.Stop()


if __name__ == '__main__':
    main()
