This commit is contained in:
Colin 2024-08-29 11:25:49 -04:00
parent b18dab5b49
commit f759a44e04
8 changed files with 62 additions and 17 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

79
main.go
View File

@ -143,7 +143,7 @@ func listContainers() ([]Container, error) {
}
func inspectContainer(containerID string) ([]string, []string, []string, []string, string, error) {
cmd := exec.Command("docker", "inspect", "--format", `{{range .Config.Env}}{{println .}}{{end}}{{range .NetworkSettings.Networks}}{{println .}}{{end}}{{range .Mounts}}{{println .}}{{end}}{{range $p, $conf := .HostConfig.PortBindings}}{{println $p}}{{end}}{{.HostConfig.RestartPolicy.Name}}`, containerID)
cmd := exec.Command("docker", "inspect", "--format", `{{json .Config.Env}} {{json .NetworkSettings.Networks}} {{json .Mounts}} {{json .HostConfig.PortBindings}} {{.HostConfig.RestartPolicy.Name}}`, containerID)
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
@ -151,29 +151,74 @@ func inspectContainer(containerID string) ([]string, []string, []string, []strin
return nil, nil, nil, nil, "", err
}
lines := strings.Split(out.String(), "\n")
var envVars, networks, volumes, ports []string
output := out.String()
parts := strings.Split(output, " ")
envVars, networks, volumes, ports := []string{}, []string{}, []string{}, []string{}
restartPolicy := ""
for _, line := range lines {
if strings.Contains(line, "=") {
envVars = append(envVars, line)
} else if strings.Contains(line, "Name:") && strings.Contains(line, "Driver:") {
networks = append(networks, strings.TrimSpace(line))
} else if strings.Contains(line, "Source:") && strings.Contains(line, "Destination:") {
volume := strings.Split(line, "Destination:")[1]
volumes = append(volumes, volume)
} else if strings.Contains(line, "/tcp") || strings.Contains(line, "/udp") {
ports = append(ports, line)
} else if line != "" {
restartPolicy = line
}
if len(parts) > 0 && parts[0] != "null" {
envVars = parseJSONStringArray(parts[0])
}
if len(parts) > 1 && parts[1] != "null" {
networks = parseJSONNetworkNames(parts[1])
}
if len(parts) > 2 && parts[2] != "null" {
volumes = parseJSONVolumeMounts(parts[2])
}
if len(parts) > 3 && parts[3] != "null" {
ports = parseJSONPorts(parts[3])
}
if len(parts) > 4 {
restartPolicy = strings.Trim(parts[4], `"`)
}
return envVars, networks, volumes, ports, restartPolicy, nil
}
func parseJSONStringArray(jsonStr string) []string {
jsonStr = strings.Trim(jsonStr, "[]")
if jsonStr == "" {
return []string{}
}
return strings.Split(jsonStr, ",")
}
func parseJSONNetworkNames(jsonStr string) []string {
var networkNames []string
networkData := strings.Split(jsonStr, ":")
for _, data := range networkData {
if strings.Contains(data, "\"Name\"") {
parts := strings.Split(data, "\"")
networkNames = append(networkNames, parts[1])
}
}
return networkNames
}
func parseJSONVolumeMounts(jsonStr string) []string {
var volumeMounts []string
volumeData := strings.Split(jsonStr, "},{")
for _, data := range volumeData {
if strings.Contains(data, "\"Destination\"") {
parts := strings.Split(data, "\"")
volumeMounts = append(volumeMounts, parts[3])
}
}
return volumeMounts
}
func parseJSONPorts(jsonStr string) []string {
var ports []string
portData := strings.Split(jsonStr, "},{")
for _, data := range portData {
if strings.Contains(data, "\"HostPort\"") {
parts := strings.Split(data, "\"")
ports = append(ports, parts[3]+":"+parts[7])
}
}
return ports
}
func isDockerSwarmStack(stackName string, containers []Container) bool {
for _, container := range containers {
if strings.Contains(container.Name, ".") {