ZIP fallback обновления был добавлен
Этот коммит содержится в:
@@ -7,8 +7,10 @@ STATE_FILE="${STATE_DIR}/state.json"
|
|||||||
LOG_FILE="/var/log/virtuality/update.log"
|
LOG_FILE="/var/log/virtuality/update.log"
|
||||||
REMOTE="${VIRTUALITY_UPDATE_REMOTE:-origin}"
|
REMOTE="${VIRTUALITY_UPDATE_REMOTE:-origin}"
|
||||||
BRANCH="${VIRTUALITY_UPDATE_BRANCH:-main}"
|
BRANCH="${VIRTUALITY_UPDATE_BRANCH:-main}"
|
||||||
|
REPO_ZIP_URL="${VIRTUALITY_UPDATE_ZIP_URL:-https://github.com/viktor138irk/virtuality/archive/refs/heads/${BRANCH}.zip}"
|
||||||
|
TMP_DIR="${STATE_DIR}/tmp"
|
||||||
|
|
||||||
mkdir -p "$STATE_DIR" "$(dirname "$LOG_FILE")"
|
mkdir -p "$STATE_DIR" "$TMP_DIR" "$(dirname "$LOG_FILE")"
|
||||||
|
|
||||||
now() { date '+%Y-%m-%d %H:%M:%S'; }
|
now() { date '+%Y-%m-%d %H:%M:%S'; }
|
||||||
json_escape() { python3 -c 'import json,sys; print(json.dumps(sys.stdin.read())[1:-1])'; }
|
json_escape() { python3 -c 'import json,sys; print(json.dumps(sys.stdin.read())[1:-1])'; }
|
||||||
@@ -38,6 +40,70 @@ run_step() {
|
|||||||
exit $code
|
exit $code
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
try_run() {
|
||||||
|
log "TRY: $*"
|
||||||
|
"$@" >> "$LOG_FILE" 2>&1
|
||||||
|
return $?
|
||||||
|
}
|
||||||
|
|
||||||
|
fetch_zip_update() {
|
||||||
|
local zip_file extract_dir extracted_root
|
||||||
|
zip_file="${TMP_DIR}/virtuality-${BRANCH}.zip"
|
||||||
|
extract_dir="${TMP_DIR}/zip-update"
|
||||||
|
rm -rf "$zip_file" "$extract_dir"
|
||||||
|
mkdir -p "$extract_dir"
|
||||||
|
|
||||||
|
log "Fallback update via ZIP started"
|
||||||
|
log "ZIP URL: $REPO_ZIP_URL"
|
||||||
|
write_state "running" "GitHub git fetch не сработал, пробуем ZIP fallback"
|
||||||
|
|
||||||
|
if command -v curl >/dev/null 2>&1; then
|
||||||
|
if ! try_run curl -L --connect-timeout 20 --max-time 240 --retry 3 --retry-delay 3 -o "$zip_file" "$REPO_ZIP_URL"; then
|
||||||
|
log "curl ZIP download failed"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
elif command -v wget >/dev/null 2>&1; then
|
||||||
|
if ! try_run wget -T 240 -t 3 -O "$zip_file" "$REPO_ZIP_URL"; then
|
||||||
|
log "wget ZIP download failed"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "ERROR: neither curl nor wget found"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -s "$zip_file" ]; then
|
||||||
|
log "ERROR: downloaded ZIP is empty: $zip_file"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command -v unzip >/dev/null 2>&1; then
|
||||||
|
if ! try_run unzip -q "$zip_file" -d "$extract_dir"; then
|
||||||
|
log "unzip failed"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "ERROR: unzip not found"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
extracted_root="$(find "$extract_dir" -mindepth 1 -maxdepth 1 -type d | head -1)"
|
||||||
|
if [ -z "$extracted_root" ] || [ ! -f "$extracted_root/install.sh" ]; then
|
||||||
|
log "ERROR: extracted repo root invalid: $extracted_root"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "ZIP extracted root: $extracted_root"
|
||||||
|
log "Syncing ZIP content into $SOURCE_DIR"
|
||||||
|
mkdir -p "$SOURCE_DIR"
|
||||||
|
if ! try_run rsync -a --delete --exclude='.git/' "$extracted_root/" "$SOURCE_DIR/"; then
|
||||||
|
log "rsync from ZIP fallback failed"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "ZIP fallback sync completed"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
STARTED_AT="$(now)"
|
STARTED_AT="$(now)"
|
||||||
write_state "running" "Обновление запущено"
|
write_state "running" "Обновление запущено"
|
||||||
@@ -46,47 +112,64 @@ log "Virtuality GitHub update started"
|
|||||||
log "source: $SOURCE_DIR"
|
log "source: $SOURCE_DIR"
|
||||||
log "remote: $REMOTE"
|
log "remote: $REMOTE"
|
||||||
log "branch: $BRANCH"
|
log "branch: $BRANCH"
|
||||||
|
log "zip fallback: $REPO_ZIP_URL"
|
||||||
|
|
||||||
if [ ! -d "$SOURCE_DIR/.git" ]; then
|
BEFORE_COMMIT="unknown"
|
||||||
log "ERROR: git repository not found: $SOURCE_DIR"
|
BEFORE_VERSION="$(cat "$SOURCE_DIR/VERSION" 2>/dev/null || echo unknown)"
|
||||||
write_state "error" "Не найден git-репозиторий: $SOURCE_DIR"
|
if [ -d "$SOURCE_DIR/.git" ]; then
|
||||||
exit 1
|
cd "$SOURCE_DIR" || exit 1
|
||||||
|
BEFORE_COMMIT="$(git rev-parse HEAD 2>/dev/null || true)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd "$SOURCE_DIR" || exit 1
|
|
||||||
|
|
||||||
BEFORE_COMMIT="$(git rev-parse HEAD 2>/dev/null || true)"
|
|
||||||
BEFORE_VERSION="$(cat VERSION 2>/dev/null || echo unknown)"
|
|
||||||
log "before commit: $BEFORE_COMMIT"
|
log "before commit: $BEFORE_COMMIT"
|
||||||
log "before version: $BEFORE_VERSION"
|
log "before version: $BEFORE_VERSION"
|
||||||
|
|
||||||
write_state "running" "Получаем изменения из GitHub"
|
GIT_UPDATED=0
|
||||||
run_step git fetch "$REMOTE" "$BRANCH"
|
if [ -d "$SOURCE_DIR/.git" ]; then
|
||||||
|
cd "$SOURCE_DIR" || exit 1
|
||||||
TARGET_REF="${REMOTE}/${BRANCH}"
|
write_state "running" "Получаем изменения из GitHub через git"
|
||||||
TARGET_COMMIT="$(git rev-parse "$TARGET_REF" 2>/dev/null || true)"
|
if try_run git fetch "$REMOTE" "$BRANCH"; then
|
||||||
if [ -z "$TARGET_COMMIT" ]; then
|
TARGET_REF="${REMOTE}/${BRANCH}"
|
||||||
log "ERROR: remote ref not found: $TARGET_REF"
|
TARGET_COMMIT="$(git rev-parse "$TARGET_REF" 2>/dev/null || true)"
|
||||||
write_state "error" "Не найден удалённый ref: $TARGET_REF"
|
if [ -n "$TARGET_COMMIT" ]; then
|
||||||
exit 1
|
LOCAL_STATUS="$(git status --porcelain 2>/dev/null || true)"
|
||||||
|
if [ -n "$LOCAL_STATUS" ]; then
|
||||||
|
log "Local changes before update:"
|
||||||
|
printf '%s\n' "$LOCAL_STATUS" >> "$LOG_FILE"
|
||||||
|
fi
|
||||||
|
write_state "running" "Синхронизируем исходники с GitHub через git reset"
|
||||||
|
log "Deploy mode: git reset --hard $TARGET_REF"
|
||||||
|
if try_run git reset --hard "$TARGET_REF" && try_run git clean -fd; then
|
||||||
|
GIT_UPDATED=1
|
||||||
|
else
|
||||||
|
log "git reset/clean failed, ZIP fallback will be used"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "remote ref not found after fetch: $TARGET_REF"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "git fetch failed, ZIP fallback will be used"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "git repository not found, ZIP fallback will be used"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
LOCAL_STATUS="$(git status --porcelain 2>/dev/null || true)"
|
if [ "$GIT_UPDATED" != "1" ]; then
|
||||||
if [ -n "$LOCAL_STATUS" ]; then
|
if ! fetch_zip_update; then
|
||||||
log "Local changes before update:"
|
write_state "error" "Не удалось обновиться ни через git, ни через ZIP fallback. Проверь доступ к github.com, curl/wget/unzip и DNS."
|
||||||
printf '%s\n' "$LOCAL_STATUS" >> "$LOG_FILE"
|
exit 1
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
write_state "running" "Синхронизируем исходники с GitHub"
|
AFTER_COMMIT="unknown"
|
||||||
log "Deploy mode: git reset --hard $TARGET_REF"
|
if [ -d "$SOURCE_DIR/.git" ]; then
|
||||||
run_step git reset --hard "$TARGET_REF"
|
cd "$SOURCE_DIR" || exit 1
|
||||||
run_step git clean -fd
|
AFTER_COMMIT="$(git rev-parse HEAD 2>/dev/null || true)"
|
||||||
|
fi
|
||||||
AFTER_COMMIT="$(git rev-parse HEAD 2>/dev/null || true)"
|
AFTER_VERSION="$(cat "$SOURCE_DIR/VERSION" 2>/dev/null || echo unknown)"
|
||||||
AFTER_VERSION="$(cat VERSION 2>/dev/null || echo unknown)"
|
|
||||||
log "after commit: $AFTER_COMMIT"
|
log "after commit: $AFTER_COMMIT"
|
||||||
log "after version: $AFTER_VERSION"
|
log "after version: $AFTER_VERSION"
|
||||||
|
|
||||||
|
cd "$SOURCE_DIR" || exit 1
|
||||||
write_state "running" "Запускаем установщик web-панели"
|
write_state "running" "Запускаем установщик web-панели"
|
||||||
run_step bash scripts/install_web_panel.sh
|
run_step bash scripts/install_web_panel.sh
|
||||||
|
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user