From 1f0e326f8166d29c88a8281328131ae0f9756f15 Mon Sep 17 00:00:00 2001 From: bergware Date: Thu, 22 Jun 2023 21:13:38 +0200 Subject: [PATCH 1/3] Dashboard updates - Re-introduce show/hide tile content - Add new icon function to show/hide all content at once - Reduce gap between columns --- emhttp/plugins/dynamix/DashStats.page | 295 ++++++++++++++---- .../plugins/dynamix/include/DashboardApps.php | 13 + 2 files changed, 242 insertions(+), 66 deletions(-) diff --git a/emhttp/plugins/dynamix/DashStats.page b/emhttp/plugins/dynamix/DashStats.page index abaa83c92..b9b6fdf7e 100644 --- a/emhttp/plugins/dynamix/DashStats.page +++ b/emhttp/plugins/dynamix/DashStats.page @@ -174,20 +174,21 @@ switch ($display['theme']) { "> @@ -237,8 +241,9 @@ input[value=Edit]{margin:12px 0 0 0;padding:5px 10px}
- - - - + @@ -308,7 +313,7 @@ foreach ($cpus as $pair) { - @@ -319,7 +324,7 @@ foreach ($cpus as $pair) { - + - @@ -386,7 +391,7 @@ foreach ($ports as $port) { @@ -400,7 +405,7 @@ foreach ($ports as $port) { -"; - - + - - + - - class="mixed"> +"; +
+ +
+ - - class="mixed"> + - + + - @@ -598,8 +621,9 @@ if (!$group) { - @@ -608,7 +632,10 @@ if (!$group) { - + @@ -675,18 +702,61 @@ function hideShow() { Number.prototype.pad = function(size){var s=String(this);while(s.length<(size||2)){s='0'+s;}return s;} Array.prototype.tail = function(t){return this.slice(-t).map(function(o){return o.y;}).join(';');} String.prototype.build = function(){return this.replace(/\n()\n/g,'');} -String.prototype.marker = function(){return this.substr(0,12).replace(/ /g,'').toLowerCase();} +String.prototype.md5 = function() { + // Original copyright (c) Paul Johnston & Greg Holt. + var hc = '0123456789abcdef'; + function rh(n){var j,s='';for(j=0;j<=3;j++) s+=hc.charAt((n>>(j*8+4))&0x0F)+hc.charAt((n>>(j*8))&0x0F);return s;} + function ad(x,y){var l=(x&0xFFFF)+(y&0xFFFF);var m=(x>>16)+(y>>16)+(l>>16);return (m<<16)|(l&0xFFFF);} + function rl(n,c){return (n<>>(32-c));} + function cm(q,a,b,x,s,t){return ad(rl(ad(ad(a,q),ad(x,t)),s),b);} + function ff(a,b,c,d,x,s,t){return cm((b&c)|((~b)&d),a,b,x,s,t);} + function gg(a,b,c,d,x,s,t){return cm((b&d)|(c&(~d)),a,b,x,s,t);} + function hh(a,b,c,d,x,s,t){return cm(b^c^d,a,b,x,s,t);} + function ii(a,b,c,d,x,s,t){return cm(c^(b|(~d)),a,b,x,s,t);} + function sb(x) { + var i;var nblk=((x.length+8)>>6)+1;var blks=new Array(nblk*16);for(i=0;i>2]|=x.charCodeAt(i)<<((i%4)*8); + blks[i>>2]|=0x80<<((i%4)*8);blks[nblk*16-2]=x.length*8;return blks; + } + var i,x=sb(''+this),a=1732584193,b=-271733879,c=-1732584194,d=271733878,olda,oldb,oldc,oldd; + for(i=0;i]; -var cpu = []; -var rxd = []; -var txd = []; -var cputime = 0; -var nettime = 0; -var cpuline = $.cookie('cpuline')||30; -var netline = $.cookie('netline')||30; -var update2 = true; -var box = null; +var ports = []; +var cpu = []; +var rxd = []; +var txd = []; +var cputime = 0; +var nettime = 0; +var cpuline = $.cookie('cpuline')||30; +var netline = $.cookie('netline')||30; +var update2 = true; +var box = null; +var startup = true; var options_cpu = { series:[{name:'load', data:cpu.slice()}], @@ -805,8 +875,8 @@ function noVMs() { } function loadlist(init) { if (init) { - $('#apps').switchButton({labels_placement:'left', off_label:"_(All Apps)_", on_label:"_(Started only)_", checked:$.cookie('my_apps')=='startedOnly'}); - $('#vms').switchButton({labels_placement:'left', off_label:"_(All VMs)_", on_label:"_(Started only)_", checked:$.cookie('my_vms')=='startedOnly'}); + $('#apps').switchButton({labels_placement:'right', off_label:"_(All Apps)_", on_label:"_(Started only)_", checked:$.cookie('my_apps')=='startedOnly'}); + $('#vms').switchButton({labels_placement:'right', off_label:"_(All VMs)_", on_label:"_(Started only)_", checked:$.cookie('my_vms')=='startedOnly'}); $('#apps').change(function(){ $('span.outer.apps.stopped').finish().toggle('fast',function(){noApps();}) $('#apps').is(':checked') ? $.cookie('my_apps','startedOnly',{expires:3650}) : $.removeCookie('my_apps'); @@ -820,8 +890,10 @@ function loadlist(init) { var data = d.split('\0'); $('#docker_view tr.updated').remove(); $('#docker_view').append(data[0]); + hideMe($('#docker_view')); $('#vm_view tr.updated').remove(); $('#vm_view').append(data[1]); + hideMe($('#vm_view')); if ($.cookie('my_apps')!=null) $('span.apps.stopped').hide(0,noApps()); if ($.cookie('my_vms')!=null) $('span.vms.stopped').hide(0,noVMs()); }); @@ -841,13 +913,22 @@ function getCase() { function changeMode(item) { if (item==0) $.removeCookie('enter_share'); else $.cookie('enter_share',item,{expires:3650}); - if (item==0) $('.smb.user1').show(); else $('.smb.user1').hide(); - if (item==0) $('.smb.share1').show(); else $('.smb.share1').hide(); + if (startup || $('.smb.share1').parent().find('tr:eq(1)').is(':visible')) { + if (item==0) $('.smb.share1').show(); else $('.smb.share1').hide(); + } + if (startup || $('.smb.user1').parent().find('tr:eq(1)').is(':visible')) { + if (item==0) $('.smb.user1').show(); else $('.smb.user1').hide(); + } - if (item==2) $('.nfs.user3').show(); else $('.nfs.user3').hide(); - if (item==2) $('.nfs.share3').show(); else $('.nfs.share3').hide(); + if ($('.nfs.share3').parent().find('tr:eq(1)').is(':visible')) { + if (item==2) $('.nfs.share3').show(); else $('.nfs.share3').hide(); + } + if ($('.nfs.user3').parent().find('tr:eq(1)').is(':visible')) { + if (item==2) $('.nfs.user3').show(); else $('.nfs.user3').hide(); + } + $('select[name="enter_user"]').val(item); } function changeView(item) { if (item==0) $.removeCookie('enter_view'); else $.cookie('enter_view',item,{expires:3650}); @@ -942,7 +1023,7 @@ function dropdown(menu) { var select = 'select[name="'+menu+'"]'; var size = $(select+' option').length; var option = $.cookie(menu)||0; - if (option >= size) option = size - 1; + if (option >= size) option = 0; $(select+' option')[option].selected = true; $(select).change(); } @@ -962,8 +1043,15 @@ function toggleChart(init) { $('#cpu_main').removeClass('last'); $('.cpu_open:last').removeClass('last'); if ($.cookie('cpu-chart')==null) { - $('#cpu_chart').show(); - $('#cpuline').show(); + var hidden = $.cookie('hidden_content'); + hidden = hidden==null ? [] : hidden.split(';'); + if (hidden.indexOf($('#cpu_main').parent().attr('sort'))==-1) { + $('#cpu_chart').show(); + $('#cpuline').show(); + } else { + $('#cpu_chart').hide(); + $('#cpuline').hide(); + } } else { $('#cpu_chart').hide(); $('#cpuline').hide(); @@ -1050,17 +1138,24 @@ function sortTables() { }); } function addProperties() { - $('div.frame tbody.system').addClass('sortable').attr('sort','_system_information_'); + $('div.frame tbody.system').addClass('sortable').attr('sort','_system_information_'.md5()); + $('div.frame tbody.system').find('td:first').prepend(""); + $('div.frame tbody').each(function(){ + $(this).find('td:first').prepend(""); + }); $('div.frame tbody').not('.system').each(function(){ - $(this).addClass('sortable').attr('sort',$(this).attr('title').marker()); + $(this).addClass('sortable').attr('sort',$(this).attr('title').md5()); $(this).find('td:first').prepend(""); }); $('div.frame tr').attr('title',''); + $('tr#var0').hover(function(){$.post('/webGui/include/DashboardApps.php',{sys:0},function(val){$('.sys0').text(val);})}); - $('tr#var1').show(); + $('tr#var1').show().hover(function(){$.post('/webGui/include/DashboardApps.php',{sys:1},function(val){$('.sys1').text(val);})}); + $('tr#var2').hover(function(){$.post('/webGui/include/DashboardApps.php',{sys:2},function(val){$('.sys2').text(val);})}); + $('tr#var3').hover(function(){$.post('/webGui/include/DashboardApps.php',{sys:3},function(val){$('.sys3').text(val);})}); - $('tr#var4').show(); + $('tr#var4').show().hover(function(){$.post('/webGui/include/DashboardApps.php',{sys:4},function(val){$('.sys4').text(val);})}); } function showContent() { @@ -1068,13 +1163,22 @@ function showContent() { var inactive = $.cookie('inactive_content'); if (inactive) { inactive = inactive.split(';'); - for (var n=0,x; x=inactive[n]; n++) { - var tbody = $('table.dashboard tbody[sort="'+x+'"]'); + for (var n=0,md5; md5=inactive[n]; n++) { + var tbody = $('table.dashboard tbody[sort="'+md5+'"]'); var id = tbody.parent().prop('id'); count[id]--; tbody.hide(); } } + var hidden = $.cookie('hidden_content'); + if (hidden) { + hidden = hidden.split(';'); + for (var n=0,md5; md5=hidden[n]; n++) { + var tbody = $('div.frame tbody[sort="'+md5+'"]'); + tbody.find('.openclose').removeClass('fa-chevron-up fa-chevron-down').addClass('fa-chevron-down'); + tbody.find('tr:gt(0)').hide(); + } + } if (count['db-box1']>0) $('div#tile1').show(); if (count['db-box2']>0) $('div#tile2').show(); if (count['db-box3']>0) $('div#tile3').show(); @@ -1085,8 +1189,62 @@ function setColor(l, t1, t2) { case (t2 > 0 && l >= t2): return 'orangebar'; default: return '';} } -function dismiss(close) { - var tbody = close.closest('tbody'); +function hideMe(tbody) { + var hidden = $.cookie('hidden_content'); + hidden = hidden==null ? [] : hidden.split(';'); + if (hidden.indexOf(tbody.attr('sort'))>=0) tbody.find('tr:gt(0)').hide(); +} +function mixed(tbody) { + if (tbody.attr('data')) { + setTimeout(tbody.attr('data')); + } + if (tbody.hasClass('mixed')) { + var select = tbody.find('select[name^="enter"]'); + select = parseInt(select.val())+1; + tbody.find('tr:gt(0)').each(function(){ + var names = ($(this).attr('class')||'').split(' '); + for (var n=0,name; name=names[n]; n++) if (/[0-9]/.test(name.slice(-1)) && name.slice(-1)!=select) $(this).hide(); + }); + } +} +function openClose(button) { + var hidden = $.cookie('hidden_content'); + hidden = hidden==null ? [] : hidden.split(';'); + if (button) { + // show/hide single tile content + var tbody = button.closest('tbody'); + if (button.hasClass('fa-chevron-up')) { + button.removeClass('fa-chevron-up fa-chevron-down').addClass('fa-chevron-down'); + tbody.find('tr:gt(0)').hide(); + hidden.push(tbody.attr('sort')); + } else { + button.removeClass('fa-chevron-up fa-chevron-down').addClass('fa-chevron-up'); + tbody.find('tr:gt(0)').show(); + mixed(tbody); + hidden.splice(hidden.indexOf(tbody.attr('sort')),1); + } + $.cookie('hidden_content',hidden.join(';'),{expires:3650}); + } else { + // show/hide all tiles content + if (hidden.length==0) { + $('div.frame tbody').each(function(){ + $(this).find('.openclose').removeClass('fa-chevron-up fa-chevron-down').addClass('fa-chevron-down'); + $(this).find('tr:gt(0)').hide(); + hidden.push($(this).attr('sort')); + }); + $.cookie('hidden_content',hidden.join(';'),{expires:3650}); + } else { + $('div.frame tbody').each(function(){ + $(this).find('.openclose').removeClass('fa-chevron-up fa-chevron-down').addClass('fa-chevron-up'); + $(this).find('tr:gt(0)').show(); + mixed($(this)); + }); + $.removeCookie('hidden_content'); + } + } +} +function dismiss(button) { + var tbody = button.closest('tbody'); var table = tbody.parent(); var tile = table.parent(); var inactive = $.cookie('inactive_content'); @@ -1100,7 +1258,7 @@ function contentMgmt() { box = $("#iframe-popup"); box.html($("#templateContentMgmt").html().build()); box.dialog({ - title: "_(Content Management)_", + title: "_(Tile Management)_", height: 350, width: 900, resizable: false, @@ -1113,8 +1271,9 @@ function contentMgmt() { $.removeCookie('db-box2'); $.removeCookie('db-box3'); $.removeCookie('inactive_content'); + $.removeCookie('hidden_content'); box.dialog('close'); - refresh(); + location.reload(); }, "_(All)_": function(){ $('input.checker').each(function(){$(this).prop('checked',true);}); @@ -1222,6 +1381,7 @@ dashboard.on('message',function(msg,meta) { // array devices $('#array_list tr.updated').remove(); $('#array_list').append(data[0]); + hideMe($('#array_list')); $('#array_info').parent().css('display',info?'':'none'); $('#array_info').html(info); smartMenu('#array_list'); @@ -1232,6 +1392,7 @@ dashboard.on('message',function(msg,meta) { var info = moreInfo(data,"_(Pool)_"); $('#pool_list'+i+' tr.updated').remove(); $('#pool_list'+i).append(t); + hideMe($('#pool_list'+i)); $('#pool_info'+i).parent().css('display',info?'':'none'); $('#pool_info'+i).html(info); smartMenu('#pool_list'+i); @@ -1242,12 +1403,13 @@ dashboard.on('message',function(msg,meta) { var info = moreInfo(data,"_(Unassigned)_"); $('#devs_list tr.updated').remove(); $('#devs_list').append(data[0]); + hideMe($('#devs_list')); $('#devs_info').parent().css('display',info?'':'none'); $('#devs_info').html(info); smartMenu('#devs_list'); // parity status - $('span.info.title').html(part[3]); + $('span.parity').html(part[3]); // parity schedule var data = part[4].split('\0'); $('#parity').html(data[0]); @@ -1320,6 +1482,7 @@ $(function() { dropdown('enter_share'); dropdown('enter_view'); + startup = false; dashboard.start(); apcups.start(); diff --git a/emhttp/plugins/dynamix/include/DashboardApps.php b/emhttp/plugins/dynamix/include/DashboardApps.php index c9f47105e..8f9bc08aa 100644 --- a/emhttp/plugins/dynamix/include/DashboardApps.php +++ b/emhttp/plugins/dynamix/include/DashboardApps.php @@ -20,6 +20,19 @@ require_once "$docroot/plugins/dynamix.docker.manager/include/DockerClient.php"; require_once "$docroot/plugins/dynamix.vm.manager/include/libvirt_helpers.php"; require_once "$docroot/webGui/include/Helpers.php"; +if (isset($_POST['sys'])) { + switch ($_POST['sys']) { + case 0: $size = exec("awk '/^MemTotal/{t=$2}/^MemAvailable/{a=$2}END{print (t-a)*1024}' /proc/meminfo 2>/dev/null"); break; + case 1: $size = exec("awk '/^size/{print \$3;exit}' /proc/spl/kstat/zfs/arcstats 2>/dev/null"); break; + case 2: $size = exec("df --output=used /boot 2>/dev/null|awk '$1!=\"Used\" {print $1*1024}'"); break; + case 3: $size = exec("df --output=used /var/log 2>/dev/null|awk '$1!=\"Used\" {print $1*1024}'"); break; + case 4: $size = exec("df --output=used /var/lib/docker 2>/dev/null|awk '$1!=\"Used\" {print $1*1024}'"); break; + default: $size = 0; + } + extract(parse_plugin_cfg('dynamix',true)); + die(my_scale($size,$unit,null,-1,1024)." $unit"); +} + $display = $_POST['display']; if ($_POST['docker'] && ($display=='icons' || $display=='docker')) { From 2e8ffa7dadbf0b8742f09bec33832db8d54d26f9 Mon Sep 17 00:00:00 2001 From: bergware Date: Thu, 22 Jun 2023 21:14:56 +0200 Subject: [PATCH 2/3] OS update: add checkbox to confirm reading release notes before upgrading --- .../dynamix.plugin.manager/include/PluginHelpers.php | 8 ++++++-- .../dynamix.plugin.manager/include/ShowPlugins.php | 10 +++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/emhttp/plugins/dynamix.plugin.manager/include/PluginHelpers.php b/emhttp/plugins/dynamix.plugin.manager/include/PluginHelpers.php index bfa918912..fdbc1a029 100644 --- a/emhttp/plugins/dynamix.plugin.manager/include/PluginHelpers.php +++ b/emhttp/plugins/dynamix.plugin.manager/include/PluginHelpers.php @@ -1,6 +1,6 @@ " : ""; $disabled = $check ? ' disabled' : ''; + if ($method == 'update' && $extra) { + $disabled = 'disabled'; + $id = $extra; + } if ($method == 'delete') { $cmd = "plugin_rm $arg"; $func = "refresh"; diff --git a/emhttp/plugins/dynamix.plugin.manager/include/ShowPlugins.php b/emhttp/plugins/dynamix.plugin.manager/include/ShowPlugins.php index 601412e56..60a81355d 100644 --- a/emhttp/plugins/dynamix.plugin.manager/include/ShowPlugins.php +++ b/emhttp/plugins/dynamix.plugin.manager/include/ShowPlugins.php @@ -163,12 +163,16 @@ foreach (glob($plugins,GLOB_NOSORT) as $plugin_link) { } else { $latest = plugin('version',$filename); if ($os ? version_compare($latest,$version,'>') : strcmp($latest,$version) > 0) { - $version .= "
$latest"; + if ($os) { + $version = ""._('I have read the release notes')."
$latest"; + } else { + $version .= "
$latest"; + } $error = null; - if ( ! $os && (version_compare(plugin("min",$filename,$error) ?: "1.0",$Unraid['version'],">") || version_compare(plugin("max",$filename,$error) ?: "999.9.9",$Unraid['version'],"<") ) ) { + if (!$os && (version_compare(plugin("min",$filename,$error) ?: "1.0",$Unraid['version'],">") || version_compare(plugin("max",$filename,$error) ?: "999.9.9",$Unraid['version'],"<"))) { $status = " "._("Update Incompatible").""; } else { - $status = make_link("update",basename($plugin_file)); + $status = make_link("update",basename($plugin_file),$os?'cmdUpdate':''); } $changes_file = $filename; if (!$os) $updates++; From 37563023dfa7693b7cbdc6fb43a25808ba1d1a27 Mon Sep 17 00:00:00 2001 From: bergware Date: Thu, 22 Jun 2023 21:15:23 +0200 Subject: [PATCH 3/3] Minor code optimization to generate the welcome message --- sbin/create_network_ini | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/sbin/create_network_ini b/sbin/create_network_ini index 4aa865f3d..1b9cc2fd3 100755 --- a/sbin/create_network_ini +++ b/sbin/create_network_ini @@ -232,17 +232,15 @@ fi # generate our welcome text (management interface only) if [[ -z $interface || "eth0 br0 bond0" =~ $interface ]]; then - source /etc/unraid-version + . /etc/unraid-version echo -e "unRAID Server OS version: $version" >/etc/issue # find management interface - ETH=eth0 - [[ -e /sys/class/net/bond0 ]] && ETH=bond0 - [[ -e /sys/class/net/br0 ]] && ETH=br0 - IPv4=$(ip -4 addr show $ETH|awk '/inet /{print $2;exit}') - IPv6=$(ip -6 addr show $ETH noprefixroute|awk '/inet6 /{print $2;exit}') - [[ -z $IPv6 ]] && IPv6=$(ip -6 addr show $ETH scope global permanent|awk '/inet6 /{print $2;exit}') - [[ -n $IPv4 ]] && echo " IPv4 address: ${IPv4%%/*}">>/etc/issue || echo " IPv4 address: not set">>/etc/issue - [[ -n $IPv6 ]] && echo " IPv6 address: ${IPv6%%/*}">>/etc/issue || echo " IPv6 address: not set">>/etc/issue + [[ -e /sys/class/net/bond0 ]] && dev=bond0 || dev=eth0 + [[ -e /sys/class/net/br0 ]] && dev=br0 + IPv4=$(ip -br -4 addr show $dev|awk '{print $3}') + IPv6=$(ip -br -6 addr show $dev|awk '$3 !~ "^fe80" {print $3}') + [[ -n $IPv4 ]] && echo " IPv4 address: ${IPv4%/*}">>/etc/issue || echo " IPv4 address: not set">>/etc/issue + [[ -n $IPv6 ]] && echo " IPv6 address: ${IPv6%/*}">>/etc/issue || echo " IPv6 address: not set">>/etc/issue echo >>/etc/issue fi exit 0