From 9c2aa45751a367b1160bc4437e45af8d77229d91 Mon Sep 17 00:00:00 2001 From: Christoph Hummer Date: Sat, 3 Aug 2024 07:39:00 +0200 Subject: [PATCH] Minor improvements (#1) * few changes, please test * Change weird formatting * Another formatting change * Fix for `container:` networks * Hide IPs/Ports when container is not running * WebUI fix - generate WebUI links correctly - don't show WebUI from containers which use a `container:` network --- .../DockerContainers.page | 1 + .../include/DockerClient.php | 65 ++++++++++++------- .../include/DockerContainers.php | 19 +++++- 3 files changed, 58 insertions(+), 27 deletions(-) diff --git a/emhttp/plugins/dynamix.docker.manager/DockerContainers.page b/emhttp/plugins/dynamix.docker.manager/DockerContainers.page index 19e524d9a..e0bfb05c6 100644 --- a/emhttp/plugins/dynamix.docker.manager/DockerContainers.page +++ b/emhttp/plugins/dynamix.docker.manager/DockerContainers.page @@ -182,3 +182,4 @@ window.onunload = function(){ dockerload.stop(); } + diff --git a/emhttp/plugins/dynamix.docker.manager/include/DockerClient.php b/emhttp/plugins/dynamix.docker.manager/include/DockerClient.php index 0aef6fc1b..7d777ec78 100644 --- a/emhttp/plugins/dynamix.docker.manager/include/DockerClient.php +++ b/emhttp/plugins/dynamix.docker.manager/include/DockerClient.php @@ -293,7 +293,7 @@ class DockerTemplates { } public function getAllInfo($reload=false,$com=true,$communityApplications=false) { - global $dockerManPaths, $host; + global $driver, $dockerManPaths, $host; $DockerClient = new DockerClient(); $DockerUpdate = new DockerUpdate(); //$DockerUpdate->verbose = $this->verbose; @@ -321,8 +321,18 @@ class DockerTemplates { // non-templated webui, user specified $tmp['url'] = $webui; } else { - $ip = ($ct['NetworkMode']=='host'||!is_null(_var($port,'PublicPort'))) ? $host : _var($port,'IP'); + if ($ct['NetworkMode']=='host') { + $ip = $host; + } elseif ($driver[$ct['NetworkMode']]=='ipvlan' || $driver[$ct['NetworkMode']]=='macvlan') { + $ip = reset($ct['Networks'])['IPAddress']; + } elseif (!is_null(_var($port,'PublicPort'))) { + $ip = $host; + } else { + $ip = _var($port,'IP'); + } $tmp['url'] = $ip ? (strpos($tmp['url'],$ip)!==false ? $tmp['url'] : $this->getControlURL($ct, $ip, $tmp['url'])) : $tmp['url']; + if (strpos($ct['NetworkMode'], 'container:') === 0) + $tmp['url'] = ''; } if ( ($tmp['shell'] ?? false) == false ) $tmp['shell'] = $this->getTemplateValue($image, 'Shell'); @@ -928,32 +938,38 @@ class DockerClient { $c['Ports'] = []; $c['Networks'] = []; if ($id) $c['NetworkMode'] = $net.str_replace('/',':',DockerUtil::ctMap($id)?:'/???'); - if (isset($driver[$c['NetworkMode']])) { - if ($driver[$c['NetworkMode']]=='bridge') { - $ports = &$info['HostConfig']['PortBindings']; - } else { + if ($info['State']['Running']) { + if (isset($driver[$c['NetworkMode']])) { + if ($driver[$c['NetworkMode']]=='bridge') { + $ports = &$info['HostConfig']['PortBindings']; + } elseif ($driver[$c['NetworkMode']]=='host') { + $c['Ports']['host'] = ['host' => '']; + } elseif ($driver[$c['NetworkMode']]=='ipvlan' || $driver[$c['NetworkMode']]=='macvlan') { + $c['Ports']['vlan'] = ['vlan' => '']; + } else { + $ports = &$info['Config']['ExposedPorts']; + } + } 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 ]; + } } - } 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 ]; + $ports = (isset($ports) && is_array($ports)) ? $ports : []; + foreach ($ports as $port => $value) { + [$PrivatePort, $Type] = array_pad(explode('/', $port),2,''); + $PublicPort = $info['HostConfig']['PortBindings']["$port"][0]['HostPort'] ?: null; + $nat = ($driver[$c['NetworkMode']]=='bridge'); + if (array_key_exists($PrivatePort, $c['Ports']) && $Type != $c['Ports'][$PrivatePort]['Type']) + $Type = $c['Ports'][$PrivatePort]['Type'] . '/' . $Type; + $c['Ports'][$PrivatePort] = ['IP' => $ip, 'PrivatePort' => $PrivatePort, 'PublicPort' => $PublicPort, 'NAT' => $nat, 'Type' => $Type, 'Driver' => $driver[$c['NetworkMode']]]; } + ksort($c['Ports']); } - $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) { - [$PrivatePort, $Type] = array_pad(explode('/', $port),2,''); - $PublicPort = $info['HostConfig']['PortBindings']["$port"][0]['HostPort'] ?: null; - $nat = ($driver[$c['NetworkMode']]=='bridge'); - if (array_key_exists($PrivatePort, $c['Ports']) && $Type != $c['Ports'][$PrivatePort]['Type']) - $Type = $c['Ports'][$PrivatePort]['Type'] . '/' . $Type; - $c['Ports'][$PrivatePort] = ['IP' => $ip, 'PrivatePort' => $PrivatePort, 'PublicPort' => $PublicPort, 'NAT' => $nat, 'Type' => $Type, 'Driver' => $driver[$c['NetworkMode']]]; - } - ksort($c['Ports']); $this::$containersCache[] = $c; } array_multisort(array_column($this::$containersCache,'Name'), SORT_NATURAL|SORT_FLAG_CASE, $this::$containersCache); @@ -1101,3 +1117,4 @@ class DockerUtil { } } ?> + diff --git a/emhttp/plugins/dynamix.docker.manager/include/DockerContainers.php b/emhttp/plugins/dynamix.docker.manager/include/DockerContainers.php index 1a28ab5f0..3e67cb5d2 100644 --- a/emhttp/plugins/dynamix.docker.manager/include/DockerContainers.php +++ b/emhttp/plugins/dynamix.docker.manager/include/DockerContainers.php @@ -96,11 +96,23 @@ foreach ($containers as $ct) { $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 (_var($port,'Driver') == 'ipvlan' || _var($port,'Driver') == 'host') - $ports_external[] = sprintf('%s:%s', _var($port,'IP'), strtoupper(_var($port,'PrivatePort'))); - $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[] = 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'))); + } } $paths = []; $ct['Volumes'] = is_array($ct['Volumes']) ? $ct['Volumes'] : []; @@ -168,3 +180,4 @@ foreach ($images as $image) { } echo "\0".implode($docker)."\0".(pgrep('rc.docker')!==false ? 1:0); ?> +