Agent update

This commit is contained in:
Frank Harris 2026-06-06 11:41:17 -05:00
parent c195c0930b
commit cc5f7bb90c
16 changed files with 474 additions and 85 deletions

View file

@ -1,41 +1,79 @@
@echo off
@title OGP Agent
FOR /f "tokens=2,3,4 delims=[.]" %%a IN ('ver') DO SET WVer=%%a
FOR /f "tokens=2,3 delims= " %%a IN ('echo %WVer%') DO SET Ver=%%a
setlocal EnableExtensions
title GSP Windows Agent
whoami /groups | find "S-1-16-12288" >nul 2>&1
if NOT %errorLevel% == 0 if %VER% GEQ 6 (
echo Failure: Current permissions inadequate.
echo[
echo Run this script by using "Run as administrator" in the context menu.
pause >nul
exit
if not "%errorLevel%" == "0" (
echo Failure: current permissions are inadequate.
echo.
echo Run this script with "Run as administrator".
pause
exit /b 1
)
set WD=%~dp0
pushd %WD%
set path=%WD%bin;%WD%usr\sbin;%path%
set CYGWIN=server ntsec
set SHELL=/bin/bash
set runAgentNormally=no
REM Stop any running agent
if exist %WD%var\run\pure-ftpd.pid set /p PID1=<%WD%var\run\pure-ftpd.pid
if exist %WD%OGP\ogp_agent.pid set /p PID2=<%WD%OGP\ogp_agent.pid
if exist %WD%OGP\ogp_agent_run.pid set /p PID3=<%WD%OGP\ogp_agent_run.pid
IF NOT [%PID1%] == [] kill -15 %PID1%
IF NOT [%PID2%] == [] kill -15 %PID2%
IF NOT [%PID3%] == [] kill -15 %PID3%
set "WD=%~dp0"
pushd "%WD%" >nul 2>&1
REM Check for gameserver user and if it exists and the user running this script matches, run it the normal way, else prompt for elevation
if "%username%" == "" set runAgentNormally=yes
if "%username%" == "gameserver" set runAgentNormally=yes
net user gameserver
if %ERRORLEVEL% EQU 0 (
if %runAgentNormally% == yes (
bash ogp_agent -pidfile /OGP/ogp_agent_run.pid
) else (
cygstart mintty /c "runas /profile /user:gameserver \"%WD%\bin\bash.exe %WD%\bin\ogp_agent -pidfile /OGP/ogp_agent_run.pid\""
set "CYGWIN_ROOT=%WD%"
if not exist "%CYGWIN_ROOT%OGP\ogp_agent.pl" (
if exist "%WD%..\OGP\ogp_agent.pl" (
for %%I in ("%WD%..") do set "CYGWIN_ROOT=%%~fI\"
)
) else (
bash ogp_agent -pidfile /OGP/ogp_agent_run.pid
)
set "BASH_EXE="
if exist "%CYGWIN_ROOT%bin\bash.exe" set "BASH_EXE=%CYGWIN_ROOT%bin\bash.exe"
if not defined BASH_EXE if exist "C:\cygwin64\bin\bash.exe" set "BASH_EXE=C:\cygwin64\bin\bash.exe"
if not defined BASH_EXE if exist "C:\cygwin\bin\bash.exe" set "BASH_EXE=C:\cygwin\bin\bash.exe"
if not defined BASH_EXE (
echo Failure: Cygwin bash.exe was not found.
echo.
echo Checked:
echo %CYGWIN_ROOT%bin\bash.exe
echo C:\cygwin64\bin\bash.exe
echo C:\cygwin\bin\bash.exe
pause
exit /b 1
)
set "PATH=%CYGWIN_ROOT%bin;%CYGWIN_ROOT%usr\sbin;%PATH%"
set "CYGWIN=server ntsec"
set "SHELL=/bin/bash"
set "HELPER=/Install/agent_start_cygwin.sh"
if exist "%CYGWIN_ROOT%OGP\Install\agent_start_cygwin.sh" set "HELPER=/OGP/Install/agent_start_cygwin.sh"
if not exist "%CYGWIN_ROOT%Install\agent_start_cygwin.sh" if not exist "%CYGWIN_ROOT%OGP\Install\agent_start_cygwin.sh" (
echo Failure: agent_start_cygwin.sh was not found.
echo.
echo Expected one of:
echo %CYGWIN_ROOT%Install\agent_start_cygwin.sh
echo %CYGWIN_ROOT%OGP\Install\agent_start_cygwin.sh
pause
exit /b 1
)
rem Stop any existing agent processes whose PID files still exist.
if exist "%CYGWIN_ROOT%var\run\pure-ftpd.pid" set /p PID1=<"%CYGWIN_ROOT%var\run\pure-ftpd.pid"
if exist "%CYGWIN_ROOT%OGP\ogp_agent.pid" set /p PID2=<"%CYGWIN_ROOT%OGP\ogp_agent.pid"
if exist "%CYGWIN_ROOT%OGP\ogp_agent_run.pid" set /p PID3=<"%CYGWIN_ROOT%OGP\ogp_agent_run.pid"
if defined PID1 kill -15 %PID1% >nul 2>&1
if defined PID2 kill -15 %PID2% >nul 2>&1
if defined PID3 kill -15 %PID3% >nul 2>&1
echo Starting GSP Windows Agent with:
echo %BASH_EXE%
echo.
"%BASH_EXE%" --login "%HELPER%" /OGP/ogp_agent_run.pid
set "AGENT_EXIT=%ERRORLEVEL%"
if not "%AGENT_EXIT%" == "0" (
echo.
echo GSP Windows Agent exited with error code %AGENT_EXIT%.
echo Review the messages above. The window is staying open so the failure is visible.
pause
exit /b %AGENT_EXIT%
)
popd >nul 2>&1
exit /b 0

View file

@ -0,0 +1,116 @@
#!/usr/bin/env bash
set -u
AGENT_DIR="/OGP"
PIDFILE="${1:-/OGP/ogp_agent_run.pid}"
PREFS_FILE="$AGENT_DIR/Cfg/bash_prefs.cfg"
REPO_URL_DEFAULT="http://forge.runlevelsystems.com/dev/GSP.git"
REPO_BRANCH_DEFAULT="Panel-unstable"
warn() {
printf 'WARNING: %s\n' "$*" >&2
}
fail() {
printf 'ERROR: %s\n' "$*" >&2
exit 1
}
normalize_text_files() {
local root="$1"
[ -d "$root" ] || return 0
find "$root" -type f \( -name '*.pl' -o -name '*.pm' -o -name '*.sh' -o -name '*.cfg' \) -print0 2>/dev/null |
while IFS= read -r -d '' file; do
sed -i 's/\r$//' "$file" 2>/dev/null || warn "Could not normalize line endings for $file"
done
}
load_agent_preferences() {
agent_auto_update=0
agent_update_repo_url="$REPO_URL_DEFAULT"
agent_update_branch="$REPO_BRANCH_DEFAULT"
if [ -f "$PREFS_FILE" ]; then
# shellcheck disable=SC1090
. "$PREFS_FILE"
fi
agent_auto_update="${agent_auto_update:-0}"
agent_update_repo_url="${agent_update_repo_url:-$REPO_URL_DEFAULT}"
agent_update_branch="${agent_update_branch:-$REPO_BRANCH_DEFAULT}"
}
auto_update_windows_agent() {
[ "$agent_auto_update" = "1" ] || {
echo "Agent auto-update is disabled."
return 0
}
if ! command -v git >/dev/null 2>&1; then
warn "git is not installed; skipping agent auto-update and using the current agent."
return 0
fi
local tmp_dir repo_dir source_file target_file backup_file
tmp_dir="$(mktemp -d /tmp/gsp-agent-update.XXXXXX 2>/dev/null)" || {
warn "Could not create temporary update directory; skipping auto-update."
return 0
}
repo_dir="$tmp_dir/repo"
target_file="$AGENT_DIR/ogp_agent.pl"
backup_file="$AGENT_DIR/ogp_agent.pl.bak.$(date +%Y%m%d%H%M%S)"
echo "Checking for Windows agent update from $agent_update_repo_url ($agent_update_branch)..."
if ! git clone --depth 1 --branch "$agent_update_branch" "$agent_update_repo_url" "$repo_dir"; then
warn "Agent auto-update clone failed; using the current agent."
rm -rf "$tmp_dir"
return 0
fi
source_file="$repo_dir/Agent-Windows/ogp_agent.pl"
if [ ! -f "$source_file" ]; then
warn "Updated Windows agent source was not found at Agent-Windows/ogp_agent.pl; using the current agent."
rm -rf "$tmp_dir"
return 0
fi
cp "$target_file" "$backup_file" 2>/dev/null || {
warn "Could not backup $target_file; skipping auto-update."
rm -rf "$tmp_dir"
return 0
}
if ! cp "$source_file" "$target_file"; then
warn "Could not copy updated Windows agent; restoring backup."
cp "$backup_file" "$target_file" 2>/dev/null
rm -rf "$tmp_dir"
return 0
fi
sed -i 's/\r$//' "$target_file" 2>/dev/null || true
if ! perl -c "$target_file"; then
warn "Updated Windows agent failed perl syntax validation; restoring backup."
cp "$backup_file" "$target_file" 2>/dev/null
perl -c "$target_file" || true
rm -rf "$tmp_dir"
return 0
fi
echo "Windows agent auto-update completed."
rm -rf "$tmp_dir"
return 0
}
cd "$AGENT_DIR" || fail "Could not enter $AGENT_DIR. Is the Windows agent installed under Cygwin /OGP?"
normalize_text_files "$AGENT_DIR"
normalize_text_files "/Install"
load_agent_preferences
auto_update_windows_agent
echo "Validating $AGENT_DIR/ogp_agent.pl..."
perl -c "$AGENT_DIR/ogp_agent.pl" || fail "Perl syntax/dependency validation failed. Install missing Cygwin Perl packages or restore a valid Windows agent file."
echo "Launching GSP Windows Agent..."
exec perl "$AGENT_DIR/ogp_agent.pl" -pidfile "$PIDFILE"