fix(debugger): extract MarteController into an importable controller package

Client/debugger was entirely package main, which Go forbids importing from
another module ("is a program, not an importable package") -- discovered
while wiring the new debugclient E2E tool against NewHeadlessMarteController.
Move martecontrol.go and its test into a new marte2debugger/controller
subpackage (package controller) and update Client/debugger/main.go to call
controller.NewMarteController/controller.DangerousCommandsEnabled. No
behavioral change to the browser-facing server.
This commit is contained in:
Martino Ferrari
2026-07-01 19:18:08 +02:00
parent 269b2c4d97
commit f0f83110a4
3 changed files with 14 additions and 7 deletions
@@ -1,4 +1,4 @@
package main package controller
import ( import (
"testing" "testing"
@@ -1,4 +1,9 @@
package main // Package controller implements MarteController, the shared TCP/UDP client
// logic that drives a running MARTe2 DebugService+TCPLogger instance. It is
// consumed both by the Client/debugger browser-facing WebSocket server
// (package main, via NewMarteController) and headlessly by the
// Test/E2E/suite/debugclient E2E test tool (via NewHeadlessMarteController).
package controller
import ( import (
"bufio" "bufio"
@@ -21,9 +26,9 @@ import (
// Command safety gate (CR-4) // Command safety gate (CR-4)
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// dangerousCommandsEnabled gates commands that mutate the RT application state // DangerousCommandsEnabled gates commands that mutate the RT application state
// (FORCE, PAUSE, RESUME, STEP, BREAK, MSG). Set via --enable-dangerous-commands. // (FORCE, PAUSE, RESUME, STEP, BREAK, MSG). Set via --enable-dangerous-commands.
var dangerousCommandsEnabled = false var DangerousCommandsEnabled = false
// dangerousCommands is the set of MARTe2 commands that can change signal values // dangerousCommands is the set of MARTe2 commands that can change signal values
// or alter execution flow. Without --enable-dangerous-commands these are blocked // or alter execution flow. Without --enable-dangerous-commands these are blocked
@@ -319,7 +324,7 @@ func (m *MarteController) HandleBrowserCommand(msg []byte) {
// (DISCOVER, TREE, INFO, LS, VALUE, TRACE, UNTRACE, STEP_STATUS) are // (DISCOVER, TREE, INFO, LS, VALUE, TRACE, UNTRACE, STEP_STATUS) are
// forwarded to the MARTe2 TCP control connection. // forwarded to the MARTe2 TCP control connection.
if isDangerousCommand(cmd) { if isDangerousCommand(cmd) {
if !dangerousCommandsEnabled { if !DangerousCommandsEnabled {
m.sink(map[string]any{ m.sink(map[string]any{
"type": "log", "time": time.Now().Format("15:04:05.000"), "type": "log", "time": time.Now().Format("15:04:05.000"),
"level": "WARNING", "level": "WARNING",
+4 -2
View File
@@ -10,6 +10,8 @@ import (
"net/http" "net/http"
"os" "os"
"marte2debugger/controller"
"marte2/common/wshub" "marte2/common/wshub"
) )
@@ -21,7 +23,7 @@ var staticFiles embed.FS
func main() { func main() {
addr := flag.String("addr", ":7777", "HTTP listen address") addr := flag.String("addr", ":7777", "HTTP listen address")
sourcesFile := flag.String("sources-file", "", "JSON file for persistent source list") sourcesFile := flag.String("sources-file", "", "JSON file for persistent source list")
flag.BoolVar(&dangerousCommandsEnabled, "enable-dangerous-commands", false, flag.BoolVar(&controller.DangerousCommandsEnabled, "enable-dangerous-commands", false,
"Allow FORCE/PAUSE/RESUME/STEP/BREAK/MSG commands from the browser (CR-4 safety gate)") "Allow FORCE/PAUSE/RESUME/STEP/BREAK/MSG commands from the browser (CR-4 safety gate)")
flag.Parse() flag.Parse()
@@ -29,7 +31,7 @@ func main() {
sm := wshub.NewSourceManager(hub, *sourcesFile) sm := wshub.NewSourceManager(hub, *sourcesFile)
hub.SetSourceManager(sm) hub.SetSourceManager(sm)
ctrl := NewMarteController(hub) ctrl := controller.NewMarteController(hub)
go hub.Run() go hub.Run()