#!/usr/bin/env bash set -euo pipefail IFS=$'\n\t' ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" CONFIG_DIR="$ROOT_DIR/config" GLOBAL_CONFIG="$CONFIG_DIR/global/config.json" ensure_dirs() { mkdir -p "$CONFIG_DIR/global" "$CONFIG_DIR/projects" "$CONFIG_DIR/registries" "$ROOT_DIR/projects" if [[ ! -f "$GLOBAL_CONFIG" ]]; then cat >"$GLOBAL_CONFIG" </dev/null 2>&1; then echo "[WARN] Benötigtes Programm fehlt: $b" fi done } # ------------------------- # Konfigurations-Menü # ------------------------- config_menu() { while true; do local builder_status builder_status=$(get_builder_status) choice=$(whiptail --title "Konfiguration" --menu "Bitte wählen:" 20 70 10 \ 1 "Abhängigkeiten installieren (docker, git, jq, whiptail)" \ 2 "Buildx-Builder einrichten | Builder-Status: $builder_status" \ 3 "Globalen Editor setzen" \ 0 "Zurück" \ 3>&1 1>&2 2>&3) || return case $choice in 1) install_dependencies;; 2) install_docker_and_buildx;; 3) set_editor;; 0) return;; esac done } get_builder_status() { if docker buildx ls 2>/dev/null | grep -q "multiarch-builder"; then if docker buildx ls | grep "multiarch-builder" | grep -q "running"; then echo "[läuft]" else echo "[vorhanden, aber gestoppt]" fi else echo "[nicht eingerichtet]" fi } install_dependencies() { whiptail --msgbox "Installation von Abhängigkeiten (Beispiel für Debian/Ubuntu). Bitte root-Rechte eingeben." 10 70 sudo apt update sudo apt install -y docker.io git jq whiptail micro } install_docker_and_buildx() { # Prüfen ob Docker installiert ist if ! command -v docker >/dev/null 2>&1; then whiptail --msgbox "Docker ist nicht installiert! Bitte zuerst über 'Abhängigkeiten installieren' einrichten." 10 70 return fi # Prüfen ob Buildx verfügbar ist if ! docker buildx version >/dev/null 2>&1; then whiptail --msgbox "Docker Buildx-Plugin fehlt! Installiere Buildx..." 10 70 mkdir -p ~/.docker/cli-plugins BUILDX_URL="https://github.com/docker/buildx/releases/latest/download/buildx-$(uname -s)-$(uname -m)" curl -sSL "$BUILDX_URL" -o ~/.docker/cli-plugins/docker-buildx chmod +x ~/.docker/cli-plugins/docker-buildx fi # Prüfen, ob multiarch-builder existiert if ! docker buildx ls | grep -q "multiarch-builder"; then whiptail --msgbox "Richte Buildx-Builder 'multiarch-builder' ein..." 10 70 docker run --rm --privileged tonistiigi/binfmt --install all docker buildx create --name multiarch-builder --use docker buildx inspect --bootstrap >/dev/null 2>&1 fi # Finalprüfung: existiert Builder jetzt wirklich? if docker buildx ls | grep -q "multiarch-builder"; then whiptail --msgbox "Buildx-Builder 'multiarch-builder' erfolgreich eingerichtet." 10 70 else whiptail --msgbox "Fehler: Buildx-Builder konnte nicht eingerichtet werden!" 10 70 fi } set_editor() { # editor -> paketname declare -A editor_pkg editor_pkg=( ["nano"]="nano" ["vim"]="vim" ["micro"]="micro" ["nvim"]="neovim" ) local options=() declare -A editor_status # Prüfe, ob Editor installiert ist for cmd in "${!editor_pkg[@]}"; do if command -v "$cmd" >/dev/null 2>&1; then editor_status[$cmd]="(installiert)" else editor_status[$cmd]="(nicht installiert)" fi options+=("$cmd" "${editor_status[$cmd]}") done while true; do choice=$(whiptail --title "Editor wählen" --menu "Bitte Editor auswählen:" 20 70 10 "${options[@]}" 3>&1 1>&2 2>&3) || return if command -v "$choice" >/dev/null 2>&1; then jq --arg ed "$choice" '.editor = $ed' "$GLOBAL_CONFIG" >"$GLOBAL_CONFIG.tmp" && mv "$GLOBAL_CONFIG.tmp" "$GLOBAL_CONFIG" whiptail --msgbox "Editor wurde auf '$choice' gesetzt." 10 60 return else install_choice=$(whiptail --title "Editor nicht installiert" \ --yesno "Der Editor '$choice' ist nicht installiert. Möchten Sie ihn jetzt installieren?" 10 60 3>&1 1>&2 2>&3) if [[ $? -eq 0 ]]; then whiptail --msgbox "Installation von ${editor_pkg[$choice]}..." 8 50 sudo apt update sudo apt install -y "${editor_pkg[$choice]}" if command -v "$choice" >/dev/null 2>&1; then whiptail --msgbox "$choice erfolgreich installiert." 8 50 jq --arg ed "$choice" '.editor = $ed' "$GLOBAL_CONFIG" >"$GLOBAL_CONFIG.tmp" && mv "$GLOBAL_CONFIG.tmp" "$GLOBAL_CONFIG" return else whiptail --msgbox "Fehler: $choice konnte nicht installiert werden." 8 50 fi fi fi done } # ------------------------- # Hauptmenü # ------------------------- main_menu() { while true; do choice=$(whiptail --title "Image Builder" --menu "Bitte wählen:" 20 70 10 \ 1 "Konfiguration" \ 2 "Projektverwaltung" \ 3 "Repository-Verwaltung" \ 4 "Image-Bauen" \ 5 "Image-Verwaltung" \ 0 "Beenden" \ 3>&1 1>&2 2>&3) || exit 0 case $choice in 1) config_menu;; 2) whiptail --msgbox "Projektverwaltung (noch nicht implementiert)" 10 70;; 3) whiptail --msgbox "Repository-Verwaltung (noch nicht implementiert)" 10 70;; 4) whiptail --msgbox "Image-Bauen (noch nicht implementiert)" 10 70;; 5) whiptail --msgbox "Image-Verwaltung (noch nicht implementiert)" 10 70;; 0) exit 0;; esac done } # ------------------------- # Main # ------------------------- ensure_dirs ensure_prereqs main_menu