Fix: Update-Check Bootstrap — --check-only Flag in mailwolt-update
Problem: Henne-Ei-Situation — alte Server haben alte CheckUpdates.php die
git fetch als www-data aufruft (schlägt wegen fehlender Credentials fehl).
Neue mailwolt-fetch-tags Helper sind noch nicht deployed.
Lösung:
- scripts/update.sh: --check-only Flag — ruft nur git ls-remote als App-User
auf, schreibt version_remote, beendet sich sofort (kein Update)
- update.sh: schreibt version_remote auch nach normalem Tag-Fetch (damit es
nach manuellen Updates aktuell bleibt)
- CheckUpdates.php: sichere Fallback-Kette:
1. mailwolt-update --check-only (nur wenn Skript das Flag kennt — kein
versehentliches Triggern auf alten Servern)
2. mailwolt-fetch-tags (ab v1.1.268)
3. lokale git tags (letzter Fallback)
+ version_remote wird nur verwendet wenn < 2h alt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
main
v1.1.270
parent
f740ffc753
commit
ae3b1e6b14
|
|
@ -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"));
|
||||
|
||||
|
|
|
|||
|
|
@ -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}"
|
||||
|
|
|
|||
Loading…
Reference in New Issue