diff --git a/emhttp/plugins/dynamix/DashStats.page b/emhttp/plugins/dynamix/DashStats.page index b50fed0f6..beb2474cc 100644 --- a/emhttp/plugins/dynamix/DashStats.page +++ b/emhttp/plugins/dynamix/DashStats.page @@ -55,25 +55,25 @@ exec("sed -ri 's/^\.logLine\{color:#......;/.logLine{color:$fgcolor;/' $docroot/ exec("/etc/rc.d/rc.docker status >/dev/null",$dummy,$dockerd); exec("/etc/rc.d/rc.libvirt status >/dev/null",$dummy,$libvirtd); -$dockerd = $dockerd==0; -$libvirtd = $libvirtd==0; -$apcupsd = file_exists('/var/run/apcupsd.pid'); -$conf = glob('/etc/wireguard/wg*.conf'); -$wireguard = is_executable('/usr/bin/wg') && count($conf); -$started = _var($var,'fsState')=='Started'; -$sleep = isset($display['sleep']); +$dockerd = $dockerd==0; +$libvirtd = $libvirtd==0; +$apcupsd = file_exists('/var/run/apcupsd.pid'); +$cookie = '/boot/config/cookie.json'; +$conf = glob('/etc/wireguard/wg*.conf'); +$wireguard = is_executable('/usr/bin/wg') && count($conf); +$started = _var($var,'fsState')=='Started'; +$sleep = isset($display['sleep']); $poolsOnly = (_var($var,'SYS_ARRAY_SLOTS') == 0 ) ? true : false; $array_size = $array_used = 0; $extra_size = $extra_used = 0; $cache_size = $cache_used = []; $cache_type = $cache_rate = []; - -$parity = _var($var,'mdResync'); -$mover = file_exists('/var/run/mover.pid'); -$btrfs = exec('pgrep --ns $$ -cf /sbin/btrfs'); -$vdisk = exec("grep -Pom1 '^DOCKER_IMAGE_TYPE=\"\\K[^\"]+' /boot/config/docker.cfg 2>/dev/null")!='folder' ? _('Docker vdisk') : _('Docker folder'); -$dot = _var($display,'number','.,')[0]; -$zfs = count(array_filter(array_column($disks,'fsType'),function($fs){return str_replace('luks:','',$fs??'')=='zfs';})); +$parity = _var($var,'mdResync'); +$mover = file_exists('/var/run/mover.pid'); +$btrfs = exec('pgrep --ns $$ -cf /sbin/btrfs'); +$vdisk = exec("grep -Pom1 '^DOCKER_IMAGE_TYPE=\"\\K[^\"]+' /boot/config/docker.cfg 2>/dev/null")!='folder' ? _('Docker vdisk') : _('Docker folder'); +$dot = _var($display,'number','.,')[0]; +$zfs = count(array_filter(array_column($disks,'fsType'),function($fs){return str_replace('luks:','',$fs??'')=='zfs';})); $domain_cfgfile = "/boot/config/domain.cfg"; $domain_cfg = parse_ini_file($domain_cfgfile); @@ -673,10 +673,11 @@ function hideShow() { if (count['db-box2']>0) $('div#tile2').show(); else $('div#tile2').hide(); if (count['db-box3']>0) $('div#tile3').show(); else $('div#tile3').hide(); if (inactive.length>0) { - $.cookie('inactive_content',inactive.join(';'),{expires:3650}); + cookie.inactive_content = inactive.join(';'); } else { - $.removeCookie('inactive_content'); + delete cookie.inactive_content; } + saveCookie(); }
@@ -753,8 +754,8 @@ String.prototype.md5 = function(){ return rh(a)+rh(b)+rh(c)+rh(d); } jQuery.prototype.hideMe = function() { - var hidden = $.cookie('hidden_content'); - hidden = hidden==null ? [] : hidden.split(';'); + var hidden = cookie.hidden_content; + hidden = hidden ? hidden.split(';') : []; if (hidden.indexOf(this.attr('sort'))>=0) this.find('tr:gt(0)').hide(); } jQuery.prototype.mixedView = function(s) { @@ -779,29 +780,12 @@ jQuery.prototype.mixedView = function(s) { }); } } -function sanitizeMultiCookie(cookieName, delimiter, removeDuplicates = false) { - // Some browser states leave multi-value cookies with nulls, empties or duplicates. - // This function cleans up any such cookies so that they do not break functionality. - try { - var uncleanCookie = $.cookie(cookieName); - if (uncleanCookie) { - uncleanCookie = uncleanCookie.split(delimiter); - var cleanCookie = uncleanCookie.filter(n => n); - if (removeDuplicates) { cleanCookie = [...new Set(cleanCookie)]; } - if (JSON.stringify(uncleanCookie) !== JSON.stringify(cleanCookie)) { - $.cookie(cookieName,cleanCookie.join(delimiter),{expires:3650}); - return true; - } else { - return false; - } - } else { - return false; - } - } catch (ex) { - return false; - } -} + +var cookie = JSON.parse('=file_get_contents($cookie)?>'); + +var cookie = {}; + var colors = ['=$c0?>','=$c1?>','#d77e0d','#d4ac0d','#cd5c5c','#ffc0cb','#e6e6fa','#9370db','#7cfc00','#228b22','#00ffff','#4682b4']; var blue = '#486dba'; // fallback color when too many graph elements exist var ports = [=implode(',',array_map('escapestring',$ports))?>]; @@ -810,8 +794,8 @@ var rxd = []; var txd = []; var cputime = 0; var nettime = 0; -var cpuline = $.cookie('cpuline')||30; -var netline = $.cookie('netline')||30; +var cpuline = cookie.cpuline||30; +var netline = cookie.netline||30; var update2 = true; var box = null; var startup = true; @@ -849,8 +833,38 @@ var options_net = { var cpuchart = new ApexCharts(document.querySelector('#cpuchart'), options_cpu); var netchart = new ApexCharts(document.querySelector('#netchart'), options_net); -if ($.cookie('port_select')!=null && !ports.includes($.cookie('port_select'))) $.removeCookie('port_select'); -var port_select = $.cookie('port_select')||ports[0]; +if (cookie.port_select!=null && !ports.includes(cookie.port_select)) { + delete cookie.port_select; + saveCookie(); +} +var port_select = cookie.port_select||ports[0]; + +function saveCookie() { + $.post('/webGui/include/InitCharts.php',{cmd:'cookie',data:JSON.stringify(cookie)}); +} + +function sanitizeMultiCookie(cookieName, delimiter, removeDuplicates=false) { + // Some browser states leave multi-value cookies with nulls, empties or duplicates. + // This function cleans up any such cookies so that they do not break functionality. + try { + var uncleanCookie = $.cookie(cookieName); + if (uncleanCookie) { + uncleanCookie = uncleanCookie.split(delimiter); + var cleanCookie = uncleanCookie.filter(n => n); + if (removeDuplicates) { cleanCookie = [...new Set(cleanCookie)]; } + if (JSON.stringify(uncleanCookie) !== JSON.stringify(cleanCookie)) { + $.cookie(cookieName,cleanCookie.join(delimiter),{expires:3650}); + return true; + } else { + return false; + } + } else { + return false; + } + } catch (ex) { + return false; + } +} function initCharts(clear) { $.post('/webGui/include/InitCharts.php',{cmd:'get'},function(data) { @@ -879,12 +893,14 @@ function initCharts(clear) { nettime = x + 1; }); } + function resetCharts() { // prevent unlimited graph growing cpu = cpu.slice(-cpuline); rxd = rxd.slice(-netline); txd = txd.slice(-netline); } + function addChartCpu(load) { cputime++; var i = cpu.length - cpuline; @@ -895,6 +911,7 @@ function addChartCpu(load) { } cpu.push({x:cputime, y:load}); } + function addChartNet(rx, tx) { nettime++; var i = rxd.length - netline; @@ -908,6 +925,7 @@ function addChartNet(rx, tx) { rxd.push({x:nettime, y:rx}); txd.push({x:nettime, y:tx}); } + function toggleVPN(id,vtun) { var up = $('#vpn-active'); @@ -928,23 +946,28 @@ function toggleVPN(id,vtun) { } } + function noApps() { if ($('span.outer.apps:visible').length==0) $('#no_apps').show(); else $('#no_apps').hide(); } + function noVMs() { if ($('span.outer.vms:visible').length==0) $('#no_vms').show(); else $('#no_vms').hide(); } + function loadlist(init) { if (init) { - $('#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').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'); + $('#apps').is(':checked') ? cookie.my_apps = 'startedOnly' : delete cookie.my_apps; + saveCookie(); }); $('#vms').change(function(){ $('span.outer.vms.stopped').finish().toggle('fast',function(){noVMs();}); - $('#vms').is(':checked') ? $.cookie('my_vms','startedOnly',{expires:3650}) : $.removeCookie('my_vms'); + $('#vms').is(':checked') ? cookie.my_vms = 'startedOnly' : delete cookie.my_vms; + saveCookie(); }); } $.post('/webGui/include/DashboardApps.php',{docker:'=$dockerd?>',vms:'=$libvirtd?>',vmusage:'=$vmusage?>'},function(d) { @@ -963,10 +986,11 @@ function loadlist(init) { $('#vm_view_usage').append(data[2]).hideMe(); $('.apps.switch').html("_(Containers)_ -- _(Started)_: "+started_apps+", _(Stopped)_: "+stopped_apps+", _(Paused)_: "+paused_apps); $('.vms.switch').html("_(VMs)_ -- _(Started)_: "+started_vms+", _(Stopped)_: "+stopped_vms+", _(Paused)_: "+paused_vms); - if ($.cookie('my_apps')!=null) $('span.apps.stopped').hide(0,noApps()); - if ($.cookie('my_vms')!=null) $('span.vms.stopped').hide(0,noVMs()); + if (cookie.my_apps!=null) $('span.apps.stopped').hide(0,noApps()); + if (cookie.my_vms!=null) $('span.vms.stopped').hide(0,noVMs()); }); } + function getCase() { $.post('/webGui/include/SelectCase.php',{mode:'get',file:'=$myfile?>'},function(model){ if (!model) { @@ -979,8 +1003,10 @@ function getCase() { } }); } + function changeMode(item) { - if (item==0) $.removeCookie('enter_share'); else $.cookie('enter_share',item,{expires:3650}); + if (item==0) delete cookie.enter_share; else cookie.enter_share = item; + saveCookie(); if (startup || $('.smb.share1').parent().find('tr:eq(1)').is(':visible')) { if (item==0) $('.smb.share1').show(); else $('.smb.share1').hide(); @@ -999,23 +1025,30 @@ function changeMode(item) { $('select[name="enter_user"]').val(item); } + function changeView(item) { - if (item==0) $.removeCookie('enter_view'); else $.cookie('enter_view',item,{expires:3650}); + if (item==0) delete cookie.enter_view; else cookie.enter_view = item; if (item==0) $('.view1').show(); else $('.view1').hide(); if (item==1) $('.view2').show(); else $('.view2').hide(); if (item==2) $('.view3').show(); else $('.view3').hide(); if (item==3) $('.view4').show(); else $('.view4').hide(); + saveCookie(); } + function changeCPUline(val) { cpuline = val; - if (val==30) $.removeCookie('cpuline'); else $.cookie('cpuline',val,{expires:3650}); + if (val==30) delete cookie.cpuline; else cookie.cpuline = val; + saveCookie(); cpuchart.updateOptions({xaxis:{range:cpuline-1}}); } + function changeNetline(val) { netline = val; - if (val==30) $.removeCookie('netline'); else $.cookie('netline',val,{expires:3650}); + if (val==30) delete cookie.netline; else cookie.netline = val; + saveCookie(); netchart.updateOptions({xaxis:{range:netline-1}}); } + function smartMenu(table) { $(table).find('[id^="smart-"]').each(function() { var opts = []; @@ -1037,6 +1070,7 @@ function smartMenu(table) { context.attach(id,opts); }); } + function portMenu() { var select = 'select[name="port_select"]'; var option = $(select+' option'); @@ -1044,11 +1078,14 @@ function portMenu() { if (option[i].value == port_select) {option[i].selected = true; break;} } } + function portSelect(name) { - $.cookie('port_select',name,{expires:3650}); + cookie.port_select = name; + saveCookie(); initCharts(true); port_select = name; } + function moreInfo(data,table) { var info = []; if (data[1]>0) info.push(data[1]+' '+(data[1]==1 ? "_(device warning)_" : "_(device warnings)_")); @@ -1057,6 +1094,7 @@ function moreInfo(data,table) { if (data[4]>0) info.push(data[4]+' '+(data[4]==1 ? "_(utilization warning)_" : "_(utilization warnings)_")); return info.length ? "