Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 52 additions & 35 deletions core/dbox.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@ package core
*/

import (
"encoding/json"
"errors"
"fmt"
"log"
"os"
"os/exec"
"slices"
"strings"
"syscall"

Expand All @@ -28,11 +30,19 @@ type dbox struct {
}

type dboxContainer struct {
ID string
CreatedAt string
Status string
Labels map[string]string
Name string
ID string `json:"Id"`
CreatedAt string `json:"CreatedAt"`
Status string `json:"Status"`
Labels map[string]string `json:"Labels"`
Names []string `json:"Names"`
}

type dockerContainer struct {
ID string `json:"ID"`
CreatedAt string `json:"CreatedAt"`
Status string `json:"Status"`
Labels string `json:"Labels"`
Names string `json:"Names"`
}

func NewDbox() (*dbox, error) {
Expand Down Expand Up @@ -190,47 +200,54 @@ func (d *dbox) RunCommand(command string, args []string, engineFlags []string, u
func (d *dbox) ListContainers(rootFull bool) ([]dboxContainer, error) {
output, err := d.RunCommand("ps", []string{
"-a",
"--format", "{{.ID}}|{{.CreatedAt}}|{{.Status}}|{{.Labels}}|{{.Names}}",
"--no-trunc",
"--format", "json",
}, []string{}, true, true, false, rootFull, false)
if err != nil {
return nil, err
}

rows := strings.Split(string(output), "\n")
containers := []dboxContainer{}

for _, row := range rows {
if row == "" {
continue
var containers []dboxContainer
switch d.Engine {
case "podman":
err := json.Unmarshal(output, &containers)
if err != nil {
return nil, err
}

rowItems := strings.Split(row, "|")
if len(rowItems) != 5 {
continue
}
case "docker":
rows := strings.Split(string(output), "\n")
for _, row := range rows {
if row == "" {
continue
}

container := dboxContainer{
ID: strings.Trim(rowItems[0], "\""),
CreatedAt: strings.Trim(rowItems[1], "\""),
Status: strings.Trim(rowItems[2], "\""),
Name: strings.Trim(rowItems[4], "\""),
Labels: map[string]string{},
}
var container dockerContainer
err := json.Unmarshal([]byte(row), &container)
if err != nil {
return nil, err
}

// example labels: map[manager:apx name:alpine stack:alpine]
labels := strings.ReplaceAll(rowItems[3], "map[", "")
labels = strings.ReplaceAll(labels, "]", "")
labelsItems := strings.Split(labels, " ")
for _, label := range labelsItems {
labelItems := strings.Split(label, ":")
if len(labelItems) != 2 {
continue
labels := map[string]string{}
if container.Labels != "" {
for _, label := range strings.Split(container.Labels, ",") {
labelItems := strings.Split(label, "=")
if len(labelItems) == 2 {
labels[labelItems[0]] = labelItems[1]
}
}
}

container.Labels[labelItems[0]] = labelItems[1]
}
names := strings.Split(container.Names, ",")

containers = append(containers, container)
containers = append(containers, dboxContainer{
ID: container.ID,
CreatedAt: container.CreatedAt,
Status: container.Status,
Labels: labels,
Names: names,
})
}
}

return containers, nil
Expand All @@ -244,7 +261,7 @@ func (d *dbox) GetContainer(name string, rootFull bool) (*dboxContainer, error)

for _, container := range containers {
// fmt.Println("found container", container.Name, "requested", name)
if container.Name == name {
if slices.Contains(container.Names, name) {
return &container, nil
}
}
Expand Down