From 4fab43b92177b30275b157d40b9a07c26dd01c17 Mon Sep 17 00:00:00 2001 From: NATroutter Date: Thu, 18 Jun 2026 00:46:51 +0300 Subject: [PATCH] Handle expired Hytale downloader authentication - Detect expired downloader credentials from invalid_grant refresh-token errors - Clear stale downloader credential cache and rerun initial setup - Avoid treating downloader error output as a valid server version - Only save version and patchline state after successful downloads - Validate server.zip exists before extraction - Stream downloader output during downloads so auth prompts remain visible --- lib/downloader.sh | 108 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 96 insertions(+), 12 deletions(-) diff --git a/lib/downloader.sh b/lib/downloader.sh index 0a16458..e1fc5dd 100644 --- a/lib/downloader.sh +++ b/lib/downloader.sh @@ -68,6 +68,49 @@ update_downloader() { fi } +downloader_output_has_expired_auth() { + printf "%s" "$1" | grep -qiE "invalid_grant|refresh token expired|authorization grant" +} + +clear_downloader_credentials() { + logger warn "Hytale downloader authentication expired; clearing cached downloader credentials." + rm -f "$DOWNLOAD_CRED_FILE" +} + +download_server_archive() { + local DOWNLOAD_LOG_FILE="" + local DOWNLOAD_STATUS=0 + + DOWNLOAD_LOG_FILE=$(mktemp) + if [ -z "$DOWNLOAD_LOG_FILE" ]; then + logger error "Failed to create temporary downloader log file." + return 1 + fi + + $DOWNLOADER -patchline "$PATCHLINE" -download-path server.zip 2>&1 | tee "$DOWNLOAD_LOG_FILE" + DOWNLOAD_STATUS=${PIPESTATUS[0]} + + if grep -qiE "invalid_grant|refresh token expired|authorization grant" "$DOWNLOAD_LOG_FILE"; then + clear_downloader_credentials + rm -f "$DOWNLOAD_LOG_FILE" + return 2 + fi + + if [ "$DOWNLOAD_STATUS" -ne 0 ]; then + rm -f "$DOWNLOAD_LOG_FILE" + return 1 + fi + + if [ ! -f "server.zip" ]; then + logger error "Downloader completed but server.zip was not created." + rm -f "$DOWNLOAD_LOG_FILE" + return 1 + fi + + rm -f "$DOWNLOAD_LOG_FILE" + return 0 +} + ensure_aot_cache() { local AOT_CONFIG_FILE="HytaleServer.aot.config" local AOT_CACHE_FILE="HytaleServer.aot" @@ -148,7 +191,16 @@ run_update_process() { if [ "$PATCHLINE" != "$CACHED_PATCHLINE" ]; then logger warn "Patchline mismatch, running update..." $DOWNLOADER -check-update - $DOWNLOADER -patchline $PATCHLINE -download-path server.zip + download_server_archive + local DOWNLOAD_STATUS=$? + + if [ "$DOWNLOAD_STATUS" -eq 2 ]; then + run_initial_setup + return 0 + elif [ "$DOWNLOAD_STATUS" -ne 0 ]; then + logger error "Failed to download Hytale server files." + exit 1 + fi save_patchline_version extract_server_files @@ -167,11 +219,12 @@ run_patchline_change() { logger info "Updating server to patchline: $PATCHLINE" $DOWNLOADER -check-update - if ! $DOWNLOADER -patchline $PATCHLINE -download-path server.zip; then + download_server_archive + local DOWNLOAD_STATUS=$? + + if [ "$DOWNLOAD_STATUS" -ne 0 ]; then echo "" logger error "Failed to download Hytale server files." - logger warn "Removing invalid credential file..." - rm -f $DOWNLOAD_CRED_FILE exit 1 fi @@ -196,11 +249,12 @@ run_initial_setup() { printc "{MAGENTA}╚══════════════════════════════════════════════════════════════════════════════════════╝" echo " " - if ! $DOWNLOADER -patchline $PATCHLINE -download-path server.zip; then + download_server_archive + local DOWNLOAD_STATUS=$? + + if [ "$DOWNLOAD_STATUS" -ne 0 ]; then echo "" logger error "Failed to download Hytale server files." - logger warn "Removing invalid credential file..." - rm -f $DOWNLOAD_CRED_FILE exit 1 fi @@ -216,14 +270,26 @@ run_auto_update() { local LOCAL_VERSION="" if [ -f "$VERSION_FILE" ]; then LOCAL_VERSION=$(cat $VERSION_FILE) + if downloader_output_has_expired_auth "$LOCAL_VERSION"; then + logger warn "Ignoring invalid cached version info from expired downloader authentication." + LOCAL_VERSION="" + fi else logger warn "Version file not found, forcing update" fi local DOWNLOADER_VERSION=$($DOWNLOADER -print-version -skip-update-check 2>&1) + local VERSION_STATUS=$? - if [ $? -ne 0 ] || [ -z "$DOWNLOADER_VERSION" ]; then - logger error "Failed to get downloader version." + if downloader_output_has_expired_auth "$DOWNLOADER_VERSION"; then + clear_downloader_credentials + run_initial_setup + return 0 + fi + + if [ "$VERSION_STATUS" -ne 0 ] || [ -z "$DOWNLOADER_VERSION" ]; then + logger error "Failed to get available server version." + logger info "Response: $DOWNLOADER_VERSION" exit 1 else if [ -n "$LOCAL_VERSION" ]; then @@ -234,7 +300,16 @@ run_auto_update() { if [ "$LOCAL_VERSION" != "$DOWNLOADER_VERSION" ]; then logger warn "Version mismatch, running update..." $DOWNLOADER -check-update - $DOWNLOADER -patchline $PATCHLINE -download-path server.zip + download_server_archive + local DOWNLOAD_STATUS=$? + + if [ "$DOWNLOAD_STATUS" -eq 2 ]; then + run_initial_setup + return 0 + elif [ "$DOWNLOAD_STATUS" -ne 0 ]; then + logger error "Failed to download Hytale server files." + exit 1 + fi save_patchline_version save_downloader_version @@ -254,11 +329,20 @@ save_patchline_version() { save_downloader_version() { local DOWNLOADER_VERSION=$($DOWNLOADER -print-version -skip-update-check 2>&1) - if [ $? -eq 0 ] && [ -n "$DOWNLOADER_VERSION" ]; then + local VERSION_STATUS=$? + + if downloader_output_has_expired_auth "$DOWNLOADER_VERSION"; then + clear_downloader_credentials + logger error "Failed to save version info because downloader authentication expired." + exit 1 + fi + + if [ "$VERSION_STATUS" -eq 0 ] && [ -n "$DOWNLOADER_VERSION" ]; then echo "$DOWNLOADER_VERSION" > $VERSION_FILE logger success "Saved version info!" else - logger error "Failed to get downloader version." + logger error "Failed to get available server version." + logger info "Response: $DOWNLOADER_VERSION" exit 1 fi }