#!/usr/bin/env python3 # -*- mode: python -*- # # Copyright (c) 2016 Weitian LI # 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 ipaddress 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 # Define options in the global namespace # These options can also be used in other modules 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") define("hosts_allowed", default="any", type=str, help=("Hosts allowed to access the Web UI. " "The network addresses should be given in CIDR format, e.g., " "'192.168.0.0/24'. " "Specify 'any' to allow any hosts. " "Note that the localhost/127.0.0.1 is always allowed.")) def main(): options.logging = None parse_command_line() # Validate the value of ``options.hosts_allowed`` if options.hosts_allowed.upper() != "ANY": try: ipaddress.ip_network(options.hosts_allowed) except ValueError as e: raise ValueError("Option 'hosts_allowed' invalid: " + str(e)) 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) url = "http://localhost:{port}".format(port=options.port) logger.info("Tornado started") logger.info("You can use the Web UI by accessing:\n\t{0}".format(url)) if not options.no_browser: # Open the Web UI in a new browser tab webbrowser.open_new_tab(url) logger.info("Hosts allowed to access the Web UI: {0}".format( options.hosts_allowed)) tornado.ioloop.IOLoop.current().start() if __name__ == "__main__": main()