diff --git a/plugins/dynamix.docker.manager/DockerContainers.page b/plugins/dynamix.docker.manager/DockerContainers.page
index 88e39798e..a06388956 100644
--- a/plugins/dynamix.docker.manager/DockerContainers.page
+++ b/plugins/dynamix.docker.manager/DockerContainers.page
@@ -34,13 +34,14 @@ img.stopped{opacity:0.3}
.started{color:#009900}
.stopped{color:#EF3D47}
.switch-button-label.off{color:inherit}
-th.three{width:3%}
+th.five{width:5%}
+th.eight{width:8%}
- | Application | Version | Network | Port Mappings (App to Host) | Volume Mappings (App to Host) | Autostart | Log |
+ | Application | Version | Network | Port Mappings (App to Host) | Volume Mappings (App to Host) | Autostart | Log | |
|
@@ -85,10 +86,6 @@ function loadlist(update) {
$('.autostart').change(function() {
$.post( "/plugins/dynamix.docker.manager/include/UpdateConfig.php",{action:'autostart',container:$(this).attr('container'),response:'json'},function(data){$(this).prop('checked',data.autostart);},'json');
});
- $('#docker_containers').tablesorter({
- sortList:[[1,0]],headers:{0:{sorter:false},4:{sorter:false},5:{sorter:false},7:{sorter:false}},
- textExtraction:{6:function(node,table,cellIndex){return $(node).find('input').prop('checked')?1:0;}}
- });
if ($.cookie('docker_listview_mode')=='advanced') {$('.advanced').show(); $('.basic').hide();}
listview();
context.init({preventDoubleContext:false});
@@ -98,6 +95,24 @@ function loadlist(update) {
} else {
$('input#checkAll').show(); $('input#updateAll').hide();
}
+ $('i.up,i.down').click(function() {
+ var row = $(this).parents('tr:first');
+ var color1 = row.css('background-color');
+ if ($(this).is('.up')) {
+ var color2 = row.prev().css('background-color');
+ row.prev().css('background-color',color1);
+ row.css('background-color',color2);
+ row.insertBefore(row.prev());
+ } else {
+ var color2 = row.next().css('background-color');
+ row.next().css('background-color',color1);
+ row.css('background-color',color2);
+ row.insertAfter(row.next());
+ }
+ var names = ''; var index = '';
+ row.parent().children().find('td.ct-name').each(function(){names+=$(this).text().replace(/Container ID.*$/,'')+';';index+=$(this).parent().parent().children().index($(this).parent())+';';});
+ $.post('/plugins/dynamix.docker.manager/include/UserPrefs.php',{names:names,index:index});
+ });
});
}
$(function() {
diff --git a/plugins/dynamix.docker.manager/include/ContainerManager.php b/plugins/dynamix.docker.manager/include/ContainerManager.php
index e4b81ed61..affcfe830 100644
--- a/plugins/dynamix.docker.manager/include/ContainerManager.php
+++ b/plugins/dynamix.docker.manager/include/ContainerManager.php
@@ -12,16 +12,23 @@
*/
?>
-$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
+$user_prefs = '/boot/config/plugins/dockerMan/userprefs.cfg';
-exec("docker ps -a --format='{{.Names}}'",$container);
+exec("docker ps -a --format='{{.Names}}'",$all_containers);
+
+if (file_exists($user_prefs)) {
+ $prefs = parse_ini_file($user_prefs); $sort = [];
+ foreach ($all_containers as $ct) $sort[] = array_search($ct,$prefs) ?? 999;
+ array_multisort($sort,SORT_NUMERIC,$all_containers);
+}
$action = $_POST['action'];
switch ($action) {
- case 'stop' : $state = 'true'; break;
+ case 'stop' : $state = 'true'; $all_containers = array_reverse($all_containers); break;
case 'start': $state = 'false'; break;
}
-foreach ($container as $ct) {
+
+foreach ($all_containers as $ct) {
if (exec("docker inspect --format='{{.State.Running}}' $ct")==$state) exec("docker $action $ct >/dev/null");
}
?>
diff --git a/plugins/dynamix.docker.manager/include/CreateDocker.php b/plugins/dynamix.docker.manager/include/CreateDocker.php
index 884dbf06b..9c1db9b2d 100644
--- a/plugins/dynamix.docker.manager/include/CreateDocker.php
+++ b/plugins/dynamix.docker.manager/include/CreateDocker.php
@@ -439,8 +439,7 @@ function xmlToCommand($xml, $create_paths=false) {
function execCommand($command) {
// $command should have all its args already properly run through 'escapeshellarg'
- $cmdTmp = explode(";",$command);
- $command = $cmdTmp[0];
+ // $command = explode(';',$command)[0]; // commented out, not sure if we want this!
$descriptorspec = [
0 => ["pipe", "r"], // stdin is a pipe that the child will read from
diff --git a/plugins/dynamix.docker.manager/include/DockerClient.php b/plugins/dynamix.docker.manager/include/DockerClient.php
index b92adbe4f..c160e3c3b 100644
--- a/plugins/dynamix.docker.manager/include/DockerClient.php
+++ b/plugins/dynamix.docker.manager/include/DockerClient.php
@@ -20,6 +20,7 @@ $dockerManPaths = [
'template-repos' => '/boot/config/plugins/dockerMan/template-repos',
'templates-user' => '/boot/config/plugins/dockerMan/templates-user',
'templates-storage' => '/boot/config/plugins/dockerMan/templates',
+ 'user-prefs' => '/boot/config/plugins/dockerMan/userprefs.cfg',
'images-ram' => '/usr/local/emhttp/state/plugins/dynamix.docker.manager/images',
'images-storage' => '/boot/config/plugins/dockerMan/images',
'webui-info' => '/usr/local/emhttp/state/plugins/dynamix.docker.manager/docker.json',
diff --git a/plugins/dynamix.docker.manager/include/DockerContainers.php b/plugins/dynamix.docker.manager/include/DockerContainers.php
index 1349d1ae4..752ce035b 100644
--- a/plugins/dynamix.docker.manager/include/DockerContainers.php
+++ b/plugins/dynamix.docker.manager/include/DockerContainers.php
@@ -17,6 +17,7 @@ $docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
// Add the Docker JSON client
require_once "$docroot/plugins/dynamix.docker.manager/include/DockerClient.php";
+$user_prefs = $dockerManPaths['user-prefs'];
$DockerClient = new DockerClient();
$DockerTemplates = new DockerTemplates();
@@ -26,17 +27,23 @@ if (!$all_containers) {
return;
}
+if (file_exists($user_prefs)) {
+ $prefs = parse_ini_file($user_prefs); $sort = [];
+ foreach ($all_containers as $ct) $sort[] = array_search($ct['Name'],$prefs) ?? 999;
+ array_multisort($sort,SORT_NUMERIC,$all_containers);
+}
+
// Read network settings
extract(parse_ini_file('state/network.ini',true));
// Read container info
-$all = $DockerTemplates->getAllInfo();
+$all_info = $DockerTemplates->getAllInfo();
$menu = [];
$docker = ['var docker=[];'];
foreach ($all_containers as $ct) {
$name = $ct['Name'];
- $info = &$all[$name];
+ $info = &$all_info[$name];
$mode = $ct['NetworkMode'];
$id = $ct['Id'];
$imageID = $ct['ImageId'];
@@ -80,7 +87,7 @@ foreach ($all_containers as $ct) {
echo "";
echo "
.")
";
echo "
";
- echo "";
+ echo " | ";
if ($template) {
echo "".htmlspecialchars($name)."";
} else {
@@ -109,7 +116,9 @@ foreach ($all_containers as $ct) {
echo " | ".implode(' ',$ports)." | ";
echo "".implode(' ',$paths)." | ";
echo " | ";
- echo " ".htmlspecialchars(str_replace('Up','Uptime',$ct['Status']))." Created ".htmlspecialchars($ct['Created'])." | ";
+ echo " ";
+ echo htmlspecialchars(str_replace('Up','Uptime',$ct['Status']))."Created ".htmlspecialchars($ct['Created'])." | ";
+ echo " | ";
}
foreach ($DockerClient->getDockerImages() as $image) {
if (count($image['usedBy'])) continue;
diff --git a/plugins/dynamix.docker.manager/include/UpdateConfig.php b/plugins/dynamix.docker.manager/include/UpdateConfig.php
index 57ef3bda1..c1995dd6f 100644
--- a/plugins/dynamix.docker.manager/include/UpdateConfig.php
+++ b/plugins/dynamix.docker.manager/include/UpdateConfig.php
@@ -1,6 +1,7 @@
true]);
- }
- else {
+ } else {
unset($allAutoStart[$key]);
if ($json) echo json_encode(['autostart' => false]);
}
- file_put_contents($autostart_file, implode(PHP_EOL, $allAutoStart).(count($allAutoStart)? PHP_EOL : ""));
+ // sort containers for start-up
+ if (file_exists($user_prefs)) {
+ $prefs = parse_ini_file($user_prefs); $sort = [];
+ foreach ($allAutoStart as $ct) $sort[] = array_search($ct,$prefs) ?? 999;
+ array_multisort($sort,SORT_NUMERIC,$allAutoStart);
+ } else {
+ natcasesort($allAutoStart);
+ }
+ $allAutoStart ? file_put_contents($autostart_file, implode(PHP_EOL, $allAutoStart).PHP_EOL) : @unlink($autostart_file);
}
-if ($_POST['#action'] == "templates" ){
+if ($_POST['#action'] == 'templates' ){
readfile("$docroot/update.htm");
$repos = $_POST['template_repos'];
file_put_contents($template_repos, $repos);
diff --git a/plugins/dynamix.docker.manager/include/UserPrefs.php b/plugins/dynamix.docker.manager/include/UserPrefs.php
new file mode 100644
index 000000000..c40e65d4d
--- /dev/null
+++ b/plugins/dynamix.docker.manager/include/UserPrefs.php
@@ -0,0 +1,36 @@
+
+
+$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
+require_once "$docroot/plugins/dynamix.docker.manager/include/DockerClient.php";
+
+$autostart_file = $dockerManPaths['autostart-file'];
+$user_prefs = $dockerManPaths['user-prefs'];
+
+$names = explode(';',$_POST['names']);
+$index = explode(';',$_POST['index']);
+$save = []; $i = 0;
+
+foreach ($names as $name) if ($name) $save[] = $index[$i++]."=\"".$name."\""; else $i++;
+file_put_contents($user_prefs, implode("\n",$save)."\n");
+
+// sort containers for start-up
+if (file_exists($autostart_file)) {
+ $prefs = parse_ini_file($user_prefs); $sort = [];
+ $allAutoStart = file($autostart_file, FILE_IGNORE_NEW_LINES);
+ foreach ($allAutoStart as $ct) $sort[] = array_search($ct,$prefs) ?? 999;
+ array_multisort($sort,SORT_NUMERIC,$allAutoStart);
+ file_put_contents($autostart_file, implode(PHP_EOL, $allAutoStart).PHP_EOL);
+}
+?>
diff --git a/plugins/dynamix.vm.manager/VMMachines.page b/plugins/dynamix.vm.manager/VMMachines.page
index 06de1ddc0..8ddc56d99 100644
--- a/plugins/dynamix.vm.manager/VMMachines.page
+++ b/plugins/dynamix.vm.manager/VMMachines.page
@@ -111,7 +111,7 @@ div.PanelText{display:none;}
th.five{width:5%}
- | Name | Description | CPUs | Memory | vDisks | Graphics | Autostart | |
+ | Name | Description | CPUs | Memory | vDisks | Graphics | Autostart | |
|
diff --git a/plugins/dynamix.vm.manager/include/VMMachines.php b/plugins/dynamix.vm.manager/include/VMMachines.php
index f81d1d667..a2592f7e7 100644
--- a/plugins/dynamix.vm.manager/include/VMMachines.php
+++ b/plugins/dynamix.vm.manager/include/VMMachines.php
@@ -16,18 +16,18 @@ $docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/webGui/include/Helpers.php";
require_once "$docroot/plugins/dynamix.vm.manager/include/libvirt_helpers.php";
-$cfg = '/boot/config/plugins/dynamix.vm.manager/userprefs.cfg';
+$user_prefs = '/boot/config/plugins/dynamix.vm.manager/userprefs.cfg';
$vms = $lv->get_domains();
if (empty($vms)) {
echo '| No Virtual Machines installed |
';
return;
}
-if (file_exists($cfg)) {
- $prefs = parse_ini_file($cfg); $sort = [];
+if (file_exists($user_prefs)) {
+ $prefs = parse_ini_file($user_prefs); $sort = [];
foreach ($vms as $vm) $sort[] = array_search($vm,$prefs) ?? 999;
array_multisort($sort,SORT_NUMERIC,$vms);
} else {
- natsort($vms);
+ natcasesort($vms);
}
$i = 0;
$menu = [];
@@ -89,7 +89,7 @@ foreach ($vms as $vm) {
echo "$disks | ";
echo "$graphics | ";
echo " | ";
- echo " | ";
+ echo " | ";
/* Disk device information */
echo "";
diff --git a/plugins/dynamix.vm.manager/include/VMManager.php b/plugins/dynamix.vm.manager/include/VMManager.php
index 5ed5b0f1c..0f2234ba4 100644
--- a/plugins/dynamix.vm.manager/include/VMManager.php
+++ b/plugins/dynamix.vm.manager/include/VMManager.php
@@ -15,9 +15,20 @@
$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
require_once "$docroot/plugins/dynamix.vm.manager/include/libvirt_helpers.php";
+$user_prefs = '/boot/config/plugins/dynamix.vm.manager/userprefs.cfg';
+
$act = $_POST['action'];
$vms = $lv->get_domains();
+if (file_exists($user_prefs)) {
+ $prefs = parse_ini_file($user_prefs); $sort = [];
+ foreach ($vms as $vm) $sort[] = array_search($vm,$prefs) ?? 999;
+ array_multisort($sort,SORT_NUMERIC,$vms);
+} else {
+ natcasesort($vms);
+}
+if ($act=='stop') $vms = array_reverse($vms);
+
foreach ($vms as $vm) {
$res = $lv->get_domain_by_name($vm);
$uuid = $lv->domain_get_uuid($res);
diff --git a/plugins/dynamix/include/DashboardApps.php b/plugins/dynamix/include/DashboardApps.php
index 5a58163c4..a990f2335 100644
--- a/plugins/dynamix/include/DashboardApps.php
+++ b/plugins/dynamix/include/DashboardApps.php
@@ -20,14 +20,22 @@ require_once "$docroot/plugins/dynamix.vm.manager/include/libvirt_helpers.php";
$display = $_POST['display'];
if (pgrep('dockerd')!==false && ($display=='icons' || $display=='docker')) {
- $DockerClient = new DockerClient();
+ $user_prefs = $dockerManPaths['user-prefs'];
+ $DockerClient = new DockerClient();
$DockerTemplates = new DockerTemplates();
- $containers = $DockerClient->getDockerContainers() ?: [];
- $Allinfo = $DockerTemplates->getAllInfo();
+ $all_containers = $DockerClient->getDockerContainers();
+ $all_info = $DockerTemplates->getAllInfo();
$menu = [];
- foreach ($containers as $ct) {
+
+ if (file_exists($user_prefs)) {
+ $prefs = parse_ini_file($user_prefs); $sort = [];
+ foreach ($all_containers as $ct) $sort[] = array_search($ct['Name'],$prefs) ?? 999;
+ array_multisort($sort,SORT_NUMERIC,$all_containers);
+ }
+
+ foreach ($all_containers as $ct) {
$name = $ct['Name'];
- $info = &$Allinfo[$name];
+ $info = &$all_info[$name];
$id = $ct['Id'];
$imageID = $ct['ImageId'];
$is_autostart = $info['autostart'] ? 'true':'false';
@@ -50,14 +58,14 @@ if (pgrep('dockerd')!==false && ($display=='icons' || $display=='docker')) {
}
if (pgrep('libvirtd')!==false && ($display=='icons' || $display=='vms')) {
- $txt = '/boot/config/plugins/dynamix.vm.manager/userprefs.txt';
+ $user_prefs = '/boot/config/plugins/dynamix.vm.manager/userprefs.cfg';
$vms = $lv->get_domains();
- if (file_exists($txt)) {
- $prefs = parse_ini_file($txt); $sort = [];
- foreach ($vms as $vm) $sort[] = $prefs[$vm] ?? 999;
+ if (file_exists($user_prefs)) {
+ $prefs = parse_ini_file($user_prefs); $sort = [];
+ foreach ($vms as $vm) $sort[] = array_search($vm,$prefs) ?? 999;
array_multisort($sort,SORT_NUMERIC,$vms);
} else {
- natsort($vms);
+ natcasesort($vms);
}
foreach ($vms as $vm) {
$res = $lv->get_domain_by_name($vm);