diff --git a/internal/daemon/docker_monitor/client/bridge.go b/internal/daemon/docker_monitor/client/bridge.go index a4bccc7..72fc846 100644 --- a/internal/daemon/docker_monitor/client/bridge.go +++ b/internal/daemon/docker_monitor/client/bridge.go @@ -1,6 +1,7 @@ package client import ( + "encoding/json" "fmt" "strings" ) @@ -25,42 +26,17 @@ func (d *docker) Bridges() ([]string, error) { return lines, nil } -func (d *docker) BridgeNames() ([]string, error) { - bridges, err := d.Bridges() - if err != nil { - return nil, err - } - - var names []string - - for _, bridge := range bridges { - bridgeName, err := d.BridgeName(bridge) - if err != nil { - d.logger.Error(err.Error()) - continue - } - names = append(names, bridgeName) - } - - return names, nil -} - -func (d *docker) BridgeName(bridgeID string) (string, error) { - format := fmt.Sprintf(`{{"br-%s" | or (index .Options "com.docker.network.bridge.name")}}`, bridgeID) - args := []string{"network", "inspect", "-f", format, bridgeID} +func (d *docker) BridgeInfo(bridgeID string) (DockerBridgeInspect, error) { + args := []string{"network", "inspect", bridgeID} result, err := d.command(args...) if err != nil { - return "", fmt.Errorf("failed to get bridge name: %s", err.Error()) + return DockerBridgeInspect{}, fmt.Errorf("failed to get bridge name: %s", err.Error()) } - return strings.TrimSpace(string(result)), nil -} -func (d *docker) BridgeSubnet(bridgeID string) (string, error) { - format := fmt.Sprintf(`{{range .IPAM.Config}}{{.Subnet}}{{end}}`) - args := []string{"network", "inspect", "-f", format, bridgeID} - result, err := d.command(args...) - if err != nil { - return "", fmt.Errorf("failed to get bridge subnet: %s", err.Error()) + var info []DockerBridgeInspect + if err := json.Unmarshal(result, &info); err != nil { + return DockerBridgeInspect{}, err } - return strings.TrimSpace(string(result)), nil + + return info[0], nil } diff --git a/internal/daemon/docker_monitor/client/docker.go b/internal/daemon/docker_monitor/client/docker.go index 6438bd7..3e82d7d 100644 --- a/internal/daemon/docker_monitor/client/docker.go +++ b/internal/daemon/docker_monitor/client/docker.go @@ -16,9 +16,7 @@ type Docker interface { FetchContainers(bridgeID string) (Containers, error) Bridges() ([]string, error) - BridgeNames() ([]string, error) - BridgeName(bridgeID string) (string, error) - BridgeSubnet(bridgeID string) (string, error) + BridgeInfo(bridgeID string) (DockerBridgeInspect, error) Containers(bridgeID string) ([]string, error) ContainerNetworks(containerID string) (DockerContainerInspect, error) @@ -52,13 +50,7 @@ func (d *docker) FetchBridges() (Bridges, error) { } for _, bridgeId := range list { - bridgeName, err := d.BridgeName(bridgeId) - if err != nil { - d.logger.Error(err.Error()) - continue - } - - bridgeSubnet, err := d.BridgeSubnet(bridgeId) + bridgeInfo, err := d.BridgeInfo(bridgeId) if err != nil { d.logger.Error(err.Error()) continue @@ -70,10 +62,22 @@ func (d *docker) FetchBridges() (Bridges, error) { d.logger.Error(err.Error()) } + bridgeName := fmt.Sprintf("br-%s", bridgeId) + if bridgeInfo.Options.Name != "" { + bridgeName = bridgeInfo.Options.Name + } + + var bridgeSubnet []string + if bridgeInfo.IPAM.Config != nil { + for _, config := range bridgeInfo.IPAM.Config { + bridgeSubnet = append(bridgeSubnet, config.Subnet) + } + } + bridges = append(bridges, Bridge{ - ID: bridgeId, + ID: bridgeInfo.ID, Name: bridgeName, - Subnet: bridgeSubnet, + Subnets: bridgeSubnet, Containers: containers, }) } diff --git a/internal/daemon/docker_monitor/client/entity.go b/internal/daemon/docker_monitor/client/entity.go index fe10d7b..7741ea6 100644 --- a/internal/daemon/docker_monitor/client/entity.go +++ b/internal/daemon/docker_monitor/client/entity.go @@ -14,10 +14,22 @@ type Bridges []Bridge type Bridge struct { ID string Name string - Subnet string + Subnets []string Containers Containers } +type DockerBridgeInspect struct { + ID string `json:"Id"` + Options struct { + Name string `json:"com.docker.network.bridge.name"` + } `json:"Options"` + IPAM struct { + Config []struct { + Subnet string `json:"Subnet"` + } `json:"Config"` + } `json:"IPAM"` +} + type Containers []Container type Container struct {