diff --git a/emhttp/plugins/dynamix/DashStats.page b/emhttp/plugins/dynamix/DashStats.page index 10c6bf7287..d5b9932303 100644 --- a/emhttp/plugins/dynamix/DashStats.page +++ b/emhttp/plugins/dynamix/DashStats.page @@ -81,8 +81,11 @@ foreach ($disks as $disk) { case 'Cache': $name = _var($disk,'name'); if (in_array($name,$pools)) { - $cache_size[$name] = _var($disk,'fsSize',0); - $cache_used[$name] = _var($disk,'fsSize',0)-_var($disk,'fsFree',0); + $cache_fstype = str_replace('luks:','',_var($disk,'fsType','')); + $cache_size[$name] = ($cache_fstype=='btrfs' && is_numeric(_var($disk,'fsFree',null)) && is_numeric(_var($disk,'fsUsed',null))) + ? _var($disk,'fsFree',0)+_var($disk,'fsUsed',0) + : _var($disk,'fsSize',0); + $cache_used[$name] = _var($disk,'fsUsed',_var($disk,'fsSize',0)-_var($disk,'fsFree',0)); $cache_type[$name] = _var($disk,'rotational') ? (_var($disk,'luksState') ? 'disk-encrypted' : 'disk') : 'nvme'; $cache_rate[$name] = number_format(100*$cache_used[$name]/($cache_size[$name] ?: 1),1,$dot,''); if (empty($disks[$name]['devices'])) unset($pools[array_search($name,$pools)]); @@ -1188,11 +1191,11 @@ switch ($themeHelper->getThemeName()) { // $themeHelper set in DefaultPageLayout

- +
@@ -2654,6 +2657,7 @@ dashboard.on('message',function(msg,meta) { $('#pool_info'+i).parent().css({'display':info?'':'none'}); $('#pool_info'+i).html(info); $('#pool_status_'+i).html(get.pool[i][5] || ""); + if (get.pool[i][6] !== undefined) $('#pool_usage'+i).html(get.pool[i][6]); smartMenu('#pool_list'+i); } } diff --git a/emhttp/plugins/dynamix/nchan/device_list b/emhttp/plugins/dynamix/nchan/device_list index 8108a6c711..6dbb43b363 100755 --- a/emhttp/plugins/dynamix/nchan/device_list +++ b/emhttp/plugins/dynamix/nchan/device_list @@ -243,10 +243,18 @@ function get_pool_boot_metrics(?array $bootDisk): array { if (empty($bootDisk)) return []; $size = _var($bootDisk,'fsSize',null); + $rawSize = $size; $used = _var($bootDisk,'fsUsed',null); $free = _var($bootDisk,'fsFree',null); + $fsDisk = [ + 'fsSize' => $size ?? 0, + 'fsUsed' => $used ?? 0, + 'fsFree' => $free ?? 0, + 'fsType' => _var($bootDisk,'fsType',''), + ]; + $size = effective_fs_size($fsDisk); - if ($size !== null || $used !== null || $free !== null) { + if ($rawSize !== null || $used !== null || $free !== null) { return [ 'fsSize' => $size ?? 0, 'fsUsed' => $used ?? 0, @@ -263,9 +271,17 @@ function get_boot_pool_metrics(array $bootDisks, string $bootPoolName, ?array $f foreach ($bootDisks as $disk) { if (prefix(_var($disk,'name','')) !== $bootPoolName) continue; $size = _var($disk,'fsSize',null); + $rawSize = $size; $used = _var($disk,'fsUsed',null); $free = _var($disk,'fsFree',null); - if ($size !== null || $used !== null || $free !== null) { + $fsDisk = [ + 'fsSize' => $size ?? 0, + 'fsUsed' => $used ?? 0, + 'fsFree' => $free ?? 0, + 'fsType' => _var($disk,'fsType',''), + ]; + $size = effective_fs_size($fsDisk); + if ($rawSize !== null || $used !== null || $free !== null) { return [ 'fsSize' => $size ?? 0, 'fsUsed' => $used ?? 0, @@ -295,7 +311,7 @@ function get_pool_data_metrics(?array $poolDisk, string $poolName='', array $dis if (!empty($firstPoolDisk)) $metricsDisk = $firstPoolDisk; } if (empty($metricsDisk)) return []; - $size = _var($metricsDisk,'fsSize',0); + $size = effective_fs_size($metricsDisk); $used = _var($metricsDisk,'fsUsed',0); $free = _var($metricsDisk,'fsFree',0); @@ -657,24 +673,33 @@ function vfs_type(&$disk,$online = false) { return $luks.str_replace('luks:','',$fsType); } +function effective_fs_size(&$disk) { + $size = _var($disk,'fsSize',0); + $used = _var($disk,'fsUsed',null); + $free = _var($disk,'fsFree',null); + $fsType = str_replace('luks:','',_var($disk,'fsType','')); + return ($fsType=='btrfs' && is_numeric($used) && is_numeric($free)) ? $used+$free : $size; +} + function fs_info(&$disk,$online = false) { global $display; $echo = []; if (empty(_var($disk,'fsStatus',''))) return ""; if (_var($disk,'fsStatus')=='Mounted') { + $fsSize = effective_fs_size($disk); $echo[] = "".vfs_type($disk,$online).""; - $echo[] = "".my_scale(_var($disk,'fsSize',0)*1024,$unit,-1)." $unit"; + $echo[] = "".my_scale($fsSize*1024,$unit,-1)." $unit"; if ($display['text']%10==0) { $echo[] = "".my_scale(_var($disk,'fsUsed',0)*1024,$unit)." $unit"; } else { - $used = _var($disk,'fsSize',0)>0 ? 100-round(100*_var($disk,'fsFree',0)/$disk['fsSize']) : 0; + $used = $fsSize>0 ? max(0,min(100,100*(1-_var($disk,'fsFree',0)/$fsSize))) : 0; $echo[] = "
".my_scale(_var($disk,'fsUsed',0)*1024,$unit)." $unit
"; } if (_var($display,'text',0)<10 ? _var($display,'text',0)%10==0 : _var($display,'text',0)%10!=0) { $echo[] = "".my_scale(_var($disk,'fsFree',0)*1024,$unit)." $unit"; } else { - $free = _var($disk,'fsSize',0)>0 ? round(100*_var($disk,'fsFree',0)/$disk['fsSize']) : 0; + $free = $fsSize>0 ? max(0,min(100,100*_var($disk,'fsFree',0)/$fsSize)) : 0; $echo[] = "
".my_scale(_var($disk,'fsFree',0)*1024,$unit)." $unit
"; } } else { @@ -803,7 +828,7 @@ function array_online(&$disk, $fstype='', $poolName='', $poolstatusData=[], $opt $sum['numWrites'] += _var($disk,'numWrites',0); $sum['numErrors'] += _var($disk,'numErrors',0); if (isset($disk['fsFree'])) { - $sum['fsSize'] += _var($disk,'fsSize',0); + $sum['fsSize'] += effective_fs_size($disk); $sum['fsUsed'] += _var($disk,'fsUsed',0); $sum['fsFree'] += _var($disk,'fsFree',0); } @@ -812,9 +837,6 @@ function array_online(&$disk, $fstype='', $poolName='', $poolstatusData=[], $opt case 'DISK_NP': if (in_array(_var($disk,'name'),$pools) || $fstype=='zfs') { $echo[] = "".device_info($disk,true,$poolName,$poolstatusData,$options).""; - $echo[] = "".device_info($disk,true,$poolName,$poolstatusData,$options).""; - $echo[] = "".device_info($disk,true,$poolName,$poolstatusData,$options).""; - $echo[] = "".device_info($disk,true,$poolName,$poolstatusData,$options).""; $echo[] = "".($fstype=='zfs' ? _('Not present') : _('Not installed')).""; $echo[] = ""; $echo[] = $showFsInfo ? fs_info($disk,true) : ""; @@ -880,13 +902,13 @@ function show_totals($text,$array,$name) { if ($display['text']%10==0) { $echo[] = "".my_scale($sum['fsUsed']*1024,$unit)." $unit"; } else { - $used = $sum['fsSize'] ? 100-round(100*$sum['fsFree']/$sum['fsSize']) : 0; + $used = $sum['fsSize'] ? max(0,min(100,100*(1-$sum['fsFree']/$sum['fsSize']))) : 0; $echo[] = "
".my_scale($sum['fsUsed']*1024,$unit)." $unit
"; } if ($display['text']<10 ? $display['text']%10==0 : $display['text']%10!=0) { $echo[] = "".my_scale($sum['fsFree']*1024,$unit)." $unit"; } else { - $free = $sum['fsSize'] ? round(100*$sum['fsFree']/$sum['fsSize']) : 0; + $free = $sum['fsSize'] ? max(0,min(100,100*$sum['fsFree']/$sum['fsSize'])) : 0; $echo[] = "
".my_scale($sum['fsFree']*1024,$unit)." $unit
"; } } else { diff --git a/emhttp/plugins/dynamix/nchan/update_2 b/emhttp/plugins/dynamix/nchan/update_2 index 0972e05f16..0e4069fdae 100755 --- a/emhttp/plugins/dynamix/nchan/update_2 +++ b/emhttp/plugins/dynamix/nchan/update_2 @@ -242,9 +242,40 @@ function device_smart(&$disk, &$fail, &$smart) { } function device_usage(&$disk, &$full, &$high) { - global $display; + global $display,$disks; $text = $display['text']; - $used = (_var($disk,'type')!='Parity' && _var($disk,'type')!='Extra' && _var($disk,'fsStatus')=='Mounted') ? (_var($disk,'fsSize',0)>0 ? round((1-_var($disk,'fsFree',0)/$disk['fsSize'])*100) : 0).'%' : false; + $type = _var($disk,'type'); + $status = _var($disk,'fsStatus'); + $size = _var($disk,'fsSize',0); + $free = _var($disk,'fsFree',null); + $used_kib = null; + $fs_type = ''; + + if ($type=='Cache') { + $name = _var($disk,'name'); + $pool = prefix($name); + if ($name!=$pool) return $text%10==0 ? "-" : "-
"; + $root = _var($disks,$pool,[]); + if (!empty($root)) { + $status = _var($root,'fsStatus',$status); + $size = _var($root,'fsSize',$size); + $free = _var($root,'fsFree',$free); + $used_kib = _var($root,'fsUsed',null); + $fs_type = str_replace('luks:','',_var($root,'fsType','')); + if ($fs_type=='btrfs' && is_numeric($free) && is_numeric($used_kib)) $size = $free+$used_kib; + } + } + + if ($type!='Parity' && $type!='Extra' && $status=='Mounted') { + if ($type=='Cache' && is_numeric($used_kib) && $size>0) { + $pct = round(100*$used_kib/$size); + } else { + $pct = $size>0 && is_numeric($free) ? round((1-$free/$size)*100) : 0; + } + $used = $pct.'%'; + } else { + $used = false; + } if ($used) { if ($text==2 || $text==21) { $load = substr($used,0,-1); @@ -339,6 +370,20 @@ function print_error($error) { return sprintf(_('Finding **%s** error'.($error==1?'':'s')),$error?:'0'); } +function pool_usage($pool) { + global $disks,$display; + $disk = _var($disks,$pool,[]); + if (_var($disk,'fsStatus')!='Mounted') return ''; + $size = _var($disk,'fsSize',0); + $free = _var($disk,'fsFree',0); + $used = _var($disk,'fsUsed',$size-$free); + $fs_type = str_replace('luks:','',_var($disk,'fsType','')); + if ($fs_type=='btrfs' && is_numeric($free) && is_numeric($used)) $size = $free+$used; + $dot = _var($display,'number','.,')[0]; + $rate = number_format(100*$used/($size ?: 1),1,$dot,''); + return sprintf(_('Used: %s of %s (%s %%)'),my_scale($used*1024,$unit)." $unit",my_scale($size*1024,$unit,-1,-1)." $unit",$rate); +} + $pool_check_counter = 0; $poolstatus = []; @@ -390,10 +435,10 @@ while (true) { $statusText = " ".$statusText.""; } $poolType = _var($disks[$pool],'type') == 'Boot' ? 'Boot' : 'Cache'; - $echo['pool'][$p++] = [array_group($poolType,$pool), $error+$warning, $red+$orange, $fail+$smart, $full+$high,$statusText]; + $echo['pool'][$p++] = [array_group($poolType,$pool), $error+$warning, $red+$orange, $fail+$smart, $full+$high,$statusText,pool_usage($pool)]; } else { $poolType = _var($disks[$pool],'type') == 'Boot' ? 'Boot' : 'Cache'; - $echo['pool'][$p++] = [array_group($poolType,$pool), $error+$warning, $red+$orange, $fail+$smart, $full+$high,""]; + $echo['pool'][$p++] = [array_group($poolType,$pool), $error+$warning, $red+$orange, $fail+$smart, $full+$high,"",pool_usage($pool)]; } } //unassigned devices