aboutsummaryrefslogtreecommitdiffstats
path: root/bin/fg21sim-webui
blob: 9db0be03e59559e00e044b6f74aef5b3b2deda5c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/usr/bin/env python3
# -*- mode: python -*-
#
# Copyright (c) 2016-2017 Weitian LI <weitian@aaronly.me>
# MIT license

"""
Start (and/or control) the Web user interface (UI) of "fg21sim",
which is built using the Tornado_ web server and WebSocket_ protocol.

.. _Tornado: http://www.tornadoweb.org/

.. _WebSocket: https://en.wikipedia.org/wiki/WebSocket ,
   http://caniuse.com/#feat=websockets
"""


import os
import sys
import logging
import webbrowser

import tornado.ioloop
from tornado.options import define, options, parse_command_line

from fg21sim.configs import CONFIGS
from fg21sim.utils import setup_logging
from fg21sim.webui import Application


# Each module can defines its own options, which are added to the global
# namespace.  Therefore the defined options can also be used by other modules.
define("host", default="localhost", type=str,
       help=("IP address or hostname the server will listen on. "
             "Specify '0.0.0.0' or '' (empty string) to listen on "
             "all available interfaces."))
define("port", default=21127, type=int, help="Server listen port")
define("debug", default=False, help="Enable the debug mode")
define("no_browser", default=False,
       help="Do not open the Web UI in a browser after startup")


def main():
    options.logging = None
    parse_command_line()

    if options.host == "":
        options.host = "0.0.0.0"

    loglevel = "DEBUG" if options.debug else None
    setup_logging(dict_config=CONFIGS.logging, level=loglevel)
    tool = os.path.basename(sys.argv[0])
    logger = logging.getLogger(tool)
    logger.info("COMMAND: {0}".format(" ".join(sys.argv)))

    application = Application(debug=options.debug)
    application.listen(options.port, address=options.host)
    listen_url = "http://{host}:{port}".format(host=options.host,
                                               port=options.port)
    access_url = "http://{host}:{port}".format(host="localhost",
                                               port=options.port)
    logger.info("Tornado started on: {0}".format(listen_url))
    logger.info("You can use the Web UI by accessing:" +
                "\n\t{0}".format(access_url))
    if not options.no_browser:
        # Open the Web UI in a new browser tab
        webbrowser.open_new_tab(access_url)

    tornado.ioloop.IOLoop.current().start()


if __name__ == "__main__":
    main()