Files
2026-07-21 22:06:10 +00:00

299 lines
9.4 KiB
Markdown

# Conduit Linux Console/ConVar Re-run - 2026-06-14
## Scope
- Pulled latest Conduit commits from `origin/main`.
- Inspected the dynamic console command / convar diff and `docs/linux-bringup.md` test steps.
- Rebuilt on Linux with GCC 12.
- Deployed to CS2 server `Test Sunucusu`.
- Verified dynamic command registration, dynamic command dispatch under profiler scope, plugin convar read/write, engine convar read/write, owner cleanup, and final server state.
- Satisfactory server was not modified.
## Git
Latest commits:
```text
bb58461 (HEAD -> main, origin/main, origin/HEAD) Phase 2: dynamic console commands + convar access
a3bd08f Close out Linux verification of the Entity + Player slice
de4bda2 Phase 2: schema-backed Entity + Player access, with event bridge
4b79d33 Close out Linux verification of the Phase 2 GameEvents slice
a5c1c13 docs: Linux re-test steps for the Phase 2 GameEvents slice
ffb57f3 Phase 2 start: dispatch core + GameEvents, with an RTTI vtable finder
```
Pulled range:
```text
Updating de4bda2..bb58461
Fast-forward
PLAN.md | 4 +-
core/CMakeLists.txt | 1 +
core/src/conduit/commands.cpp | 52 ++++++++
core/src/conduit/console.cpp | 302 ++++++++++++++++++++++++++++++++++++++++++
core/src/conduit/console.h | 78 +++++++++++
core/src/plugin.cpp | 5 +
docs/linux-bringup.md | 58 ++++++--
7 files changed, 491 insertions(+), 9 deletions(-)
create mode 100644 core/src/conduit/console.cpp
create mode 100644 core/src/conduit/console.h
```
Working tree after the run:
```text
## main...origin/main
```
## Build
Command:
```sh
cmake -S /root/codex/Conduit -B /root/codex/Conduit/build/linux-rerun -G Ninja \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_C_COMPILER=gcc-12 \
-DCMAKE_CXX_COMPILER=g++-12
cmake --build /root/codex/Conduit/build/linux-rerun
```
Result: build and link succeeded.
```text
-- Configuring done
-- Generating done
-- Build files have been written to: /root/codex/Conduit/build/linux-rerun
[1/4] Building CXX object core/CMakeFiles/conduit.dir/src/conduit/commands.cpp.o
[2/4] Building CXX object core/CMakeFiles/conduit.dir/src/conduit/console.cpp.o
[3/4] Building CXX object core/CMakeFiles/conduit.dir/src/plugin.cpp.o
[4/4] Linking CXX shared library package/addons/conduit/bin/conduit.so
```
Only warning observed: the existing volatile compound-assignment warning in `commands.cpp`.
No failed CMake/Ninja output exists because the build passed. The Linux link path for `CConVar` / `ConVarRefAbstract` symbols passed.
## Deploy
Package source:
```text
/root/codex/Conduit/build/linux-rerun/package/.
```
Destination:
```text
/var/lib/gamepanel/servers/c2b47a90/game/csgo/
```
CS2 container restarted:
```text
gp_c2b47a90
```
Satisfactory was not touched:
```text
/gp_d8f13411 exited running=false exit=130 oom=false
```
## Load Check
RCON:
```text
rcon: authenticated
--- meta list ---
Listing 1 plugin:
[01] Conduit (0.1.0-dev) by Conduit Contributors
--- conduit_status ---
Conduit 0.1.0-dev
uptime : 47.4 s
game frames : 2251
log file : /home/steam/cs2-dedicated/game/csgo/addons/conduit/logs/conduit-20260614.log
crash report: armed (use conduit_crash_test to verify)
```
Startup log:
```text
2026-06-14 14:19:24 [INFO] gamedata: 1 files loaded: 0 signatures, 0 offsets, all valid
2026-06-14 14:19:25 [INFO] entity: armed via CGameEntitySystem vtable 0x7f4c8640ffd8 - entity system not created yet, will resolve on first use after map load
2026-06-14 14:19:25 [INFO] gameevents: armed via CGameEventManager vtable 0x7f4c86410f50 - instance captured on next LoadEventsFromFile
2026-06-14 14:19:25 [INFO] core: Conduit 0.1.0-dev loaded - crash reporter armed, profiler on
2026-06-14 14:19:25 [INFO] gameevents: game event manager connected (0x7f4c86790460) - event listening live
2026-06-14 14:19:36 [INFO] core: first GameFrame observed - hook dispatch confirmed
```
Result: plugin loaded, frames advanced, no Conduit/Metamod load failure.
## Dynamic Command and Profiler
Commands:
```text
conduit_console
conduit_demo alpha bravo charlie
conduit_prof
```
Output:
```text
rcon: authenticated
--- conduit_console ---
[Conduit] [INFO] console: command 'conduit_demo' registered (owner 'console_demo')
[Conduit] [INFO] console: convar 'conduit_demo_value' created (owner 'console_demo')
console: ready, 1 command(s), 1 plugin convar(s)
cmd conduit_demo owner=console_demo
cvar conduit_demo_value owner=console_demo value=7
--- conduit_demo alpha bravo charlie ---
[Conduit] [INFO] console_demo: conduit_demo invoked: argc=4 args='alpha bravo charlie' issuer=server(-1)
--- conduit_prof ---
owner callsite calls avg p50 p99 max total
engine GameFrame 3409 2.53ms 4.19ms 8.39ms 47.48ms 8.62s
console_demo conduit_demo 1 63.1us 65.5us 65.5us 63.1us 63.1us
```
Result: dynamic command dispatch works and is profiled under `console_demo / conduit_demo`.
## ConVar Tests
Commands:
```text
conduit_cvar conduit_demo_value
conduit_cvar conduit_demo_value 42
conduit_cvar conduit_demo_value
conduit_cvar sv_cheats
conduit_cvar sv_gravity
conduit_cvar sv_gravity 700
conduit_cvar sv_gravity
```
Output:
```text
rcon: authenticated
--- conduit_cvar conduit_demo_value ---
[Conduit] conduit_demo_value = 7 (int=7 float=7.000 bool=1)
--- conduit_cvar conduit_demo_value 42 ---
[Conduit] set 'conduit_demo_value' = '42'
[Conduit] conduit_demo_value = 42 (int=42 float=42.000 bool=1)
--- conduit_cvar conduit_demo_value ---
[Conduit] conduit_demo_value = 42 (int=42 float=42.000 bool=1)
--- conduit_cvar sv_cheats ---
[Conduit] sv_cheats = false (int=0 float=0.000 bool=0)
--- conduit_cvar sv_gravity ---
[Conduit] sv_gravity = 800.000000 (int=800 float=800.000 bool=1)
--- conduit_cvar sv_gravity 700 ---
L 06/14/2026 - 14:20:43: server_cvar: "sv_gravity" "700.000000"
[Conduit] set 'sv_gravity' = '700'
[Conduit] sv_gravity = 700.000000 (int=700 float=700.000 bool=1)
--- conduit_cvar sv_gravity ---
[Conduit] sv_gravity = 700.000000 (int=700 float=700.000 bool=1)
```
Result: plugin-owned convar read/write passed. Engine convar read/write passed.
`sv_gravity` was restored:
```text
rcon: authenticated
--- conduit_cvar sv_gravity 800 ---
L 06/14/2026 - 14:20:56: server_cvar: "sv_gravity" "800.000000"
[Conduit] set 'sv_gravity' = '800'
[Conduit] sv_gravity = 800.000000 (int=800 float=800.000 bool=1)
--- conduit_cvar sv_gravity ---
[Conduit] sv_gravity = 800.000000 (int=800 float=800.000 bool=1)
```
## Owner Cleanup
Commands:
```text
conduit_concmd_stop
conduit_demo x
```
Output:
```text
--- conduit_concmd_stop ---
[Conduit] removed 2 demo registration(s)
--- conduit_demo x ---
```
Result: `conduit_demo x` produced no handler line after cleanup, so the command was removed from the engine.
I then called `conduit_console` again to probe the persistence/adopt path:
```text
--- conduit_console ---
[Conduit] [INFO] console: command 'conduit_demo' registered (owner 'console_demo')
[Conduit] [INFO] console: convar 'conduit_demo_value' already registered - adopting (owner 'console_demo')
console: ready, 1 command(s), 0 plugin convar(s)
cmd conduit_demo owner=console_demo
```
The persisted convar value remained available:
```text
--- conduit_cvar conduit_demo_value ---
[Conduit] conduit_demo_value = 42 (int=42 float=42.000 bool=1)
```
Final cleanup after the re-register:
```text
rcon: authenticated
--- conduit_cvar conduit_demo_value ---
[Conduit] conduit_demo_value = 42 (int=42 float=42.000 bool=1)
--- conduit_concmd_stop ---
[Conduit] removed 1 demo registration(s)
--- conduit_demo x ---
--- conduit_status ---
Conduit 0.1.0-dev
uptime : 115.6 s
game frames : 6615
log file : /home/steam/cs2-dedicated/game/csgo/addons/conduit/logs/conduit-20260614.log
crash report: armed (use conduit_crash_test to verify)
--- conduit_prof ---
owner callsite calls avg p50 p99 max total
engine GameFrame 6617 2.34ms 4.19ms 8.39ms 47.48ms 15.50s
console_demo conduit_demo 1 63.1us 65.5us 65.5us 63.1us 63.1us
```
## Finding
The adopt path works for name-based access: `conduit_demo_value` stayed at `42` and could be read after re-registration.
Potential mismatch: after adoption, `conduit_console` reported `0 plugin convar(s)` and did not list `conduit_demo_value`, despite logging `already registered - adopting`. That means the existing convar is not represented in `g_convars`, so owner cleanup removed only the command on the second cleanup (`removed 1 demo registration(s)`). If the intended behavior is "adopted convars are tracked and listed as plugin-owned", this needs a small fix. If "adopt" only means "treat existing engine convar as accessible by name", the runtime behavior is consistent.
## Final State
Docker:
```text
/gp_c2b47a90 running running=true exit=0 oom=false
/gp_d8f13411 exited running=false exit=130 oom=false
```
Panel DB:
```text
uuid | name | status | slug | port
----------+----------------+---------+--------------+-------
c2b47a90 | Test Sunucusu | running | cs2 | 27015
d8f13411 | MukemmelSunucu | stopped | satisfactory | 7777
(2 rows)
```
No Conduit/Metamod/signal-specific load failure or crash was observed. Server console had ordinary CS2/Steam/map warnings only.