From 3475829b9d30a0e27200d06574cfdfecd54699af Mon Sep 17 00:00:00 2001 From: bergware Date: Thu, 6 Feb 2020 18:13:32 +0100 Subject: [PATCH 01/55] Docker settings: updated help text --- plugins/dynamix.docker.manager/DockerSettings.page | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/dynamix.docker.manager/DockerSettings.page b/plugins/dynamix.docker.manager/DockerSettings.page index 48f51c7ca..e71df7951 100644 --- a/plugins/dynamix.docker.manager/DockerSettings.page +++ b/plugins/dynamix.docker.manager/DockerSettings.page @@ -177,6 +177,8 @@ Docker vDisk location: > You must specify an image file for Docker. The system will automatically create this file when the Docker service is first started. > +> The image file name must have the extension .img, e.g. If not the input is not accepted and marked red. +> > It is recommended to create this image file outside the array, e.g. on the Cache pool. For best performance SSD devices are preferred. Default appdata storage location: @@ -189,6 +191,8 @@ Default appdata storage location: > You can specify a folder to automatically generate and store subfolders containing configuration files for each Docker app (via the /config mapped volume). > +> The folder's path must end with a trailing slash (/) character. If not the input is not accepted and marked red. +> > It is recommended to create this folder outside the array, e.g. on the Cache pool. For best performance SSD devices are preferred. > > Only used when adding new Docker apps. Editing existing Docker apps will not be affected by this setting. From b81fd2d3ff2d3172fbadd318ed75ca3530d813c9 Mon Sep 17 00:00:00 2001 From: bergware Date: Thu, 6 Feb 2020 18:14:26 +0100 Subject: [PATCH 02/55] Added "Reboot Now" in banner when OS upgrade is available --- plugins/dynamix/include/DefaultPageLayout.php | 52 ++++++++----------- 1 file changed, 21 insertions(+), 31 deletions(-) diff --git a/plugins/dynamix/include/DefaultPageLayout.php b/plugins/dynamix/include/DefaultPageLayout.php index 28b4321a2..1e0968f78 100644 --- a/plugins/dynamix/include/DefaultPageLayout.php +++ b/plugins/dynamix/include/DefaultPageLayout.php @@ -88,19 +88,19 @@ var before = new Date(); // page timer events var timers = {}; -function pauseEvents(id){ - $.each(timers, function(i, timer) { +function pauseEvents(id) { + $.each(timers, function(i,timer){ if (!id || i==id) clearTimeout(timer); }); } -function resumeEvents(id,delay){ +function resumeEvents(id,delay) { var startDelay = delay||50; - $.each(timers, function(i, timer) { + $.each(timers, function(i,timer) { if (!id || i==id) timers[i] = setTimeout(i+'()', startDelay); startDelay += 50; }); } -function plus(value, label, last) { +function plus(value,label,last) { return value>0 ? (value+' '+label+(value!=1?'s':'')+(last?'':', ')) : ''; } function updateTime() { @@ -222,21 +222,14 @@ var osUpgradeWarning = false; function addBannerWarning(text,warning=true,noDismiss=false) { var cookieText = text.replace(/[^a-z0-9]/gi,''); - if ( $.cookie(cookieText) == "true" ) { return false; } - - if ( warning ) { - text = " "+text; - } + if ($.cookie(cookieText) == "true") return false; + if (warning) text = " "+text; var arrayEntry = bannerWarnings.push("placeholder") - 1; - if ( ! noDismiss ) { - text = text + ""; - } + if (!noDismiss) text = text + ""; bannerWarnings[arrayEntry] = text; - if ( ! bannerWarningInterval ) { + if (!bannerWarningInterval) { showBannerWarnings(); - bannerWarningInterval = setInterval(function() { - showBannerWarnings() - },10000); + bannerWarningInterval = setInterval(showBannerWarnings,10000); } return arrayEntry; } @@ -254,33 +247,28 @@ function removeBannerWarning(entry) { function bannerFilterArray(array) { var newArray = []; array.filter(function(value,index,arr) { - if ( value ) { - newArray.push(value); - } - }); + if (value) newArray.push(value); + }); return newArray; } function showBannerWarnings() { var allWarnings = bannerFilterArray(Object.values(bannerWarnings)); - if ( allWarnings.length == 0 ) { + if (allWarnings.length == 0) { $(".upgrade_notice").hide(); clearInterval(bannerWarningInterval); bannerWarningInterval = false; return; } - if ( currentBannerWarning >= allWarnings.length ) { - currentBannerWarning = 0; - } + if (currentBannerWarning >= allWarnings.length) currentBannerWarning = 0; $(".upgrade_notice").show().html(allWarnings[currentBannerWarning]); currentBannerWarning++; } -function showUpgrade(data,noDismiss=false) { +function showUpgrade(text,noDismiss=false) { if ($.cookie('os_upgrade')==null) { - if (osUpgradeWarning) - removeBannerWarning(osUpgradeWarning); - osUpgradeWarning = addBannerWarning(data.replace(/(.*)<\/a>/,"$1"),false,noDismiss); + if (osUpgradeWarning) removeBannerWarning(osUpgradeWarning); + osUpgradeWarning = addBannerWarning(text.replace(/(.*)<\/a>/,"$1").replace(/(.*)<\/b>/,"$1"),false,noDismiss); } } function hideUpgrade(set) { @@ -291,6 +279,7 @@ function hideUpgrade(set) { $.removeCookie('os_upgrade',{path:'/'}); } function openUpgrade() { + hideUpgrade(); swal({title:'Update Unraid OS',text:'Do you want to update to the new version?',type:'warning',showCancelButton:true},function(){ openBox('/plugins/dynamix.plugin.manager/scripts/plugin&arg1=update&arg2=unRAIDServer.plg','Update Unraid OS',600,900,true); }); @@ -502,6 +491,7 @@ unset($pages,$page,$pgs,$pg,$icon); ?>
+
- showUpgrade('Reboot required to apply Unraid OS update',true); + showUpgrade('Reboot Now to upgrade Unraid OS',true); - showUpgrade('Reboot required to downgrade Unraid OS',true); + showUpgrade('Reboot Now to downgrade Unraid OS',true); showUpgrade('Unraid OS v is available. Update Now'); From 48bc965839cc5c14386e5511d9b66fee8716bae4 Mon Sep 17 00:00:00 2001 From: Squidly271 Date: Sat, 8 Feb 2020 16:22:52 -0500 Subject: [PATCH 03/55] dockerMan: Add Security as a category @limetech Also did a PR for the sysdream template to reflect this --- plugins/dynamix.docker.manager/include/CreateDocker.php | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/dynamix.docker.manager/include/CreateDocker.php b/plugins/dynamix.docker.manager/include/CreateDocker.php index 3aa1b8bff..eaf25b450 100644 --- a/plugins/dynamix.docker.manager/include/CreateDocker.php +++ b/plugins/dynamix.docker.manager/include/CreateDocker.php @@ -818,6 +818,7 @@ button[type=button]{margin:0 20px 0 0} + From 1f0dde19e7d3baaea476808b513bc270257236d6 Mon Sep 17 00:00:00 2001 From: Larry Meaney Date: Sat, 8 Feb 2020 16:03:17 -0800 Subject: [PATCH 04/55] Block referrals to 3rd Party Sites --- logging.htm | 1 + login.php | 1 + plugins/dynamix.docker.manager/include/ContainerSize.php | 1 + plugins/dynamix.docker.manager/log.htm | 1 + plugins/dynamix.plugin.manager/include/ShowChanges.php | 1 + plugins/dynamix/include/Boot.php | 1 + plugins/dynamix/include/CryptoBenchmark.php | 1 + plugins/dynamix/include/DefaultPageLayout.php | 1 + plugins/dynamix/include/Feedback.php | 1 + plugins/dynamix/include/ParityHistory.php | 1 + plugins/dynamix/include/ReplaceKey.php | 1 + plugins/dynamix/include/SelectCase.php | 1 + plugins/dynamix/include/SystemInformation.php | 1 + plugins/dynamix/include/TrialRequest.php | 1 + update.htm | 1 + 15 files changed, 15 insertions(+) diff --git a/logging.htm b/logging.htm index dc9005d37..5ffdbb5ec 100644 --- a/logging.htm +++ b/logging.htm @@ -3,6 +3,7 @@ + + @@ -101,7 +102,7 @@ var sortableHelper = function(e,i){ function loadlist() { $.get('/plugins/dynamix.docker.manager/include/DockerContainers.php',function(d) { var data = d.split(/\0/); - $('div.spinner').hide('slow').remove(); + $('div.spinner').hide('slow'); $('#docker_list').html(data[0]).sortable({helper:sortableHelper,items:'tr.sortable',cursor:'move',axis:'y',containment:'parent',cancel:'span.docker_readmore,input',delay:100,opacity:0.5,zIndex:9999, update:function(e,ui){ var row = $('#docker_list').find('tr:first'); @@ -131,11 +132,15 @@ function loadlist() { if ($.cookie('docker_listview_mode')=='advanced') {$('.advanced').show(); $('.basic').hide();} context.init({preventDoubleContext:false,left:true,above:false}); $('input[type=button]').prop('disabled',false).show('slow'); - var update = false; - for (var i=0,ct; ct=docker[i]; i++) if (ct.update=='false') {update = true; break;}; - if (!update) $('input#updateAll').prop('disabled',true); + var update = false, rebuild = false; + for (var i=0,ct; ct=docker[i]; i++) { + if (ct.update==0) update = true; + if (ct.update==2) rebuild = true; + } listview(); if (data[2]==1) {$('#busy').show(); setTimeout(loadlist,5000);} else if ($('#busy').is(':visible')) {$('#busy').hide(); setTimeout(loadlist,3000);} + if (!update) $('input#updateAll').prop('disabled',true); + if (rebuild) rebuildAll(); }); } function sizes() { @@ -153,6 +158,7 @@ watchDocker.on('message', function(data){ } }); $(function() { + $('div.spinner').html(unraid_logo); $('.advancedview').switchButton({labels_placement:'left', on_label:'Advanced View', off_label:'Basic View', checked:$.cookie('docker_listview_mode')=='advanced'}); $('.advancedview').change(function(){ $('.advanced').toggle('slow'); diff --git a/plugins/dynamix.docker.manager/include/CreateDocker.php b/plugins/dynamix.docker.manager/include/CreateDocker.php index 7c3efb862..7cbe1892c 100644 --- a/plugins/dynamix.docker.manager/include/CreateDocker.php +++ b/plugins/dynamix.docker.manager/include/CreateDocker.php @@ -156,11 +156,14 @@ if (isset($_POST['contName'])) { ########################## if ($_GET['updateContainer']){ - readfile("$docroot/plugins/dynamix.docker.manager/log.htm"); - @flush(); + $echo = $_GET['mute'] ? false : true; + if ($echo) { + readfile("$docroot/plugins/dynamix.docker.manager/log.htm"); + @flush(); + } foreach ($_GET['ct'] as $value) { $tmpl = $DockerTemplates->getUserTemplate(urldecode($value)); - if (!$tmpl) { + if ($echo && !$tmpl) { echo ""; @flush(); continue; @@ -169,27 +172,23 @@ if ($_GET['updateContainer']){ list($cmd, $Name, $Repository) = xmlToCommand($tmpl); $Registry = getXmlVal($xml, "Registry"); $oldImageID = $DockerClient->getImageID($Repository); - // Pull image - if (!pullImage($Name, $Repository)) continue; + // pull image + if ($echo) if (!pullImage($Name, $Repository)) continue; $oldContainerInfo = $DockerClient->getContainerDetails($Name); // determine if the container is still running if (!empty($oldContainerInfo) && !empty($oldContainerInfo['State']) && !empty($oldContainerInfo['State']['Running'])) { // since container was already running, put it back it to a running state after update $cmd = str_replace('/docker create ', '/docker run -d ', $cmd); // attempt graceful stop of container first - stopContainer($Name); + stopContainer($Name, $echo); } // force kill container if still running after 10 seconds - if (!$_GET['communityApplications']) { - removeContainer($Name); - } - execCommand($cmd); + if (!$_GET['communityApplications']) removeContainer($Name, $echo); + execCommand($cmd, $echo); $DockerClient->flushCaches(); $newImageID = $DockerClient->getImageID($Repository); - if ($oldImageID && $oldImageID != $newImageID) { - // remove old orphan image since it's no longer used by this container - removeImage($oldImageID); - } + // remove old orphan image since it's no longer used by this container + if ($oldImageID && $oldImageID != $newImageID) removeImage($oldImageID, $echo); } echo '

'; goto END; @@ -381,11 +380,11 @@ button[type=button]{margin:0 20px 0 0} } return newConfig.prop('outerHTML'); } - + function escapeQuote(string) { return string.replace(new RegExp('"','g'),"""); } - + function makeAllocations(container,current) { var html = []; for (var i=0,ct; ct=container[i]; i++) { @@ -556,20 +555,19 @@ button[type=button]{margin:0 20px 0 0} } function prepareConfig(form) { - var types = [], values = [], targets = []; + var types = [], values = [], targets = [], vcpu = []; if ($('select[name="contNetwork"]').val()=='host') { $(form).find('input[name="confType[]"]').each(function(){types.push($(this).val());}); $(form).find('input[name="confValue[]"]').each(function(){values.push($(this));}); $(form).find('input[name="confTarget[]"]').each(function(){targets.push($(this));}); for (var i=0; i < types.length; i++) if (types[i]=='Port') $(targets[i]).val($(values[i]).val()); } - var vcpu = []; $(form).find('input[id^="box"]').each(function(){if ($(this).prop('checked')) vcpu.push($('#'+$(this).prop('id').replace('box','cpu')).text());}); form.contCPUset.value = vcpu.join(','); } function makeName(type) { - i = $("#configLocation input[name^='confType'][value='"+type+"']").length+1; + var i = $("#configLocation input[name^='confType'][value='"+type+"']").length+1; return "Host "+type.replace('Variable','Key')+" "+i; } diff --git a/plugins/dynamix.docker.manager/include/DockerClient.php b/plugins/dynamix.docker.manager/include/DockerClient.php index f33fef688..e089fa60c 100644 --- a/plugins/dynamix.docker.manager/include/DockerClient.php +++ b/plugins/dynamix.docker.manager/include/DockerClient.php @@ -845,7 +845,7 @@ class DockerClient { $c['CPUset'] = $info['HostConfig']['CpusetCpus']; $c['BaseImage'] = $ct['Labels']['BASEIMAGE'] ?? false; $c['Ports'] = []; - if ($id) $c['NetworkMode'] = $net.str_replace('/',':',DockerUtil::docker("inspect --format='{{.Name}}' $id")?:'/???'); + if ($id) $c['NetworkMode'] = $net.str_replace('/',':',DockerUtil::ctMap($id)?:'/???'); if ($driver[$c['NetworkMode']]=='bridge') { $ports = &$info['HostConfig']['PortBindings']; $nat = true; @@ -969,5 +969,8 @@ class DockerUtil { exec('cat /sys/devices/system/cpu/*/topology/thread_siblings_list|sort -nu', $cpus); return $cpus; } + public static function ctMap($ct, $type='Name') { + return static::docker("inspect --format='{{.$type}}' $ct"); + } } ?> diff --git a/plugins/dynamix.docker.manager/include/DockerContainers.php b/plugins/dynamix.docker.manager/include/DockerContainers.php index ad06dbbf2..f8c7849f1 100644 --- a/plugins/dynamix.docker.manager/include/DockerContainers.php +++ b/plugins/dynamix.docker.manager/include/DockerContainers.php @@ -51,7 +51,7 @@ foreach ($containers as $ct) { $running = $info['running'] ? 1 : 0; $paused = $info['paused'] ? 1 : 0; $is_autostart = $info['autostart'] ? 'true':'false'; - $updateStatus = ($info['updated']=='true'||$info['updated']=='undef') && strpos($ct['NetworkMode'],':???')===false ? 'true':'false'; + $updateStatus = strpos($ct['NetworkMode'],':???')!==false ? 2 : ($info['updated']=='true' ? 1 : ($info['updated']=='undef' ? 3 : 0)); $template = $info['template']; $shell = $info['shell']; $webGui = html_entity_decode($info['url']); @@ -59,11 +59,11 @@ foreach ($containers as $ct) { $project = html_entity_decode($info['Project']); $registry = html_entity_decode($info['registry']); $menu[] = sprintf("addDockerContainerContext('%s','%s','%s',%s,%s,%s,%s,'%s','%s','%s','%s','%s','%s');", addslashes($name), addslashes($ct['ImageId']), addslashes($template), $running, $paused, $updateStatus, $is_autostart, addslashes($webGui), $shell, $id, addslashes($support), addslashes($project),addslashes($registry)); - $docker[] = "docker.push({name:'$name',id:'$id',state:$running,pause:$paused,update:'$updateStatus'});"; + $docker[] = "docker.push({name:'$name',id:'$id',state:$running,pause:$paused,update:$updateStatus});"; $shape = $running ? ($paused ? 'pause' : 'play') : 'square'; $status = $running ? ($paused ? 'paused' : 'started') : 'stopped'; $color = $status=='started' ? 'green-text' : ($status=='paused' ? 'orange-text' : 'red-text'); - $update = $updateStatus=='false' ? 'blue-text' : ''; + $update = $updateStatus==0 ? 'blue-text' : ''; $icon = $info['icon'] ?: '/plugins/dynamix.docker.manager/images/question.png'; $image = substr($icon,-4)=='.png' ? "" : (substr($icon,0,5)=='icon-' ? "" : ""); $wait = var_split($autostart[array_search($name,$names)],1); @@ -97,15 +97,23 @@ foreach ($containers as $ct) { echo htmlspecialchars($author); } echo ""; echo ""; diff --git a/plugins/dynamix.docker.manager/javascript/docker.js b/plugins/dynamix.docker.manager/javascript/docker.js index 500b30d0b..702850c48 100644 --- a/plugins/dynamix.docker.manager/javascript/docker.js +++ b/plugins/dynamix.docker.manager/javascript/docker.js @@ -7,8 +7,8 @@ function addDockerContainerContext(container, image, template, started, paused, opts.push({text:'Console', icon:'fa-terminal', action:function(e){e.preventDefault(); dockerTerminal(container,shell);}}); opts.push({divider:true}); } - if (!update) { - opts.push({text:'Update', icon:'fa-arrow-down', action:function(e){e.preventDefault(); execUpContainer(container);}}); + if (update==0) { + opts.push({text:'Update', icon:'fa-cloud-download', action:function(e){e.preventDefault(); execUpContainer(container);}}); opts.push({divider:true}); } if (started) { @@ -58,8 +58,8 @@ function dockerTerminal(container,shell) { } function execUpContainer(container) { var title = 'Updating the container: '+container; - var address = '/plugins/dynamix.docker.manager/include/CreateDocker.php?updateContainer=true&ct[]='+encodeURIComponent(container); - popupWithIframe(title, address, true, 'loadlist'); + var cmd = '/plugins/dynamix.docker.manager/include/CreateDocker.php?updateContainer=true&ct[]='+encodeURIComponent(container); + popupWithIframe(title, cmd, true, 'loadlist'); } function popupWithIframe(title, cmd, reload, func) { pauseEvents(); @@ -126,6 +126,7 @@ function rmContainer(container, image, id) { showLoaderOnConfirm:true },function(c){ if (!c) {setTimeout(loadlist,0); return;} + $('div.spinner').show('slow'); if ($('#removeimagechk').prop('checked')) { eventControl({action:'remove_all', container:id, name:container, image:image},'loadlist'); } else { @@ -145,6 +146,7 @@ function rmImage(image, imageName) { showLoaderOnConfirm:true },function(c){ if (!c) {setTimeout(loadlist,0); return;} + $('div.spinner').show('slow'); eventControl({action:'remove_image', image:image},'loadlist'); }); } @@ -190,12 +192,18 @@ function checkAll() { } function updateAll() { $('input[type=button]').prop('disabled',true); - $('#docker_list').append("
"); - $('div.spinner').html(unraid_logo).show('slow'); - var list = ''; - for (var i=0,ct; ct=docker[i]; i++) if (ct.update=='false') list += '&ct[]='+encodeURI(ct.name); - var address = '/plugins/dynamix.docker.manager/include/CreateDocker.php?updateContainer=true'+list; - popupWithIframe('Updating all Containers', address, true, 'loadlist'); + $('div.spinner').show('slow'); + var ct = ''; + for (var i=0,d; d=docker[i]; i++) if (d.update==0) ct += '&ct[]='+encodeURI(d.name); + var cmd = '/plugins/dynamix.docker.manager/include/CreateDocker.php?updateContainer=true'+ct; + popupWithIframe('Updating all Containers', cmd, true, 'loadlist'); +} +function rebuildAll() { + $('input[type=button]').prop('disabled',true); + $('div.spinner').show('slow'); + var ct = []; + for (var i=0,d; d=docker[i]; i++) if (d.update==2) ct.push(encodeURI(d.name)); + $.get('/plugins/dynamix.docker.manager/include/CreateDocker.php',{updateContainer:true,mute:true,ct},function(){loadlist();}); } function containerLogs(container, id) { var height = 600; From 655e67705294462449ed800b2aed500c59c1559e Mon Sep 17 00:00:00 2001 From: bergware Date: Mon, 10 Feb 2020 02:12:11 +0100 Subject: [PATCH 07/55] Updated: animated spinner logic --- plugins/dynamix.docker.manager/DockerContainers.page | 8 +++----- plugins/dynamix.docker.manager/include/ContainerSize.php | 6 +++--- plugins/dynamix.plugin.manager/Plugins.page | 7 +++---- plugins/dynamix/Diagnostics.page | 5 ++--- plugins/dynamix/FlashInfo.page | 5 ++--- plugins/dynamix/include/DefaultPageLayout.php | 3 ++- 6 files changed, 15 insertions(+), 19 deletions(-) diff --git a/plugins/dynamix.docker.manager/DockerContainers.page b/plugins/dynamix.docker.manager/DockerContainers.page index d4a2900c2..f68913581 100644 --- a/plugins/dynamix.docker.manager/DockerContainers.page +++ b/plugins/dynamix.docker.manager/DockerContainers.page @@ -5,9 +5,9 @@ Cond="is_file('/var/run/dockerd.pid')" Markdown="false" --- -
"; - if ($updateStatus=='false') { + switch ($updateStatus) { + case 0: echo "
update ready
"; echo " apply update"; - } elseif ($updateStatus=='true') { + break; + case 1: echo " up-to-date"; echo ""; - } else { + break; + case 2: + echo "
rebuild ready
"; + echo " rebuilding"; + break; + default: echo " not available"; echo ""; + break; } echo "
$version
{$ct['NetworkMode']}
@@ -158,7 +157,6 @@ watchDocker.on('message', function(data){ } }); $(function() { - $('div.spinner').html(unraid_logo); $('.advancedview').switchButton({labels_placement:'left', on_label:'Advanced View', off_label:'Basic View', checked:$.cookie('docker_listview_mode')=='advanced'}); $('.advancedview').change(function(){ $('.advanced').toggle('slow'); diff --git a/plugins/dynamix.docker.manager/include/ContainerSize.php b/plugins/dynamix.docker.manager/include/ContainerSize.php index 142b7714b..21faaaf16 100644 --- a/plugins/dynamix.docker.manager/include/ContainerSize.php +++ b/plugins/dynamix.docker.manager/include/ContainerSize.php @@ -1,6 +1,6 @@
- +
NameDescriptionCPUsMemoryvDisksGraphicsAutostart
@@ -147,6 +147,8 @@ var sortableHelper = function(e,i){ }; function loadlist() { $.get('/plugins/dynamix.vm.manager/include/VMMachines.php',{show:$.cookie('vmshow')},function(d) { + clearTimeout(timers.vm); + $('div.spinner.fixed').hide('slow'); var data = d.split(/\0/); $('#kvm_list').html(data[0]).sortable({helper:sortableHelper,items:'tr.sortable',cursor:'move',axis:'y',containment:'parent',delay:100,opacity:0.5,zIndex:9999, update:function(e,ui){ @@ -197,6 +199,7 @@ $(function() { $('#countdown').html(""); $('#btnAddVM').click(function AddVMEvent(){$('.tab>input#tab2').click();}); + timers.vm = setTimeout(function(){$('div.spinner.fixed').show('slow');},150); loadlist(); }); From 9402420229a6110c8da21fa09a7e1a21e85bc276 Mon Sep 17 00:00:00 2001 From: bergware Date: Mon, 10 Feb 2020 02:57:24 +0100 Subject: [PATCH 10/55] Updated: animated spinner logic --- plugins/dynamix/NotificationsArchive.page | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/plugins/dynamix/NotificationsArchive.page b/plugins/dynamix/NotificationsArchive.page index 429a1b3ea..ba279a73f 100644 --- a/plugins/dynamix/NotificationsArchive.page +++ b/plugins/dynamix/NotificationsArchive.page @@ -4,8 +4,8 @@ Icon="icon-archive" Tag="archive" --- function archiveList(init) { $.get('/webGui/include/NotificationsArchive.php',{filter:''},function(data) { + if (init) { + clearTimeout(timers.archive); + $('div.spinner.fixed').hide('slow'); + } if (data) $('#archive_list').html(data); if (init) { @@ -72,6 +76,7 @@ function openClose(row) { } } $(function(){ + timers.archive = setTimeout(function(){$('div.spinner.fixed').show('slow');},150); archiveList(true); $(window).bind('resize',function(){resize(true);}); @@ -82,6 +87,6 @@ $(function(){ - +
TimeEventSubjectDescriptionImportance
From 8dbb62a97ddc9de3acf4e25923fdddbb89a7090e Mon Sep 17 00:00:00 2001 From: bergware Date: Mon, 10 Feb 2020 03:21:54 +0100 Subject: [PATCH 11/55] Updated: animated spinner logic --- plugins/dynamix/Browse.page | 9 ++++++--- plugins/dynamix/Syslog.page | 10 ++++++++-- plugins/dynamix/include/DefaultPageLayout.php | 4 ++-- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/plugins/dynamix/Browse.page b/plugins/dynamix/Browse.page index 3457b6a0d..3e5166fe6 100644 --- a/plugins/dynamix/Browse.page +++ b/plugins/dynamix/Browse.page @@ -3,8 +3,8 @@ Tag="navicon" Markdown="false" --- - +
TypeNameSizeLast ModifiedLocation
diff --git a/plugins/dynamix/Syslog.page b/plugins/dynamix/Syslog.page index f95dd7fb7..3a4e148b8 100644 --- a/plugins/dynamix/Syslog.page +++ b/plugins/dynamix/Syslog.page @@ -4,8 +4,8 @@ Icon="icon-log" Tag="list" --- resize(); @@ -92,7 +95,10 @@ function showLog(log) { }); } $(function() { + timers.syslog = setTimeout(function(){$('div.spinner.fixed').show('slow');},150); $.post('/webGui/include/Syslog.php',{log:''},function(data){ + clearTimeout(timers.syslog); + $('div.spinner.fixed').hide('slow'); $('pre.up').html(data); resize(); diff --git a/plugins/dynamix/include/DefaultPageLayout.php b/plugins/dynamix/include/DefaultPageLayout.php index acedb807a..019f65390 100644 --- a/plugins/dynamix/include/DefaultPageLayout.php +++ b/plugins/dynamix/include/DefaultPageLayout.php @@ -356,6 +356,7 @@ $(function() { if (tab=='tab0') tab = 'tab'+$('input[name$="tabs"]').length; else if ($('#'+tab).length==0) {initab(); tab = 'tab1';} if ($.cookie('help')=='help') {$('.inline_help').show(); $('#nav-item.HelpButton').addClass('active');} $('#'+tab).attr('checked', true); + $('div.spinner.fixed').html(unraid_logo); updateTime(); $.jGrowl.defaults.closeTemplate = ''; $.jGrowl.defaults.closerTemplate = '':'
'?>[ close all notifications ]
'; @@ -381,6 +382,7 @@ $.ajaxPrefilter(function(s, orig, xhr){
+
-
').attr({type:'hidden', name:'csrf_token', value:''})); - $('div.spinner.fixed').html(unraid_logo); setTimeout(function(){$('div.spinner').not('.fixed').each(function(){$(this).html(unraid_logo);});},150); // display animation if page loading takes longer than 150ms watchdog.start(); }); From 8d14545d59d6b263f5b312b5e9f218e9a8e6abbc Mon Sep 17 00:00:00 2001 From: bergware Date: Mon, 10 Feb 2020 03:26:01 +0100 Subject: [PATCH 12/55] Updated: animated spinner logic --- plugins/dynamix/include/DefaultPageLayout.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/dynamix/include/DefaultPageLayout.php b/plugins/dynamix/include/DefaultPageLayout.php index 019f65390..4f60cac89 100644 --- a/plugins/dynamix/include/DefaultPageLayout.php +++ b/plugins/dynamix/include/DefaultPageLayout.php @@ -596,6 +596,7 @@ $('.back_to_top').click(function(event) { return false; }); $(function() { + setTimeout(function(){$('div.spinner').not('.fixed').each(function(){$(this).html(unraid_logo);});},150); // display animation if page loading takes longer than 150ms shortcut.add('F1',function(){HelpButton();}); $('#licensetype').addClass('orange-text'); @@ -681,7 +682,6 @@ $(function() { }); } $('form').append($('').attr({type:'hidden', name:'csrf_token', value:''})); - setTimeout(function(){$('div.spinner').not('.fixed').each(function(){$(this).html(unraid_logo);});},150); // display animation if page loading takes longer than 150ms watchdog.start(); }); From 4187f52aacee72ac1be449512db3d6dbcb1a84e7 Mon Sep 17 00:00:00 2001 From: bergware Date: Mon, 10 Feb 2020 03:27:28 +0100 Subject: [PATCH 13/55] Updated: animated spinner logic --- plugins/dynamix.vm.manager/VMMachines.page | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/dynamix.vm.manager/VMMachines.page b/plugins/dynamix.vm.manager/VMMachines.page index 64b0d04d1..f5efb03ee 100644 --- a/plugins/dynamix.vm.manager/VMMachines.page +++ b/plugins/dynamix.vm.manager/VMMachines.page @@ -5,9 +5,9 @@ Cond="is_file('/var/run/libvirt/libvirtd.pid')" Markdown="false" --- Date: Mon, 10 Feb 2020 03:52:40 +0100 Subject: [PATCH 14/55] Fixed VM settings: allow to stop service when no hardware support --- plugins/dynamix.vm.manager/VMSettings.page | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/plugins/dynamix.vm.manager/VMSettings.page b/plugins/dynamix.vm.manager/VMSettings.page index 15641ba7a..88dd9e8dc 100644 --- a/plugins/dynamix.vm.manager/VMSettings.page +++ b/plugins/dynamix.vm.manager/VMSettings.page @@ -4,9 +4,9 @@ Icon="icon-virtualization" Tag="columns" --- Your hardware does not have Intel VT-x or AMD-V capability. This is required to create VMs in KVM."; +$hardware = !empty(shell_exec("/etc/rc.d/rc.libvirt test")); +if (!$hardware) { + echo "

Your hardware does not have Intel VT-x or AMD-V capability. This is required to create VMs in KVM. Please disable the VM function. "; echo " Click here to see the Unraid Wiki for more information

"; - echo ""; - exit; } function scan($area, $text) { @@ -77,7 +75,9 @@ body{-webkit-overflow-scrolling:touch} #remove_button span{font-family:clear-sans} + +
@@ -87,14 +87,17 @@ Enable VMs: + One or more paths do not exist (view) + > Stopping the VM Manager will first attempt to shutdown all running VMs. After 60 seconds, any remaining VM instances will be terminated. +
@@ -230,6 +233,7 @@ VFIO allow unsafe interrupts:   + : @@ -400,6 +404,7 @@ $(function(){ $('.advanced').show(); $('.basic').hide(); } + $('.advancedview').switchButton({ labels_placement: "left", on_label: 'Advanced View', @@ -411,6 +416,7 @@ $(function(){ $('.basic').toggle('slow'); $.cookie('vmsettings_view_mode', $('.advancedview').is(':checked') ? 'advanced' : 'basic', {expires:3650}); }); + showStatus('pid','libvirt/libvirtd'); $("input[data-pickroot]").fileTreeAttach(); From e2d5c56c7858a7b1d8258f4bc2320941cacca0ba Mon Sep 17 00:00:00 2001 From: bergware Date: Mon, 10 Feb 2020 05:15:21 +0100 Subject: [PATCH 15/55] Fixed plugin manager - show correct version for "next" branch --- plugins/dynamix.plugin.manager/Update.page | 6 +++--- .../dynamix.plugin.manager/include/PluginHelpers.php | 6 +++--- .../dynamix.plugin.manager/include/ShowPlugins.php | 12 ++++++------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/plugins/dynamix.plugin.manager/Update.page b/plugins/dynamix.plugin.manager/Update.page index 9a61799d3..75bab247a 100644 --- a/plugins/dynamix.plugin.manager/Update.page +++ b/plugins/dynamix.plugin.manager/Update.page @@ -4,8 +4,8 @@ Icon="icon-update" Tag="upload" ---
"; +$empty = "
"; $version = $branch = $date = 'unknown'; $bzroot = file_exists('/boot/previous/bzroot'); $check = $notify['unraidos'] ? 0 : 1; diff --git a/plugins/dynamix.plugin.manager/include/PluginHelpers.php b/plugins/dynamix.plugin.manager/include/PluginHelpers.php index 289e620f3..3aa89852e 100644 --- a/plugins/dynamix.plugin.manager/include/PluginHelpers.php +++ b/plugins/dynamix.plugin.manager/include/PluginHelpers.php @@ -1,6 +1,6 @@ |' $tmp_file"); symlink($tmp_file,"/var/log/plugins/$tmp_plg"); - if (check_plugin($tmp_plg,$ncsi)) { + if (version_compare(check_plugin($tmp_plg,$ncsi),$past,'>')) { copy("/tmp/plugins/$tmp_plg",$tmp_file); $plugin_file = $tmp_file; } @@ -108,7 +108,7 @@ foreach (glob($plugins,GLOB_NOSORT) as $plugin_link) { if ($url !== false) { $filename = "/tmp/plugins/".(($os && $branch) ? $tmp_plg : basename($url)); if ($checked && file_exists($filename)) { - if ($toggle && $toggle != $version) { + if ($past && $past != $version) { $status = make_link('install',$plugin_file,'forced'); } else { $latest = plugin('version',$filename); From f45cfb0e221798da043693127e0bb3c0e2bf739e Mon Sep 17 00:00:00 2001 From: Eric Schultz Date: Mon, 10 Feb 2020 03:05:14 -0600 Subject: [PATCH 16/55] remove 'nl-be' from VM keyboard types --- plugins/dynamix.vm.manager/include/libvirt_helpers.php | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/dynamix.vm.manager/include/libvirt_helpers.php b/plugins/dynamix.vm.manager/include/libvirt_helpers.php index 6cb9bd106..c96c3a5fe 100644 --- a/plugins/dynamix.vm.manager/include/libvirt_helpers.php +++ b/plugins/dynamix.vm.manager/include/libvirt_helpers.php @@ -827,7 +827,6 @@ 'cz' => 'Czech (cz)', 'da' => 'Danish (da)', 'nl' => 'Dutch (nl)', - 'nl-be' => 'Dutch-Belgium (nl-be)', 'en-gb' => 'English-United Kingdom (en-gb)', 'en-us' => 'English-United States (en-us)', 'es' => 'Español (es)', From 5b8ef99c966f518781470dee8b566ee5b32971e8 Mon Sep 17 00:00:00 2001 From: Eric Schultz Date: Mon, 10 Feb 2020 03:06:08 -0600 Subject: [PATCH 17/55] remove 'nl-be' from VM keyboard type autocomplete --- .../scripts/codemirror/addon/hint/libvirt-schema.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/dynamix.vm.manager/scripts/codemirror/addon/hint/libvirt-schema.js b/plugins/dynamix.vm.manager/scripts/codemirror/addon/hint/libvirt-schema.js index 7adaf0f21..186d72c15 100644 --- a/plugins/dynamix.vm.manager/scripts/codemirror/addon/hint/libvirt-schema.js +++ b/plugins/dynamix.vm.manager/scripts/codemirror/addon/hint/libvirt-schema.js @@ -307,7 +307,7 @@ function getLibvirtSchema() { autoport: ["yes", "no"], websocket: ["-1"], listen: ["0.0.0.0"], - keymap: ["en-us", "en-gb", "ar", "hr", "cz", "da", "nl", "nl-be", "es", "et", "fo", + keymap: ["en-us", "en-gb", "ar", "hr", "cz", "da", "nl", "es", "et", "fo", "fi", "fr", "bepo", "fr-be", "fr-ca", "fr-ch", "de-ch", "hu", "is", "it", "ja", "lv", "lt", "mk", "no", "pl", "pt-br", "ru", "sl", "sv", "th", "tr"] } @@ -373,4 +373,4 @@ function getLibvirtSchema() { return root; -} \ No newline at end of file +} From 7288145222e1ed21641057608cf1b0f653d20c30 Mon Sep 17 00:00:00 2001 From: Eric Schultz Date: Mon, 10 Feb 2020 04:07:54 -0600 Subject: [PATCH 18/55] Dont force single threaded VMs for AMD --- plugins/dynamix/include/UpdateTwo.php | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/plugins/dynamix/include/UpdateTwo.php b/plugins/dynamix/include/UpdateTwo.php index 67aef1f97..f3265b74b 100644 --- a/plugins/dynamix/include/UpdateTwo.php +++ b/plugins/dynamix/include/UpdateTwo.php @@ -33,12 +33,8 @@ case 'vm': // initial cores/threads assignment $cores = $vcpus; $threads = 1; - $vendor = exec("grep -Pom1 '^vendor_id\\s+: \\K\\S+' /proc/cpuinfo"); - if ($vendor == 'AuthenticAMD') { - $ht = 1; // force single threaded for AMD - } else { - $ht = exec("lscpu|grep -Po '^Thread\\(s\\) per core:\\s+\\K\\d+'") ?: 1; // fetch hyperthreading - } + $ht = exec("lscpu|grep -Po '^Thread\\(s\\) per core:\\s+\\K\\d+'") ?: 1; // fetch hyperthreading + // adjust for hyperthreading if ($vcpus > $ht && $vcpus%$ht===0) { $cores /= $ht; From bf78f59d75d38fdabe96cea43356bedf8c4114bf Mon Sep 17 00:00:00 2001 From: Eric Schultz Date: Mon, 10 Feb 2020 04:09:27 -0600 Subject: [PATCH 19/55] Dont force single threaded VMs for AMD --- plugins/dynamix.vm.manager/include/libvirt.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/plugins/dynamix.vm.manager/include/libvirt.php b/plugins/dynamix.vm.manager/include/libvirt.php index 0d724d7fe..80233d5be 100644 --- a/plugins/dynamix.vm.manager/include/libvirt.php +++ b/plugins/dynamix.vm.manager/include/libvirt.php @@ -327,12 +327,6 @@ // detect if the processor is hyperthreaded: $intCPUThreadsPerCore = max(intval(shell_exec('/usr/bin/lscpu | grep \'Thread(s) per core\' | awk \'{print $4}\'')), 1); - // detect if the processor is AMD, and if so, force single threaded - $strCPUInfo = file_get_contents('/proc/cpuinfo'); - if (strpos($strCPUInfo, 'AuthenticAMD') !== false) { - $intCPUThreadsPerCore = 1; - } - // even amount of cores assigned and cpu is hyperthreaded: pass that info along to the cpu section below if ($intCPUThreadsPerCore > 1 && ($vcpus % $intCPUThreadsPerCore == 0)) { $intCores = $vcpus / $intCPUThreadsPerCore; From 0f94acd8fb2486b67fc5931653bd8ed88c5be214 Mon Sep 17 00:00:00 2001 From: Eric Schultz Date: Mon, 10 Feb 2020 04:35:23 -0600 Subject: [PATCH 20/55] VMs: enable cpu cache passthrough; AMD + multithreaded --- plugins/dynamix.vm.manager/include/libvirt.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/plugins/dynamix.vm.manager/include/libvirt.php b/plugins/dynamix.vm.manager/include/libvirt.php index 80233d5be..e8c07c32b 100644 --- a/plugins/dynamix.vm.manager/include/libvirt.php +++ b/plugins/dynamix.vm.manager/include/libvirt.php @@ -321,11 +321,22 @@ $intCPUThreadsPerCore = 1; $cpumode = ''; + $cpucache = ''; + $cpufeatures = ''; if (!empty($domain['cpumode']) && $domain['cpumode'] == 'host-passthrough') { $cpumode .= "mode='host-passthrough'"; + $cpucache = ""; // detect if the processor is hyperthreaded: $intCPUThreadsPerCore = max(intval(shell_exec('/usr/bin/lscpu | grep \'Thread(s) per core\' | awk \'{print $4}\'')), 1); + + // detect if the processor is AMD + multithreaded, and if so, enable topoext cpu feature + if ($intCPUThreadsPerCore > 1) { + $strCPUInfo = file_get_contents('/proc/cpuinfo'); + if (strpos($strCPUInfo, 'AuthenticAMD') !== false) { + $cpufeatures .= ""; + } + } // even amount of cores assigned and cpu is hyperthreaded: pass that info along to the cpu section below if ($intCPUThreadsPerCore > 1 && ($vcpus % $intCPUThreadsPerCore == 0)) { @@ -336,6 +347,8 @@ $cpustr = " + $cpucache + $cpufeatures {$vcpus} From b93653a5fb59677f9f1054cbf868d90b84ad3532 Mon Sep 17 00:00:00 2001 From: bergware Date: Mon, 10 Feb 2020 12:55:34 +0100 Subject: [PATCH 21/55] Miscellaneous updates --- .../dynamix.docker.manager/DockerContainers.page | 8 ++++---- .../include/DockerClient.php | 13 +++++++------ .../include/DockerContainers.php | 14 +++++++------- .../include/DockerUpdate.php | 6 +++--- plugins/dynamix.docker.manager/include/Helpers.php | 1 + .../dynamix.docker.manager/javascript/docker.js | 10 +++++----- plugins/dynamix.vm.manager/VMMachines.page | 6 +++--- plugins/dynamix/NotificationsArchive.page | 6 ++---- 8 files changed, 32 insertions(+), 32 deletions(-) diff --git a/plugins/dynamix.docker.manager/DockerContainers.page b/plugins/dynamix.docker.manager/DockerContainers.page index 4ff666bb9..3c247aa03 100644 --- a/plugins/dynamix.docker.manager/DockerContainers.page +++ b/plugins/dynamix.docker.manager/DockerContainers.page @@ -98,9 +98,9 @@ var sortableHelper = function(e,i){ }); return i; }; -function loadlist() { +function loadlist(init) { $.get('/plugins/dynamix.docker.manager/include/DockerContainers.php',function(d) { - clearTimeout(timers.docker); + if (init) clearTimeout(timers.docker); $('div.spinner.fixed').hide('slow'); var data = d.split(/\0/); $('#docker_list').html(data[0]).sortable({helper:sortableHelper,items:'tr.sortable',cursor:'move',axis:'y',containment:'parent',cancel:'span.docker_readmore,input',delay:100,opacity:0.5,zIndex:9999, @@ -134,7 +134,7 @@ function loadlist() { $('input[type=button]').prop('disabled',false).show('slow'); var update = false, rebuild = false; for (var i=0,ct; ct=docker[i]; i++) { - if (ct.update==0) update = true; + if (ct.update==1) update = true; if (ct.update==2) rebuild = true; } listview(); @@ -166,7 +166,7 @@ $(function() { listview(); }); timers.docker = setTimeout(function(){$('div.spinner.fixed').show('slow');},150); - loadlist(); + loadlist(true); watchDocker.start(); }); diff --git a/plugins/dynamix.docker.manager/include/DockerClient.php b/plugins/dynamix.docker.manager/include/DockerClient.php index e089fa60c..513e33f34 100644 --- a/plugins/dynamix.docker.manager/include/DockerClient.php +++ b/plugins/dynamix.docker.manager/include/DockerClient.php @@ -69,7 +69,7 @@ class DockerTemplates { } public function download_url($url, $path='', $bg=false) { - exec('curl --max-time 60 --silent --insecure --location --fail '.($path ? ' -o '.escapeshellarg($path) : '').' '.escapeshellarg($url).' '.($bg ? '>/dev/null 2>&1 &' : '2>/dev/null'), $out, $exit_code); + exec('curl --max-time 20 --silent --insecure --location --fail '.($path ? ' -o '.escapeshellarg($path) : '').' '.escapeshellarg($url).' '.($bg ? '>/dev/null 2>&1 &' : '2>/dev/null'), $out, $exit_code); return $exit_code===0 ? implode("\n", $out) : false; } @@ -286,8 +286,7 @@ class DockerTemplates { $tmp['Project'] = $tmp['Project'] ?? $this->getTemplateValue($image, 'Project'); if (!$tmp['updated'] || $reload) { if ($reload) $DockerUpdate->reloadUpdateStatus($image); - $vs = $DockerUpdate->getUpdateStatus($image); - $tmp['updated'] = $vs===null ? 'undef' : ($vs===true ? 'true' : 'false'); + $tmp['updated'] = var_export($DockerUpdate->getUpdateStatus($image),true); } if (!$tmp['template'] || $reload) $tmp['template'] = $this->getUserTemplate($name); if ($reload) $DockerUpdate->updateUserTemplate($name); @@ -339,7 +338,7 @@ class DockerUpdate{ } public function download_url($url, $path='', $bg=false) { - exec('curl --max-time 30 --silent --insecure --location --fail '.($path ? ' -o '.escapeshellarg($path) : '').' '.escapeshellarg($url).' '.($bg ? '>/dev/null 2>&1 &' : '2>/dev/null'), $out, $exit_code); + exec('curl --max-time 20 --silent --insecure --location --fail '.($path ? ' -o '.escapeshellarg($path) : '').' '.escapeshellarg($url).' '.($bg ? '>/dev/null 2>&1 &' : '2>/dev/null'), $out, $exit_code); return ($exit_code===0) ? implode("\n", $out) : false; } @@ -348,7 +347,7 @@ class DockerUpdate{ foreach ($headers as $header) { $strHeaders .= ' -H '.escapeshellarg($header); } - exec('curl --max-time 30 --silent --insecure --location --fail -i '.$strHeaders.($path ? ' -o '.escapeshellarg($path) : '').' '.escapeshellarg($url).' '.($bg ? '>/dev/null 2>&1 &' : '2>/dev/null'), $out, $exit_code); + exec('curl --max-time 20 --silent --insecure --location --fail -i '.$strHeaders.($path ? ' -o '.escapeshellarg($path) : '').' '.escapeshellarg($url).' '.($bg ? '>/dev/null 2>&1 &' : '2>/dev/null'), $out, $exit_code); return ($exit_code===0) ? implode("\n", $out) : false; } @@ -380,6 +379,7 @@ class DockerUpdate{ * Step 2: Get www-authenticate header from manifest url to generate token url */ $ch = getCurlHandle($manifestURL, 'HEAD'); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); $response = curl_exec($ch); if (curl_errno($ch) !== 0) { //$this->debug('Error: curl error getting manifest: '.curl_error($ch)); @@ -412,6 +412,7 @@ class DockerUpdate{ if ($registryAuth) { curl_setopt($ch, CURLOPT_USERPWD, $registryAuth['username'].':'.$registryAuth['password']); } + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); $response = curl_exec($ch); if (curl_errno($ch) !== 0) { //$this->debug('Error: curl error getting token: '.curl_error($ch)); @@ -469,7 +470,7 @@ class DockerUpdate{ global $dockerManPaths; $DockerClient = new DockerClient(); $updateStatus = DockerUtil::loadJSON($dockerManPaths['update-status']); - $images = ($image) ? [DockerUtil::ensureImageTag($image)] : array_map(function($ar){return $ar['Tags'][0];}, $DockerClient->getDockerImages()); + $images = $image ? [DockerUtil::ensureImageTag($image)] : array_map(function($ar){return $ar['Tags'][0];}, $DockerClient->getDockerImages()); foreach ($images as $img) { $localVersion = null; if (!empty($updateStatus[$img]) && array_key_exists('local', $updateStatus[$img])) { diff --git a/plugins/dynamix.docker.manager/include/DockerContainers.php b/plugins/dynamix.docker.manager/include/DockerContainers.php index f8c7849f1..53d1e8550 100644 --- a/plugins/dynamix.docker.manager/include/DockerContainers.php +++ b/plugins/dynamix.docker.manager/include/DockerContainers.php @@ -51,7 +51,7 @@ foreach ($containers as $ct) { $running = $info['running'] ? 1 : 0; $paused = $info['paused'] ? 1 : 0; $is_autostart = $info['autostart'] ? 'true':'false'; - $updateStatus = strpos($ct['NetworkMode'],':???')!==false ? 2 : ($info['updated']=='true' ? 1 : ($info['updated']=='undef' ? 3 : 0)); + $updateStatus = substr($ct['NetworkMode'],-4)==':???' ? 2 : ($info['updated']=='true' ? 0 : ($info['updated']=='false' ? 1 : 3)); $template = $info['template']; $shell = $info['shell']; $webGui = html_entity_decode($info['url']); @@ -63,7 +63,7 @@ foreach ($containers as $ct) { $shape = $running ? ($paused ? 'pause' : 'play') : 'square'; $status = $running ? ($paused ? 'paused' : 'started') : 'stopped'; $color = $status=='started' ? 'green-text' : ($status=='paused' ? 'orange-text' : 'red-text'); - $update = $updateStatus==0 ? 'blue-text' : ''; + $update = $updateStatus==1 ? 'blue-text' : ''; $icon = $info['icon'] ?: '/plugins/dynamix.docker.manager/images/question.png'; $image = substr($icon,-4)=='.png' ? "" : (substr($icon,0,5)=='icon-' ? "" : ""); $wait = var_split($autostart[array_search($name,$names)],1); @@ -99,19 +99,19 @@ foreach ($containers as $ct) { echo ""; switch ($updateStatus) { case 0: - echo "
update ready
"; - echo " apply update"; - break; - case 1: echo " up-to-date"; echo ""; break; + case 1: + echo "
update ready
"; + echo " apply update"; + break; case 2: echo "
rebuild ready
"; echo " rebuilding"; break; default: - echo " not available"; + echo " not available"; echo ""; break; } diff --git a/plugins/dynamix.docker.manager/include/DockerUpdate.php b/plugins/dynamix.docker.manager/include/DockerUpdate.php index c028230d1..76673f685 100644 --- a/plugins/dynamix.docker.manager/include/DockerUpdate.php +++ b/plugins/dynamix.docker.manager/include/DockerUpdate.php @@ -1,7 +1,7 @@ $('#btnAddVM').click(function AddVMEvent(){$('.tab>input#tab2').click();}); timers.vm = setTimeout(function(){$('div.spinner.fixed').show('slow');},150); - loadlist(); + loadlist(true); }); diff --git a/plugins/dynamix/NotificationsArchive.page b/plugins/dynamix/NotificationsArchive.page index ba279a73f..837f0ae12 100644 --- a/plugins/dynamix/NotificationsArchive.page +++ b/plugins/dynamix/NotificationsArchive.page @@ -44,10 +44,8 @@ function resize(bind) { function archiveList(init) { $.get('/webGui/include/NotificationsArchive.php',{filter:''},function(data) { - if (init) { - clearTimeout(timers.archive); - $('div.spinner.fixed').hide('slow'); - } + if (init) clearTimeout(timers.archive); + $('div.spinner.fixed').hide('slow'); if (data) $('#archive_list').html(data); if (init) { From 647a5cabe33c19bb0d28d6ad9139ba180ebe1100 Mon Sep 17 00:00:00 2001 From: bergware Date: Mon, 10 Feb 2020 13:01:24 +0100 Subject: [PATCH 22/55] Miscellaneous updates --- plugins/dynamix/Syslog.page | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/dynamix/Syslog.page b/plugins/dynamix/Syslog.page index 3a4e148b8..4e6a331b0 100644 --- a/plugins/dynamix/Syslog.page +++ b/plugins/dynamix/Syslog.page @@ -87,23 +87,23 @@ function showLog(log) { timers.syslog = setTimeout(function(){$('div.spinner.fixed').show('slow');},150); $.post('/webGui/include/Syslog.php',{log:log},function(data){ clearTimeout(timers.syslog); - $('div.spinner.fixed').hide('slow'); $('pre.up').html(data); resize(); + $('div.spinner.fixed').hide('slow'); }); } $(function() { timers.syslog = setTimeout(function(){$('div.spinner.fixed').show('slow');},150); $.post('/webGui/include/Syslog.php',{log:''},function(data){ clearTimeout(timers.syslog); - $('div.spinner.fixed').hide('slow'); $('pre.up').html(data); resize(); $(window).bind('resize',function(){resize();}); + $('div.spinner.fixed').hide('slow'); }); }); $('.tabs').append(""); From 7064ca30b4881e3ff39ddcd1173ec9d1beea46f9 Mon Sep 17 00:00:00 2001 From: bergware Date: Mon, 10 Feb 2020 13:12:58 +0100 Subject: [PATCH 23/55] Miscellaneous updates --- plugins/dynamix.docker.manager/DockerContainers.page | 2 +- plugins/dynamix.plugin.manager/Plugins.page | 6 ++++-- plugins/dynamix.vm.manager/VMMachines.page | 2 +- plugins/dynamix/NotificationsArchive.page | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/plugins/dynamix.docker.manager/DockerContainers.page b/plugins/dynamix.docker.manager/DockerContainers.page index 3c247aa03..8f2e5c473 100644 --- a/plugins/dynamix.docker.manager/DockerContainers.page +++ b/plugins/dynamix.docker.manager/DockerContainers.page @@ -101,7 +101,6 @@ var sortableHelper = function(e,i){ function loadlist(init) { $.get('/plugins/dynamix.docker.manager/include/DockerContainers.php',function(d) { if (init) clearTimeout(timers.docker); - $('div.spinner.fixed').hide('slow'); var data = d.split(/\0/); $('#docker_list').html(data[0]).sortable({helper:sortableHelper,items:'tr.sortable',cursor:'move',axis:'y',containment:'parent',cancel:'span.docker_readmore,input',delay:100,opacity:0.5,zIndex:9999, update:function(e,ui){ @@ -138,6 +137,7 @@ function loadlist(init) { if (ct.update==2) rebuild = true; } listview(); + $('div.spinner.fixed').hide('slow'); if (data[2]==1) {$('#busy').show(); setTimeout(loadlist,5000);} else if ($('#busy').is(':visible')) {$('#busy').hide(); setTimeout(loadlist,3000);} if (!update) $('input#updateAll').prop('disabled',true); if (rebuild) rebuildAll(); diff --git a/plugins/dynamix.plugin.manager/Plugins.page b/plugins/dynamix.plugin.manager/Plugins.page index a2c2787c5..8573e5da8 100644 --- a/plugins/dynamix.plugin.manager/Plugins.page +++ b/plugins/dynamix.plugin.manager/Plugins.page @@ -51,13 +51,14 @@ function loadlist(id) { var cmd = id.split(':'); var tr = 'tr#'+cmd[0].replace(/[\. _]/g,''); switch (cmd[1]) { - case 'return' : $('div.spinner').hide('slow').remove();list.html(data[0]); $('#plugin_table').trigger('destroy'); break; + case 'return' : $('div.spinner').hide('slow');list.html(data[0]); $('#plugin_table').trigger('destroy'); break; case 'remove' : list.find(tr).remove(); break; case 'update' : list.find(tr).remove(); case 'install': if (!list.find(tr).length) list.append(data[0]).trigger('update'); break; } } else { list.html(data[0]); + $('div.spinner').hide('slow'); } resize(); @@ -75,6 +76,7 @@ function spinner() { $('div.spinner.fixed').show('slow'); } $(function() { + spinner(); loadlist(); $('#plugin_tree').fileTree({root:'/boot/',filter:'plg'}, function(file) {$('#plugin_file').val(file);}); $('.tabs').append(""); @@ -85,5 +87,5 @@ $(function() { - +
PluginAuthorVersionStatusUninstall
diff --git a/plugins/dynamix.vm.manager/VMMachines.page b/plugins/dynamix.vm.manager/VMMachines.page index 3d38d8ee8..5610048d5 100644 --- a/plugins/dynamix.vm.manager/VMMachines.page +++ b/plugins/dynamix.vm.manager/VMMachines.page @@ -148,7 +148,6 @@ var sortableHelper = function(e,i){ function loadlist(init) { $.get('/plugins/dynamix.vm.manager/include/VMMachines.php',{show:$.cookie('vmshow')},function(d) { if (init) clearTimeout(timers.vm); - $('div.spinner.fixed').hide('slow'); var data = d.split(/\0/); $('#kvm_list').html(data[0]).sortable({helper:sortableHelper,items:'tr.sortable',cursor:'move',axis:'y',containment:'parent',delay:100,opacity:0.5,zIndex:9999, update:function(e,ui){ @@ -188,6 +187,7 @@ function loadlist(init) { },'json'); }); context.init({preventDoubleContext:false,left:true,above:false}); + $('div.spinner.fixed').hide('slow'); $('input[type=button]').prop('disabled',false).show('slow'); $('.text').click(showInput); $('.input').blur(hideInput); diff --git a/plugins/dynamix/NotificationsArchive.page b/plugins/dynamix/NotificationsArchive.page index 837f0ae12..70f3f8a86 100644 --- a/plugins/dynamix/NotificationsArchive.page +++ b/plugins/dynamix/NotificationsArchive.page @@ -45,7 +45,6 @@ function resize(bind) { function archiveList(init) { $.get('/webGui/include/NotificationsArchive.php',{filter:''},function(data) { if (init) clearTimeout(timers.archive); - $('div.spinner.fixed').hide('slow'); if (data) $('#archive_list').html(data); if (init) { @@ -57,6 +56,7 @@ function archiveList(init) { } $('#archive_list .tablesorter-childRow td').hide(); for (var i = 0; i < rows.length; i++) $('#archive_list .tablesorter-childRow.row'+rows[i]+' td').show(); + $('div.spinner.fixed').hide('slow'); setTimeout(archiveList,30000); }); } From 5d00715dfaed9f4e81473f4c44e7d73ba03a9ace Mon Sep 17 00:00:00 2001 From: bergware Date: Mon, 10 Feb 2020 14:09:19 +0100 Subject: [PATCH 24/55] Miscellaneous updates --- plugins/dynamix.plugin.manager/Plugins.page | 4 ++-- plugins/dynamix/include/DefaultPageLayout.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/dynamix.plugin.manager/Plugins.page b/plugins/dynamix.plugin.manager/Plugins.page index 8573e5da8..a353d3f6f 100644 --- a/plugins/dynamix.plugin.manager/Plugins.page +++ b/plugins/dynamix.plugin.manager/Plugins.page @@ -51,14 +51,14 @@ function loadlist(id) { var cmd = id.split(':'); var tr = 'tr#'+cmd[0].replace(/[\. _]/g,''); switch (cmd[1]) { - case 'return' : $('div.spinner').hide('slow');list.html(data[0]); $('#plugin_table').trigger('destroy'); break; + case 'return' : $('div.spinner.fixed').hide('slow');list.html(data[0]); $('#plugin_table').trigger('destroy'); break; case 'remove' : list.find(tr).remove(); break; case 'update' : list.find(tr).remove(); case 'install': if (!list.find(tr).length) list.append(data[0]).trigger('update'); break; } } else { list.html(data[0]); - $('div.spinner').hide('slow'); + $('div.spinner.fixed').hide('slow'); } resize(); diff --git a/plugins/dynamix/include/DefaultPageLayout.php b/plugins/dynamix/include/DefaultPageLayout.php index 4f60cac89..2b02c7a6d 100644 --- a/plugins/dynamix/include/DefaultPageLayout.php +++ b/plugins/dynamix/include/DefaultPageLayout.php @@ -356,7 +356,6 @@ $(function() { if (tab=='tab0') tab = 'tab'+$('input[name$="tabs"]').length; else if ($('#'+tab).length==0) {initab(); tab = 'tab1';} if ($.cookie('help')=='help') {$('.inline_help').show(); $('#nav-item.HelpButton').addClass('active');} $('#'+tab).attr('checked', true); - $('div.spinner.fixed').html(unraid_logo); updateTime(); $.jGrowl.defaults.closeTemplate = ''; $.jGrowl.defaults.closerTemplate = '':'
'?>[ close all notifications ]
'; @@ -382,7 +381,6 @@ $.ajaxPrefilter(function(s, orig, xhr){
-
+
From 6fae6e38971a7727fe442d6f1e62f890735e0f10 Mon Sep 17 00:00:00 2001 From: bergware Date: Mon, 10 Feb 2020 16:15:15 +0100 Subject: [PATCH 25/55] css updates --- plugins/dynamix.plugin.manager/Update.page | 2 +- plugins/dynamix/styles/default-black.css | 2 +- plugins/dynamix/styles/default-white.css | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/dynamix.plugin.manager/Update.page b/plugins/dynamix.plugin.manager/Update.page index 75bab247a..e752a9ea8 100644 --- a/plugins/dynamix.plugin.manager/Update.page +++ b/plugins/dynamix.plugin.manager/Update.page @@ -36,7 +36,7 @@ if (file_exists('/boot/previous/changes.txt')) { From 92835081a32eb6f0fb8db9e219686ef7ab47bf84 Mon Sep 17 00:00:00 2001 From: bergware Date: Mon, 10 Feb 2020 18:45:57 +0100 Subject: [PATCH 30/55] Updated animated spinner logic --- plugins/dynamix.plugin.manager/Plugins.page | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/dynamix.plugin.manager/Plugins.page b/plugins/dynamix.plugin.manager/Plugins.page index 0fdae35d2..7634feaee 100644 --- a/plugins/dynamix.plugin.manager/Plugins.page +++ b/plugins/dynamix.plugin.manager/Plugins.page @@ -44,22 +44,23 @@ function resize(bind) { } function loadlist(id) { - $('div.spinner.fixed').show('slow'); + timers.plugins = setTimeout(function(){$('div.spinner.fixed').show('slow');},150); $.get('/plugins/dynamix.plugin.manager/include/ShowPlugins.php',{audit:id,check:},function(d) { var data = d.split(/\0/); var list = $('#plugin_list'); + clearTimeout(timers.plugins); + $('div.spinner.fixed').hide('slow'); if (id) { var cmd = id.split(':'); var tr = 'tr#'+cmd[0].replace(/[\. _]/g,''); switch (cmd[1]) { - case 'return' : $('div.spinner.fixed').hide('slow');list.html(data[0]); $('#plugin_table').trigger('destroy'); break; + case 'return' : list.html(data[0]); $('#plugin_table').trigger('destroy'); break; case 'remove' : list.find(tr).remove(); break; case 'update' : list.find(tr).remove(); case 'install': if (!list.find(tr).length) list.append(data[0]).trigger('update'); break; } } else { list.html(data[0]); - $('div.spinner.fixed').hide('slow'); } resize(); From f7436d8ae81b336fa832439bdc6280a57f788f9f Mon Sep 17 00:00:00 2001 From: bergware Date: Mon, 10 Feb 2020 19:02:29 +0100 Subject: [PATCH 31/55] Updated: animated spinner logic --- plugins/dynamix.docker.manager/DockerContainers.page | 8 ++++---- plugins/dynamix.plugin.manager/Plugins.page | 2 +- plugins/dynamix.vm.manager/VMMachines.page | 8 ++++---- plugins/dynamix/NotificationsArchive.page | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/plugins/dynamix.docker.manager/DockerContainers.page b/plugins/dynamix.docker.manager/DockerContainers.page index 8f2e5c473..cfa623f77 100644 --- a/plugins/dynamix.docker.manager/DockerContainers.page +++ b/plugins/dynamix.docker.manager/DockerContainers.page @@ -98,9 +98,10 @@ var sortableHelper = function(e,i){ }); return i; }; -function loadlist(init) { +function loadlist() { + timers.docker = setTimeout(function(){$('div.spinner.fixed').show('slow');},150); $.get('/plugins/dynamix.docker.manager/include/DockerContainers.php',function(d) { - if (init) clearTimeout(timers.docker); + clearTimeout(timers.docker); var data = d.split(/\0/); $('#docker_list').html(data[0]).sortable({helper:sortableHelper,items:'tr.sortable',cursor:'move',axis:'y',containment:'parent',cancel:'span.docker_readmore,input',delay:100,opacity:0.5,zIndex:9999, update:function(e,ui){ @@ -165,8 +166,7 @@ $(function() { $.cookie('docker_listview_mode',$('.advancedview').is(':checked')?'advanced':'basic',{expires:3650}); listview(); }); - timers.docker = setTimeout(function(){$('div.spinner.fixed').show('slow');},150); - loadlist(true); + loadlist(); watchDocker.start(); }); diff --git a/plugins/dynamix.plugin.manager/Plugins.page b/plugins/dynamix.plugin.manager/Plugins.page index 7634feaee..f8754d3ed 100644 --- a/plugins/dynamix.plugin.manager/Plugins.page +++ b/plugins/dynamix.plugin.manager/Plugins.page @@ -49,7 +49,6 @@ function loadlist(id) { var data = d.split(/\0/); var list = $('#plugin_list'); clearTimeout(timers.plugins); - $('div.spinner.fixed').hide('slow'); if (id) { var cmd = id.split(':'); var tr = 'tr#'+cmd[0].replace(/[\. _]/g,''); @@ -72,6 +71,7 @@ function loadlist(id) { $('#checkall').find('input').prop('disabled',false).show(); + $('div.spinner.fixed').hide('slow'); }); } $(function() { diff --git a/plugins/dynamix.vm.manager/VMMachines.page b/plugins/dynamix.vm.manager/VMMachines.page index 5610048d5..4c634f1f9 100644 --- a/plugins/dynamix.vm.manager/VMMachines.page +++ b/plugins/dynamix.vm.manager/VMMachines.page @@ -145,9 +145,10 @@ var sortableHelper = function(e,i){ }); return i; }; -function loadlist(init) { +function loadlist() { + timers.vm = setTimeout(function(){$('div.spinner.fixed').show('slow');},150); $.get('/plugins/dynamix.vm.manager/include/VMMachines.php',{show:$.cookie('vmshow')},function(d) { - if (init) clearTimeout(timers.vm); + clearTimeout(timers.vm); var data = d.split(/\0/); $('#kvm_list').html(data[0]).sortable({helper:sortableHelper,items:'tr.sortable',cursor:'move',axis:'y',containment:'parent',delay:100,opacity:0.5,zIndex:9999, update:function(e,ui){ @@ -199,7 +200,6 @@ $(function() { $('#countdown').html(""); $('#btnAddVM').click(function AddVMEvent(){$('.tab>input#tab2').click();}); - timers.vm = setTimeout(function(){$('div.spinner.fixed').show('slow');},150); - loadlist(true); + loadlist(); }); diff --git a/plugins/dynamix/NotificationsArchive.page b/plugins/dynamix/NotificationsArchive.page index 70f3f8a86..dd01eaf72 100644 --- a/plugins/dynamix/NotificationsArchive.page +++ b/plugins/dynamix/NotificationsArchive.page @@ -43,8 +43,9 @@ function resize(bind) { } function archiveList(init) { + timers.archive = setTimeout(function(){$('div.spinner.fixed').show('slow');},150); $.get('/webGui/include/NotificationsArchive.php',{filter:''},function(data) { - if (init) clearTimeout(timers.archive); + clearTimeout(timers.archive); if (data) $('#archive_list').html(data); if (init) { @@ -74,7 +75,6 @@ function openClose(row) { } } $(function(){ - timers.archive = setTimeout(function(){$('div.spinner.fixed').show('slow');},150); archiveList(true); $(window).bind('resize',function(){resize(true);}); From 1a67bde6746864ca0fb45cc83eeb58eacff32035 Mon Sep 17 00:00:00 2001 From: bergware Date: Mon, 10 Feb 2020 19:13:50 +0100 Subject: [PATCH 32/55] Updated: animated spinner logic --- plugins/dynamix/Syslog.page | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/plugins/dynamix/Syslog.page b/plugins/dynamix/Syslog.page index 4e6a331b0..c5c559438 100644 --- a/plugins/dynamix/Syslog.page +++ b/plugins/dynamix/Syslog.page @@ -77,7 +77,7 @@ function toggle(checked) { function resize() { $('pre.up').height(Math.max(window.innerHeight-320,330)); } -function showLog(log) { +function showLog(log,init) { logfile = log; $('span.label input[type=checkbox]').prop('checked',true); $('span.label').each(function(){ @@ -90,21 +90,13 @@ function showLog(log) { $('pre.up').html(data); resize(); + if (init) $(window).bind('resize',function(){resize();}); $('div.spinner.fixed').hide('slow'); }); } $(function() { - timers.syslog = setTimeout(function(){$('div.spinner.fixed').show('slow');},150); - $.post('/webGui/include/Syslog.php',{log:''},function(data){ - clearTimeout(timers.syslog); - $('pre.up').html(data); - - resize(); - $(window).bind('resize',function(){resize();}); - - $('div.spinner.fixed').hide('slow'); - }); + showLog(logfile,true); }); $('.tabs').append(""); From a78eeca5a9656ee754cc8a9f87f4ed87d1f83696 Mon Sep 17 00:00:00 2001 From: bergware Date: Mon, 10 Feb 2020 19:22:24 +0100 Subject: [PATCH 33/55] Updated: animated spinner logic --- plugins/dynamix/Browse.page | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/dynamix/Browse.page b/plugins/dynamix/Browse.page index 3e5166fe6..0829f1790 100644 --- a/plugins/dynamix/Browse.page +++ b/plugins/dynamix/Browse.page @@ -23,7 +23,6 @@ $(function(){ timers.browse = setTimeout(function(){$('div.spinner.fixed').show('slow');},150); $.get('/webGui/include/Browse.php',{dir:"",path:"",user:},function(data){ clearTimeout(timers.browse); - $('div.spinner.fixed').hide('slow'); var table = $('table.indexer'); var col = $.cookie('col')||1; var dir = $.cookie('dir')||0; @@ -33,6 +32,7 @@ $(function(){ $.cookie('col',sort[0],{path:'/'}); $.cookie('dir',sort[1],{path:'/'}); }); + $('div.spinner.fixed').hide('slow'); table.tablesorter({sortList:[[col,dir],[1,0]],sortAppend:[[1,0]],textAttribute:'data'}); }); }); From 85404a0689cd3750973f74e6c97d60b3268bb331 Mon Sep 17 00:00:00 2001 From: bergware Date: Tue, 11 Feb 2020 09:08:33 +0100 Subject: [PATCH 34/55] Miscellaneous updates --- .../dynamix.docker.manager/include/CreateDocker.php | 8 ++++---- plugins/dynamix.docker.manager/javascript/docker.js | 11 +++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/plugins/dynamix.docker.manager/include/CreateDocker.php b/plugins/dynamix.docker.manager/include/CreateDocker.php index 7cbe1892c..9fbcea559 100644 --- a/plugins/dynamix.docker.manager/include/CreateDocker.php +++ b/plugins/dynamix.docker.manager/include/CreateDocker.php @@ -308,7 +308,7 @@ button[type=button]{margin:0 20px 0 0} for (var x=1; x<=last; x++) if(x != this_tab) $('#tab'+x).bind({click:function(){$('#'+elementId).hide();}}); $('.advanced-switch').switchButton({labels_placement: "left", on_label: 'Advanced View', off_label: 'Basic View'}); - $('.advanced-switch').change(function () { + $('.advanced-switch').change(function() { var status = $(this).is(':checked'); toggleRows('advanced', status, 'basic'); load_contOverview(); @@ -665,13 +665,13 @@ button[type=button]{margin:0 20px 0 0} allowBrowsing: true }, function(file){if(on_files){p.val(file);p.trigger('change');if(close_on_select){ft.slideUp('fast',function(){ft.remove();});}}}, - function(folder){if(on_folders){p.val(folder);p.trigger('change');if(close_on_select){$(ft).slideUp('fast',function (){$(ft).remove();});}}}); + function(folder){if(on_folders){p.val(folder);p.trigger('change');if(close_on_select){$(ft).slideUp('fast',function(){$(ft).remove();});}}}); // Format fileTree according to parent position, height and width ft.css({'left':p.position().left,'top':(p.position().top+p.outerHeight()),'width':(p.width())}); // close if click elsewhere - $(document).mouseup(function(e){if(!ft.is(e.target) && ft.has(e.target).length === 0){ft.slideUp('fast',function (){$(ft).remove();});}}); + $(document).mouseup(function(e){if(!ft.is(e.target) && ft.has(e.target).length === 0){ft.slideUp('fast',function(){$(ft).remove();});}}); // close if parent changed - p.bind("keydown", function(){ft.slideUp('fast', function (){$(ft).remove();});}); + p.bind("keydown", function(){ft.slideUp('fast', function(){$(ft).remove();});}); // Open fileTree ft.slideDown('fast'); } diff --git a/plugins/dynamix.docker.manager/javascript/docker.js b/plugins/dynamix.docker.manager/javascript/docker.js index 33e43302b..2d39fd944 100644 --- a/plugins/dynamix.docker.manager/javascript/docker.js +++ b/plugins/dynamix.docker.manager/javascript/docker.js @@ -56,11 +56,6 @@ function dockerTerminal(container,shell) { var win = window.open('', container, 'resizeable=yes,scrollbars=yes,height='+height+',width='+width+',top='+top+',left='+left); $.get(eventURL,{action:'terminal',name:container,shell:shell},function(){win.location='/dockerterminal/'+container+'/'; win.focus();}); } -function execUpContainer(container) { - var title = 'Updating the container: '+container; - var cmd = '/plugins/dynamix.docker.manager/include/CreateDocker.php?updateContainer=true&ct[]='+encodeURIComponent(container); - popupWithIframe(title, cmd, true, 'loadlist'); -} function popupWithIframe(title, cmd, reload, func) { pauseEvents(); $('#iframe-popup').html(''); @@ -89,6 +84,11 @@ function popupWithIframe(title, cmd, reload, func) { $('.ui-dialog .ui-dialog-title').css('text-align', 'center').css('width', '100%'); $('.ui-dialog .ui-dialog-content').css('padding', '12'); } +function execUpContainer(container) { + var title = 'Updating the container: '+container; + var cmd = '/plugins/dynamix.docker.manager/include/CreateDocker.php?updateContainer=true&ct[]='+encodeURIComponent(container); + popupWithIframe(title, cmd, true, 'loadlist'); +} function addContainer() { var path = location.pathname; var x = path.indexOf('?'); @@ -192,7 +192,6 @@ function checkAll() { } function updateAll() { $('input[type=button]').prop('disabled',true); - $('div.spinner.fixed').show('slow'); var ct = ''; for (var i=0,d; d=docker[i]; i++) if (d.update==1) ct += '&ct[]='+encodeURI(d.name); var cmd = '/plugins/dynamix.docker.manager/include/CreateDocker.php?updateContainer=true'+ct; From 90e7c31996e31e0dbd45454f8dbd536a96f23797 Mon Sep 17 00:00:00 2001 From: bergware Date: Tue, 11 Feb 2020 09:19:21 +0100 Subject: [PATCH 35/55] Miscellaneous updates --- plugins/dynamix.docker.manager/include/DockerClient.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugins/dynamix.docker.manager/include/DockerClient.php b/plugins/dynamix.docker.manager/include/DockerClient.php index 54f6f3ee4..4aad55e49 100644 --- a/plugins/dynamix.docker.manager/include/DockerClient.php +++ b/plugins/dynamix.docker.manager/include/DockerClient.php @@ -76,7 +76,6 @@ class DockerTemplates { curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); curl_setopt($ch, CURLOPT_TIMEOUT, 45); curl_setopt($ch, CURLOPT_ENCODING, ""); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_REFERER, ""); $out = curl_exec($ch) ?: false; @@ -358,7 +357,6 @@ class DockerUpdate{ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); curl_setopt($ch, CURLOPT_TIMEOUT, 45); curl_setopt($ch, CURLOPT_ENCODING, ""); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_REFERER, ""); $out = curl_exec($ch) ?: false; @@ -376,7 +374,6 @@ class DockerUpdate{ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); curl_setopt($ch, CURLOPT_TIMEOUT, 45); curl_setopt($ch, CURLOPT_ENCODING, ""); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_REFERER, ""); $out = curl_exec($ch) ?: false; From b16765681101eda7f8b9c74e3779834db2f98d38 Mon Sep 17 00:00:00 2001 From: bergware Date: Tue, 11 Feb 2020 09:22:24 +0100 Subject: [PATCH 36/55] Miscellaneous updates --- plugins/dynamix.docker.manager/include/DockerClient.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/dynamix.docker.manager/include/DockerClient.php b/plugins/dynamix.docker.manager/include/DockerClient.php index 4aad55e49..53af24b52 100644 --- a/plugins/dynamix.docker.manager/include/DockerClient.php +++ b/plugins/dynamix.docker.manager/include/DockerClient.php @@ -80,7 +80,7 @@ class DockerTemplates { curl_setopt($ch, CURLOPT_REFERER, ""); $out = curl_exec($ch) ?: false; curl_close($ch); - if ($path && $out) file_put_contents($path,$out); else @unlink($path); + if ($path && $out) file_put_contents($path,$out); elseif ($path) @unlink($path); return $out; } @@ -361,7 +361,7 @@ class DockerUpdate{ curl_setopt($ch, CURLOPT_REFERER, ""); $out = curl_exec($ch) ?: false; curl_close($ch); - if ($path && $out) file_put_contents($path,$out); else @unlink($path); + if ($path && $out) file_put_contents($path,$out); elseif ($path) @unlink($path); return $out; } @@ -378,7 +378,7 @@ class DockerUpdate{ curl_setopt($ch, CURLOPT_REFERER, ""); $out = curl_exec($ch) ?: false; curl_close($ch); - if ($path && $out) file_put_contents($path,$out); else @unlink($path); + if ($path && $out) file_put_contents($path,$out); elseif ($path) @unlink($path); return $out; } From 243949d567a77c4314e563dd0b0919a2ed69dfd6 Mon Sep 17 00:00:00 2001 From: bergware Date: Tue, 11 Feb 2020 09:41:05 +0100 Subject: [PATCH 37/55] Miscellaneous updates --- .../include/DockerClient.php | 42 ++++++------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/plugins/dynamix.docker.manager/include/DockerClient.php b/plugins/dynamix.docker.manager/include/DockerClient.php index 53af24b52..3c927b135 100644 --- a/plugins/dynamix.docker.manager/include/DockerClient.php +++ b/plugins/dynamix.docker.manager/include/DockerClient.php @@ -393,7 +393,6 @@ class DockerUpdate{ public function getRemoteVersionV2($image) { list($strRepo, $strTag) = explode(':', DockerUtil::ensureImageTag($image)); - /* * Step 1: Check whether or not the image is in a private registry, get corresponding auth data and generate manifest url */ @@ -405,72 +404,57 @@ class DockerUpdate{ $manifestURL = sprintf('https://registry-1.docker.io/v2/%s/manifests/%s', $strRepo, $strTag); } //$this->debug('Manifest URL: '.$manifestURL); - /* * Step 2: Get www-authenticate header from manifest url to generate token url */ $ch = getCurlHandle($manifestURL, 'HEAD'); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); - $response = curl_exec($ch); + $reply = curl_exec($ch); if (curl_errno($ch) !== 0) { //$this->debug('Error: curl error getting manifest: '.curl_error($ch)); return null; } - - preg_match('@www-authenticate:\s*Bearer\s*(.*)@i', $response, $matches); + preg_match('@www-authenticate:\s*Bearer\s*(.*)@i', $reply, $matches); if (empty($matches[1])) { //this->debug('Error: Www-Authenticate header is empty or missing'); return null; } - $strArgs = explode(',', $matches[1]); $args = []; foreach ($strArgs as $arg) { $arg = explode('=', $arg); $args[$arg[0]] = trim($arg[1], "\" \r\n"); } - - if (empty($args['realm']) || empty($args['service']) || empty($args['scope'])) { - return null; - } + if (empty($args['realm']) || empty($args['service']) || empty($args['scope'])) return null; $url = $args['realm'].'?service='.urlencode($args['service']).'&scope='.urlencode($args['scope']); //$this->debug('Token URL: '.$url); - /** * Step 3: Get token from API and authenticate via username / password if in private registry and auth data was found */ $ch = getCurlHandle($url); - if ($registryAuth) { - curl_setopt($ch, CURLOPT_USERPWD, $registryAuth['username'].':'.$registryAuth['password']); - } - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); - $response = curl_exec($ch); + if ($registryAuth) curl_setopt($ch, CURLOPT_USERPWD, $registryAuth['username'].':'.$registryAuth['password']); + $reply = curl_exec($ch); if (curl_errno($ch) !== 0) { //$this->debug('Error: curl error getting token: '.curl_error($ch)); return null; } - $response = json_decode($response, true); - if (!$response || empty($response['token'])) { + $reply = json_decode($reply, true); + if (!$reply || empty($reply['token'])) { //$this->debug('Error: Token response was empty or missing token'); return null; } - $token = $response['token']; - + $token = $reply['token']; /** * Step 4: Get Docker-Content-Digest header from manifest file */ - $ch = getCurlHandle($manifestURL, 'HEAD'); - curl_setopt($ch, CURLOPT_HTTPHEADER, [ - 'Accept: application/vnd.docker.distribution.manifest.list.v2+json,application/vnd.docker.distribution.manifest.v2+json', - 'Authorization: Bearer '.$token - ]); - - $response = curl_exec($ch); + $ch = getCurlHandle($manifestURL, 'HEAD', $header); + $header = ['Accept: application/vnd.docker.distribution.manifest.list.v2+json,application/vnd.docker.distribution.manifest.v2+json', 'Authorization: Bearer '.$token]; + curl_setopt($ch, CURLOPT_HTTPHEADER, $header); + $reply = curl_exec($ch); if (curl_errno($ch) !== 0) { //$this->debug('Error: curl error getting manifest: '.curl_error($ch)); return null; } - preg_match('@Docker-Content-Digest:\s*(.*)@', $response, $matches); + preg_match('@Docker-Content-Digest:\s*(.*)@', $reply, $matches); if (empty($matches[1])) { //$this->debug('Error: Docker-Content-Digest header is empty or missing'); return null; From 2d9bac9701b61a9c6779be04f7299675d9f18f2f Mon Sep 17 00:00:00 2001 From: bergware Date: Tue, 11 Feb 2020 09:50:09 +0100 Subject: [PATCH 38/55] Miscellaneous updates --- plugins/dynamix.docker.manager/include/DockerClient.php | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/plugins/dynamix.docker.manager/include/DockerClient.php b/plugins/dynamix.docker.manager/include/DockerClient.php index 3c927b135..7b62aae79 100644 --- a/plugins/dynamix.docker.manager/include/DockerClient.php +++ b/plugins/dynamix.docker.manager/include/DockerClient.php @@ -505,14 +505,10 @@ class DockerUpdate{ public function inspectLocalVersion($image) { $DockerClient = new DockerClient(); $inspect = $DockerClient->getDockerJSON('/images/'.$image.'/json'); - if (empty($inspect['RepoDigests'])) { - return null; - } + if (empty($inspect['RepoDigests'])) return null; $shaPos = strpos($inspect['RepoDigests'][0], '@sha256:'); - if ($shaPos === false) { - return null; - } + if ($shaPos === false) return null; return substr($inspect['RepoDigests'][0], $shaPos + 1); } From 615609c06fff069948333e0cd47402dc5bc09537 Mon Sep 17 00:00:00 2001 From: bergware Date: Tue, 11 Feb 2020 10:28:55 +0100 Subject: [PATCH 39/55] Miscellaneous updates --- plugins/dynamix.docker.manager/javascript/docker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/dynamix.docker.manager/javascript/docker.js b/plugins/dynamix.docker.manager/javascript/docker.js index 2d39fd944..894fccbac 100644 --- a/plugins/dynamix.docker.manager/javascript/docker.js +++ b/plugins/dynamix.docker.manager/javascript/docker.js @@ -126,7 +126,7 @@ function rmContainer(container, image, id) { showLoaderOnConfirm:true },function(c){ if (!c) {setTimeout(loadlist,0); return;} - $('div.spinner').show('slow'); + $('div.spinner.fixed').show('slow'); if ($('#removeimagechk').prop('checked')) { eventControl({action:'remove_all', container:id, name:container, image:image},'loadlist'); } else { From 743beceb5827aae3c9ba91dc9c23bd2e6fe21753 Mon Sep 17 00:00:00 2001 From: bergware Date: Tue, 11 Feb 2020 16:38:41 +0100 Subject: [PATCH 40/55] Fixed cloning of share attributes --- plugins/dynamix/SecurityAFP.page | 139 ++++++++++++++++++------------- plugins/dynamix/SecurityNFS.page | 51 +++++++----- plugins/dynamix/SecuritySMB.page | 138 +++++++++++++++++------------- plugins/dynamix/ShareEdit.page | 61 ++++++++------ plugins/dynamix/UserEdit.page | 11 ++- 5 files changed, 232 insertions(+), 168 deletions(-) diff --git a/plugins/dynamix/SecurityAFP.page b/plugins/dynamix/SecurityAFP.page index 29e49177e..0056788f5 100644 --- a/plugins/dynamix/SecurityAFP.page +++ b/plugins/dynamix/SecurityAFP.page @@ -4,8 +4,8 @@ Tag="apple" Cond="(($var['shareAFPEnabled']!='no') && (isset($name)?array_key_exists($name,$sec_afp):0))" --- Select the desired destinations and press **Write** to copy the AFP security settings to the selected shares.
-Read settings from - - +
-Write settings to - (All)"; foreach ($rows as $row) echo $row; ?> - +
@@ -139,8 +139,8 @@ Security: > Select the desired destinations and press **Write** to copy the AFP User access settings to the selected shares.
-Read settings from - - +
-Write settings to - (All)"; foreach ($rows as $row)echo $row; ?> - +
@@ -187,8 +187,8 @@ foreach ($rows as $row)echo $row; > Select the desired destinations and press **Write** to copy the AFP User access settings to the selected shares.
-Read settings from - - +
-Write settings to - (All)"; foreach($rows as $row) echo $row; ?> - +
@@ -260,21 +260,31 @@ function readAFP() { }); $(form).find('select').trigger('change'); } -function writeAFP() { - var data = {}, copied = false; - data.shareExportAFP = ''; - data.shareVolsizelimitAFP = ''; - data.shareVoldbpathAFP = ''; - data.shareSecurityAFP = ''; - data.changeShareSecurityAFP = 'Apply'; - $('select#afp1 option').map(function() { - if ($(this).prop('selected')==true && $(this).val()!='(All)') { - data.shareName = $(this).val(); - $.post('/update.htm', data); - copied = true; +function writeAFP(data,n,i) { + if (data) { + if (n'; + data[i]['shareVolsizelimitAFP'] = ''; + data[i]['shareVoldbpathAFP'] = ''; + data[i]['shareSecurityAFP'] = ''; + data[i]['changeShareSecurityAFP'] = 'Apply'; + i++; + } + }); + toggleButton('writeafp',true); + $('div.spinner.fixed').show('slow'); + writeAFP(data,0,i); + } } function readUserAFP() { var form = document.afp_user_edit; @@ -296,32 +306,43 @@ function readUserAFP() { }); $(form).find('select').trigger('change'); } -function writeUserAFP() { - var data = {}, copied = false; - data['userAccess.0'] = 'no-access'; +function writeUserAFP(data,n,i) { + if (data) { + if (n - data.changeShareAccessAFP = 'Apply'; - $('select#afp2 option').map(function() { - if ($(this).prop('selected')==true && $(this).val()!='(All)') { - data.shareName = $(this).val(); - $.post('/update.htm', data); - copied = true; - } - }); - if (copied) swal({title:'Clone complete',text:'AFP User Access settings are written to the selected shares',type:'success'},function(){refresh();}); + data[i]['changeShareAccessAFP'] = 'Apply'; + i++; + } + }); + toggleButton('writeuserafp',true); + $('div.spinner.fixed').show('slow'); + writeUserAFP(data,0,i); + } } diff --git a/plugins/dynamix/SecurityNFS.page b/plugins/dynamix/SecurityNFS.page index d993bdf15..51442152c 100644 --- a/plugins/dynamix/SecurityNFS.page +++ b/plugins/dynamix/SecurityNFS.page @@ -4,8 +4,8 @@ Tag="linux" Cond="(($var['shareNFSEnabled']!='no') && (isset($name)?array_key_exists($name,$sec_nfs):0))" --- Select the desired destinations and press **Write** to copy the NFS security settings to the selected shares.
-Read settings from - - +
-Write settings to - (All)"; foreach ($rows as $row) echo $row; ?> - +
@@ -116,18 +116,29 @@ function readNFS() { }); $(form).find('select').trigger('change'); } -function writeNFS() { - var data = {}, copied = false; - data.shareExportNFS = ''; - data.shareSecurityNFS = ''; - data.changeShareSecurityNFS = 'Apply'; - $('select#nfs1 option').map(function() { - if ($(this).prop('selected')==true && $(this).val()!='(All)') { - data.shareName = $(this).val(); - $.post('/update.htm', data); - copied = true; +function writeNFS(data,n,i) { + if (data) { + if (n'; + data[i]['shareSecurityNFS'] = ''; + data[i]['changeShareSecurityNFS'] = 'Apply'; + i++; + } + }); + toggleButton('writenfs',true); + $('div.spinner.fixed').show('slow'); + writeNFS(data,0,i); + } } diff --git a/plugins/dynamix/SecuritySMB.page b/plugins/dynamix/SecuritySMB.page index af331bd8b..0f5cf1953 100644 --- a/plugins/dynamix/SecuritySMB.page +++ b/plugins/dynamix/SecuritySMB.page @@ -4,8 +4,8 @@ Tag="windows" Cond="(($var['shareSMBEnabled']!='no') && (isset($name)?array_key_exists($name,$sec):0))" --- Select the desired destinations and press **Write** to copy the SMB security settings to the selected shares.
-Read settings from - - +
-Write settings to - (All)"; foreach ($rows as $row) echo $row; ?> - +
@@ -126,8 +126,8 @@ Security: > Select the desired destinations and press **Write** to copy the SMB User access settings to the selected shares.
-Read settings from - - +
-Write settings to - (All)"; foreach ($rows as $row) echo $row; ?> - +
@@ -174,8 +174,8 @@ foreach ($rows as $row) echo $row; > Select the desired destinations and press **Write** to copy the SMB User access settings to the selected shares.
-Read settings from - - +
-Write settings to - (All)"; foreach ($rows as $row) echo $row; ?> - +
@@ -246,20 +246,31 @@ function readSMB() { }); $(form).find('select').trigger('change'); } -function writeSMB() { - var data = {}, copied = false; - data.shareExport = ''; - data.shareFruit = ''; - data.shareSecurity = ''; - data.changeShareSecurity = 'Apply'; - $('select#smb1 option').map(function() { - if ($(this).prop('selected')==true && $(this).val()!='(All)') { - data.shareName = $(this).val(); - $.post('/update.htm', data); - copied = true; +function writeSMB(data,n,i) { + if (data) { + if (n'; + data[i]['shareFruit'] = ''; + data[i]['shareSecurity'] = ''; + data[i]['changeShareSecurity'] = 'Apply'; + i++; + } + }); + toggleButton('writesmb',true); + $('div.spinner.fixed').show('slow'); + writeSMB(data,0,i); + } } function readUserSMB() { var form = document.smb_user_edit; @@ -281,32 +292,43 @@ function readUserSMB() { }); $(form).find('select').trigger('change'); } -function writeUserSMB() { - var data = {}, copied = false; - data['userAccess.0'] = 'no-access'; +function writeUserSMB(data,n,i) { + if (data) { + if (n - data.changeShareAccess = 'Apply'; - $('select#smb2 option').map(function() { - if ($(this).prop('selected')==true && $(this).val()!='(All)') { - data.shareName = $(this).val(); - $.post('/update.htm', data); - copied = true; - } - }); - if (copied) swal({title:'Clone complete',text:'SMB User Access settings are written to the selected shares',type:'success'},function(){refresh();}); + data[i]['changeShareAccess'] = 'Apply'; + i++; + } + }); + toggleButton('writeusersmb',true); + $('div.spinner.fixed').show('slow'); + writeUserSMB(data,0,i); + } } diff --git a/plugins/dynamix/ShareEdit.page b/plugins/dynamix/ShareEdit.page index 059458d90..88b167bf9 100644 --- a/plugins/dynamix/ShareEdit.page +++ b/plugins/dynamix/ShareEdit.page @@ -3,8 +3,8 @@ Title="Share Settings" Tag="share-alt-square" ---
-Read settings from - - +
-Write settings to - (All)"; foreach ($rows as $row) echo $row; ?> - +
@@ -372,23 +372,34 @@ function readShare() { }); $(form).find('select').trigger('change'); } -function writeShare() { - var data = {}, copied = false; - data.shareAllocator = ''; - data.shareFloor = ''; - data.shareSplitLevel = ''; - data.shareInclude = ''; - data.shareExclude = ''; - data.shareUseCache = ''; - data.cmdEditShare = 'Apply'; - $('select#s3 option').map(function() { - if ($(this).prop('selected')==true && $(this).val()!='(All)') { - data.shareNameOrig = $(this).val(); - data.shareName = $(this).val(); - $.post('/update.htm', data); - copied = true; +function writeShare(data,n,i) { + if (data) { + if (n'; + data[i]['shareFloor'] = ''; + data[i]['shareSplitLevel'] = ''; + data[i]['shareInclude'] = ''; + data[i]['shareExclude'] = ''; + data[i]['shareUseCache'] = ''; + data[i]['cmdEditShare'] = 'Apply'; + i++; + } + }); + toggleButton('writeshare',true); + $('div.spinner.fixed').show('slow'); + writeShare(data,0,i); + } } diff --git a/plugins/dynamix/UserEdit.page b/plugins/dynamix/UserEdit.page index 5ce5c7c51..5d844fd6c 100644 --- a/plugins/dynamix/UserEdit.page +++ b/plugins/dynamix/UserEdit.page @@ -3,8 +3,8 @@ Title="Edit User" Tag="user" --- Date: Tue, 11 Feb 2020 16:39:55 +0100 Subject: [PATCH 41/55] Fixed cloning of share attributes --- plugins/dynamix/Disk.page | 13 ++++++++++--- plugins/dynamix/Share.page | 15 +++++++++++---- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/plugins/dynamix/Disk.page b/plugins/dynamix/Disk.page index 7e8aff83c..600e67c31 100644 --- a/plugins/dynamix/Disk.page +++ b/plugins/dynamix/Disk.page @@ -33,13 +33,17 @@ $next = urlencode($i<$end ? $refs[$i+1] : $refs[0]); diff --git a/plugins/dynamix.vm.manager/include/VMMachines.php b/plugins/dynamix.vm.manager/include/VMMachines.php index 2f1b5aa7e..510fe7bb1 100644 --- a/plugins/dynamix.vm.manager/include/VMMachines.php +++ b/plugins/dynamix.vm.manager/include/VMMachines.php @@ -1,7 +1,7 @@ " : "' style='display:none'>"); - echo ""; + echo ""; echo ""; echo ""; echo ""; @@ -152,7 +152,6 @@ foreach ($vms as $vm) { $bus = $arrValidDiskBuses[$arrCD['bus']] ?? 'VirtIO'; echo ""; } - echo "
Disk devicesBusCapacityAllocation
$disk$bus$capacity$allocation
"; echo ""; } From 3ab52c181c5cbc8cc585d364dfa91a89e8b6ba4b Mon Sep 17 00:00:00 2001 From: bergware Date: Tue, 11 Feb 2020 23:31:05 +0100 Subject: [PATCH 49/55] Updated VMs table styling --- plugins/dynamix.vm.manager/VMMachines.page | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/dynamix.vm.manager/VMMachines.page b/plugins/dynamix.vm.manager/VMMachines.page index 033995980..00fd36100 100644 --- a/plugins/dynamix.vm.manager/VMMachines.page +++ b/plugins/dynamix.vm.manager/VMMachines.page @@ -105,7 +105,7 @@ table.domdisk tbody tr td:nth-child(1){padding-left:72px} table.domdisk tbody tr:nth-child(even){background-color:transparent!important} table.domdisk tbody tr:nth-child(4n-1){background-color:transparent!important} - +
NameDescriptionCPUsMemoryvDisksGraphicsAutostart
From 09af4b9b7b76e6a1cea91fb84673897493aeefdb Mon Sep 17 00:00:00 2001 From: bergware Date: Tue, 11 Feb 2020 23:35:41 +0100 Subject: [PATCH 50/55] Updated VMs table styling --- plugins/dynamix.vm.manager/VMMachines.page | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/dynamix.vm.manager/VMMachines.page b/plugins/dynamix.vm.manager/VMMachines.page index 00fd36100..bf8c79f14 100644 --- a/plugins/dynamix.vm.manager/VMMachines.page +++ b/plugins/dynamix.vm.manager/VMMachines.page @@ -96,7 +96,8 @@ if (empty($vms)) { - +
NameDescriptionCPUsMemoryvDisksGraphicsAutostart
NameDescriptionCPUsMemoryvDisksGraphicsAutostart
From 4ea4676c9e9ee7a4d6aee63b67a6463c425c3649 Mon Sep 17 00:00:00 2001 From: bergware Date: Tue, 11 Feb 2020 23:38:44 +0100 Subject: [PATCH 51/55] Updated VMs table styling --- plugins/dynamix.vm.manager/VMMachines.page | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/dynamix.vm.manager/VMMachines.page b/plugins/dynamix.vm.manager/VMMachines.page index bf8c79f14..fc6ecd1c6 100644 --- a/plugins/dynamix.vm.manager/VMMachines.page +++ b/plugins/dynamix.vm.manager/VMMachines.page @@ -97,7 +97,7 @@ if (empty($vms)) {