ContextStudioWizard/lib/prereqs.sh
Karamelmar 431e5493fc Fix set -e bug causing silent exit after valid input
- Replace all `[[ condition ]] && die` with `if/fi` — the && pattern
  exits silently when the condition is false under set -e
- Removed -e from set flags (kept -uo pipefail), all error paths are
  now explicit
- Declare `input` as local in ask/ask_yn/ask_choice to prevent leakage
- Use `read -r input || true` to handle EOF safely
- Fix ask_choice arithmetic to avoid (()) triggering exit on false

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 12:11:31 +01:00

145 lines
4.5 KiB
Bash

#!/usr/bin/env bash
# prereqs.sh — detect distro, install missing prerequisites
# Detect package manager / distro family
detect_distro() {
if command -v pacman &>/dev/null; then echo "arch";
elif command -v apt-get &>/dev/null; then echo "debian";
elif command -v dnf &>/dev/null; then echo "rhel";
elif command -v yum &>/dev/null; then echo "rhel-yum";
elif command -v zypper &>/dev/null; then echo "suse";
else echo "unknown";
fi
}
install_pkg() {
local pkg="$1"
local distro
distro="$(detect_distro)"
info "Installing $pkg (distro: $distro)..."
case "$distro" in
arch)
sudo pacman -Sy --noconfirm "$pkg" ;;
debian)
sudo apt-get update -qq && sudo apt-get install -y "$pkg" ;;
rhel)
sudo dnf install -y "$pkg" ;;
rhel-yum)
sudo yum install -y "$pkg" ;;
suse)
sudo zypper install -y "$pkg" ;;
*)
die "Unsupported distro — please install $pkg manually." ;;
esac
}
ensure_git() {
if command -v git &>/dev/null; then
success "git: $(git --version)"
return
fi
warn "git not found."
ask_yn _install "Install git now?" "y"
if [[ "$_install" != "y" ]]; then die "git is required."; fi
install_pkg git
command -v git &>/dev/null || die "git installation failed."
success "git installed: $(git --version)"
}
ensure_container_runtime() {
# Already available?
if command -v podman &>/dev/null; then
CONTAINER_CMD="podman"
success "podman: $(podman --version)"
return
fi
if command -v docker &>/dev/null; then
CONTAINER_CMD="docker"
success "docker: $(docker --version | head -1)"
return
fi
warn "No container runtime found (podman or docker)."
echo ""
echo -e " ${CYAN}podman${RESET} is preferred (rootless, no daemon)"
echo -e " ${CYAN}docker${RESET} is the alternative"
echo ""
ask_choice _runtime "Which would you like to install?" \
"podman (recommended)" \
"docker"
local runtime_choice="$_runtime"
case "$runtime_choice" in
podman*)
_install_podman
CONTAINER_CMD="podman"
;;
docker*)
_install_docker
CONTAINER_CMD="docker"
;;
esac
command -v "$CONTAINER_CMD" &>/dev/null \
|| die "$CONTAINER_CMD installation failed. Please install manually."
success "$CONTAINER_CMD installed: $($CONTAINER_CMD --version | head -1)"
}
_install_podman() {
local distro
distro="$(detect_distro)"
case "$distro" in
arch) install_pkg podman ;;
debian) install_pkg podman ;;
rhel) install_pkg podman ;;
rhel-yum) install_pkg podman ;;
suse) install_pkg podman ;;
*) die "Unsupported distro — install podman manually: https://podman.io/getting-started/installation" ;;
esac
}
_install_docker() {
local distro
distro="$(detect_distro)"
case "$distro" in
arch)
install_pkg docker
sudo systemctl enable --now docker
sudo usermod -aG docker "$USER"
warn "Added $USER to docker group — log out and back in for it to take effect."
;;
debian)
install_pkg docker.io
sudo systemctl enable --now docker
sudo usermod -aG docker "$USER"
warn "Added $USER to docker group — log out and back in for it to take effect."
;;
rhel)
install_pkg docker
sudo systemctl enable --now docker
sudo usermod -aG docker "$USER"
warn "Added $USER to docker group — log out and back in for it to take effect."
;;
rhel-yum)
install_pkg docker
sudo systemctl enable --now docker
sudo usermod -aG docker "$USER"
warn "Added $USER to docker group — log out and back in for it to take effect."
;;
suse)
install_pkg docker
sudo systemctl enable --now docker
sudo usermod -aG docker "$USER"
warn "Added $USER to docker group — log out and back in for it to take effect."
;;
*)
die "Unsupported distro — install docker manually: https://docs.docker.com/engine/install/" ;;
esac
}
check_prerequisites() {
header "Checking Prerequisites"
ensure_git
ensure_container_runtime
}