diff --git a/config/config.yaml b/config/config.yaml index 4185d9f..7dece20 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -2,6 +2,7 @@ upload_folder: "~/zordon-uploads/" update_engines_on_launch: true max_content_path: 100000000 server_log_level: info +log_buffer_length: 250 flask_log_level: error flask_debug_enable: false queue_eval_seconds: 1 diff --git a/src/api/api_server.py b/src/api/api_server.py index 5502286..8eecda4 100755 --- a/src/api/api_server.py +++ b/src/api/api_server.py @@ -23,6 +23,7 @@ from src.distributed_job_manager import DistributedJobManager from src.engines.core.base_worker import string_to_status, RenderStatus from src.engines.engine_manager import EngineManager from src.render_queue import RenderQueue, JobNotFoundError +from src.utilities.config import Config from src.utilities.misc_helper import system_safe_path, current_system_os, current_system_cpu, current_system_os_version from src.utilities.server_helper import generate_thumbnail_for_job from src.utilities.zeroconf_server import ZeroconfServer @@ -492,17 +493,18 @@ def upload_file_page(): return render_template('upload.html', supported_renderers=EngineManager.supported_engines()) -def start_server(background_thread=False): +def start_server(): def eval_loop(delay_sec=1): while True: RenderQueue.evaluate_queue() time.sleep(delay_sec) - with open(system_safe_path('config/config.yaml')) as f: - config = yaml.load(f, Loader=yaml.FullLoader) + # Load Config YAML + config_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), 'config') + Config.load_config(system_safe_path(os.path.join(config_dir, 'config.yaml'))) logging.basicConfig(format='%(asctime)s: %(levelname)s: %(module)s: %(message)s', datefmt='%d-%b-%y %H:%M:%S', - level=config.get('server_log_level', 'INFO').upper()) + level=Config.server_log_level.upper()) # get hostname local_hostname = socket.gethostname() @@ -510,14 +512,15 @@ def start_server(background_thread=False): # load flask settings server.config['HOSTNAME'] = local_hostname - server.config['PORT'] = int(config.get('port_number', 8080)) - server.config['UPLOAD_FOLDER'] = system_safe_path(os.path.expanduser(config['upload_folder'])) - server.config['THUMBS_FOLDER'] = system_safe_path(os.path.join(os.path.expanduser(config['upload_folder']), 'thumbs')) - server.config['MAX_CONTENT_PATH'] = config['max_content_path'] - server.config['enable_split_jobs'] = config.get('enable_split_jobs', False) + server.config['PORT'] = int(Config.port_number) + server.config['UPLOAD_FOLDER'] = system_safe_path(os.path.expanduser(Config.upload_folder)) + server.config['THUMBS_FOLDER'] = system_safe_path(os.path.join(os.path.expanduser(Config.upload_folder), 'thumbs')) + server.config['MAX_CONTENT_PATH'] = Config.max_content_path + server.config['enable_split_jobs'] = Config.enable_split_jobs # Setup directory for saving engines to - EngineManager.engines_path = system_safe_path(os.path.join(os.path.join(os.path.expanduser(config['upload_folder']), 'engines'))) + EngineManager.engines_path = system_safe_path(os.path.join(os.path.join(os.path.expanduser(Config.upload_folder), + 'engines'))) os.makedirs(EngineManager.engines_path, exist_ok=True) # Debug info @@ -527,17 +530,17 @@ def start_server(background_thread=False): # disable most Flask logging flask_log = logging.getLogger('werkzeug') - flask_log.setLevel(config.get('flask_log_level', 'ERROR').upper()) + flask_log.setLevel(Config.flask_log_level.upper()) # check for updates for render engines if config'd or on first launch - if config.get('update_engines_on_launch', False) or not EngineManager.all_engines(): + if Config.update_engines_on_launch or not EngineManager.all_engines(): EngineManager.update_all_engines() # Set up the RenderQueue object RenderQueue.load_state(database_directory=server.config['UPLOAD_FOLDER']) DistributedJobManager.start() - thread = threading.Thread(target=eval_loop, kwargs={'delay_sec': config.get('queue_eval_seconds', 1)}, daemon=True) + thread = threading.Thread(target=eval_loop, kwargs={'delay_sec': Config.queue_eval_seconds}, daemon=True) thread.start() logger.info(f"Starting Zordon Render Server - Hostname: '{server.config['HOSTNAME']}:'") @@ -545,14 +548,8 @@ def start_server(background_thread=False): ZeroconfServer.start() try: - if background_thread: - server_thread = threading.Thread( - target=lambda: server.run(host='0.0.0.0', port=server.config['PORT'], debug=False, use_reloader=False)) - server_thread.start() - server_thread.join() - else: - server.run(host='0.0.0.0', port=server.config['PORT'], debug=config.get('flask_debug_enable', False), - use_reloader=False, threaded=True) + server.run(host='0.0.0.0', port=server.config['PORT'], debug=Config.flask_debug_enable, + use_reloader=False, threaded=True) finally: RenderQueue.save_state() ZeroconfServer.stop() diff --git a/src/utilities/config.py b/src/utilities/config.py new file mode 100644 index 0000000..e1b2089 --- /dev/null +++ b/src/utilities/config.py @@ -0,0 +1,36 @@ +import os +import yaml + + +class Config: + # Initialize class variables with default values + upload_folder = "~/zordon-uploads/" + update_engines_on_launch = True + max_content_path = 100000000 + server_log_level = 'debug' + log_buffer_length = 250 + subjob_connection_timeout = 120 + flask_log_level = 'error' + flask_debug_enable = False + queue_eval_seconds = 1 + port_number = 8080 + enable_split_jobs = True + download_timeout_seconds = 120 + + @classmethod + def load_config(cls, config_path): + with open(config_path, 'r') as ymlfile: + cfg = yaml.safe_load(ymlfile) + + cls.upload_folder = os.path.expanduser(cfg.get('upload_folder', cls.upload_folder)) + cls.update_engines_on_launch = cfg.get('update_engines_on_launch', cls.update_engines_on_launch) + cls.max_content_path = cfg.get('max_content_path', cls.max_content_path) + cls.server_log_level = cfg.get('server_log_level', cls.server_log_level) + cls.log_buffer_length = cfg.get('log_buffer_length', cls.log_buffer_length) + cls.subjob_connection_timeout = cfg.get('subjob_connection_timeout', cls.subjob_connection_timeout) + cls.flask_log_level = cfg.get('flask_log_level', cls.flask_log_level) + cls.flask_debug_enable = cfg.get('flask_debug_enable', cls.flask_debug_enable) + cls.queue_eval_seconds = cfg.get('queue_eval_seconds', cls.queue_eval_seconds) + cls.port_number = cfg.get('port_number', cls.port_number) + cls.enable_split_jobs = cfg.get('enable_split_jobs', cls.enable_split_jobs) + cls.download_timeout_seconds = cfg.get('download_timeout_seconds', cls.download_timeout_seconds)