#!/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" [[ "$_install" != "y" ]] && die "git is required." 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" case "$_runtime" 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 }