84 lines
3.1 KiB
Python
84 lines
3.1 KiB
Python
import importlib
|
|
import json
|
|
import os
|
|
import subprocess
|
|
import urllib
|
|
|
|
from core.stack import Stack
|
|
from core.vars import ROCM_VERSION, logger
|
|
|
|
|
|
def get_prebuilts(repo_owner: str = "M4TH1EU", repo_name: str = "ai-suite-rocm-local",
|
|
release_tag: str = f"prebuilt-whl-{ROCM_VERSION}") -> list:
|
|
api_url = f"https://api.github.com/repos/{repo_owner}/{repo_name}/releases/tags/{release_tag}"
|
|
|
|
try:
|
|
with urllib.request.urlopen(api_url) as response:
|
|
if response.status != 200:
|
|
logger.error(f"Failed to fetch data: HTTP Status {response.status}")
|
|
return []
|
|
|
|
release_data = json.load(response)
|
|
|
|
assets = release_data.get('assets', [])
|
|
if not assets:
|
|
logger.error("No assets found in release data")
|
|
return []
|
|
|
|
return assets
|
|
|
|
except urllib.error.URLError as e:
|
|
logger.error(f"Error fetching release data: {e}")
|
|
|
|
|
|
def check_for_build_essentials():
|
|
logger.debug("Checking for build essentials...")
|
|
debian = os.path.exists('/etc/debian_version')
|
|
fedora = os.path.exists('/etc/fedora-release')
|
|
|
|
if debian:
|
|
# TODO: check if these work for debian users
|
|
check_gcc = run_command("dpkg -l | grep build-essential &>/dev/null", exit_on_error=False)[2] == 0
|
|
check_python = run_command("dpkg -l | grep python3.10-dev &>/dev/null", exit_on_error=False)[2] == 0
|
|
|
|
if not check_gcc or not check_python:
|
|
raise UserWarning(
|
|
"The packages build-essential and python3.10-dev are required for this script to run. Please install them. See the README for more information.")
|
|
elif fedora:
|
|
check_gcc = run_command("rpm -q gcc &>/dev/null", exit_on_error=False)[2] == 0
|
|
check_python = run_command("rpm -q python3.10-devel &>/dev/null", exit_on_error=False)[2] == 0
|
|
|
|
if not check_gcc or not check_python:
|
|
raise UserWarning(
|
|
"The package python3.10-devel and the Development Tools group are required for this script to run. Please install them. See the README for more information.")
|
|
else:
|
|
logger.warning(
|
|
"Unsupported OS detected. Please ensure you have the following packages installed or their equivalent: build-essential, python3.10-dev")
|
|
|
|
|
|
def run_command(command: str, exit_on_error: bool = True):
|
|
logger.debug(f"Running command: {command}")
|
|
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
out, err = process.communicate()
|
|
|
|
if process.returncode != 0:
|
|
logger.fatal(f"Failed to run command: {command}")
|
|
raise Exception(f"Failed to run command: {command}")
|
|
|
|
return out, err, process.returncode
|
|
|
|
|
|
def load_service_from_string(service: str) -> Stack:
|
|
logger.debug(f"Loading service from string: {service}")
|
|
|
|
try:
|
|
service_name = service.replace("_", " ").title().replace(" ", "")
|
|
|
|
module = importlib.import_module(f"services.{service}")
|
|
met = getattr(module, service_name)
|
|
return met()
|
|
|
|
except ModuleNotFoundError as e:
|
|
logger.error(f"Failed to load service: {e}")
|
|
return None
|