Source code for flexget.plugins.daemon.web_server
from loguru import logger
from flexget.api import api_app
from flexget.config_schema import register_config_key
from flexget.event import event
from flexget.ui.v1 import register_web_ui as register_web_ui_v1
from flexget.ui.v2 import register_web_ui as register_web_ui_v2
from flexget.utils.tools import get_config_hash
from flexget.webserver import get_secret, register_app, setup_server
logger = logger.bind(name='web_server_daemon')
config_hash = ''
web_server = None
web_config_schema = {
'oneOf': [
{'type': 'boolean'},
{'type': 'integer', 'minimum': 0, 'maximum': 65536},
{
'type': 'object',
'properties': {
'bind': {'type': 'string', 'format': 'ipv4'},
'port': {'type': 'integer', 'minimum': 0, 'maximum': 65536},
'ssl_certificate': {'type': 'string'},
'ssl_private_key': {'type': 'string'},
'web_ui': {'type': 'boolean'},
'base_url': {'type': 'string'},
'run_v2': {
'type': 'boolean',
'deprecated': True,
'deprecationMessage': 'v2 is registered by default if web_ui: true so `run_v2` is now redundant. To run v1 alongside, use the `run_v1`.',
},
'run_v1': {'type': 'boolean'},
},
'additionalProperties': False,
'dependentRequired': {
'ssl_certificate': ['ssl_private_key'],
'ssl_private_key': ['ssl_certificate'],
},
},
]
}
[docs]
def prepare_config(config):
if not config:
return None
if isinstance(config, bool):
config = {}
if isinstance(config, int):
config = {'port': config}
config.setdefault('bind', '0.0.0.0')
config.setdefault('port', 5050)
config.setdefault('ssl_certificate', None)
config.setdefault('ssl_private_key', None)
config.setdefault('web_ui', True)
config.setdefault('base_url', '')
config.setdefault('run_v2', False)
config.setdefault('run_v1', False)
if config['base_url']:
if not config['base_url'].startswith('/'):
config['base_url'] = '/' + config['base_url']
config['base_url'] = config['base_url'].removesuffix('/')
return config
[docs]
@event('config.register')
def register_config():
register_config_key('web_server', web_config_schema)
[docs]
@event('manager.config_updated')
@event('manager.daemon.started')
def register_web_server(manager):
"""Register Web Server and load API (always) and WebUi via config."""
global web_server, config_hash
if not manager.is_daemon:
return
config = manager.config.get('web_server')
if get_config_hash(config) == config_hash:
logger.debug("web server config hasn't changed")
return
config_hash = get_config_hash(config)
web_server_config = prepare_config(config)
# Removes any existing web server instances if exists
stop_server(manager)
if not web_server_config:
return
logger.info(
'Running web server at IP {}:{}', web_server_config['bind'], web_server_config['port']
)
# Register API
api_app.secret_key = get_secret()
logger.info('Initiating API')
register_app('/api', api_app, 'API')
# Register WebUI
if web_server_config.get('web_ui'):
if web_server_config.get('run_v1'):
logger.info('Registering WebUI v1')
register_web_ui_v1(manager)
logger.info('Registering WebUI v2')
register_web_ui_v2(web_server_config)
web_server = setup_server(web_server_config)
[docs]
@event('manager.shutdown')
def stop_server(manager):
"""Set up and start/restart the webui."""
global web_server
if not manager.is_daemon:
return
if web_server and web_server.is_alive():
web_server.stop()
web_server = None