From a3fe701dfe0c44969f0fbc67594d47be6fbcc081 Mon Sep 17 00:00:00 2001 From: bergware Date: Sat, 17 Mar 2018 13:53:05 +0100 Subject: [PATCH] Allow user sorting preference for containers and VMs Sorting preference also dictates the sequence in which containers and VMs are started and stopped (reversed) --- .../DockerContainers.page | 27 ++++++++++---- .../include/ContainerManager.php | 15 +++++--- .../include/CreateDocker.php | 3 +- .../include/DockerClient.php | 1 + .../include/DockerContainers.php | 17 ++++++--- .../include/UpdateConfig.php | 30 +++++++++------- .../include/UserPrefs.php | 36 +++++++++++++++++++ plugins/dynamix.vm.manager/VMMachines.page | 2 +- .../dynamix.vm.manager/include/VMMachines.php | 10 +++--- .../dynamix.vm.manager/include/VMManager.php | 11 ++++++ plugins/dynamix/include/DashboardApps.php | 28 +++++++++------ 11 files changed, 136 insertions(+), 44 deletions(-) create mode 100644 plugins/dynamix.docker.manager/include/UserPrefs.php 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%} - +
ApplicationVersionNetworkPort Mappings (App to Host)Volume Mappings (App to Host)AutostartLog
ApplicationVersionNetworkPort Mappings (App to Host)Volume Mappings (App to Host)AutostartLog
@@ -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 @@ */ ?> /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 @@ + + 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%} - +
NameDescriptionCPUsMemoryvDisksGraphicsAutostart
NameDescriptionCPUsMemoryvDisksGraphicsAutostart
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);