diff --git a/app/Console/Commands/CheckUpdates.php b/app/Console/Commands/CheckUpdates.php index 536c03d..4b3d8ba 100644 --- a/app/Console/Commands/CheckUpdates.php +++ b/app/Console/Commands/CheckUpdates.php @@ -16,14 +16,27 @@ class CheckUpdates extends Command $appPath = base_path(); - // Fetch remote tags via privileged helper (www-data has no git credentials for private repo) + // www-data hat keine git-Credentials für private Repos. + // Fallback-Kette (erste funktionierende Methode gewinnt): + // 1. mailwolt-update --check-only (verfügbar wenn update.sh neu genug, sudoers: mailwolt-update) + // 2. mailwolt-fetch-tags (verfügbar ab v1.1.268) + // Sicherheitscheck: --check-only nur aufrufen wenn das Skript das Flag auch kennt. + $updateBin = '/usr/local/sbin/mailwolt-update'; $fetchHelper = '/usr/local/sbin/mailwolt-fetch-tags'; - if (file_exists($fetchHelper)) { + + if (file_exists($updateBin) && str_contains((string) @file_get_contents($updateBin), '--check-only')) { + shell_exec('sudo -n ' . escapeshellarg($updateBin) . ' --check-only 2>/dev/null'); + } elseif (file_exists($fetchHelper)) { shell_exec('sudo -n ' . escapeshellarg($fetchHelper) . ' 2>/dev/null'); } - // Latest remote tag written by helper; fall back to local tags - $remoteRaw = trim((string) @file_get_contents('/var/lib/mailwolt/version_remote')); + // Version_remote wurde von einem der Helfer geschrieben; frisch genug wenn < 2h alt + $remoteFile = '/var/lib/mailwolt/version_remote'; + $remoteRaw = ''; + if (file_exists($remoteFile) && (time() - filemtime($remoteFile)) < 7200) { + $remoteRaw = trim((string) file_get_contents($remoteFile)); + } + $latestTagRaw = $remoteRaw !== '' ? $remoteRaw : trim((string) shell_exec("git -C " . escapeshellarg($appPath) . " tag -l 'v*' --sort=-v:refname 2>/dev/null | head -n1")); diff --git a/scripts/update.sh b/scripts/update.sh index c749575..a973a04 100644 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -9,6 +9,19 @@ BRANCH="${BRANCH:-main}" MODE="${UPDATE_MODE:-tags}" ALLOW_DIRTY="${ALLOW_DIRTY:-0}" +# -------- --check-only: nur Remote-Tags holen, Version schreiben, sicher beenden --- +# (wird von CheckUpdates via sudo aufgerufen — kein Update, nur Versionsprüfung) +if [[ "${1:-}" == "--check-only" ]]; then + LATEST="$(sudo -u "$APP_USER" bash -c \ + "git -C '${APP_DIR}' ls-remote --tags --sort=-v:refname origin 'v*' 2>/dev/null \ + | grep -v '\^{}' | head -1 | sed 's|.*refs/tags/||'" 2>/dev/null || true)" + if [[ -n "$LATEST" ]]; then + mkdir -p /var/lib/mailwolt + printf '%s\n' "$LATEST" > /var/lib/mailwolt/version_remote + fi + exit 0 +fi + STATE_DIR="/var/lib/mailwolt/update" LOCK_FILE="/var/run/mailwolt-update.lock" LOG_FILE="/var/log/mailwolt-update.log" @@ -174,6 +187,8 @@ if [[ "$MODE" = "tags" ]]; then # → Neueste Tags holen as_app "git -C ${APP_DIR} fetch --quiet origin && git -C ${APP_DIR} fetch --tags --quiet origin || true" LATEST_TAG="$(as_app "git -C ${APP_DIR} describe --tags --abbrev=0 \$(git -C ${APP_DIR} rev-list --tags --max-count=1 2>/dev/null) 2>/dev/null || echo ''")" + # Neuesten Remote-Tag cachen für CheckUpdates (läuft als www-data ohne git-Credentials) + [[ -n "$LATEST_TAG" ]] && { mkdir -p /var/lib/mailwolt; printf '%s\n' "$LATEST_TAG" > /var/lib/mailwolt/version_remote; } || true if [[ -z "$LATEST_TAG" ]]; then echo "[!] Keine Tags gefunden – falle auf origin/${BRANCH} zurück" as_app "git -C ${APP_DIR} checkout -q ${BRANCH} && git -C ${APP_DIR} pull --ff-only origin ${BRANCH}"