Files
update-install-newt/install_newt.sh

183 lines
5.1 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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" >&2
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 (nicht angezeigt aus Sicherheitsgründen)"
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}
echo "[DEBUG] Version ist: '$version'"
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}
echo "[DEBUG] Version ist: '$version'"
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}
echo "[DEBUG] Version ist: '$version'"
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 "$@"