mirror of
https://github.com/blw1138/Zordon.git
synced 2025-12-17 08:48:13 +00:00
Added engine update check on launch (#43)
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
upload_folder: "~/zordon-uploads/"
|
upload_folder: "~/zordon-uploads/"
|
||||||
|
update_engines_on_launch: true
|
||||||
max_content_path: 100000000
|
max_content_path: 100000000
|
||||||
server_log_level: info
|
server_log_level: info
|
||||||
flask_log_level: error
|
flask_log_level: error
|
||||||
|
|||||||
@@ -664,6 +664,10 @@ def start_server(background_thread=False):
|
|||||||
flask_log = logging.getLogger('werkzeug')
|
flask_log = logging.getLogger('werkzeug')
|
||||||
flask_log.setLevel(config.get('flask_log_level', 'ERROR').upper())
|
flask_log.setLevel(config.get('flask_log_level', 'ERROR').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():
|
||||||
|
EngineManager.update_all_engines()
|
||||||
|
|
||||||
# Set up the RenderQueue object
|
# Set up the RenderQueue object
|
||||||
RenderQueue.start_queue()
|
RenderQueue.start_queue()
|
||||||
DistributedJobManager.start()
|
DistributedJobManager.start()
|
||||||
@@ -671,7 +675,7 @@ def start_server(background_thread=False):
|
|||||||
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.get('queue_eval_seconds', 1)}, daemon=True)
|
||||||
thread.start()
|
thread.start()
|
||||||
|
|
||||||
logging.info(f"Starting Zordon Render Server - Hostname: '{server.config['HOSTNAME']}:'")
|
logger.info(f"Starting Zordon Render Server - Hostname: '{server.config['HOSTNAME']}:'")
|
||||||
ZeroconfServer.configure("_zordon._tcp.local.", server.config['HOSTNAME'], server.config['PORT'])
|
ZeroconfServer.configure("_zordon._tcp.local.", server.config['HOSTNAME'], server.config['PORT'])
|
||||||
ZeroconfServer.start()
|
ZeroconfServer.start()
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ class BlenderDownloader:
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
def get_major_versions():
|
def get_major_versions():
|
||||||
try:
|
try:
|
||||||
response = requests.get(url)
|
response = requests.get(url, timeout=5)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
|
|
||||||
# Use regex to find all the <a> tags and extract the href attribute
|
# Use regex to find all the <a> tags and extract the href attribute
|
||||||
@@ -38,7 +38,7 @@ class BlenderDownloader:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
base_url = url + 'Blender' + major_version
|
base_url = url + 'Blender' + major_version
|
||||||
response = requests.get(base_url)
|
response = requests.get(base_url, timeout=5)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
|
|
||||||
versions_pattern = r'<a href="(?P<file>[^"]+)">blender-(?P<version>[\d\.]+)-(?P<system_os>\w+)-(?P<cpu>\w+).*</a>'
|
versions_pattern = r'<a href="(?P<file>[^"]+)">blender-(?P<version>[\d\.]+)-(?P<system_os>\w+)-(?P<cpu>\w+).*</a>'
|
||||||
@@ -86,11 +86,11 @@ class BlenderDownloader:
|
|||||||
return lts_versions
|
return lts_versions
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def find_most_recent_version(cls, system_os, cpu, lts_only=False):
|
def find_most_recent_version(cls, system_os=None, cpu=None, lts_only=False):
|
||||||
try:
|
try:
|
||||||
major_version = cls.find_LTS_versions()[0] if lts_only else cls.get_major_versions()[0]
|
major_version = cls.find_LTS_versions()[0] if lts_only else cls.get_major_versions()[0]
|
||||||
most_recent = cls.get_minor_versions(major_version, system_os, cpu)[0]
|
most_recent = cls.get_minor_versions(major_version=major_version, system_os=system_os, cpu=cpu)
|
||||||
return most_recent
|
return most_recent[0]
|
||||||
except IndexError:
|
except IndexError:
|
||||||
logger.error("Cannot find a most recent version")
|
logger.error("Cannot find a most recent version")
|
||||||
|
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ class EngineManager:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def has_engine_version(cls, engine, version, system_os=None, cpu=None):
|
def is_version_downloaded(cls, engine, version, system_os=None, cpu=None):
|
||||||
system_os = system_os or cls.system_os()
|
system_os = system_os or cls.system_os()
|
||||||
cpu = cpu or cls.system_cpu()
|
cpu = cpu or cls.system_cpu()
|
||||||
|
|
||||||
@@ -107,26 +107,25 @@ class EngineManager:
|
|||||||
@classmethod
|
@classmethod
|
||||||
def version_is_available_to_download(cls, engine, version, system_os=None, cpu=None):
|
def version_is_available_to_download(cls, engine, version, system_os=None, cpu=None):
|
||||||
try:
|
try:
|
||||||
return cls.downloader_classes[engine].version_is_available_to_download(version, system_os, cpu)
|
return cls.downloader_classes[engine].version_is_available_to_download(version=version, system_os=system_os,
|
||||||
|
cpu=cpu)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def find_most_recent_version(cls, engine, system_os, cpu, lts_only=False):
|
def find_most_recent_version(cls, engine=None, system_os=None, cpu=None, lts_only=False):
|
||||||
try:
|
try:
|
||||||
return cls.downloader_classes[engine].find_most_recent_version(system_os, cpu)
|
return cls.downloader_classes[engine].find_most_recent_version(system_os=system_os, cpu=cpu)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def download_engine(cls, engine, version, system_os=None, cpu=None):
|
def download_engine(cls, engine, version, system_os=None, cpu=None):
|
||||||
existing_download = cls.has_engine_version(engine, version, system_os, cpu)
|
existing_download = cls.is_version_downloaded(engine, version, system_os, cpu)
|
||||||
if existing_download:
|
if existing_download:
|
||||||
logger.info(f"Requested download of {engine} {version}, but local copy already exists")
|
logger.info(f"Requested download of {engine} {version}, but local copy already exists")
|
||||||
return existing_download
|
return existing_download
|
||||||
|
|
||||||
logger.info(f"Requesting download of {engine} {version}")
|
|
||||||
|
|
||||||
# Check if the provided engine type is valid
|
# Check if the provided engine type is valid
|
||||||
if engine not in cls.downloader_classes:
|
if engine not in cls.downloader_classes:
|
||||||
logger.error("No valid engine found")
|
logger.error("No valid engine found")
|
||||||
@@ -137,7 +136,7 @@ class EngineManager:
|
|||||||
system_os=system_os, cpu=cpu, timeout=300)
|
system_os=system_os, cpu=cpu, timeout=300)
|
||||||
|
|
||||||
# Check that engine was properly downloaded
|
# Check that engine was properly downloaded
|
||||||
found_engine = cls.has_engine_version(engine, version, system_os, cpu)
|
found_engine = cls.is_version_downloaded(engine, version, system_os, cpu)
|
||||||
if not found_engine:
|
if not found_engine:
|
||||||
logger.error(f"Error downloading {engine}")
|
logger.error(f"Error downloading {engine}")
|
||||||
return found_engine
|
return found_engine
|
||||||
@@ -146,7 +145,7 @@ class EngineManager:
|
|||||||
@classmethod
|
@classmethod
|
||||||
def delete_engine_download(cls, engine, version, system_os=None, cpu=None):
|
def delete_engine_download(cls, engine, version, system_os=None, cpu=None):
|
||||||
logger.info(f"Requested deletion of engine: {engine}-{version}")
|
logger.info(f"Requested deletion of engine: {engine}-{version}")
|
||||||
found = cls.has_engine_version(engine, version, system_os, cpu)
|
found = cls.is_version_downloaded(engine, version, system_os, cpu)
|
||||||
if found:
|
if found:
|
||||||
dir_path = os.path.dirname(found['path'])
|
dir_path = os.path.dirname(found['path'])
|
||||||
shutil.rmtree(dir_path, ignore_errors=True)
|
shutil.rmtree(dir_path, ignore_errors=True)
|
||||||
@@ -155,6 +154,15 @@ class EngineManager:
|
|||||||
else:
|
else:
|
||||||
logger.error(f"Cannot find engine: {engine}-{version}")
|
logger.error(f"Cannot find engine: {engine}-{version}")
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def update_all_engines(cls):
|
||||||
|
logger.info(f"Checking for updates for render engines...")
|
||||||
|
for engine, engine_downloader in cls.downloader_classes.items():
|
||||||
|
latest_version = engine_downloader.find_most_recent_version().get('version')
|
||||||
|
if latest_version and not cls.is_version_downloaded(engine, latest_version):
|
||||||
|
logger.info(f"Downloading newest version of {engine} ({latest_version})")
|
||||||
|
cls.download_engine(engine, latest_version)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class FFMPEGDownloader:
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def __get_macos_versions(cls):
|
def __get_macos_versions(cls):
|
||||||
response = requests.get(cls.macos_url)
|
response = requests.get(cls.macos_url, timeout=5)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
|
|
||||||
link_pattern = r'>(.*\.zip)[^\.]'
|
link_pattern = r'>(.*\.zip)[^\.]'
|
||||||
@@ -37,12 +37,12 @@ class FFMPEGDownloader:
|
|||||||
def __get_linux_versions(cls):
|
def __get_linux_versions(cls):
|
||||||
|
|
||||||
# Link 1 / 2 - Current Version
|
# Link 1 / 2 - Current Version
|
||||||
response = requests.get(cls.linux_url)
|
response = requests.get(cls.linux_url, timeout=5)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
current_release = re.findall(r'release: ([\w\.]+)', response.text)[0]
|
current_release = re.findall(r'release: ([\w\.]+)', response.text)[0]
|
||||||
|
|
||||||
# Link 2 / 2 - Previous Versions
|
# Link 2 / 2 - Previous Versions
|
||||||
response = requests.get(os.path.join(cls.linux_url, 'old-releases'))
|
response = requests.get(os.path.join(cls.linux_url, 'old-releases'), timeout=5)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
releases = list(set(re.findall(r'href="ffmpeg-([\w\.]+)-.*">ffmpeg', response.text)))
|
releases = list(set(re.findall(r'href="ffmpeg-([\w\.]+)-.*">ffmpeg', response.text)))
|
||||||
releases.sort(reverse=True)
|
releases.sort(reverse=True)
|
||||||
@@ -51,7 +51,7 @@ class FFMPEGDownloader:
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def __get_windows_versions(cls):
|
def __get_windows_versions(cls):
|
||||||
response = requests.get(cls.windows_api_url)
|
response = requests.get(cls.windows_api_url, timeout=5)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
|
|
||||||
versions = []
|
versions = []
|
||||||
@@ -62,8 +62,14 @@ class FFMPEGDownloader:
|
|||||||
return versions
|
return versions
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def find_most_recent_version(cls, system_os, cpu, lts_only=False):
|
def find_most_recent_version(cls, system_os=None, cpu=None, lts_only=False):
|
||||||
return cls.all_versions(system_os, cpu)[0]
|
try:
|
||||||
|
system_os = system_os or current_system_os()
|
||||||
|
cpu = cpu or current_system_cpu()
|
||||||
|
return cls.all_versions(system_os, cpu)[0]
|
||||||
|
except TypeError:
|
||||||
|
pass
|
||||||
|
return None
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def all_versions(cls, system_os=None, cpu=None):
|
def all_versions(cls, system_os=None, cpu=None):
|
||||||
|
|||||||
Reference in New Issue
Block a user