2024-08-28 20:05:46 +02:00
import json
2024-08-28 10:39:16 +02:00
import logging
import os
2024-08-28 20:05:46 +02:00
import subprocess
2024-08-28 10:39:16 +02:00
import sys
2024-08-28 20:05:46 +02:00
import ui
2024-08-28 10:39:16 +02:00
PYTHON_EXEC = ' python3.10 '
PATH = os . path . dirname ( os . path . abspath ( __file__ ) )
ROCM_VERSION = " 6.1.2 "
logger = logging . getLogger ( ' ai-suite-rocm ' )
2024-08-28 20:05:46 +02:00
config = None
class Config :
data = { }
def __init__ ( self ) :
self . file = os . path . join ( os . path . expanduser ( " ~ " ) , " .config " , " ai-suite-rocm " , " config.json " )
self . create ( )
self . read ( )
def create ( self ) :
if not os . path . exists ( self . file ) :
os . makedirs ( os . path . dirname ( self . file ) , exist_ok = True )
with open ( self . file , " w " ) as f :
f . write ( " {} " )
logger . info ( f " Created config file at { self . file } " )
def read ( self ) :
with open ( self . file , " r " ) as f :
self . data = json . load ( f )
def write ( self ) :
with open ( self . file , " w " ) as f :
json . dump ( self . data , f )
def get ( self , key : str ) :
return self . data . get ( key )
def set ( self , key : str , value ) :
self . data [ key ] = value
self . write ( )
def has ( self , key : str ) :
return key in self . data
def remove ( self , key : str ) :
self . data . pop ( key )
self . write ( )
def clear ( self ) :
self . data = { }
self . write ( )
def setup_logger ( level : logger . level = logging . INFO ) :
global logger
if not logger . hasHandlers ( ) :
logger . setLevel ( level )
handler = logging . StreamHandler ( sys . stdout )
handler . setFormatter ( logging . Formatter ( ' [ %(levelname)s ] : %(message)s ' ) )
logger . addHandler ( handler )
def setup_config ( ) :
global config
config = Config ( )
def get_config ( ) :
global config
return config
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 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_interactive_cmd_ui ( ) :
while True :
choice = ui . start . ask ( )
match choice :
case " Start services " :
services = ui . start_services . ask ( )
for service in services :
logger . info ( f " Starting service: { service } " )
pass
pass
case " Stop services " :
pass
case " Install/update services " :
pass
case " Uninstall services " :
pass
case " Exit " :
print ( " Exiting... " )
exit ( 0 )
2024-08-28 10:39:16 +02:00
if __name__ == ' __main__ ' :
2024-08-28 20:05:46 +02:00
setup_logger ( logging . DEBUG )
setup_config ( )
2024-08-28 10:39:16 +02:00
2024-08-28 20:05:46 +02:00
logger . info ( " Starting AI Suite for ROCM " )
check_for_build_essentials ( )
2024-08-28 10:39:16 +02:00
2024-08-28 20:05:46 +02:00
run_interactive_cmd_ui ( )