mirror of
https://github.com/unraid/webgui.git
synced 2026-05-04 08:49:47 -05:00
More enhancements and fixes based on feedback
- Disk settings: Separate SSD temperature thresholds - Dashboard: more descriptive system resources + tooltip - Wrappers: fix NVME power value retrieval
This commit is contained in:
@@ -263,13 +263,20 @@ foreach ($cpus as $pair) {
|
||||
<span id="head_ram">_(RAM)_:<span class="head_bar"><span class='_sys0_ load'>0%</span><div class='usage-disk sys'><span id='_sys0_'></span><span></span></div></span></span><br></div>
|
||||
<a href='/Dashboard/Tools/Processes' title="_(View Running Processes)_"><i class='fa fa-fw fa-info-circle control'></i></a>
|
||||
</td></tr>
|
||||
<tr><td><span class='w36'><i class='ups fa fa-compress'></i>_(Usable size)_: <?=my_scale($total,$unit,1,null,1024)." $unit"?></span><i class='ups fa fa-expand'></i>_(Maximum size)_: <?="$memory_maximum $unit"?><?=$low?'*':''?></td></tr>
|
||||
<tr><td>
|
||||
<span class='w26'><?if($zfs):?><div class='zfs'><i class='ups fa fa-fw fa-shield'></i>_(ZFS)_: <span id='zfs'></span></div><?else:?> <?endif;?></span>
|
||||
<span class='w18 center'><span class='center'>_(RAM)_</span><div class='pie' id='sys0'><span class='sys0'></span><span class='var0'></span></div></span>
|
||||
<span class='w18 center'><span class='center'>_(Flash)_</span><div class='pie' id='sys1'><span class='sys1'></span><span class='var1'></span></div></span>
|
||||
<span class='w18 center'><span class='center'>_(Log)_</span><div class='pie' id='sys2'><span class='sys2'></span><span class='var2'></span></div></span>
|
||||
<span class='w18 center'><span class='center'>_(Docker)_</span><div class='pie' id='sys3'><span class='sys3'></span><span class='var3'></span></div></span>
|
||||
<span class='w26'><div class='more'>
|
||||
<i class='ups fa fa-compress'></i>_(Usable size)_: <?=my_scale($total,$unit,1,null,1024)." $unit"?><br>
|
||||
<i class='ups fa fa-expand'></i>_(Maximum size)_: <?="$memory_maximum $unit"?><?=$low?'*':''?><br><br>
|
||||
<i class='ups fa fa-circle used'></i>_(Services)_: <span id='used'></span><br>
|
||||
<?if($zfs):?>
|
||||
<i class='ups fa fa-circle zfs'></i>_(ZFS cache)_: <span id='zfs'></span><br>
|
||||
<?endif;?>
|
||||
<i class='ups fa fa-circle free'></i>_(Free)_: <span id='free'></span><br>
|
||||
</div></span>
|
||||
<span class='w18 center'><span class='center'><a class='info hand none'>_(RAM)_<br>_(usage)_<span>_(Percentage of total used memory)_</span></a></span><div class='pie' id='sys0'><span class='sys0'></span><span class='var0'></span></div></span>
|
||||
<span class='w18 center'><span class='center'><a class='info hand none'>_(Flash)_<br>_(device)_<span>_(Percentage usage of flash device)_</span></a></span><div class='pie' id='sys1'><span class='sys1'></span><span class='var1'></span></div></span>
|
||||
<span class='w18 center'><span class='center'><a class='info hand none'>_(Log)_<br>_(filesystem)_<span>_(Percentage usage of LOG file system)_</span></a></span><div class='pie' id='sys2'><span class='sys2'></span><span class='var2'></span></div></span>
|
||||
<span class='w18 center'><span class='center'><a class='info hand none'>_(Docker)_<br>_(vDisk)_<span>_(Percentage usage of Docker image)_</span></a></span><div class='pie' id='sys3'><span class='sys3'></span><span class='var3'></span></div></span>
|
||||
</td></tr>
|
||||
</tbody>
|
||||
|
||||
@@ -1484,8 +1491,10 @@ dashboard.on('message',function(msg,meta) {
|
||||
var load = v[0].slice(0,-1);
|
||||
$('.sys'+k).text(v[0]).css({color:fontColor(load,<?=$display['critical']?>,<?=$display['warning']?>)});
|
||||
if (k == 0) {
|
||||
$('#used').text(v[4]);
|
||||
$('#free').text(v[5]);
|
||||
<?if ($zfs):?>
|
||||
$('#zfs').text(v[4]+' ('+v[3]+')');
|
||||
$('#zfs').text(v[6]);
|
||||
<?endif;?>
|
||||
var color = setColor(load,<?=$display['critical']?>,<?=$display['warning']?>);
|
||||
$('._sys0_').text(v[0]);
|
||||
|
||||
@@ -96,7 +96,7 @@ function makeTemp(&$disk, $zone) {
|
||||
case 'hot': $nvme = 'wctemp'; break;
|
||||
case 'max': $nvme = 'cctemp'; break;
|
||||
}
|
||||
return _var($disk,'transport')=='nvme' ? get_nvme_info(_var($disk,'device'),$nvme) : (_var($disk,'rotational',1)==0 && $display[$zone]>0 ? $display[$zone]+$display['ssd'] : $display[$zone]);
|
||||
return _var($disk,'transport')=='nvme' ? get_nvme_info(_var($disk,'device'),$nvme) : (_var($disk,'rotational',1)==0 && $display["{$zone}ssd"]>=0 ? $display["{$zone}ssd"] : $display[$zone]);
|
||||
}
|
||||
function maintenance_mode() {
|
||||
global $var;
|
||||
@@ -1186,12 +1186,24 @@ _(xfs_repair status)_:
|
||||
<input type="hidden" name="#cleanup" value="true">
|
||||
<input type="hidden" name="smEvents" value="">
|
||||
<input type="hidden" name="smGlue" value="<?=_var($var,'smGlue')?>">
|
||||
<?if (_var($disk,'rotational',1)==1):?>
|
||||
_(Warning disk temperature threshold)_ (°<?=_var($display,'unit','C')?>):
|
||||
<?elseif (_var($disk,'transport')=='nvme'):?>
|
||||
_(Warning NVME temperature threshold)_ (°<?=_var($display,'unit','C')?>):
|
||||
<?else:?>
|
||||
_(Warning SSD temperature threshold)_ (°<?=_var($display,'unit','C')?>):
|
||||
<?endif;?>
|
||||
: <input type="number" min="0" max="300" name="hotTemp" class="narrow" value="<?=displayTemp(_var($disk,'hotTemp'))?>" placeholder="<?=displayTemp(makeTemp($disk,'hot'))?>">
|
||||
|
||||
:info_warning_temp_help:
|
||||
|
||||
<?if (_var($disk,'rotational',1)==1):?>
|
||||
_(Critical disk temperature threshold)_ (°<?=_var($display,'unit','C')?>):
|
||||
<?elseif (_var($disk,'transport')=='nvme'):?>
|
||||
_(Critical NVME temperature threshold)_ (°<?=_var($display,'unit','C')?>):
|
||||
<?else:?>
|
||||
_(Critical SSD temperature threshold)_ (°<?=_var($display,'unit','C')?>):
|
||||
<?endif;?>
|
||||
: <input type="number" min="0" max="300" name="maxTemp" class="narrow" value="<?=displayTemp(_var($disk,'maxTemp'))?>" placeholder="<?=displayTemp(makeTemp($disk,'max'))?>">
|
||||
|
||||
:info_critical_temp_help:
|
||||
|
||||
@@ -244,10 +244,15 @@ _(Default critical disk temperature threshold)_ (°<?=_var($display,'unit','C
|
||||
|
||||
:disk_default_critical_temperature_help:
|
||||
|
||||
_(Default SSD offset temperature)_ (°<?=_var($display,'unit','C')?>):
|
||||
: <input type="number" min="0" max="300" name="display_ssd" class="narrow" value="<?=displayTemp($display['ssd'])?>" placeholder="<?=displayTemp($default['display']['ssd'])?>">
|
||||
_(Default warning SSD temperature threshold)_ (°<?=_var($display,'unit','C')?>):
|
||||
: <input type="number" min="0" max="300" name="display_hotssd" class="narrow" value="<?=displayTemp($display['hotssd'])?>" placeholder="<?=displayTemp($default['display']['hotssd'])?>">
|
||||
|
||||
:ssd_default_disk_offset_temperature_help:
|
||||
:ssd_default_warning_temperature_help:
|
||||
|
||||
_(Default critical SSD temperature threshold)_ (°<?=_var($display,'unit','C')?>):
|
||||
: <input type="number" min="0" max="300" name="display_maxssd" class="narrow" value="<?=displayTemp($display['maxssd'])?>" placeholder="<?=displayTemp($default['display']['maxssd'])?>">
|
||||
|
||||
:ssd_default_critical_temperature_help:
|
||||
|
||||
|
||||
: <input type="submit" name="changeDisk" value="_(Apply)_" disabled><input type="button" value="_(Done)_" onclick="done()">
|
||||
|
||||
@@ -24,7 +24,8 @@ warning="70"
|
||||
critical="90"
|
||||
hot="45"
|
||||
max="55"
|
||||
ssd="15"
|
||||
hotssd="60"
|
||||
maxssd="70"
|
||||
theme="white"
|
||||
locale=""
|
||||
raw=""
|
||||
|
||||
@@ -59,8 +59,8 @@ case "attributes":
|
||||
$events = explode('|',get_value($disk,'smEvents',$numbers));
|
||||
extract(parse_plugin_cfg('dynamix',true));
|
||||
[$hotNVME,$maxNVME] = _var($disk,'transport')=='nvme' ? get_nvme_info(_var($disk,'device'),'temp') : [-1,-1];
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($hotNVME>=0 ? $hotNVME : (_var($disk,'rotational',1)==0 && $display['hot']>0 ? $display['hot']+$display['ssd'] : $display['hot']));
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($maxNVME>=0 ? $maxNVME : (_var($disk,'rotational',1)==0 && $display['max']>0 ? $display['max']+$display['ssd'] : $display['max']));
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($hotNVME>=0 ? $hotNVME : (_var($disk,'rotational',1)==0 && $display['hotssd']>=0 ? $display['hotssd'] : $display['hot']));
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($maxNVME>=0 ? $maxNVME : (_var($disk,'rotational',1)==0 && $display['maxssd']>=0 ? $display['maxssd'] : $display['max']));
|
||||
$top = $_POST['top'] ?? 120;
|
||||
$empty = true;
|
||||
exec("smartctl -n standby -A $type ".escapeshellarg("/dev/$port"),$output);
|
||||
|
||||
@@ -133,10 +133,10 @@ function get_nvme_info($device, $info) {
|
||||
case 'wctemp':
|
||||
return exec("nvme id-ctrl /dev/$device 2>/dev/null | grep -Pom1 '^wctemp +: \K\d+'")-273;
|
||||
case 'state':
|
||||
$state = hexdec(exec("nvme get-feature /dev/$device -f2 2>/dev/null | grep -Pom1 'value:\K\S+'"));
|
||||
$state = exec("nvme get-feature /dev/$device -f2 2>/dev/null | grep -Pom1 'value:.+\K.$'");
|
||||
return exec("nvme id-ctrl /dev/$device 2>/dev/null | grep -Pom1 '^ps +$state : mp:\K\S+ \S+'");
|
||||
case 'power':
|
||||
$state = hexdec(exec("nvme get-feature /dev/$device -f2 2>/dev/null | grep -Pom1 'value:\K\S+'"));
|
||||
$state = exec("nvme get-feature /dev/$device -f2 2>/dev/null | grep -Pom1 'value:.+\K.$'");
|
||||
return exec("smartctl -c /dev/$device 2>/dev/null | grep -Pom1 '^ *$state [+-] +\K[^W]+'");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,10 +31,12 @@ while (true) {
|
||||
exec("sensors -uA 2>/dev/null|grep -Po 'fan\d_input: \K\d+'",$fans);
|
||||
$zfs = exec("awk '/^size/{print \$3;exit}' /proc/spl/kstat/zfs/arcstats 2>/dev/null")?:0;
|
||||
[$total,$free] = $memory;
|
||||
$meminfo[] = max(round(100*(1-$free/$total)),0)."%";
|
||||
$meminfo[] = round(100*(1-$free/$total))."%";
|
||||
$meminfo[] = my_scale($total-$free,$unit,null,-1,1024)." $unit";
|
||||
$meminfo[] = max(round(100*($total-$free-$zfs)/$total),0)."%";
|
||||
$meminfo[] = min(round(100*$zfs/$total),100)."%";
|
||||
$meminfo[] = round(100*($total-$free-$zfs)/$total)."%";
|
||||
$meminfo[] = round(100*$zfs/$total)."%";
|
||||
$meminfo[] = my_scale($total-$free-$zfs,$unit,null,-1,1024)." $unit";
|
||||
$meminfo[] = my_scale($free,$unit,null,-1,1024)." $unit";
|
||||
$meminfo[] = my_scale($zfs,$unit,null,-1,1024)." $unit\0";
|
||||
foreach ($df as $data) {
|
||||
[$pcent,$used] = explode(' ',$data);
|
||||
|
||||
@@ -166,8 +166,8 @@ function device_temp(&$disk, &$red, &$orange) {
|
||||
$dev = _var($disk,'device');
|
||||
$nvme = _var($disk,'transport')=='nvme';
|
||||
[$hotNVME,$maxNVME] = $nvme ? get_nvme_info($dev,'temp') : [-1,-1];
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($hotNVME>=0 ? $hotNVME : (_var($disk,'rotational',1)==0 && $display['hot']>0 ? $display['hot']+$display['ssd'] : $display['hot']));
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($maxNVME>=0 ? $maxNVME : (_var($disk,'rotational',1)==0 && $display['max']>0 ? $display['max']+$display['ssd'] : $display['max']));
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($hotNVME>=0 ? $hotNVME : (_var($disk,'rotational',1)==0 && $display['hotssd']>=0 ? $display['hotssd'] : $display['hot']));
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($maxNVME>=0 ? $maxNVME : (_var($disk,'rotational',1)==0 && $display['maxssd']>=0 ? $display['maxssd'] : $display['max']));
|
||||
$top = $display['top'] ?? 120;
|
||||
$color= 'green';
|
||||
if (exceed($temp,$max,$top)) {
|
||||
|
||||
@@ -48,8 +48,8 @@ function check_temp(&$disk,$text,$info) {
|
||||
$named = no_tilde($name);
|
||||
$temp = _var($disk,'temp','*');
|
||||
[$hotNVME,$maxNVME] = _var($disk,'transport')=='nvme' ? get_nvme_info(_var($disk,'device'),'temp') : [-1,-1];
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($hotNVME>=0 ? $hotNVME : (_var($disk,'rotational',1)==0 && $display['hot']>0 ? $display['hot']+$display['ssd'] : $display['hot']));
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($maxNVME>=0 ? $maxNVME : (_var($disk,'rotational',1)==0 && $display['max']>0 ? $display['max']+$display['ssd'] : $display['max']));
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($hotNVME>=0 ? $hotNVME : (_var($disk,'rotational',1)==0 && $display['hotssd']>=0 ? $display['hotssd'] : $display['hot']));
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($maxNVME>=0 ? $maxNVME : (_var($disk,'rotational',1)==0 && $display['maxssd']>=0 ? $display['maxssd'] : $display['max']));
|
||||
$warn = exceed($temp,$max,$top) ? 'alert' : (exceed($temp,$hot,$top) ? 'warning' : false);
|
||||
$item = 'temp';
|
||||
$last = $saved[$item][$named] ?? 0;
|
||||
|
||||
@@ -95,8 +95,8 @@ function my_array(&$disk) {
|
||||
global $data,$display,$error0,$error1,$error2,$error3;
|
||||
$name = _var($disk,'name');
|
||||
[$hotNVME,$maxNVME] = _var($disk,'transport')=='nvme' ? get_nvme_info(_var($disk,'device'),'temp') : [-1,-1];
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($hotNVME>=0 ? $hotNVME : (_var($disk,'rotational',1)==0 && $display['hot']>0 ? $display['hot']+$display['ssd'] : $display['hot']));
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($maxNVME>=0 ? $maxNVME : (_var($disk,'rotational',1)==0 && $display['max']>0 ? $display['max']+$display['ssd'] : $display['max']));
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($hotNVME>=0 ? $hotNVME : (_var($disk,'rotational',1)==0 && $display['hotssd']>=0 ? $display['hotssd'] : $display['hot']));
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($maxNVME>=0 ? $maxNVME : (_var($disk,'rotational',1)==0 && $display['maxssd']>=0 ? $display['maxssd'] : $display['max']));
|
||||
if (strpos(_var($disk,'status'),'_NP')!==false) return false;
|
||||
$temp = _var($disk,'temp');
|
||||
if ($max>0 && $temp>=$max) {
|
||||
|
||||
@@ -1,2 +1,4 @@
|
||||
div.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(580px,1fr));column-gap:20px}
|
||||
div.pie::after{background-color:#d7dbdd}
|
||||
i.free{color:#eceaec}
|
||||
i.used{color:#606e7f}
|
||||
|
||||
@@ -1,2 +1,4 @@
|
||||
div.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(610px,1fr));column-gap:20px}
|
||||
div.pie::after{background-color:#262626}
|
||||
i.free{color:#444444}
|
||||
i.used{color:#787878}
|
||||
|
||||
@@ -1,2 +1,4 @@
|
||||
div.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(580px,1fr));column-gap:20px}
|
||||
div.pie::after{background-color:#212f3d}
|
||||
i.free{color:#232523}
|
||||
i.used{color:#606e7f}
|
||||
|
||||
@@ -1,2 +1,4 @@
|
||||
div.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(610px,1fr));column-gap:20px}
|
||||
div.pie::after{background-color:#f7f9f9}
|
||||
i.free{color:#dcdcdc}
|
||||
i.used{color:#a8a8a8}
|
||||
|
||||
@@ -35,6 +35,7 @@ span.w26{min-width:26%;max-width:26%;display:inline-block;float:left;overflow:hi
|
||||
span.w36{min-width:36%;max-width:36%;display:inline-block;float:left;overflow:hidden;text-overflow:ellipsis}
|
||||
span.w44{min-width:44%;max-width:44%;display:inline-block;float:left;overflow:hidden;text-overflow:ellipsis}
|
||||
span.w72{min-width:72%;max-width:72%;display:inline-block;float:left;overflow:hidden;text-overflow:ellipsis}
|
||||
span.w18:hover{overflow:visible}
|
||||
span.center{display:block;width:96px;text-align:center;margin:4px 0 8px 0}
|
||||
select#cpuline,select#netline{border:none;padding:0 12px 0 0}
|
||||
select[name=enter_share],select[name=enter_user]{margin-top:0;float:none}
|
||||
@@ -70,5 +71,6 @@ table.snapshot{margin-top:0}
|
||||
div.pie{height:96px;width:96px;border-radius:50%;display:flex;justify-content:center;align-items:center}
|
||||
div.pie::after{content:'';position:absolute;height:72px;width:72px;border-radius:50%}
|
||||
div.pie span{z-index:2;font-size:1.6rem;font-weight:bold}
|
||||
div.zfs{margin-top:74px;color:#d4ac0d;text-align:right;padding-right:30px}
|
||||
div.more{margin-top:8px}
|
||||
i.zfs{color:#d4ac0d}
|
||||
.var0,.var1,.var2,.var3{display:none;font-size:1.3rem!important}
|
||||
|
||||
Reference in New Issue
Block a user