From 8d76d6f1ccd20f749104e6a99ffbdbd48a1798ea Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 15 Aug 2024 15:55:01 +1200 Subject: [PATCH 1/4] fix: display multiple networks for all types This commit ensures containers with multiple networks are always displayed. Previously, networks connected to containers (docker network connect...) don't show --- .../dynamix.docker.manager/include/DockerClient.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/emhttp/plugins/dynamix.docker.manager/include/DockerClient.php b/emhttp/plugins/dynamix.docker.manager/include/DockerClient.php index f7fcabb99..cdd320577 100644 --- a/emhttp/plugins/dynamix.docker.manager/include/DockerClient.php +++ b/emhttp/plugins/dynamix.docker.manager/include/DockerClient.php @@ -951,13 +951,11 @@ class DockerClient { } else if (!$id) { $c['NetworkMode'] = DockerUtil::ctMap($c['NetworkMode']); $ports = &$info['Config']['ExposedPorts']; - foreach($ct['NetworkSettings']['Networks'] as $netName => $netVals) { - $i = $c['NetworkMode']=='host' ? $host : $netVals['IPAddress']; - $c['Networks'][$netName] = [ 'IPAddress' => $i ]; - } } - $ip = $c['NetworkMode']=='host' ? $host : $ct['NetworkSettings']['Networks'][$c['NetworkMode']]['IPAddress'] ?? null; - $c['Networks'][$c['NetworkMode']] = [ 'IPAddress' => $ip ]; + foreach($ct['NetworkSettings']['Networks'] as $netName => $netVals) { + $i = $c['NetworkMode']=='host' ? $host : $netVals['IPAddress']; + $c['Networks'][$netName] = [ 'IPAddress' => $i ]; + } $ports = (isset($ports) && is_array($ports)) ? $ports : []; foreach ($ports as $port => $value) { if (!isset($info['HostConfig']['PortBindings'][$port])) { From 1c019c8f08748a26c5cf7c14a63a192413c7d13a Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 15 Aug 2024 18:50:44 +1200 Subject: [PATCH 2/4] fix: display LAN:IP for multiple external networks --- .../include/DockerContainers.php | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/emhttp/plugins/dynamix.docker.manager/include/DockerContainers.php b/emhttp/plugins/dynamix.docker.manager/include/DockerContainers.php index 3e67cb5d2..55623123e 100644 --- a/emhttp/plugins/dynamix.docker.manager/include/DockerContainers.php +++ b/emhttp/plugins/dynamix.docker.manager/include/DockerContainers.php @@ -89,29 +89,29 @@ foreach ($containers as $ct) { $wait = var_split($autostart[array_search($name,$names)]??'',1); $networks = []; $network_ips = []; + $ports_internal = []; + $ports_external = []; foreach($ct['Networks'] as $netName => $netVals) { $networks[] = $netName; $network_ips[] = $netVals['IPAddress']; - } - $ports_internal = []; - $ports_external = []; - foreach ($ct['Ports'] as $port) { - if (strpos($ct['NetworkMode'], 'container:') === 0) - break; - if (_var($port,'PublicPort') && _var($port,'Driver') == 'bridge') - $ports_external[] = sprintf('%s:%s', $host, strtoupper(_var($port,'PublicPort'))); - if (isset($ct['Networks']['host'])) { - $ports_external[] = sprintf('%s', $netVals['IPAddress']); - $ports_internal[] = sprintf('%s', 'all'); - break; - } - if (isset($ct['Ports']['vlan'])) { - $ports_external[] = sprintf('%s', $netVals['IPAddress']); - $ports_internal[] = sprintf('%s', 'all'); - break; - } - if ((!isset($ct['Networks']['host'])) || (!isset($ct['Networks']['vlan']))) { - $ports_internal[] = sprintf('%s:%s', _var($port,'PrivatePort'), strtoupper(_var($port,'Type'))); + foreach ($ct['Ports'] as $port) { + if (strpos($ct['NetworkMode'], 'container:') === 0) + break; + if (_var($port,'PublicPort') && _var($port,'Driver') == 'bridge') + $ports_external[] = sprintf('%s:%s', $host, strtoupper(_var($port,'PublicPort'))); + if (isset($ct['Networks']['host'])) { + $ports_external[] = sprintf('%s', $netVals['IPAddress']); + $ports_internal[0] = sprintf('%s', 'all'); + break; + } + if (isset($ct['Ports']['vlan'])) { + $ports_external[] = sprintf('%s', $netVals['IPAddress']); + $ports_internal[0] = sprintf('%s', 'all'); + break; + } + if ((!isset($ct['Networks']['host'])) || (!isset($ct['Networks']['vlan']))) { + $ports_internal[] = sprintf('%s:%s', _var($port,'PrivatePort'), strtoupper(_var($port,'Type'))); + } } } $paths = []; From 840e19d322e97307e16ba1f02794eaa2d035910a Mon Sep 17 00:00:00 2001 From: mtongnz Date: Fri, 16 Aug 2024 17:35:22 +1200 Subject: [PATCH 3/4] fix: some networks not showing --- emhttp/plugins/dynamix.docker.manager/include/DockerClient.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/emhttp/plugins/dynamix.docker.manager/include/DockerClient.php b/emhttp/plugins/dynamix.docker.manager/include/DockerClient.php index cdd320577..4719b9134 100644 --- a/emhttp/plugins/dynamix.docker.manager/include/DockerClient.php +++ b/emhttp/plugins/dynamix.docker.manager/include/DockerClient.php @@ -952,6 +952,8 @@ class DockerClient { $c['NetworkMode'] = DockerUtil::ctMap($c['NetworkMode']); $ports = &$info['Config']['ExposedPorts']; } + $ip = $c['NetworkMode']=='host' ? $host : $ct['NetworkSettings']['Networks'][$c['NetworkMode']]['IPAddress'] ?? null; + $c['Networks'][$c['NetworkMode']] = [ 'IPAddress' => $ip ]; foreach($ct['NetworkSettings']['Networks'] as $netName => $netVals) { $i = $c['NetworkMode']=='host' ? $host : $netVals['IPAddress']; $c['Networks'][$netName] = [ 'IPAddress' => $i ]; From c1b2bb7435bef334fa67152005c9e624c54a4cee Mon Sep 17 00:00:00 2001 From: mtongnz Date: Fri, 16 Aug 2024 18:20:10 +1200 Subject: [PATCH 4/4] fix: better display of container LAN IP for ipvlan & macvlan --- .../include/DockerClient.php | 11 +++++-- .../include/DockerContainers.php | 32 +++++++++---------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/emhttp/plugins/dynamix.docker.manager/include/DockerClient.php b/emhttp/plugins/dynamix.docker.manager/include/DockerClient.php index 4719b9134..c5548d46f 100644 --- a/emhttp/plugins/dynamix.docker.manager/include/DockerClient.php +++ b/emhttp/plugins/dynamix.docker.manager/include/DockerClient.php @@ -944,7 +944,8 @@ class DockerClient { } elseif ($driver[$c['NetworkMode']]=='host') { $c['Ports']['host'] = ['host' => '']; } elseif ($driver[$c['NetworkMode']]=='ipvlan' || $driver[$c['NetworkMode']]=='macvlan') { - $c['Ports']['vlan'] = ['vlan' => '']; + $i = $ct['NetworkSettings']['Networks'][$c['NetworkMode']]['IPAddress']; + $c['Ports']['vlan'] = ["$i" => $i]; } else { $ports = &$info['Config']['ExposedPorts']; } @@ -952,12 +953,16 @@ class DockerClient { $c['NetworkMode'] = DockerUtil::ctMap($c['NetworkMode']); $ports = &$info['Config']['ExposedPorts']; } - $ip = $c['NetworkMode']=='host' ? $host : $ct['NetworkSettings']['Networks'][$c['NetworkMode']]['IPAddress'] ?? null; - $c['Networks'][$c['NetworkMode']] = [ 'IPAddress' => $ip ]; foreach($ct['NetworkSettings']['Networks'] as $netName => $netVals) { $i = $c['NetworkMode']=='host' ? $host : $netVals['IPAddress']; $c['Networks'][$netName] = [ 'IPAddress' => $i ]; + if ($driver[$netName]=='ipvlan' || $driver[$netName]=='macvlan') { + if (!isset($c['Ports']['vlan'])) $c['Ports']['vlan'] = []; + $c['Ports']['vlan']["$i"] = $i; + } } + $ip = $c['NetworkMode']=='host' ? $host : $ct['NetworkSettings']['Networks'][$c['NetworkMode']]['IPAddress'] ?? null; + $c['Networks'][$c['NetworkMode']] = [ 'IPAddress' => $ip ]; $ports = (isset($ports) && is_array($ports)) ? $ports : []; foreach ($ports as $port => $value) { if (!isset($info['HostConfig']['PortBindings'][$port])) { diff --git a/emhttp/plugins/dynamix.docker.manager/include/DockerContainers.php b/emhttp/plugins/dynamix.docker.manager/include/DockerContainers.php index 55623123e..fb6f610a3 100644 --- a/emhttp/plugins/dynamix.docker.manager/include/DockerContainers.php +++ b/emhttp/plugins/dynamix.docker.manager/include/DockerContainers.php @@ -91,26 +91,24 @@ foreach ($containers as $ct) { $network_ips = []; $ports_internal = []; $ports_external = []; + if (isset($ct['Ports']['vlan'])) { + foreach ($ct['Ports']['vlan'] as $i) + $ports_external[] = sprintf('%s', $i); + $ports_internal[0] = sprintf('%s', 'all'); + } foreach($ct['Networks'] as $netName => $netVals) { $networks[] = $netName; $network_ips[] = $netVals['IPAddress']; - foreach ($ct['Ports'] as $port) { - if (strpos($ct['NetworkMode'], 'container:') === 0) - break; - if (_var($port,'PublicPort') && _var($port,'Driver') == 'bridge') - $ports_external[] = sprintf('%s:%s', $host, strtoupper(_var($port,'PublicPort'))); - if (isset($ct['Networks']['host'])) { - $ports_external[] = sprintf('%s', $netVals['IPAddress']); - $ports_internal[0] = sprintf('%s', 'all'); - break; - } - if (isset($ct['Ports']['vlan'])) { - $ports_external[] = sprintf('%s', $netVals['IPAddress']); - $ports_internal[0] = sprintf('%s', 'all'); - break; - } - if ((!isset($ct['Networks']['host'])) || (!isset($ct['Networks']['vlan']))) { - $ports_internal[] = sprintf('%s:%s', _var($port,'PrivatePort'), strtoupper(_var($port,'Type'))); + + if (isset($ct['Networks']['host'])) { + $ports_external[] = sprintf('%s', $netVals['IPAddress']); + $ports_internal[0] = sprintf('%s', 'all'); + } else if (!isset($ct['Ports']['vlan']) || strpos($ct['NetworkMode'], 'container:') != 0) { + foreach ($ct['Ports'] as $port) { + if (_var($port,'PublicPort') && _var($port,'Driver') == 'bridge') + $ports_external[] = sprintf('%s:%s', $host, strtoupper(_var($port,'PublicPort'))); + if ((!isset($ct['Networks']['host'])) || (!isset($ct['Networks']['vlan']))) + $ports_internal[] = sprintf('%s:%s', _var($port,'PrivatePort'), strtoupper(_var($port,'Type'))); } } }