def start_server():
    """ start the web server """
    logging.info("starting on port {0}".format(options.port))
    # make site configuration available in the Application settings
    config = deploy.get_server_config(options.config)
    modules = [dashboard.reports]
    if options.imports:
        extra_module_names = options.imports.split(',')
        for name in extra_module_names:
            try:
                mod = importlib.import_module(name)
                modules.append(mod)
                dashboard.reports.Version.register(name, mod.version)
            except (ImportError, AttributeError) as e:
                logging.warning("Unable to import '{}': {}".format(name, e))
    # when running stand-alone, provide /app/version
    urls = [(r"/app/version", dashboard.reports.Version)]
    for module in modules:
        urls += urls_from_module(module)
    app = web.Application(urls, config=config)
    # make IOLoop quieter about unimportant exceptions
    tsumanga.ioloop.quiet_patch()
    app.listen(options.port)
    try:
        ioloop.IOLoop.instance().start()
    except KeyboardInterrupt:
        return # no annoying traceback while testing
def init():
    """ set up distimo keys """
    global DISTIMO_KEYS
    if DISTIMO_KEYS:
        return
    try:
        server = tornado.options.options.config
    except AttributeError:
        server = "local"
    config = deploy.get_server_config(server)
    distimo_keys = config.getlist("distimo_keys", "")
    if len(distimo_keys) != 4:
        logging.warning("distimo_keys in config should be private, public, username, base64auth ")
        raise WebServiceError(500, mesg="distimo not configured")
    DISTIMO_KEYS = tuple(distimo_keys)
def start_server():
    """ start the web server """
    logging.info("starting on port {0}".format(options.port))
    if options.static == "here":
        static_path = os.path.join(HERE, "static")
    else:
        static_path = options.static
    template_path = os.path.join(HERE, "templates")
    logging.info("templates are in {0}".format(template_path))
    # make site configuration available in the Application settings
    config = deploy.get_server_config(options.config)
    modules = [dashboard.pages]
    if options.imports:
        extra_module_names = options.imports.split(',')
        for name in extra_module_names:
            try:
                modules.append(importlib.import_module(name))
            except ImportError:
                logging.warning("can't import {0}".format(name))
                pass
    urls = []
    for module in modules:
        urls += urls_from_module(module)
    app = web.Application(
        urls,
        template_path=template_path,
        static_path=static_path,
        static_handler_class=SafeStaticHandler,
        cookie_secret=b'htmlasagne',
        config=config,
        ui_modules=dashboard.ui_modules,
        gzip=True)

    # make IOLoop quieter about unimportant exceptions
    tsumanga.ioloop.quiet_patch()

    # run on chosen port
    app.listen(options.port, xheaders=True)
    try:
        ioloop.IOLoop.instance().start()
    except KeyboardInterrupt:
        return # no annoying traceback while testing