mirror of
https://github.com/unraid/webgui.git
synced 2026-04-23 18:48:49 -05:00
Enhancements to Docker settings and overview
This commit is contained in:
@@ -60,6 +60,7 @@ img.stopped{opacity:0.3;}
|
||||
<th> </th>
|
||||
<th>Application</th>
|
||||
<th>Version</th>
|
||||
<th>Network</th>
|
||||
<th>Port Mappings <small>(App to Host)</small></th>
|
||||
<th>Volume Mappings <small>(App to Host)</small></th>
|
||||
<th width="80px" style="text-align: center">Autostart</th>
|
||||
@@ -76,9 +77,10 @@ img.stopped{opacity:0.3;}
|
||||
$info = $DockerTemplates->getAllInfo();
|
||||
$contextMenus = [];
|
||||
|
||||
$IP = $eth0["IPADDR:0"];
|
||||
$IP = $eth0['IPADDR:0'];
|
||||
foreach ($all_containers as $ct) {
|
||||
$name = $ct["Name"];
|
||||
$name = $ct['Name'];
|
||||
$mode = $ct['NetworkMode'];
|
||||
$is_autostart = ($info[$name]['autostart']) ? 'true' : 'false';
|
||||
$updateStatus = $info[$name]['updated'];
|
||||
$updateStatus = ($updateStatus == "true" || $updateStatus == "undef") ? 'true' : 'false';
|
||||
@@ -97,21 +99,29 @@ img.stopped{opacity:0.3;}
|
||||
}
|
||||
|
||||
$ports = [];
|
||||
$binds = explode('|',exec("docker inspect --format='{{range \$p,\$c := .HostConfig.PortBindings}}{{\$p}}:{{(index \$c 0).HostPort}}|{{end}}' $name 2>/dev/null"));
|
||||
foreach ($binds as $bind) {
|
||||
list($container_port,$host_port) = explode(':',$bind);
|
||||
if (!$host_port) continue;
|
||||
$ipAddr = sprintf("%s:%s", $IP, $host_port);
|
||||
$ports[] = sprintf('<a href="http://%s" target="_blank">%s <i class="fa fa-arrows-h" style="margin: 0 3px"></i> %s</a>', $ipAddr, $container_port, htmlspecialchars($ipAddr));
|
||||
if ($mode == 'bridge') {
|
||||
$binds = explode('|',exec("docker inspect --format='{{range \$p,\$c := .HostConfig.PortBindings}}{{\$p}}:{{(index \$c 0).HostPort}}|{{end}}' $name 2>/dev/null"));
|
||||
$ip = exec("docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $name 2>/dev/null");
|
||||
foreach ($binds as $bind) {
|
||||
if (!$bind) continue;
|
||||
list($container_port,$host_port) = explode(':',$bind);
|
||||
$ports[] = sprintf('%s:%s<i class="fa fa-arrows-h" style="margin:0 6px"></i>%s:%s', $ip, $container_port, $IP, $host_port);
|
||||
}
|
||||
} else {
|
||||
$binds = explode('|',exec("docker inspect --format='{{range \$p,\$c := .Config.ExposedPorts}}{{\$p}}|{{end}}' $name 2>/dev/null"));
|
||||
$ip = exec("docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $name 2>/dev/null") ?: $IP;
|
||||
foreach ($binds as $bind) {
|
||||
if (!$bind) continue;
|
||||
$ports[] = sprintf('%s:%s<i class="fa fa-arrows-h" style="margin:0 6px"></i>%s:%s', $ip, $bind, $ip, str_replace(['/tcp','/udp'],'',$bind));
|
||||
}
|
||||
}
|
||||
|
||||
$paths = [];
|
||||
$mounts = explode('|',exec("docker inspect --format='{{range .Mounts}}{{.Destination}}:{{.Source}}:{{.Mode}}|{{end}}' $name 2>/dev/null"));
|
||||
$mounts = explode('|',exec("docker inspect --format='{{range \$c := .HostConfig.Binds}}{{\$c}}|{{end}}' $name 2>/dev/null"));
|
||||
foreach ($mounts as $mount) {
|
||||
list($container_path,$host_path,$access_mode) = explode(':',$mount);
|
||||
if (!$access_mode) continue;
|
||||
$tip = 'Container volume \''.$container_path.'\' has '.($access_mode == 'ro' ? 'read-only' : 'read-write').' access to Host path \''.$host_path.'\'';
|
||||
$paths[] = sprintf('<a href="/Shares/Browse?dir=%s" target="_blank" title="%s">%s <i class="fa fa-%s" style="margin: 0 3px"></i> %s</a>', urlencode($host_path), htmlspecialchars($tip), htmlspecialchars($container_path), ($access_mode == 'ro' ? 'long-arrow-left' : 'arrows-h'), htmlspecialchars($host_path));
|
||||
if (!$mount) continue;
|
||||
list($host_path,$container_path,$access_mode) = explode(':',$mount);
|
||||
$paths[] = sprintf('%s<i class="fa fa-%s" style="margin:0 6px"></i>%s', htmlspecialchars($container_path), $access_mode=='ro'?'long-arrow-left':'arrows-h', htmlspecialchars($host_path));
|
||||
}
|
||||
?>
|
||||
<tr>
|
||||
@@ -158,8 +168,9 @@ img.stopped{opacity:0.3;}
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
<td style="white-space:nowrap;"><span class="docker_readmore"><?= implode("<br>", $ports); ?></span></td>
|
||||
<td style="word-break:break-all;"><span class="docker_readmore"><?= implode("<br>", $paths); ?></span></td>
|
||||
<td><?=$mode?></td>
|
||||
<td style="white-space:nowrap;"><?= implode("<br>", $ports)?></td>
|
||||
<td style="word-break:break-all;"><?= implode("<br>", $paths)?></td>
|
||||
<td><input type="checkbox" class="autostart" container="<?=htmlspecialchars($ct['Name']);?>" <?=$info[$ct['Name']]['autostart'] ? "checked" : ""?>></td>
|
||||
<td><a class="log" onclick="containerLogs('<?=addslashes(htmlspecialchars($ct['Name']));?>','<?=$ct['Id'];?>', false, false)"><img class="basic" src="/plugins/dynamix/icons/log.png"/><div class="advanced" style="width: 124px;"><?=htmlspecialchars($ct['Status'])?></div><div class="advanced" style="color:#888;">Created <?=htmlspecialchars($ct['Created'])?></div></a></td>
|
||||
</tr>
|
||||
@@ -264,7 +275,5 @@ $(function() {
|
||||
|
||||
context.init({ preventDoubleContext: false });
|
||||
<?=htmlspecialchars(implode("\n\t", $contextMenus));?>
|
||||
|
||||
$('.docker_readmore').readmore({maxHeight:48, moreLink: '<a href="#" style="text-align:center;"><i class="fa fa-chevron-down"></i></a>', lessLink: '<a href="#" style="text-align:center;"><i class="fa fa-chevron-up"></i></a>'});
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -497,11 +497,13 @@ function getUsedPorts() {
|
||||
foreach ($names as $name) {
|
||||
$list = [];
|
||||
$list['Name'] = strtolower($name);
|
||||
$port = explode(' ',str_replace(['/tcp','/udp'],'',exec("docker inspect --format='{{range \$p,\$c := .Config.ExposedPorts}}{{\$p}} {{end}}' $name 2>/dev/null")));
|
||||
$gui = exec("docker inspect --format='{{range \$c := .Config.Env}}{{\$c}} {{end}}' $name 2>/dev/null|grep -Po '(TCP|UDP)_PORT_\d+=\K\d+'");
|
||||
if ($gui) $port[] = $gui;
|
||||
$mode = exec("docker inspect --format='{{lower .HostConfig.NetworkMode}}' $name 2>/dev/null");
|
||||
if ($mode == 'bridge')
|
||||
$port = explode('|',exec("docker inspect --format='{{range \$c := .HostConfig.PortBindings}}{{(index \$c 0).HostPort}}|{{end}}' $name 2>/dev/null"));
|
||||
else
|
||||
$port = explode('|',str_replace(['/tcp','/udp'],'',exec("docker inspect --format='{{range \$p,\$c := .Config.ExposedPorts}}{{\$p}}|{{end}}' $name 2>/dev/null")));
|
||||
natsort($port);
|
||||
$list['Port'] = trim(implode(' ',array_unique($port)));
|
||||
$list['Port'] = implode(' ',array_unique($port));
|
||||
$ports[] = $list;
|
||||
}
|
||||
return $ports;
|
||||
@@ -513,8 +515,8 @@ function getUsedIPs() {
|
||||
foreach ($names as $name) {
|
||||
$list = [];
|
||||
$list['Name'] = strtolower($name);
|
||||
$dev = exec("docker inspect --format='{{range \$p,\$c := .NetworkSettings.Networks}}{{\$p}}{{end}}' $name 2>/dev/null");
|
||||
$list['ip'] = exec("docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' $name 2>/dev/null")." ($dev)";
|
||||
$mode = exec("docker inspect --format='{{lower .HostConfig.NetworkMode}}' $name 2>/dev/null");
|
||||
$list['ip'] = exec("docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $name 2>/dev/null")." ($mode)";
|
||||
$ips[] = $list;
|
||||
}
|
||||
return $ips;
|
||||
@@ -1512,14 +1514,14 @@ optgroup.title{background-color:#625D5D;color:#FFFFFF;text-align:center;margin-t
|
||||
<table class="settings wide">
|
||||
<tr>
|
||||
<td></td>
|
||||
<td id="portsused_toggle" class="portsused_collapsed"><a onclick="togglePortsUsed()" style="cursor:pointer"><i class="fa fa-chevron-down"></i> Show deployed host ports ...</a></td>
|
||||
<td id="portsused_toggle" class="portsused_collapsed"><a onclick="togglePortsUsed()" style="cursor:pointer"><i class="fa fa-chevron-down"></i> Show exposed host ports ...</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div id="configLocationPorts" style="display:none"></div><br>
|
||||
<table class="settings wide">
|
||||
<tr>
|
||||
<td></td>
|
||||
<td id="ipsused_toggle" class="ipsused_collapsed"><a onclick="toggleIPsUsed()" style="cursor:pointer"><i class="fa fa-chevron-down"></i> Show deployed IP addresses ...</a></td>
|
||||
<td id="ipsused_toggle" class="ipsused_collapsed"><a onclick="toggleIPsUsed()" style="cursor:pointer"><i class="fa fa-chevron-down"></i> Show exposed IP addresses ...</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div id="configLocationIPs" style="display:none"></div><br>
|
||||
@@ -1684,11 +1686,11 @@ optgroup.title{background-color:#625D5D;color:#FFFFFF;text-align:center;margin-t
|
||||
if ( readm.hasClass('portsused_collapsed') ) {
|
||||
readm.removeClass('portsused_collapsed').addClass('portsused_expanded');
|
||||
$('#configLocationPorts').slideDown('fast');
|
||||
readm.find('a').html('<i class="fa fa-chevron-up"></i> Hide deployed host ports ...');
|
||||
readm.find('a').html('<i class="fa fa-chevron-up"></i> Hide exposed host ports ...');
|
||||
} else {
|
||||
$('#configLocationPorts').slideUp('fast');
|
||||
readm.removeClass('portsused_expanded').addClass('portsused_collapsed');
|
||||
readm.find('a').html('<i class="fa fa-chevron-down"></i> Show deployed host ports ...');
|
||||
readm.find('a').html('<i class="fa fa-chevron-down"></i> Show exposed host ports ...');
|
||||
}
|
||||
}
|
||||
function toggleIPsUsed() {
|
||||
@@ -1696,11 +1698,11 @@ optgroup.title{background-color:#625D5D;color:#FFFFFF;text-align:center;margin-t
|
||||
if ( readm.hasClass('ipsused_collapsed') ) {
|
||||
readm.removeClass('ipsused_collapsed').addClass('ipsused_expanded');
|
||||
$('#configLocationIPs').slideDown('fast');
|
||||
readm.find('a').html('<i class="fa fa-chevron-up"></i> Hide deployed IP addresses ...');
|
||||
readm.find('a').html('<i class="fa fa-chevron-up"></i> Hide exposed IP addresses ...');
|
||||
} else {
|
||||
$('#configLocationIPs').slideUp('fast');
|
||||
readm.removeClass('ipsused_expanded').addClass('ipsused_collapsed');
|
||||
readm.find('a').html('<i class="fa fa-chevron-down"></i> Show deployed IP addresses ...');
|
||||
readm.find('a').html('<i class="fa fa-chevron-down"></i> Show exposed IP addresses ...');
|
||||
}
|
||||
}
|
||||
function load_contOverview() {
|
||||
@@ -1765,10 +1767,10 @@ optgroup.title{background-color:#625D5D;color:#FFFFFF;text-align:center;margin-t
|
||||
// Show associated subnet with fixed IP (if existing)
|
||||
showSubnet($('select[name="contNetwork"]').val());
|
||||
|
||||
// Add list of deployed host ports
|
||||
// Add list of exposed host ports
|
||||
$("#configLocationPorts").html(makeUsedPorts(UsedPorts,$('input[name="contName"]').val()));
|
||||
|
||||
// Add list of deployed IP addresses
|
||||
// Add list of exposed IP addresses
|
||||
$("#configLocationIPs").html(makeUsedIPs(UsedIPs,$('input[name="contName"]').val()));
|
||||
|
||||
// Add switchButton
|
||||
|
||||
Reference in New Issue
Block a user