diff --git a/create_pve-mgnt-lxc_v2.sh b/create_pve-mgnt-lxc_v2.sh index 14f219d..03d9fea 100644 --- a/create_pve-mgnt-lxc_v2.sh +++ b/create_pve-mgnt-lxc_v2.sh @@ -1,157 +1,154 @@ #!/bin/bash # ===================================================== -# Proxmox VE: Debian 13 LXC automatisch erstellen -# Hostname: -MGNT -# Unprivilegiert -# Automatisches Debian 13 Template -# WebUI-Konsole funktioniert -# Autostart aktiviert +# Proxmox VE: Debian 13 LXC automatisch erstellen (dialog) # ===================================================== -# ---- Farben / Layout ---- -BOLD="\033[1m" -GREEN="\033[32m" -CYAN="\033[36m" -RED="\033[31m" -YELLOW="\033[33m" -RESET="\033[0m" -INDENT=" " +set -e + +# ---- Konfiguration ---- +IP="10.60.10.2/24" +GATEWAY="10.60.10.1" +CORES=1 +MEMORY=512 +SWAP=0 +ROOTFS_SIZE=8 +BRIDGE="xx_vmbrmgt" +MIN_VMID=300 + +DIALOG=dialog +BACKTITLE="Proxmox VE LXC Installer" +TMPFILE=$(mktemp) + +cleanup() { + rm -f "$TMPFILE" +} +trap cleanup EXIT # ---- Root Check ---- if [[ $EUID -ne 0 ]]; then - echo -e "${RED}${INDENT}Bitte als Root ausführen!${RESET}" + echo "Bitte als Root ausführen!" exit 1 fi -# ---- GUI Header ---- -draw_header() { - clear - echo -e "${CYAN}${BOLD}" - echo -e "${INDENT}=========================================" - echo -e "${INDENT} PROXMOX LXC CREATOR " - echo -e "${INDENT}=========================================" - echo -e "${RESET}" -} +# ---- Root Passwort ---- +ROOTPASS=$( +$DIALOG --backtitle "$BACKTITLE" \ + --passwordbox "Root-Passwort für den LXC:" 10 60 \ + 2> "$TMPFILE" || exit 1 +cat "$TMPFILE" +) -# ---- Root-Passwort abfragen ---- -draw_header -read -s -p "${INDENT}Root-Passwort für LXC: " ROOTPASS -echo - -# ---- Dynamischer Hostname ---- +# ---- Hostname ---- HOSTNAME="$(hostname)-MGNT" -# ---- Nächste freie VMID ab 300 ---- -VMID=300 -while pct status $VMID &>/dev/null; do ((VMID++)); done +$DIALOG --backtitle "$BACKTITLE" \ + --msgbox "LXC Hostname:\n\n$HOSTNAME" 8 50 -# ---- Storage-Auswahl ---- -draw_header -echo -e "${BOLD}${INDENT}Verfügbare Storages für LXC RootFS:${RESET}" +# ---- VMID ermitteln ---- +VMID=$MIN_VMID +while pct status "$VMID" &>/dev/null; do + ((VMID++)) +done + +# ---- Storage Auswahl ---- mapfile -t STORAGES < <(pvesm status --content rootdir | awk 'NR>1 {print $1}') if [[ ${#STORAGES[@]} -eq 0 ]]; then - echo -e "${RED}${INDENT}Kein geeigneter Storage gefunden!${RESET}" + $DIALOG --msgbox "Kein geeigneter Storage gefunden!" 8 50 exit 1 fi +MENU_ITEMS=() for i in "${!STORAGES[@]}"; do - printf "${INDENT}[%d] %s\n" "$i" "${STORAGES[$i]}" + MENU_ITEMS+=("$i" "${STORAGES[$i]}") done -while true; do - read -p "${INDENT}Storage auswählen (Nummer): " STORAGE_INDEX - if [[ "$STORAGE_INDEX" =~ ^[0-9]+$ ]] && [[ -n "${STORAGES[$STORAGE_INDEX]}" ]]; then - STORAGE="${STORAGES[$STORAGE_INDEX]}" - break - fi - echo -e "${RED}${INDENT}Ungültige Auswahl!${RESET}" -done +STORAGE_INDEX=$( +$DIALOG --backtitle "$BACKTITLE" \ + --menu "Storage für RootFS auswählen:" 15 60 6 \ + "${MENU_ITEMS[@]}" \ + 2> "$TMPFILE" || exit 1 +cat "$TMPFILE" +) -# ---- IP / Bridge / Ressourcen ---- -draw_header -echo -e "${INDENT}VMID: ${CYAN}$VMID${RESET}" -echo -e "${INDENT}Hostname: ${CYAN}$HOSTNAME${RESET}" -read -p "${INDENT}IP Adresse (z.B. 10.60.10.2/24) [default 10.60.10.2/24]: " IP -IP=${IP:-10.60.10.2/24} +STORAGE="${STORAGES[$STORAGE_INDEX]}" -read -p "${INDENT}Gateway [default 10.60.10.1]: " GATEWAY -GATEWAY=${GATEWAY:-10.60.10.1} +# ---- Template suchen ---- +$DIALOG --infobox "Suche aktuelles Debian 13 Template..." 5 50 +pveam update >/dev/null -read -p "${INDENT}Bridge [default xx_vmbrmgt]: " BRIDGE -BRIDGE=${BRIDGE:-xx_vmbrmgt} - -read -p "${INDENT}Cores [default 1]: " CORES -CORES=${CORES:-1} - -read -p "${INDENT}Memory MB [default 512]: " MEMORY -MEMORY=${MEMORY:-512} - -read -p "${INDENT}Swap MB [default 0]: " SWAP -SWAP=${SWAP:-0} - -read -p "${INDENT}RootFS Größe GB [default 8]: " ROOTFS_SIZE -ROOTFS_SIZE=${ROOTFS_SIZE:-8} - -# ---- Template automatisch wählen ---- -draw_header -echo -e "${INDENT}Suche aktuelles Debian 13 Template..." -pveam update TEMPLATE_NAME=$(pveam available | awk '/debian-13-standard_.*_amd64\.tar\.zst/ {print $2}' | tail -n1) if [[ -z "$TEMPLATE_NAME" ]]; then - echo -e "${RED}${INDENT}Kein Debian 13 Template gefunden!${RESET}" + $DIALOG --msgbox "Kein Debian 13 Template gefunden!" 8 50 exit 1 fi -echo -e "${INDENT}Gefundenes Template: ${CYAN}$TEMPLATE_NAME${RESET}" -# ---- Template prüfen / herunterladen ---- +# ---- Template laden ---- TEMPLATE_PATH="/var/lib/vz/template/cache/$TEMPLATE_NAME" if [[ ! -f "$TEMPLATE_PATH" ]]; then - echo -e "${INDENT}Template nicht vorhanden, lade herunter..." + $DIALOG --infobox "Lade Template:\n$TEMPLATE_NAME" 6 60 pveam download local "$TEMPLATE_NAME" -else - echo -e "${INDENT}Template bereits vorhanden" fi +# ---- Zusammenfassung ---- +$DIALOG --backtitle "$BACKTITLE" \ + --yesno \ +"Zusammenfassung: + +Hostname: $HOSTNAME +VMID: $VMID +Storage: $STORAGE +IP: $IP +Bridge: $BRIDGE +RAM: ${MEMORY}MB +Cores: $CORES + +LXC jetzt erstellen?" 15 60 + # ---- LXC erstellen ---- -draw_header -echo -e "${INDENT}Erstelle unprivilegierten LXC $HOSTNAME (VMID: $VMID)..." +$DIALOG --infobox "Erstelle unprivilegierten LXC..." 5 50 -CREATE_CMD="pct create $VMID local:vztmpl/$TEMPLATE_NAME \ - --hostname $HOSTNAME \ - --cores $CORES \ - --memory $MEMORY \ - --swap $SWAP \ - --rootfs $STORAGE:$ROOTFS_SIZE \ - --net0 name=eth0,bridge=$BRIDGE,ip=$IP,gw=$GATEWAY,type=veth \ - --unprivileged 1" +pct create "$VMID" "local:vztmpl/$TEMPLATE_NAME" \ + --hostname "$HOSTNAME" \ + --cores "$CORES" \ + --memory "$MEMORY" \ + --swap "$SWAP" \ + --rootfs "$STORAGE:$ROOTFS_SIZE" \ + --net0 "name=eth0,bridge=$BRIDGE,ip=$IP,gw=$GATEWAY,type=veth" \ + --unprivileged 1 \ + --password "$ROOTPASS" -if [[ -n "$ROOTPASS" ]]; then - CREATE_CMD="$CREATE_CMD --password $ROOTPASS" -fi - -eval $CREATE_CMD || { echo -e "${RED}${INDENT}Fehler beim Erstellen des LXC!${RESET}"; exit 1; } - -# ---- WebUI-Konsole aktivieren ---- +# ---- WebUI Konsole ---- CONF_FILE="/etc/pve/lxc/$VMID.conf" -echo "lxc.tty.max = 2" >> "$CONF_FILE" -echo "lxc.pty.max = 2" >> "$CONF_FILE" -echo "features: nesting=1,keyctl=1" >> "$CONF_FILE" +{ + echo "lxc.tty.max = 2" + echo "lxc.pty.max = 2" + echo "features: nesting=1,keyctl=1" +} >> "$CONF_FILE" -# ---- Autostart aktivieren ---- -pct set $VMID --onboot 1 +# ---- Autostart ---- +pct set "$VMID" --onboot 1 -# ---- Container starten ---- -pct start $VMID +# ---- Starten ---- +pct start "$VMID" -# ---- Software installieren ---- -echo -e "${INDENT}Installiere Newt-PVE-Mgnt..." -pct exec $VMID -- bash -c " +# ---- Post-Install ---- +$DIALOG --infobox "Installiere Newt-PVE-MGNT im LXC..." 5 60 + +pct exec "$VMID" -- bash -c " apt update && apt install -y curl sudo && curl -fsSL https://gitea.vmd55888.de/manuel.maier/update-install-newt/raw/branch/main/install_newt_v2.sh -o install_newt_v2.sh && bash ./install_newt_v2.sh --install " -echo -e "${GREEN}${INDENT}✔ Unprivilegierter LXC $HOSTNAME (VMID $VMID) erstellt, gestartet und Autostart aktiviert!${RESET}" \ No newline at end of file +# ---- Fertig ---- +$DIALOG --backtitle "$BACKTITLE" \ + --msgbox \ +"LXC erfolgreich erstellt! + +Name: $HOSTNAME +VMID: $VMID +Autostart: aktiv +Status: gestartet" 10 50