#!/bin/bash set -ex # -e = Abbruch bei Fehler, -x = Ausgabe jeder ausgeführten Zeile GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' REPO="fosrl/newt" INSTALL_DIR="/opt/newt" SERVICE_NAME="PVE-MGNT" SYMLINK="${INSTALL_DIR}/newt_latest" SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service" info() { echo -e "${GREEN}[INFO]${NC} $1"; } warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } error() { echo -e "${RED}[ERROR]${NC} $1"; } MODE="auto" for arg in "$@"; do case "$arg" in --install) MODE="install" ;; --update) MODE="update" ;; --reinstall|--force) MODE="reinstall" ;; *) error "Unbekannter Parameter: $arg" && exit 1 ;; esac done get_latest_version() { echo "[DEBUG] get_latest_version aufgerufen" curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest" | grep -Po '"tag_name": *"\K[^"]+' } download_newt() { echo "[DEBUG] download_newt aufgerufen mit Version=$1" version="$1" arch=$(uname -m) echo "[DEBUG] Architektur erkannt: $arch" case "$arch" in x86_64) file="newt_linux_amd64" ;; aarch64) file="newt_linux_arm64" ;; armv7l) file="newt_linux_arm32" ;; *) error "Nicht unterstützte Architektur: $arch" && exit 1 ;; esac url="https://github.com/${REPO}/releases/download/${version}/${file}" target="${INSTALL_DIR}/newt_${version}" temp_target="${target}.tmp" mkdir -p "$INSTALL_DIR" info "⬇️ Lade $url herunter …" curl -fsSL "$url" -o "$temp_target" || { error "Download fehlgeschlagen."; rm -f "$temp_target"; exit 1; } chmod +x "$temp_target" mv "$temp_target" "$target" ln -sf "$target" "$SYMLINK" info "✅ newt ${version} installiert als ${target}" } cleanup_old_versions() { echo "[DEBUG] cleanup_old_versions aufgerufen" cd "$INSTALL_DIR" keep=$(readlink -f newt_latest) versions=($(ls -1 newt_* | grep -v latest | sort -Vr)) count=0 for ver in "${versions[@]}"; do if [[ "$(readlink -f "$ver")" != "$keep" ]]; then ((count++)) if [ "$count" -gt 1 ]; then info "🧹 Entferne alte Version: $ver" rm -f "$ver" fi fi done } setup_systemd_service() { echo "[DEBUG] setup_systemd_service aufgerufen" info "🛠️ Erstelle systemd-Dienst ${SERVICE_NAME} ..." # Eingabeaufforderungen im User-Kontext read -rp "🆔 Bitte gib die Pangolin-ID ein: " PANGOLIN_ID echo "[DEBUG] Pangolin-ID eingegeben: $PANGOLIN_ID" read -rp "🔑 Bitte gib das Secret ein: " PANGOLIN_SECRET echo "[DEBUG] Secret eingegeben (aus Sicherheitsgründen nicht ausgegeben)" read -rp "🌐 Bitte gib den Endpoint (z. B. https://pangolin.domain.de) ein: " PANGOLIN_ENDPOINT echo "[DEBUG] Endpoint eingegeben: $PANGOLIN_ENDPOINT" SERVICE_CONTENT="[Unit] Description=Newt Client - ${SERVICE_NAME} After=network.target [Service] ExecStart=${SYMLINK} --id ${PANGOLIN_ID} --secret ${PANGOLIN_SECRET} --endpoint ${PANGOLIN_ENDPOINT} Restart=always RestartSec=5 [Install] WantedBy=multi-user.target" echo "$SERVICE_CONTENT" | sudo tee "$SERVICE_FILE" > /dev/null sudo systemctl daemon-reexec sudo systemctl daemon-reload sudo systemctl enable "$SERVICE_NAME" sudo systemctl start "$SERVICE_NAME" info "✅ systemd-Dienst ${SERVICE_NAME} wurde eingerichtet und gestartet." } perform_install() { echo "[DEBUG] perform_install aufgerufen" if [ -f "$SERVICE_FILE" ]; then warn "Dienst ${SERVICE_NAME} existiert bereits. Nutze --reinstall für Neuinstallation." exit 0 fi version=$(get_latest_version) version=${version#v} info "📦 Neueste Version: ${version}" download_newt "$version" cleanup_old_versions setup_systemd_service info "🚀 Installation abgeschlossen!" } perform_update() { echo "[DEBUG] perform_update aufgerufen" if [ ! -f "$SERVICE_FILE" ]; then error "Dienst ${SERVICE_NAME} nicht installiert. Nutze --install oder --reinstall." exit 1 fi version=$(get_latest_version) version=${version#v} info "📦 Neueste Version: ${version}" if [ -f "${INSTALL_DIR}/newt_${version}" ]; then info "✅ Version ${version} ist bereits installiert. Kein Update nötig." else download_newt "$version" cleanup_old_versions sudo systemctl restart "$SERVICE_NAME" info "🔄 Dienst ${SERVICE_NAME} wurde neu gestartet." fi info "🚀 Update abgeschlossen!" } perform_reinstall() { echo "[DEBUG] perform_reinstall aufgerufen" version=$(get_latest_version) version=${version#v} info "📦 Neueste Version: ${version}" download_newt "$version" cleanup_old_versions sudo rm -f "$SERVICE_FILE" || true echo "[DEBUG] Vor setup_systemd_service" setup_systemd_service echo "[DEBUG] Nach setup_systemd_service" info "🚀 Reinstallation abgeschlossen!" } main() { echo "[DEBUG] main aufgerufen mit MODE=$MODE" case "$MODE" in install) perform_install ;; update) perform_update ;; reinstall) perform_reinstall ;; auto) if [ -f "$SERVICE_FILE" ]; then MODE="update" else MODE="install" fi main # rekursiver Aufruf mit gesetztem MODE ;; esac } main "$@"