Beispiel #1
0
    def __init__(self):
        from opmuse.utils import get_staticdir

        self.dir_from = os.path.join(os.path.dirname(__file__), "..", "javascript")
        self.dir_to = os.path.join(get_staticdir(), "scripts")
Beispiel #2
0
def configure(config_file=None, environment=None):
    cherrypy.tools.database = SqlAlchemyTool()
    cherrypy.tools.authenticated = AuthenticatedTool()
    cherrypy.tools.session_query_string = SessionQueryStringTool()
    cherrypy.tools.jinja = Jinja()
    cherrypy.tools.jinjaenv = JinjaEnvTool()
    cherrypy.tools.jinjaauthenticated = JinjaAuthenticatedTool()
    cherrypy.tools.library = LibraryTool()
    cherrypy.tools.backgroundtask = BackgroundTaskTool()
    cherrypy.tools.transcodingsubprocess = FFMPEGTranscoderSubprocessTool()
    cherrypy.tools.multiheaders = multi_headers_tool
    cherrypy.tools.error_handler = error_handler_tool
    cherrypy.tools.websocket = WebSocketTool()
    cherrypy.tools.database_events = DatabaseEventsTool()

    from opmuse.controllers.main import Root

    if config_file is None:
        config_file = join(abspath(dirname(__file__)), '..', 'config', 'opmuse.ini')

    if config_file is not False and not exists(config_file):
        config_file = '/etc/opmuse/opmuse.ini'

    if config_file and not exists(config_file):
        print('Configuration is missing!')
        sys.exit(1)

    cache_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'cache'))

    app_config = {
        '/': {
            'tools.error_handler.on': True,
            'tools.autovary.on': True,
            'tools.encode.on': False,
            'tools.database.on': True,
            'tools.jinjaauthenticated.on': True,
            'tools.library.on': True,
            'tools.backgroundtask.on': True,
            'tools.jinjaenv.on': True,
            'tools.authenticated.on': True,
            'tools.database_events.on': True,
            'tools.sessions.on': True,
            # use sqlalchemy for dev env because it saves session when cherrypy
            # restarts but it doesn't support locking so we use ram for production.
            'tools.sessions.storage_type': 'ram' if environment == 'production' else 'sqlalchemy',
            # there's an annoying bug with autovary and sessions where if you dont
            # set session.path the sessions tool will try to access a None header
            # (because path_header is None) which will cause autovary to try to
            # sort header strs and a None value...
            'tools.sessions.path': '/',
            'tools.sessions.httponly': True,
            'tools.sessions.persistent': False,
            'tools.sessions.locking': 'explicit',
            'tools.sessions.timeout': 60 * 8
        }, '/ws': {
            'tools.websocket.on': True,
            'tools.websocket.handler_cls': WebSocketHandler
        }, '/static': {
            'tools.jinjaauthenticated.on': False,
            'tools.sessions.on': False,
            'tools.database.on': False,
            'tools.staticdir.on': True,
            'tools.staticdir.dir': get_staticdir(),
            'tools.expires.on': False,
            'tools.expires.secs': 3600 * 24 * 30
        },
        '/library/upload/add': {
            'response.timeout': 3600
        },
        '/library/edit/submit': {
            'response.timeout': 3600
        },
    }

    if environment == "production":
        app_config['/static']['tools.expires.on'] = True

    app = cherrypy.tree.mount(Root(), '/', app_config)

    if config_file:
        app.merge(config_file)

    if config_file is False:
        config = cherrypy._cpconfig.Config()
    else:
        config = cherrypy._cpconfig.Config(file=config_file)

    # 5 gigabyte file upload limit
    config['server.max_request_body_size'] = 1024 ** 3 * 5
    config['engine.timeout_monitor.frequency'] = 60 * 5

    config['error_page.default'] = Root.handle_error

    config['opmuse'] = {}
    config['opmuse']['cache.path'] = cache_path

    cherrypy.config.update(config)

    cherrypy._cpconfig.environments['production']['opmuse'] = {}
    cherrypy._cpconfig.environments['production']['opmuse']['jinja.auto_reload'] = False
    cherrypy._cpconfig.environments['production']['opmuse']['less_reloader.enable'] = False
    cherrypy._cpconfig.environments['production']['opmuse']['js_reloader.enable'] = False
    cherrypy._cpconfig.environments['production']['opmuse']['cache.path'] = '/var/cache/opmuse'

    # dont use the default server
    cherrypy.server.unsubscribe()

    cherrypy.server = None
    cherrypy.ssl_server = None

    # setup ssl/https server if enabled
    if 'ssl_server.enabled' in cherrypy.config and cherrypy.config['ssl_server.enabled']:
        ssl_socket_host = cherrypy.config.get('ssl_server.socket_host')
        ssl_socket_port = cherrypy.config.get('ssl_server.socket_port')
        ssl_certificate = cherrypy.config['ssl_server.ssl_certificate']
        ssl_private_key = cherrypy.config['ssl_server.ssl_private_key']

        if ssl_socket_host is None:
            ssl_socket_host = '127.0.0.1'

        if ssl_socket_port is None:
            ssl_socket_port = 8443

        if 'ssl_server.ssl_certificate_chain' in cherrypy.config:
            ssl_certificate_chain = cherrypy.config['ssl_server.ssl_certificate_chain']
        else:
            ssl_certificate_chain = None

        config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'config')

        if not os.path.isabs(ssl_certificate):
            ssl_certificate = os.path.join(config_path, ssl_certificate)

        if not os.path.isabs(ssl_private_key):
            ssl_private_key = os.path.join(config_path, ssl_private_key)

        if ssl_certificate_chain is not None and not os.path.isabs(ssl_certificate_chain):
            ssl_certificate_chain = os.path.join(config_path, ssl_certificate_chain)

        ssl_server = cherrypy._cpserver.Server()
        ssl_server.max_request_body_size = config['server.max_request_body_size']
        ssl_server.bind_addr = (ssl_socket_host, ssl_socket_port)
        ssl_server.ssl_certificate = ssl_certificate
        ssl_server.ssl_private_key = ssl_private_key
        ssl_server.ssl_certificate_chain = ssl_certificate_chain
        ssl_server.subscribe()

        cherrypy.ssl_server = ssl_server

    # setup regular http server
    socket_host = cherrypy.config.get('server.socket_host')
    socket_port = cherrypy.config.get('server.socket_port')

    if socket_host is None:
        socket_host = '127.0.0.1'

    if socket_port is None:
        socket_port = 8080

    server = cherrypy._cpserver.Server()
    server.max_request_body_size = config['server.max_request_body_size']
    server.bind_addr = (socket_host, socket_port)
    server.subscribe()

    cherrypy.server = server

    WebSocketPlugin.start.priority = 80
    WebSocketPlugin(cherrypy.engine).subscribe()

    LessReloader(cherrypy.engine).subscribe()
    JsReloader(cherrypy.engine).subscribe()

    cherrypy.engine.database = SqlAlchemyPlugin(cherrypy.engine)
    cherrypy.engine.database.subscribe()

    cherrypy.engine.jinja = JinjaPlugin(cherrypy.engine)
    cherrypy.engine.jinja.subscribe()

    cherrypy.engine.library = LibraryPlugin(cherrypy.engine)
    cherrypy.engine.library.subscribe()

    cherrypy.engine.library_watchdog = LibraryWatchdogPlugin(cherrypy.engine)
    cherrypy.engine.library_watchdog.subscribe()

    cherrypy.engine.whoosh = WhooshPlugin(cherrypy.engine)
    cherrypy.engine.whoosh.subscribe()

    cherrypy.engine.cache = CachePlugin(cherrypy.engine)
    cherrypy.engine.cache.subscribe()

    cherrypy.engine.bgtask = BackgroundTaskPlugin(cherrypy.engine)
    cherrypy.engine.bgtask.subscribe()

    cherrypy.engine.bgtaskcron = BackgroundTaskCronPlugin(cherrypy.engine)
    cherrypy.engine.bgtaskcron.subscribe()

    cherrypy.engine.bgtaskcron.add_cron(DelugeBackgroundTaskCron())

    return app