Files
update-install-newt/install_newt.sh

164 lines
4.2 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 -e
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() {
curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest" | grep -Po '"tag_name": *"\K[^"]+'
}
download_newt() {
version="$1"
arch=$(uname -m)
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() {
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() {
info "🛠️ Erstelle systemd-Dienst ${SERVICE_NAME} ..."
read -rp "🆔 Bitte gib die Pangolin-ID ein: " PANGOLIN_ID
read -rp "🔑 Bitte gib das Secret ein: " PANGOLIN_SECRET
read -rp "🌐 Bitte gib den Endpoint (z.B. https://pangolin.domain.de) ein: " PANGOLIN_ENDPOINT
cat <<EOF | sudo tee "$SERVICE_FILE" > /dev/null
[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
EOF
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() {
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() {
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() {
version=$(get_latest_version)
version=${version#v}
info "📦 Neueste Version: ${version}"
download_newt "$version"
cleanup_old_versions
sudo rm -f "$SERVICE_FILE" || true
setup_systemd_service
info "🚀 Reinstallation abgeschlossen!"
}
main() {
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 "$@"