Files
virtualbox/GUI/bash.py
2023-11-23 16:13:06 +01:00

145 lines
6.6 KiB
Python

#!/usr/bin/env python3
import subprocess
import random
def check_user_existence(username):
try:
subprocess.check_output(['id', username])
except subprocess.CalledProcessError:
print(f"Der Benutzer {username} existiert nicht auf diesem System.")
exit(1)
def get_group_users(groupname):
try:
members = subprocess.check_output(['getent', 'group', groupname]).decode().split(':')[3].split(',')
return members if members else []
except subprocess.CalledProcessError:
print(f"Die Gruppe {groupname} existiert nicht oder hat keine Mitglieder.")
exit(1)
def get_random_name():
names = ["frodo", "samweis", "gandalf", "aragorn", "legolas", "gimli", "boromir", "meriadoc", "peregrin",
"arwen", "galadriel", "celeborn", "elrond", "glorfindel", "faramir", "eowyn", "theoden", "treebeard",
"gollum", "sauron", "saruman", "bilbo", "denethor", "radagast", "thranduil", "bard", "dori", "frodo"]
return random.choice(names)
def generate_rdp_port():
return str(random.randint(3390, 49151))
def input_options(options, prompt):
while True:
try:
for i, option in enumerate(options, 1):
print(f"{i}. {option}")
choice = int(input(prompt))
if 1 <= choice <= len(options):
return options[choice - 1]
else:
print("Ungültige Auswahl. Bitte erneut versuchen.")
except ValueError:
print("Ungültige Eingabe. Bitte geben Sie eine Zahl ein.")
def execute_command(command, user=None):
if user:
command = ['sudo', '-u', user] + command
subprocess.run(command)
def main():
print("User / Passwort: user00/Start1234")
print("Welches VDI-OS soll installiert werden")
print()
print("Für wen soll es sein?")
print()
options = ["Aktueller Benutzer", "Anderer Benutzer", "Mitglieder einer Gruppe", "Beenden"]
user_choice = input_options(options, "Ihre Auswahl: ")
if user_choice == "Aktueller Benutzer":
VAR_GROUP_MEMBERS = [subprocess.check_output(['whoami']).decode().strip()]
elif user_choice == "Anderer Benutzer":
VAR_GROUP_MEMBERS = [input("Bitte geben Sie einen Benutzernamen ein: ")]
check_user_existence(VAR_GROUP_MEMBERS[0])
elif user_choice == "Mitglieder einer Gruppe":
VAR_GROUP = input("Bitte geben Sie den Gruppennamen ein: ")
VAR_GROUP_MEMBERS = get_group_users(VAR_GROUP)
elif user_choice == "Beenden":
exit()
options = ["Ubuntu 2204 GUI BASE", "Ubuntu 2204 GUI BASE EXT", "Ubuntu 2204 SRV", "Ubuntu 2204 GUI GER",
"Ubuntu 2204 GUI GER EXT", "Beenden"]
user_choice = input_options(options, 'Bitte wählen Sie die VM-Option: ')
if user_choice == "Beenden":
exit()
default_name = get_random_name()
VAR_OS, VAR_VDI = "", ""
if user_choice == "Ubuntu 2204 GUI BASE":
VAR_OS, VAR_VDI = "Ubuntu_64", "ubu2204_GUI_BASE.vdi"
elif user_choice == "Ubuntu 2204 GUI BASE EXT":
VAR_OS, VAR_VDI = "Ubuntu_64", "ubu2204_GUI_BASE.vdi"
elif user_choice == "Ubuntu 2204 SRV":
VAR_OS, VAR_VDI = "Ubuntu_64", "ubu2204_SRV.vdi"
elif user_choice == "Ubuntu 2204 GUI GER":
VAR_OS, VAR_VDI = "Ubuntu_64", "ubu2204_GUI_GER.vdi"
elif user_choice == "Ubuntu 2204 GUI GER EXT":
VAR_OS, VAR_VDI = "Ubuntu_64", "ubu2204_gui_ext_ger.vdi"
# Benutzereingaben
VAR_QUANTITY = int(input("Wie viele VMs werden benötigt? [1]: ") or 1)
VAR_NAME_PREFIX = input(f"Präfix Host Name (Vorgabe: {default_name}): ") or default_name
VAR_CPU = int(input("CPUs [2]: ") or 2)
VAR_MEM = int(input("Memory [2048]: ") or 2048)
VAR_ADDITIONAL_HDD = int(input("Anzahl der zusätzlichen HDDs (Standard: 0): ") or 0)
VAR_PATH_TO_VDI = "/srv/data/VDI"
VAR_VIDEO_RAM = 64
VAR_NIC = "bridged"
VAR_NET = subprocess.check_output(['ip', 'addr', 'show']).decode().split('2: ')[1].split()[0].strip()
VAR_NAME_PREFIX = VAR_NAME_PREFIX or default_name
for VAR_USER_IN_GROUP in VAR_GROUP_MEMBERS:
VAR_RDP_PORT = generate_rdp_port()
for i in range(1, VAR_QUANTITY + 1):
VM_NAME = f"{VAR_NAME_PREFIX}-{VAR_USER_IN_GROUP}-VM{i}"
VM_DIR = f"/storage/vbox_storage/{VAR_USER_IN_GROUP}"
execute_command(['VBoxManage', 'createvm', '--name', VM_NAME, '--ostype', VAR_OS, '--register', '--basefolder', VM_DIR], user=VAR_USER_IN_GROUP)
execute_command(['VBoxManage', 'modifyvm', VM_NAME, '--ioapic', 'on', '--memory', str(VAR_MEM),
'--cpus', str(VAR_CPU), '--vram', str(VAR_VIDEO_RAM), '--nic1', 'Nat', '--nic2', VAR_NIC,
'--bridgeadapter2', VAR_NET, '--graphicscontroller', 'vmsvga', '--vrde', 'on',
'--vrdemulticon', 'on', '--vrdeport', VAR_RDP_PORT], user=VAR_USER_IN_GROUP)
execute_command(['VBoxManage', 'storagectl', VM_NAME, '--name', 'SATA Controller', '--add', 'sata',
'--controller', 'IntelAhci'], user=VAR_USER_IN_GROUP)
execute_command(['VBoxManage', 'storagectl', VM_NAME, '--name', 'IDE Controller', '--add', 'ide',
'--controller', 'PIIX4'], user=VAR_USER_IN_GROUP)
execute_command(['VBoxManage', 'storageattach', VM_NAME, '--storagectl', 'IDE Controller', '--port', '1',
'--device', '0', '--type', 'dvddrive', '--medium', '/usr/lib/virtualbox/additions/VBoxGuestAdditions.iso'], user=VAR_USER_IN_GROUP)
with open("/srv/data/GIT/Virtualbox/rdp_port.txt", "a") as rdp_file:
rdp_file.write(f"{VM_NAME}-{VAR_RDP_PORT}\n")
for j in range(1, VAR_ADDITIONAL_HDD + 1):
HDD_NUM = f"{j:02d}"
HDD_NAME = f"{VM_NAME}-disk{HDD_NUM}.vdi"
execute_command(['VBoxManage', 'createhd', '--filename', f"{VM_DIR}/{HDD_NAME}", '--size', '102400', '--format', 'VDI'], user=VAR_USER_IN_GROUP)
execute_command(['VBoxManage', 'storageattach', VM_NAME, '--storagectl', 'SATA Controller', '--port', HDD_NUM,
'--device', '0', '--type', 'hdd', '--medium', f"{VM_DIR}/{VM_NAME}/{HDD_NAME}"], user=VAR_USER_IN_GROUP)
execute_command(['VBoxManage', 'clonehd', f"{VAR_PATH_TO_VDI}/{VAR_VDI}", f"{VM_DIR}/{VM_NAME}/{VM_NAME}-disk00.vdi"], user=VAR_USER_IN_GROUP)
execute_command(['VBoxManage', 'storageattach', VM_NAME, '--storagectl', 'SATA Controller', '--port', '0',
'--device', '0', '--type', 'hdd', '--medium', f"{VM_DIR}/{VM_NAME}/{VM_NAME}-disk00.vdi"], user=VAR_USER_IN_GROUP)
if __name__ == "__main__":
main()