#!/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()