- option to auto-attach ISO to VMs #20

- added splash screen (ASCII ART) option to skip #21
- Implemented disk options as variables from config #19
- Related changes in config creation / editing menus
This commit is contained in:
OVERLORD7F
2025-09-15 17:44:55 +03:00
parent 1a92e86704
commit 0f6e17a73c
5 changed files with 196 additions and 21 deletions

View File

@@ -16,7 +16,9 @@ def config_menu(base_url, api_key, config_relative_path):
\n[gold bold][1] [grey53 italic]Show current configuration\n[/] \ \n[gold bold][1] [grey53 italic]Show current configuration\n[/] \
\n[gold bold][2] [grey53 italic]Setup new config file[/]\n \ \n[gold bold][2] [grey53 italic]Setup new config file[/]\n \
\n[gold bold][3] [grey53 italic]Change selected data pool[/]\n\ \n[gold bold][3] [grey53 italic]Change selected data pool[/]\n\
\n[gold bold][4] [grey53 italic]Change selected VMs[/]\ \n[gold bold][4] [grey53 italic]Change selected VMs[/]\n\
\n[gold bold][5] [grey53 italic]Change ISO UUID (auto-mount)[/]\n\
\n[gold bold][6] [grey53 italic]Skip start-up splash[/]\n\
\n\n[green_yellow bold]ENTER - return to Main Menu[/]" \n\n[green_yellow bold]ENTER - return to Main Menu[/]"
config_menu_options=Align.center(config_menu_options, vertical="middle") config_menu_options=Align.center(config_menu_options, vertical="middle")
console = Console() console = Console()
@@ -33,10 +35,15 @@ def config_menu(base_url, api_key, config_relative_path):
change_data_pool(base_url, api_key, config_relative_path) change_data_pool(base_url, api_key, config_relative_path)
if sub_choice == "4": if sub_choice == "4":
change_vm_uuids(config_relative_path) change_vm_uuids(config_relative_path)
if sub_choice == "5":
change_iso_uuid(config_relative_path)
if sub_choice == "6":
change_startup_option(config_relative_path)
def config_show_example(): def config_show_example():
conf_example= """ conf_example= """
[General] [General]
skip_startup_splash = no
#Master Controller IP of your cluster #Master Controller IP of your cluster
#Has to be accessible for a machine, which will be executing this Utility #Has to be accessible for a machine, which will be executing this Utility
controller_ip = 10.20.30.44 controller_ip = 10.20.30.44
@@ -61,6 +68,20 @@ data_pool_uuid =
uuid_1 = uuid_1 =
uuid_2 = uuid_2 =
[VM_Options]
#Select interface which will be used in virtual disk creation.
#Available options: virtio / ide / scsi / sata
disk_interface = virtio
#Select allocation type for virtual disks
#Available options: none / falloc / full / metadata
preallocation = falloc
#Specify uuid of iso you wish to automatically mount to Virtual Machines during operations (Courses)
#This step is skipped if "none" provided
iso_uuid = none
[Courses-Space-VM] [Courses-Space-VM]
#Set vDisk size for "Prepare VMs for Courses™" option #Set vDisk size for "Prepare VMs for Courses™" option
disk1 = 10 disk1 = 10
@@ -74,6 +95,7 @@ disk3 = 20
Prompt.ask("[green_yellow bold]ENTER - return to Utility Configuration.. :right_arrow_curving_down:") Prompt.ask("[green_yellow bold]ENTER - return to Utility Configuration.. :right_arrow_curving_down:")
def config_show(config_relative_path): def config_show(config_relative_path):
cls() cls()
console.rule(title = "Current configuration" , align="center" , style="yellow") console.rule(title = "Current configuration" , align="center" , style="yellow")
with open(config_relative_path, "r") as f: with open(config_relative_path, "r") as f:
@@ -85,15 +107,38 @@ def config_import(config_relative_path):
config = configparser.ConfigParser() config = configparser.ConfigParser()
config.read(config_relative_path) config.read(config_relative_path)
skip_startup_splash = config.get('General', 'skip_startup_splash')
base_url = config.get('General', 'controller_ip') base_url = config.get('General', 'controller_ip')
api_key = "jwt " + config.get('General', 'api_key') #That was realy obvious DACOM >:C api_key = "jwt " + config.get('General', 'api_key') #That was realy obvious DACOM >:C
data_pool_uuid = config.get('Data_Pool', 'data_pool_uuid') data_pool_uuid = config.get('Data_Pool', 'data_pool_uuid')
vm_list = [] vm_list = []
if 'VM_List' in config: if 'VM_List' in config:
for key, value in config['VM_List'].items(): for key, value in config['VM_List'].items():
vm_list.append(value) vm_list.append(value)
#importing VM_Options
if config.has_section('VM_Options'):
iso_uuid = config.get('VM_Options' , 'iso_uuid')
disk_interface = config.get('VM_Options' , 'disk_interface')
preallocation = config.get('VM_Options' , 'preallocation')
iso_name=get_iso_name(base_url, api_key, iso_uuid)
else:
console.print("[bold yellow]Applying default values to Virtual Machine Options")
iso_uuid = "none"
disk_interface = "virtio"
preallocation = "falloc"
iso_name= "none"
config = configparser.ConfigParser() #writing default values to config
config["VM_Options"] = {
"disk_interface": "virtio",
"preallocation": "falloc",
"iso_uuid": "none",
}
with open(config_relative_path, "a") as configfile: # appending to existing config file
config.write(configfile)
#importing disk sizes for SpaceVM courses #importing disk sizes for SpaceVM courses
if config.has_section('Courses-Space-VM'): if config.has_section('Courses-Space-VM'):
disk1_size = config.get('Courses-Space-VM', 'disk1') disk1_size = config.get('Courses-Space-VM', 'disk1')
@@ -117,7 +162,22 @@ def config_import(config_relative_path):
vm_names=[] vm_names=[]
for x in vm_list: for x in vm_list:
vm_names.append(get_vm_name(base_url, api_key, x)) vm_names.append(get_vm_name(base_url, api_key, x))
return base_url, api_key, data_pool_uuid, data_pool_name, vm_list, vm_names, disk1_size, disk2_size, disk3_size
return skip_startup_splash, base_url, api_key, data_pool_uuid, data_pool_name, vm_list, vm_names, disk1_size, disk2_size, disk3_size, disk_interface, preallocation, iso_uuid, iso_name
def change_startup_option(config_relative_path):
cls()
console.print("[yellow bold]Skip start-up splash ?")
new_value = Prompt.ask("Type your choice", choices=["yes", "no"], default="no")
config = configparser.ConfigParser()
config.read(config_relative_path)
if config.has_section('General'):
config.set('General', 'skip_startup_splash', new_value)
with open(config_relative_path, 'w') as config_file:
config.write(config_file)
console.print(f"[green bold]Option set to: {new_value}")
else:
console.print("[red bold]No section 'General' in config file")
def change_data_pool(base_url, api_key, config_relative_path): #change selected data pool in config def change_data_pool(base_url, api_key, config_relative_path): #change selected data pool in config
cls() cls()
@@ -133,6 +193,18 @@ def change_data_pool(base_url, api_key, config_relative_path): #change selected
print("No 'Data_Pool' section in config file..") print("No 'Data_Pool' section in config file..")
config_show(config_relative_path) config_show(config_relative_path)
def change_iso_uuid(config_relative_path):
cls()
new_iso_uuid = input("Type ISO UUID: ")
config = configparser.ConfigParser()
config.read(config_relative_path)
if config.has_section('VM_Options'):
config.set('VM_Options', 'iso_uuid', new_iso_uuid)
with open(config_relative_path, 'w') as config_file:
config.write(config_file)
else:
print("No 'VM_Options' section in config file..")
config_show(config_relative_path)
def change_vm_uuids(config_relative_path): #change selected VM uuids in config def change_vm_uuids(config_relative_path): #change selected VM uuids in config
config = configparser.ConfigParser() config = configparser.ConfigParser()
@@ -177,10 +249,20 @@ def config_edit(config_relative_path):
config["General"] = { config["General"] = {
"controller_ip": base_url, "controller_ip": base_url,
"api_key": api_key, "api_key": api_key,
"skip_startup_splash": "no",
} }
config["Data_Pool"] = {"data_pool_uuid": data_pool_uuid} config["Data_Pool"] = {"data_pool_uuid": data_pool_uuid}
with open(config_relative_path, "w") as configfile: #disk_interface=input("Specify preffered disk interface (virtio / ide / scsi / sata): ")
#preallocation=input("Specify allocation type for virtual disks (none / falloc / full / metadata): ")
#iso_uuid=input("Specify ISO uuid you wish to auto-mount during operations(none - skip this step): ")
#config["VM_Options"] = {
# "disk_interface": disk_interface,
# "preallocation": preallocation,
# "iso_uuid": iso_uuid
#}
with open(config_relative_path, "w") as configfile: #writing everything from above to config file
config.write(configfile) config.write(configfile)
print("Type VM UUIDs one by one (input ENTER to stop)") print("Type VM UUIDs one by one (input ENTER to stop)")

View File

@@ -4,7 +4,7 @@ from domain_api import *
from rich.prompt import Prompt from rich.prompt import Prompt
from rich.console import Console , Align from rich.console import Console , Align
def disk_edit_mode(base_url , api_key , data_pool_uuid , vm_uuids, disk1_size, disk2_size, disk3_size): def disk_edit_mode(base_url , api_key , data_pool_uuid , vm_uuids, disk1_size, disk2_size, disk3_size, disk_interface, preallocation, iso_uuid):
os.system('cls' if os.name=='nt' else 'clear') os.system('cls' if os.name=='nt' else 'clear')
diks_edit_menu_options="[gold bold][1] [grey53 italic]Delete vDisk by UUID\n[/grey53 italic] \ diks_edit_menu_options="[gold bold][1] [grey53 italic]Delete vDisk by UUID\n[/grey53 italic] \
\n[gold bold][2] [grey53 italic]Delete ALL vDisks on selected Virtual Machine[/grey53 italic]\n \ \n[gold bold][2] [grey53 italic]Delete ALL vDisks on selected Virtual Machine[/grey53 italic]\n \
@@ -35,7 +35,7 @@ def disk_edit_mode(base_url , api_key , data_pool_uuid , vm_uuids, disk1_size, d
print(vm_uuids) print(vm_uuids)
select_uuids=int(input("Select VM to attach new disk. \n Type VM uuid index number (from list above) to select: ")) - 1 select_uuids=int(input("Select VM to attach new disk. \n Type VM uuid index number (from list above) to select: ")) - 1
print(f"{vm_uuids[select_uuids]} - {data_pool_uuid} - {vdisk_size} ") print(f"{vm_uuids[select_uuids]} - {data_pool_uuid} - {vdisk_size} ")
create_and_attach_disk(base_url , api_key , vm_uuids[select_uuids] , data_pool_uuid , vdisk_size , "falloc") create_and_attach_disk(base_url , api_key , vm_uuids[select_uuids] , data_pool_uuid , vdisk_size , disk_interface, preallocation)
if sub_choice == "4": if sub_choice == "4":
os.system('cls' if os.name=='nt' else 'clear') os.system('cls' if os.name=='nt' else 'clear')
@@ -55,13 +55,19 @@ def disk_edit_mode(base_url , api_key , data_pool_uuid , vm_uuids, disk1_size, d
for z in vm_uuids: # only for creating disks for z in vm_uuids: # only for creating disks
domain_uuid = z.strip('\n') domain_uuid = z.strip('\n')
vm_name = get_vm_name(base_url, api_key, domain_uuid) vm_name = get_vm_name(base_url, api_key, domain_uuid)
console.print(f"\n[bold underline yellow]Creating and attaching disk to[/] [bright_cyan]{vm_name}:") console.print(f"\n[bold underline yellow]Creating and attaching disks to[/] [bright_cyan]{vm_name}:")
domain_info = get_domain_info(base_url , api_key , domain_uuid) domain_info = get_domain_info(base_url , api_key , domain_uuid)
domain_all_content = get_domain_all_content(base_url , api_key , domain_uuid) #domain_all_content = get_domain_all_content(base_url , api_key , domain_uuid)
if domain_info: if domain_info:
create_and_attach_disk(base_url , api_key , domain_uuid , data_pool_uuid, disk1_size, "falloc") #iso_uuid="b95241c1-6134-4263-9da5-013459612eeb"
create_and_attach_disk(base_url , api_key , domain_uuid , data_pool_uuid, disk2_size, "falloc") create_and_attach_disk(base_url , api_key , domain_uuid , data_pool_uuid, disk1_size, disk_interface, preallocation)
create_and_attach_disk(base_url , api_key , domain_uuid , data_pool_uuid, disk3_size, "falloc") create_and_attach_disk(base_url , api_key , domain_uuid , data_pool_uuid, disk2_size, disk_interface, preallocation)
create_and_attach_disk(base_url , api_key , domain_uuid , data_pool_uuid, disk3_size, disk_interface, preallocation)
if iso_uuid == 'none':
console.print("[grey53 italic]iso_uuid was not specified. Skipping ISO auto-mount..[/]")
else:
attach_iso(base_url, api_key, domain_uuid, iso_uuid)
console.print("[bold green]\nDone. Happy virtualization :thumbs_up::thumbs_up:") console.print("[bold green]\nDone. Happy virtualization :thumbs_up::thumbs_up:")
Prompt.ask("[green_yellow bold]ENTER - return to Main Menu.. :right_arrow_curving_down:") Prompt.ask("[green_yellow bold]ENTER - return to Main Menu.. :right_arrow_curving_down:")
os.system('cls' if os.name=='nt' else 'clear') os.system('cls' if os.name=='nt' else 'clear')

View File

@@ -108,7 +108,26 @@ def get_disk_info(domain_all_content):
console.print(Columns(disk_info_renderables)) console.print(Columns(disk_info_renderables))
def get_cdrom_uuid(domain_all_content):
if 'cdroms' in domain_all_content:
cdrom_ids = [item['id'] for item in domain_all_content['cdroms']]
#print("CD-ROM UUIDs:")
for cdrom_id in cdrom_ids:
#print(cdrom_id)
return (cdrom_id)
else:
console.print("[bold yellow]No 'cdroms' field in recieved data. \nProbably VM does not have any CD-ROMs?")
def get_iso_name(base_url, api_key, iso_uuid):
url = f"http://{base_url}//api/iso/{iso_uuid}/"
response = requests.get(url, headers={'Authorization': api_key})
if response.status_code == 200:
iso_name = response.json()
return (f"{iso_name['filename']}")
def get_vm_name(base_url, api_key, vm_uuids): def get_vm_name(base_url, api_key, vm_uuids):
console = Console()
url = f"http://{base_url}//api/domains/{vm_uuids}/" url = f"http://{base_url}//api/domains/{vm_uuids}/"
response = requests.get(url, headers={'Authorization': api_key}) response = requests.get(url, headers={'Authorization': api_key})
if response.status_code == 200: if response.status_code == 200:
@@ -129,9 +148,10 @@ def vm_info(base_url, api_key, vm_uuids):
console.print(vm_info_renderable) console.print(vm_info_renderable)
console.rule(title = "[bold yellow]vDisks Info" , style="grey53" , align="center") console.rule(title = "[bold yellow]vDisks Info" , style="grey53" , align="center")
get_disk_info(domain_all_content) get_disk_info(domain_all_content)
#console.rule(title = "[bold yellow]CD-ROM UUIDs" , style="grey53" , align="center")
#print(get_cdrom_uuid(domain_all_content))
console.rule(style="yellow") console.rule(style="yellow")
def vm_info_short(base_url, api_key): def vm_info_short(base_url, api_key):
url = f"http://{base_url}/api/domains/" url = f"http://{base_url}/api/domains/"
response = requests.get(url, headers={'Authorization': api_key}) response = requests.get(url, headers={'Authorization': api_key})
@@ -157,7 +177,7 @@ def vm_info_short(base_url, api_key):
os.system('cls' if os.name=='nt' else 'clear') os.system('cls' if os.name=='nt' else 'clear')
def create_and_attach_disk(base_url , api_key , vm_id, data_pool_uuid, vdisk_size, preallocation): def create_and_attach_disk(base_url , api_key , vm_id, data_pool_uuid, vdisk_size, disk_interface, preallocation):
domain_name=get_domain_info(base_url , api_key , vm_id) domain_name=get_domain_info(base_url , api_key , vm_id)
disk_name=domain_name["verbose_name"] + "_" + secrets.token_hex(5) #generates unique hex id. this method can generate ~million unique ids disk_name=domain_name["verbose_name"] + "_" + secrets.token_hex(5) #generates unique hex id. this method can generate ~million unique ids
url = f"http://{base_url}/api/domains/{vm_id}/create-attach-vdisk/" url = f"http://{base_url}/api/domains/{vm_id}/create-attach-vdisk/"
@@ -170,7 +190,7 @@ def create_and_attach_disk(base_url , api_key , vm_id, data_pool_uuid, vdisk_siz
"preallocation": preallocation, "preallocation": preallocation,
"size": vdisk_size, "size": vdisk_size,
"datapool": data_pool_uuid, "datapool": data_pool_uuid,
"target_bus": "virtio", "target_bus": disk_interface, #"virtio"
} }
with Progress(SpinnerColumn(), TextColumn("[progress.description]{task.description}")) as progress: with Progress(SpinnerColumn(), TextColumn("[progress.description]{task.description}")) as progress:
task = progress.add_task("Creating and attaching vDisk...", total=None) task = progress.add_task("Creating and attaching vDisk...", total=None)
@@ -235,6 +255,59 @@ def select_vm_by_tags(base_url, api_key, config_relative_path):
Prompt.ask("[green_yellow bold]ENTER - return to Main Menu.... :right_arrow_curving_down:") Prompt.ask("[green_yellow bold]ENTER - return to Main Menu.... :right_arrow_curving_down:")
os.system('cls' if os.name=='nt' else 'clear') os.system('cls' if os.name=='nt' else 'clear')
return(vm_id_list) return(vm_id_list)
def attach_iso(base_url, api_key, vm_id, iso_uuid):
url = f"http://{base_url}/api/domains/{vm_id}/attach-iso/"
domain_all_content = get_domain_all_content(base_url, api_key, vm_id)
cdrom_uuid=get_cdrom_uuid(domain_all_content)
headers={
"Authorization" : api_key,
"Content-Type" : "application/json",
}
payload= {
"iso": iso_uuid,
"cdrom": cdrom_uuid
}
with Progress(SpinnerColumn(), TextColumn("[progress.description]{task.description}")) as progress:
task = progress.add_task("Attaching selected ISO to VM...", total=None)
response = requests.post(url , headers=headers, json=payload)
progress.remove_task(task)
if response.status_code == 200:
iso_name = get_iso_name(base_url, api_key, iso_uuid)
console.print(f"[grey53 italic]ISO {iso_name} attached[/] :white_check_mark:")
return True
else:
console.print(f"[bold yellow]ERROR {response.status_code} attaching ISO \nProbably VM does not have any CD-ROMs?")
return False
def vm_menu(base_url, api_key, vm_uuids, config_relative_path): def vm_menu(base_url, api_key, vm_uuids, config_relative_path):
os.system('cls' if os.name=='nt' else 'clear') os.system('cls' if os.name=='nt' else 'clear')

13
main.py
View File

@@ -7,7 +7,7 @@ from data_pools_api import *
from disk_edit_mode import * from disk_edit_mode import *
from rich.panel import Panel from rich.panel import Panel
from rich.console import Console , Align from rich.console import Console , Align
SVMU_ver="0.3-dev" SVMU_ver="0.35-dev"
config_relative_path = os.path.join(os.getcwd() , 'SpaceVM_Utility.conf') #config in the same directory with main.py config_relative_path = os.path.join(os.getcwd() , 'SpaceVM_Utility.conf') #config in the same directory with main.py
@@ -18,10 +18,11 @@ if not os.path.exists(config_relative_path):
menu_choice=0 menu_choice=0
console = Console() console = Console()
os.system('cls' if os.name=='nt' else 'clear') os.system('cls' if os.name=='nt' else 'clear')
show_startup_logo(SVMU_ver) #shows startup splash (ASCII art) skip_startup_splash = get_skip_startup_splash(config_relative_path)
show_startup_logo(skip_startup_splash, SVMU_ver) #shows startup splash (ASCII art)
while(menu_choice != ""): #main menu loop while(menu_choice != ""): #main menu loop
check_config(config_relative_path) check_config(config_relative_path)
base_url, api_key, data_pool_uuid, data_pool_name, vm_uuids, vm_names, disk1_size, disk2_size, disk3_size = config_import(config_relative_path) #importing API-KEY / IP / DATA POOL UUID / VM-UUIDs from config skip_startup_splash, base_url, api_key, data_pool_uuid, data_pool_name, vm_uuids, vm_names, disk1_size, disk2_size, disk3_size, disk_interface, preallocation, iso_uuid, iso_name = config_import(config_relative_path) #importing API-KEY / IP / DATA POOL UUID / VM-UUIDs from config
menu_options=f"[gold bold][1] [grey53 italic]Manage utility config\n[/grey53 italic] \ menu_options=f"[gold bold][1] [grey53 italic]Manage utility config\n[/grey53 italic] \
\n[gold bold][2] [grey53 italic]Enter disk edit mode[/grey53 italic]\n \ \n[gold bold][2] [grey53 italic]Enter disk edit mode[/grey53 italic]\n \
\n[gold bold][3] [grey53 italic]Show breif cluster overview[/grey53 italic]\n \ \n[gold bold][3] [grey53 italic]Show breif cluster overview[/grey53 italic]\n \
@@ -29,15 +30,15 @@ while(menu_choice != ""): #main menu loop
\n[gold bold][5] [grey53 italic]Show data pools[/grey53 italic]\n \ \n[gold bold][5] [grey53 italic]Show data pools[/grey53 italic]\n \
\n\n[green_yellow bold]ENTER - exit Utility[/]\n\n \ \n\n[green_yellow bold]ENTER - exit Utility[/]\n\n \
[underline bold grey53]Currently imported config:[/]\n \ [underline bold grey53]Currently imported config:[/]\n \
[bold grey53]Connected to Controller: [bright_yellow]{base_url}[/]\n Selected Data Pool: [bright_yellow]{data_pool_name}[/]\n Selected VMs:\n [bright_yellow]{vm_names}" [bold grey53]Connected to Controller: [bright_yellow]{base_url}[/]\n Selected Data Pool: [bright_yellow]{data_pool_name}[/]\n Selected VMs:\n [bright_yellow]{vm_names}[/]\n Auto-mount ISO: [bright_cyan]{iso_name}[/]"
menu_options=Align.center(menu_options, vertical="middle") menu_options=Align.center(menu_options, vertical="middle")
menu_subtitle = "[blue bold][link=https://github.com/OVERLORD7F/SpaceVM_VM_Utility]:wrench: Project_GitHub[/link] [yellow]| [magenta bold][link=https://spacevm.ru/docs/]:books: SpaceVM_Docs[/link] [yellow]| [red bold][link=https://comptek.ru]:briefcase: Comptek[/link]" menu_subtitle = "[blue bold][link=https://github.com/OVERLORD7F/SVMU]:wrench: Project_GitHub[/link] [yellow]| [magenta bold][link=https://spacevm.ru/docs/]:books: SpaceVM_Docs[/link] [yellow]| [red bold][link=https://comptek.ru]:briefcase: Comptek[/link]"
console.print(Panel(menu_options, title=f"[bold magenta]SpaceVM Utility {SVMU_ver} - Main Menu" , subtitle = menu_subtitle, subtitle_align="right" , style="yellow" , width=150 , padding = 2)) console.print(Panel(menu_options, title=f"[bold magenta]SpaceVM Utility {SVMU_ver} - Main Menu" , subtitle = menu_subtitle, subtitle_align="right" , style="yellow" , width=150 , padding = 2))
menu_choice=str(input("\n>>> ")) menu_choice=str(input("\n>>> "))
if menu_choice == "1": if menu_choice == "1":
config_menu(base_url, api_key, config_relative_path) config_menu(base_url, api_key, config_relative_path)
if menu_choice == "2": if menu_choice == "2":
disk_edit_mode(base_url , api_key , data_pool_uuid , vm_uuids, disk1_size, disk2_size, disk3_size) disk_edit_mode(base_url , api_key , data_pool_uuid , vm_uuids, disk1_size, disk2_size, disk3_size, disk_interface, preallocation, iso_uuid)
if menu_choice == "3": if menu_choice == "3":
cluster_info(base_url , api_key) cluster_info(base_url , api_key)
if menu_choice == "4": if menu_choice == "4":

View File

@@ -7,7 +7,21 @@ from rich.progress import Progress, SpinnerColumn, TextColumn
console = Console() console = Console()
def show_startup_logo(SVMU_ver): def get_skip_startup_splash(config_path):
"""Read only skip_startup_splash from config file."""
try:
with open(config_path, "r", encoding="utf-8") as f:
for line in f:
if line.strip().startswith("skip_startup_splash"):
# Example: skip_startup_splash = yes
return line.split("=")[-1].strip().lower()
except Exception:
pass
return "no" # Default if not found
def show_startup_logo(skip_startup_splash, SVMU_ver):
if skip_startup_splash == "yes":
return
splash_file = os.path.join(os.path.dirname(__file__), "splash-screens.txt") splash_file = os.path.join(os.path.dirname(__file__), "splash-screens.txt")
if not os.path.exists(splash_file): if not os.path.exists(splash_file):
console.print("[bold red]Splash screens file not found![/bold red]") console.print("[bold red]Splash screens file not found![/bold red]")
@@ -43,5 +57,4 @@ def show_startup_logo(SVMU_ver):
os.system('cls' if os.name=='nt' else 'clear') #clears screen before returning os.system('cls' if os.name=='nt' else 'clear') #clears screen before returning
# Example usage:
# show_startup_logo() # show_startup_logo()