package runtime import ( "encoding/json" "fmt" "os/exec" "strings" ) type Podman struct{} func (p *Podman) Name() string { return "podman" } type podmanContainer struct { Names []string `json:"Names"` Image string `json:"Image"` Command string `json:"Command"` State string `json:"State"` } func (p *Podman) ListRunning() ([]Container, error) { bin, err := exec.LookPath("podman") if err != nil { return nil, nil // podman not installed — not an error } out, err := exec.Command(bin, "ps", "--format", "json").Output() if err != nil { return nil, fmt.Errorf("podman ps: %w", err) } var raw []podmanContainer if err := json.Unmarshal(out, &raw); err != nil { return nil, fmt.Errorf("parsing podman output: %w", err) } var containers []Container for _, c := range raw { name := "" if len(c.Names) > 0 { name = c.Names[0] } if name == "" { continue } containers = append(containers, Container{ Name: name, Image: c.Image, Command: c.Command, Runtime: "podman", }) } return containers, nil } func (p *Podman) Exists(name string) (bool, error) { bin, err := exec.LookPath("podman") if err != nil { return false, nil } out, err := exec.Command(bin, "ps", "-a", "--format", "{{.Names}}").Output() if err != nil { return false, fmt.Errorf("podman ps -a: %w", err) } for _, line := range strings.Split(string(out), "\n") { if strings.TrimSpace(line) == name { return true, nil } } return false, nil }