agent start fix
This commit is contained in:
parent
6a15b114e6
commit
f2dbfe5e4e
10 changed files with 110 additions and 62 deletions
|
|
@ -1,13 +0,0 @@
|
||||||
%Cfg::Config = (
|
|
||||||
logfile => '/OGP/ogp_agent.log',
|
|
||||||
listen_port => '12679',
|
|
||||||
listen_ip => '0.0.0.0',
|
|
||||||
version => 'v1.4',
|
|
||||||
key => 'CHANGE_ME_PANEL_AGENT_KEY',
|
|
||||||
steam_license => 'Accept',
|
|
||||||
sudo_password => '',
|
|
||||||
web_admin_api_key => '',
|
|
||||||
web_api_url => '',
|
|
||||||
steam_dl_limit => '0',
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
%Cfg::Preferences = (
|
|
||||||
screen_log_local => '1',
|
|
||||||
delete_logs_after => '30',
|
|
||||||
ogp_manages_ftp => '1',
|
|
||||||
ftp_method => 'PureFTPd',
|
|
||||||
ogp_autorestart_server => '1',
|
|
||||||
protocol_shutdown_waittime => '10',
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
agent_auto_update=0
|
|
||||||
agent_update_repo_url=http://forge.runlevelsystems.com/dev/GSP.git
|
|
||||||
agent_update_branch=Panel-unstable
|
|
||||||
agent_update_raw_url=http://forge.runlevelsystems.com/dev/GSP/raw/branch/Panel-unstable/Agent-Windows/OGP64/OGP/ogp_agent.pl
|
|
||||||
run_pureftpd=0
|
|
||||||
ftp_port=21
|
|
||||||
ftp_ip=0.0.0.0
|
|
||||||
ftp_pasv_range=
|
|
||||||
|
|
||||||
|
|
@ -7,33 +7,63 @@ if not "%errorLevel%" == "0" (
|
||||||
echo Failure: current permissions are inadequate.
|
echo Failure: current permissions are inadequate.
|
||||||
echo.
|
echo.
|
||||||
echo Run this script with "Run as administrator".
|
echo Run this script with "Run as administrator".
|
||||||
pause
|
call :pause_on_error
|
||||||
exit /b 1
|
exit /b 1
|
||||||
)
|
)
|
||||||
|
|
||||||
set "WD=%~dp0"
|
set "WD=%~dp0"
|
||||||
pushd "%WD%" >nul 2>&1
|
pushd "%WD%" >nul 2>&1
|
||||||
|
|
||||||
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\"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
set "BASH_EXE="
|
set "BASH_EXE="
|
||||||
if exist "%CYGWIN_ROOT%bin\bash.exe" set "BASH_EXE=%CYGWIN_ROOT%bin\bash.exe"
|
set "CYGWIN_ROOT="
|
||||||
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 exist "%WD%bin\bash.exe" (
|
||||||
|
set "BASH_EXE=%WD%bin\bash.exe"
|
||||||
|
set "CYGWIN_ROOT=%WD%"
|
||||||
|
)
|
||||||
|
if not defined BASH_EXE if exist "%WD%..\bin\bash.exe" (
|
||||||
|
set "BASH_EXE=%WD%..\bin\bash.exe"
|
||||||
|
for %%I in ("%WD%..") do set "CYGWIN_ROOT=%%~fI\"
|
||||||
|
)
|
||||||
|
if not defined BASH_EXE if exist "%WD%..\..\bin\bash.exe" (
|
||||||
|
set "BASH_EXE=%WD%..\..\bin\bash.exe"
|
||||||
|
for %%I in ("%WD%..\..") do set "CYGWIN_ROOT=%%~fI\"
|
||||||
|
)
|
||||||
|
if not defined BASH_EXE if exist "C:\OGP64\bin\bash.exe" (
|
||||||
|
set "BASH_EXE=C:\OGP64\bin\bash.exe"
|
||||||
|
set "CYGWIN_ROOT=C:\OGP64\"
|
||||||
|
)
|
||||||
|
if not defined BASH_EXE if exist "C:\cygwin64\bin\bash.exe" (
|
||||||
|
set "BASH_EXE=C:\cygwin64\bin\bash.exe"
|
||||||
|
set "CYGWIN_ROOT=C:\cygwin64\"
|
||||||
|
)
|
||||||
|
if not defined BASH_EXE if exist "C:\cygwin\bin\bash.exe" (
|
||||||
|
set "BASH_EXE=C:\cygwin\bin\bash.exe"
|
||||||
|
set "CYGWIN_ROOT=C:\cygwin\"
|
||||||
|
)
|
||||||
|
|
||||||
if not defined BASH_EXE (
|
if not defined BASH_EXE (
|
||||||
echo Failure: Cygwin bash.exe was not found.
|
echo Failure: Cygwin bash.exe was not found.
|
||||||
echo.
|
echo.
|
||||||
echo Checked:
|
echo Checked:
|
||||||
echo %CYGWIN_ROOT%bin\bash.exe
|
echo %WD%bin\bash.exe
|
||||||
|
echo %WD%..\bin\bash.exe
|
||||||
|
echo %WD%..\..\bin\bash.exe
|
||||||
|
echo C:\OGP64\bin\bash.exe
|
||||||
echo C:\cygwin64\bin\bash.exe
|
echo C:\cygwin64\bin\bash.exe
|
||||||
echo C:\cygwin\bin\bash.exe
|
echo C:\cygwin\bin\bash.exe
|
||||||
pause
|
call :pause_on_error
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
if not exist "%CYGWIN_ROOT%OGP\ogp_agent.pl" (
|
||||||
|
echo Failure: OGP agent root was not found for detected Cygwin root.
|
||||||
|
echo.
|
||||||
|
echo Detected Cygwin root:
|
||||||
|
echo %CYGWIN_ROOT%
|
||||||
|
echo Expected agent file:
|
||||||
|
echo %CYGWIN_ROOT%OGP\ogp_agent.pl
|
||||||
|
call :pause_on_error
|
||||||
exit /b 1
|
exit /b 1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -49,7 +79,7 @@ if not exist "%CYGWIN_ROOT%Install\agent_start_cygwin.sh" if not exist "%CYGWIN_
|
||||||
echo Expected one of:
|
echo Expected one of:
|
||||||
echo %CYGWIN_ROOT%Install\agent_start_cygwin.sh
|
echo %CYGWIN_ROOT%Install\agent_start_cygwin.sh
|
||||||
echo %CYGWIN_ROOT%OGP\Install\agent_start_cygwin.sh
|
echo %CYGWIN_ROOT%OGP\Install\agent_start_cygwin.sh
|
||||||
pause
|
call :pause_on_error
|
||||||
exit /b 1
|
exit /b 1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -71,9 +101,13 @@ if not "%AGENT_EXIT%" == "0" (
|
||||||
echo.
|
echo.
|
||||||
echo GSP Windows Agent exited with error code %AGENT_EXIT%.
|
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.
|
echo Review the messages above. The window is staying open so the failure is visible.
|
||||||
pause
|
call :pause_on_error
|
||||||
exit /b %AGENT_EXIT%
|
exit /b %AGENT_EXIT%
|
||||||
)
|
)
|
||||||
|
|
||||||
popd >nul 2>&1
|
popd >nul 2>&1
|
||||||
exit /b 0
|
exit /b 0
|
||||||
|
|
||||||
|
:pause_on_error
|
||||||
|
if /I not "%GSP_AGENT_NO_PAUSE%"=="1" pause
|
||||||
|
exit /b 0
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,15 @@ ensure_default_configs() {
|
||||||
normalize_bash_preferences
|
normalize_bash_preferences
|
||||||
}
|
}
|
||||||
|
|
||||||
|
validate_required_config() {
|
||||||
|
if [ ! -f "$AGENT_DIR/Cfg/Config.pm" ]; then
|
||||||
|
fail "Missing $AGENT_DIR/Cfg/Config.pm. Run agent_conf.sh or copy Config.pm.default and set the Panel agent key."
|
||||||
|
fi
|
||||||
|
if grep -Eq "CHANGE_ME_PANEL_AGENT_KEY|key[[:space:]]*=>[[:space:]]*''" "$AGENT_DIR/Cfg/Config.pm"; then
|
||||||
|
fail "$AGENT_DIR/Cfg/Config.pm still contains placeholder values. Set key/listen settings to match the Panel remote server record."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
load_agent_preferences() {
|
load_agent_preferences() {
|
||||||
agent_auto_update=0
|
agent_auto_update=0
|
||||||
agent_update_repo_url="$REPO_URL_DEFAULT"
|
agent_update_repo_url="$REPO_URL_DEFAULT"
|
||||||
|
|
@ -166,26 +175,31 @@ auto_update_windows_agent() {
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! validate_agent_file "$target_file"; then
|
if [ -f "$target_file" ] && ! validate_agent_file "$target_file"; then
|
||||||
warn "Current Windows agent does not validate. Auto-update can still replace it if backup succeeds."
|
warn "Current Windows agent does not validate. Auto-update can still replace it if backup succeeds."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cp "$target_file" "$backup_file" 2>/dev/null || {
|
if [ -f "$target_file" ]; then
|
||||||
warn "Could not backup $target_file; skipping auto-update."
|
cp "$target_file" "$backup_file" 2>/dev/null || {
|
||||||
rm -rf "$tmp_dir"
|
warn "Could not backup $target_file; skipping auto-update."
|
||||||
return 0
|
rm -rf "$tmp_dir"
|
||||||
}
|
return 0
|
||||||
|
}
|
||||||
|
else
|
||||||
|
warn "$target_file is missing; installing validated agent without a local backup."
|
||||||
|
backup_file=""
|
||||||
|
fi
|
||||||
|
|
||||||
if ! cp "$candidate_file" "$target_file"; then
|
if ! cp "$candidate_file" "$target_file"; then
|
||||||
warn "Could not copy updated Windows agent; restoring backup."
|
warn "Could not copy updated Windows agent; restoring backup."
|
||||||
cp "$backup_file" "$target_file" 2>/dev/null
|
[ -n "$backup_file" ] && cp "$backup_file" "$target_file" 2>/dev/null
|
||||||
rm -rf "$tmp_dir"
|
rm -rf "$tmp_dir"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! validate_agent_file "$target_file"; then
|
if ! validate_agent_file "$target_file"; then
|
||||||
warn "Updated Windows agent failed validation after install; restoring backup."
|
warn "Updated Windows agent failed validation after install; restoring backup."
|
||||||
cp "$backup_file" "$target_file" 2>/dev/null
|
[ -n "$backup_file" ] && cp "$backup_file" "$target_file" 2>/dev/null
|
||||||
rm -rf "$tmp_dir"
|
rm -rf "$tmp_dir"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
@ -202,6 +216,7 @@ normalize_text_files "/Install"
|
||||||
ensure_default_configs
|
ensure_default_configs
|
||||||
load_agent_preferences
|
load_agent_preferences
|
||||||
auto_update_windows_agent
|
auto_update_windows_agent
|
||||||
|
validate_required_config
|
||||||
|
|
||||||
echo "Validating $AGENT_DIR/ogp_agent.pl..."
|
echo "Validating $AGENT_DIR/ogp_agent.pl..."
|
||||||
validate_agent_file "$AGENT_DIR/ogp_agent.pl" || fail "Perl syntax/dependency validation failed. Install missing Cygwin Perl packages or restore a valid Windows agent file."
|
validate_agent_file "$AGENT_DIR/ogp_agent.pl" || fail "Perl syntax/dependency validation failed. Install missing Cygwin Perl packages or restore a valid Windows agent file."
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ Cygwin-based agent that lets the GameServer Panel manage Windows Server 2019/202
|
||||||
|
|
||||||
## Startup and auto-update
|
## Startup and auto-update
|
||||||
|
|
||||||
Use `C:\\OGP64\\agent_start.bat` or `C:\\OGP\\Install\\agent_start.bat` to start the agent manually. The launcher detects the bundled Cygwin `bash.exe` first, then falls back to `C:\\cygwin64\\bin\\bash.exe` and `C:\\cygwin\\bin\\bash.exe`.
|
Use `C:\\OGP64\\agent_start.bat` or `C:\\OGP64\\OGP\\Install\\agent_start.bat` to start the agent manually. The launcher checks the bundled Cygwin root, including `C:\\OGP64\\bin\\bash.exe`, then falls back to `C:\\cygwin64\\bin\\bash.exe` and `C:\\cygwin\\bin\\bash.exe`. Manual failures pause by default; set `GSP_AGENT_NO_PAUSE=1` for service wrappers that should not block.
|
||||||
|
|
||||||
`C:\\OGP\\Cfg\\bash_prefs.cfg` controls optional restart-time agent updates:
|
`C:\\OGP\\Cfg\\bash_prefs.cfg` controls optional restart-time agent updates:
|
||||||
|
|
||||||
|
|
@ -34,7 +34,7 @@ agent_update_branch=Panel-unstable
|
||||||
agent_update_raw_url=http://forge.runlevelsystems.com/dev/GSP/raw/branch/Panel-unstable/Agent-Windows/OGP64/OGP/ogp_agent.pl
|
agent_update_raw_url=http://forge.runlevelsystems.com/dev/GSP/raw/branch/Panel-unstable/Agent-Windows/OGP64/OGP/ogp_agent.pl
|
||||||
```
|
```
|
||||||
|
|
||||||
When `agent_auto_update=1`, the launcher downloads to a temporary file, rejects HTML/404/empty/non-Perl content, validates with `perl -c`, backs up the current `ogp_agent.pl`, and rolls back if validation fails.
|
When `agent_auto_update=1`, the launcher downloads to a temporary file, rejects HTML/404/empty/non-Perl content, validates with `perl -c`, backs up the current `ogp_agent.pl`, and rolls back if validation fails. This restart-time updater may replace only `/OGP/ogp_agent.pl`; it must not touch `Cfg/` files or other installer-generated state.
|
||||||
|
|
||||||
## Related repositories
|
## Related repositories
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -49,9 +49,9 @@ Restart-time auto-update:
|
||||||
agent_update_branch=Panel-unstable
|
agent_update_branch=Panel-unstable
|
||||||
agent_update_raw_url=http://forge.runlevelsystems.com/dev/GSP/raw/branch/Panel-unstable/Agent-Windows/OGP64/OGP/ogp_agent.pl
|
agent_update_raw_url=http://forge.runlevelsystems.com/dev/GSP/raw/branch/Panel-unstable/Agent-Windows/OGP64/OGP/ogp_agent.pl
|
||||||
```
|
```
|
||||||
4. Restart the agent with `C:\\OGP64\\agent_start.bat` or `C:\\OGP\\Install\\agent_start.bat`.
|
4. Restart the agent with `C:\\OGP64\\agent_start.bat` or `C:\\OGP64\\OGP\\Install\\agent_start.bat`.
|
||||||
|
|
||||||
The updater downloads to a temporary file, rejects empty files, HTML error pages, `Not found` responses, and files without the expected Perl agent markers, then runs `perl -c` before replacing `/OGP/ogp_agent.pl`. Failed auto-update attempts are non-fatal and continue with the last known good agent.
|
The updater downloads to a temporary file, rejects empty files, HTML error pages, `Not found` responses, and files without the expected Perl agent markers, then runs `perl -c` before replacing `/OGP/ogp_agent.pl`. Failed auto-update attempts are non-fatal and continue with the last known good agent. The restart-time updater is allowlisted to `/OGP/ogp_agent.pl` only and must not overwrite `/OGP/Cfg/*`, service settings, passwords, server data, or logs.
|
||||||
|
|
||||||
## Logging & troubleshooting
|
## Logging & troubleshooting
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,13 @@ if not exist "%INNER_START%" (
|
||||||
echo %INNER_START%
|
echo %INNER_START%
|
||||||
echo.
|
echo.
|
||||||
echo This checkout should contain OGP\Install\agent_start.bat.
|
echo This checkout should contain OGP\Install\agent_start.bat.
|
||||||
pause
|
call :pause_on_error
|
||||||
exit /b 1
|
exit /b 1
|
||||||
)
|
)
|
||||||
|
|
||||||
call "%INNER_START%"
|
call "%INNER_START%"
|
||||||
exit /b %ERRORLEVEL%
|
exit /b %ERRORLEVEL%
|
||||||
|
|
||||||
|
:pause_on_error
|
||||||
|
if /I not "%GSP_AGENT_NO_PAUSE%"=="1" pause
|
||||||
|
exit /b 0
|
||||||
|
|
|
||||||
|
|
@ -57,10 +57,17 @@ Relevant files:
|
||||||
|
|
||||||
The batch launcher must not assume that `bash` is in the Windows `PATH`. It explicitly checks:
|
The batch launcher must not assume that `bash` is in the Windows `PATH`. It explicitly checks:
|
||||||
|
|
||||||
- the Cygwin root beside the launcher
|
- `%~dp0bin\bash.exe`
|
||||||
|
- `%~dp0..\bin\bash.exe`
|
||||||
|
- `%~dp0..\..\bin\bash.exe`
|
||||||
|
- `C:\OGP64\bin\bash.exe`
|
||||||
- `C:\cygwin64\bin\bash.exe`
|
- `C:\cygwin64\bin\bash.exe`
|
||||||
- `C:\cygwin\bin\bash.exe`
|
- `C:\cygwin\bin\bash.exe`
|
||||||
|
|
||||||
|
This matters because the maintained launcher may be run from `C:\OGP64\agent_start.bat` or from `C:\OGP64\OGP\Install\agent_start.bat`. In the second case the actual Cygwin root is two directories above the launcher, so `C:\OGP64\bin\bash.exe` must be checked.
|
||||||
|
|
||||||
|
Manual launches pause on fatal errors so the error remains visible. Service or scheduled-task wrappers can set `GSP_AGENT_NO_PAUSE=1` to return immediately instead of waiting forever at a `pause` prompt.
|
||||||
|
|
||||||
The Cygwin-side helper performs the shell work:
|
The Cygwin-side helper performs the shell work:
|
||||||
|
|
||||||
1. enter `/OGP`
|
1. enter `/OGP`
|
||||||
|
|
@ -72,7 +79,8 @@ The Cygwin-side helper performs the shell work:
|
||||||
7. backup the current `/OGP/ogp_agent.pl`
|
7. backup the current `/OGP/ogp_agent.pl`
|
||||||
8. validate downloaded and installed agent files with content checks plus `perl -c`
|
8. validate downloaded and installed agent files with content checks plus `perl -c`
|
||||||
9. restore the backup if validation fails
|
9. restore the backup if validation fails
|
||||||
10. launch `/OGP/ogp_agent.pl`
|
10. refuse to launch if `Cfg/Config.pm` still contains placeholder values
|
||||||
|
11. launch `/OGP/ogp_agent.pl`
|
||||||
|
|
||||||
Default optional update source:
|
Default optional update source:
|
||||||
|
|
||||||
|
|
@ -84,11 +92,13 @@ Default optional update source:
|
||||||
|
|
||||||
Auto-update failure is non-fatal. Missing `curl`/`git`, download failure, clone failure, missing source file, HTTP error-page downloads, empty files, or failed validation should warn and continue with the current installed agent.
|
Auto-update failure is non-fatal. Missing `curl`/`git`, download failure, clone failure, missing source file, HTTP error-page downloads, empty files, or failed validation should warn and continue with the current installed agent.
|
||||||
|
|
||||||
|
Restart-time auto-update is allowlisted. It may replace only `/OGP/ogp_agent.pl`. It must never overwrite `Cfg/Config.pm`, `Cfg/Preferences.pm`, `Cfg/bash_prefs.cfg`, service settings, passwords, generated installer config, server homes, logs, or user-created files. Broader agent updates belong to the admin-only Panel `component_update` flow, which also preserves `Cfg/`.
|
||||||
|
|
||||||
The Windows agent file does not use `DBI` at startup. If a Windows node reports `Can't locate DBI.pm` at line 48, it is a strong signal that a Linux agent file was copied onto the Windows node.
|
The Windows agent file does not use `DBI` at startup. If a Windows node reports `Can't locate DBI.pm` at line 48, it is a strong signal that a Linux agent file was copied onto the Windows node.
|
||||||
|
|
||||||
Required Cygwin Perl packages include `perl`, `perl_vendor`, `perl-HTTP-Daemon`, `perl-Path-Class`, `perl-XML-Parser`, `perl-XML-Simple`, `perl-Archive-Zip`, and `perl-Archive-Extract`. A clean non-Cygwin Linux workstation may fail `perl -c` on these dependencies even though the bundled Windows Cygwin tree contains them.
|
Required Cygwin Perl packages include `perl`, `perl_vendor`, `perl-HTTP-Daemon`, `perl-Path-Class`, `perl-XML-Parser`, `perl-XML-Simple`, `perl-Archive-Zip`, and `perl-Archive-Extract`. A clean non-Cygwin Linux workstation may fail `perl -c` on these dependencies even though the bundled Windows Cygwin tree contains them.
|
||||||
|
|
||||||
Default tracked config files contain placeholders only. Production installs must replace `CHANGE_ME_PANEL_AGENT_KEY`, `web_api_url`, and related values with the values configured in the Panel remote-server record.
|
Default tracked config template files contain placeholders only. Production installs must replace `CHANGE_ME_PANEL_AGENT_KEY`, `web_api_url`, and related values with the values configured in the Panel remote-server record. If startup creates `Config.pm` from `Config.pm.default`, it stops with a clear error until those values are changed.
|
||||||
|
|
||||||
## Status Logic
|
## Status Logic
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,3 +24,19 @@ Important references:
|
||||||
## Recommended Model
|
## Recommended Model
|
||||||
|
|
||||||
Installer strategy should come from game capability metadata. The agent should execute trusted strategies, not arbitrary customer commands.
|
Installer strategy should come from game capability metadata. The agent should execute trusted strategies, not arbitrary customer commands.
|
||||||
|
|
||||||
|
## Windows Agent Install Notes
|
||||||
|
|
||||||
|
The Windows agent is Cygwin-based under `Agent-Windows/OGP64`.
|
||||||
|
|
||||||
|
Common installed layout:
|
||||||
|
|
||||||
|
- Cygwin root: `C:\OGP64`
|
||||||
|
- Bash: `C:\OGP64\bin\bash.exe`
|
||||||
|
- Agent root: `C:\OGP64\OGP`
|
||||||
|
- Maintained launcher: `C:\OGP64\OGP\Install\agent_start.bat`
|
||||||
|
- Convenience launcher: `C:\OGP64\agent_start.bat`
|
||||||
|
|
||||||
|
The launcher checks `%~dp0bin\bash.exe`, `%~dp0..\bin\bash.exe`, `%~dp0..\..\bin\bash.exe`, `C:\OGP64\bin\bash.exe`, `C:\cygwin64\bin\bash.exe`, and `C:\cygwin\bin\bash.exe`. Missing-bash errors should print every checked path and pause in manual use. Set `GSP_AGENT_NO_PAUSE=1` for service/non-interactive wrappers that should fail fast instead of waiting at a prompt.
|
||||||
|
|
||||||
|
Generated config files under `/OGP/Cfg` are production state. Installer/startup may create them from `.default` templates if missing, but update logic must preserve them. Restart-time auto-update may replace only `/OGP/ogp_agent.pl`; it must not overwrite `Cfg/Config.pm`, `Cfg/Preferences.pm`, `Cfg/bash_prefs.cfg`, service settings, passwords, server data, or logs.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue