From 2dc9ba7b558cd87afbdd712cc2298b864ed49156 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 12 Jun 2026 19:25:23 +0000 Subject: [PATCH] fix(agent): detection robuste du statut instances avec fallback ps -q (v0.2.1) --- agent/build.sh | 2 +- agent/instance.go | 61 ++++++++++++++++++++++++++--------------------- 2 files changed, 35 insertions(+), 28 deletions(-) diff --git a/agent/build.sh b/agent/build.sh index 2865262..e1a8363 100755 --- a/agent/build.sh +++ b/agent/build.sh @@ -1,7 +1,7 @@ #!/bin/bash set -e -VERSION="0.2.0" +VERSION="0.2.1" LDFLAGS="-X main.version=${VERSION}" echo "Building EduBox Agent v${VERSION}..." diff --git a/agent/instance.go b/agent/instance.go index be217d8..4136d79 100644 --- a/agent/instance.go +++ b/agent/instance.go @@ -85,38 +85,45 @@ func getInstanceStatus(dataDir, instanceID string) string { } engine := getContainerEngine() + + // Try modern JSON format first cmd := exec.Command(engine, "compose", "-f", composeFile, "ps", "--format", "json") out, err := cmd.Output() + if err == nil { + outStr := strings.TrimSpace(string(out)) + if outStr == "" || outStr == "[]" { + return "stopped" + } + if strings.HasPrefix(outStr, "[") { + var containers []map[string]interface{} + if err := json.Unmarshal(out, &containers); err == nil { + for _, c := range containers { + state, _ := c["State"].(string) + if state == "running" { + return "running" + } + } + return "stopped" + } + } else { + var c map[string]interface{} + if err := json.Unmarshal(out, &c); err == nil { + state, _ := c["State"].(string) + if state == "running" { + return "running" + } + return "stopped" + } + } + } + + // Fallback: use "ps -q" which is supported by all docker-compose versions + cmd = exec.Command(engine, "compose", "-f", composeFile, "ps", "-q") + out, err = cmd.Output() if err != nil { return "error" } - - outStr := strings.TrimSpace(string(out)) - if outStr == "" || outStr == "[]" { - return "stopped" - } - - // Docker compose JSON output can be a single object or an array - if strings.HasPrefix(outStr, "[") { - var containers []map[string]interface{} - if err := json.Unmarshal(out, &containers); err != nil { - return "error" - } - for _, c := range containers { - state, _ := c["State"].(string) - if state == "running" { - return "running" - } - } - return "stopped" - } - - var c map[string]interface{} - if err := json.Unmarshal(out, &c); err != nil { - return "error" - } - state, _ := c["State"].(string) - if state == "running" { + if strings.TrimSpace(string(out)) != "" { return "running" } return "stopped"