mirror of
https://github.com/unraid/webgui.git
synced 2026-02-18 06:58:47 -06:00
Updated: NVME power state / temp threshold
This commit is contained in:
@@ -68,7 +68,7 @@ $('#tab1').bind({click:function() {$('i.toggle').show('slow');}});
|
||||
</script>
|
||||
|
||||
<table class="disk_status wide">
|
||||
<thead><tr><td>_(Device)_</td><td>_(Identification)_</td><td>_(Temp)_.</td><td>_(Reads)_</td><td>_(Writes)_</td><td>_(Errors)_</td><td>_(FS)_</td><td>_(Size)_</td><td>_(Used)_</td><td>_(Free)_</td></tr></thead>
|
||||
<thead><tr><td>_(Device)_</td><td>_(Identification)_</td><td>_(Temp)_ / _(Power)_</td><td>_(Reads)_</td><td>_(Writes)_</td><td>_(Errors)_</td><td>_(FS)_</td><td>_(Size)_</td><td>_(Used)_</td><td>_(Free)_</td></tr></thead>
|
||||
<tbody id="array_devices">
|
||||
<?
|
||||
foreach ($disks as $disk):
|
||||
|
||||
@@ -21,7 +21,7 @@ $('#tab3').bind({click:function() {$('i.toggle').show('slow');}});
|
||||
</script>
|
||||
|
||||
<table class="disk_status wide">
|
||||
<thead><tr><td>_(Device)_</td><td>_(Identification)_</td><td>_(Temp)_.</td><td>_(Reads)_</td><td>_(Writes)_</td><td>_(Errors)_</td><td>_(FS)_</td><td>_(Size)_</td><td>_(Used)_</td><td>_(Free)_</td></tr></thead>
|
||||
<thead><tr><td>_(Device)_</td><td>_(Identification)_</td><td>_(Temp)_ / _(Power)_</td><td>_(Reads)_</td><td>_(Writes)_</td><td>_(Errors)_</td><td>_(FS)_</td><td>_(Size)_</td><td>_(Used)_</td><td>_(Free)_</td></tr></thead>
|
||||
<tbody id="boot_device">
|
||||
<?if (isset($disks['flash'])) echo "<tr><td colspan='11'> </td></tr>";?>
|
||||
</tbody>
|
||||
|
||||
@@ -137,7 +137,7 @@ $('#tab2').bind({click:function() {$('i.toggle').show('slow');}});
|
||||
<?if (isset($disks[$pool]['devices']) or _var($var,'fsState')=="Stopped"):?>
|
||||
<table class="disk_status wide<?=$i?' divider':''?>">
|
||||
<?if (!isSubpool($pool)):?>
|
||||
<thead><tr><td>_(Device)_</td><td>_(Identification)_</td><td>_(Temp)_.</td><td>_(Reads)_</td><td>_(Writes)_</td><td>_(Errors)_</td><td>_(FS)_</td><td>_(Size)_</td><td>_(Used)_</td><td>_(Free)_</td></tr></thead>
|
||||
<thead><tr><td>_(Device)_</td><td>_(Identification)_</td><td>_(Temp)_ / _(Power)_</td><td>_(Reads)_</td><td>_(Writes)_</td><td>_(Errors)_</td><td>_(FS)_</td><td>_(Size)_</td><td>_(Used)_</td><td>_(Free)_</td></tr></thead>
|
||||
<?endif;?>
|
||||
<tbody id="pool_device<?=$i++?>">
|
||||
<?foreach (cache_filter($disks) as $disk) if (prefix($disk['name'])==$pool) echo "<tr><td colspan='11'> </td></tr>"?>
|
||||
|
||||
@@ -25,7 +25,7 @@ $('<?=$tabX?>').bind({click:function() {$('i.toggle').show('slow');}});
|
||||
</script>
|
||||
|
||||
<table class="disk_status wide">
|
||||
<thead><tr><td>_(Device)_</td><td>_(Identification)_</td><td>_(Temp)_.</td><td>_(Reads)_</td><td>_(Writes)_</td><td>_(Errors)_</td><td>_(FS)_</td><td>_(Size)_</td><td>_(Used)_</td><td>_(Free)_</td></tr></thead>
|
||||
<thead><tr><td>_(Device)_</td><td>_(Identification)_</td><td>_(Temp)_ / _(Power)_</td><td>_(Reads)_</td><td>_(Writes)_</td><td>_(Errors)_</td><td>_(FS)_</td><td>_(Size)_</td><td>_(Used)_</td><td>_(Free)_</td></tr></thead>
|
||||
<tbody id="open_devices">
|
||||
<?
|
||||
foreach ($devs as $dev):
|
||||
|
||||
@@ -59,9 +59,9 @@ case "attributes":
|
||||
$events = explode('|',get_value($disk,'smEvents',$numbers));
|
||||
extract(parse_plugin_cfg('dynamix',true));
|
||||
$nvme = _var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['cctemp'] : -1;
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($nvme => 0 ? $nvme : (_var($display,'max',-1)>=0 ? $display['max'] : 0));
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($nvme>=0 ? $nvme : (_var($display,'max',-1)>=0 ? $display['max'] : 0));
|
||||
$nvme = _var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['wctemp'] : -1;
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($nvme => 0 ? $nvme : (_var($display,'hot',-1)>=0 ? $display['hot'] : 0));
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($nvme>=0 ? $nvme : (_var($display,'hot',-1)>=0 ? $display['hot'] : 0));
|
||||
$top = $_POST['top'] ?? 120;
|
||||
$empty = true;
|
||||
exec("smartctl -n standby -A $type ".escapeshellarg("/dev/$port"),$output);
|
||||
|
||||
@@ -114,31 +114,23 @@ function isSubpool($name) {
|
||||
return in_array($subpool,$subpools) ? $subpool : false;
|
||||
}
|
||||
function get_nvme_powerstate($device) {
|
||||
global $display;
|
||||
$nvme = [];
|
||||
$number = _var($display,'number','.,');
|
||||
exec("nvme id-ctrl /dev/$device | grep -E '^(ps|[wc]ctemp) '",$rows);
|
||||
$nvme = [];
|
||||
$state = hexdec(my_explode(':',exec("nvme get-feature /dev/$device -f 2"),3)[2]);
|
||||
exec("nvme id-ctrl /dev/$device | grep -E '^ps $state |[wc]ctemp '",$rows);
|
||||
foreach ($rows as $row) {
|
||||
if (!$row) continue;
|
||||
$value = my_explode(':',$row,3);
|
||||
$entry = str_replace(' ','',trim($value[0]));
|
||||
$entry = trim($value[0]);
|
||||
switch ($entry){
|
||||
case 'wctemp':
|
||||
case 'cctemp':
|
||||
$nvme[$entry] = $value[1] - 273; // kelvin -> celsius
|
||||
break;
|
||||
case 'ps0':
|
||||
case 'ps1':
|
||||
case 'ps2':
|
||||
case 'ps3':
|
||||
case 'ps4':
|
||||
case 'ps5':
|
||||
$nvme[$entry] = number_format(strtok($value[2],'W'),2,$number[0]).' W';
|
||||
default:
|
||||
$nvme['power'] = strtok($value[2],'W');
|
||||
break;
|
||||
}
|
||||
}
|
||||
$nvme['powerstate'] = hexdec(my_explode(':',exec("nvme get-feature /dev/$device -f 2"),3)[2]);
|
||||
$nvme['powerstatevalue'] = _var($nvme,'ps'.$nvme['powerstate']);
|
||||
return $nvme;
|
||||
}
|
||||
// convert strftime to date format
|
||||
|
||||
@@ -33,11 +33,16 @@ require_once "$docroot/webGui/include/Translations.php";
|
||||
$locale_init = $locale;
|
||||
|
||||
function initSum() {
|
||||
return ['count'=>0, 'temp'=>0, 'fsSize'=>0, 'fsUsed'=>0, 'fsFree'=>0, 'ioReads'=>0, 'ioWrites'=>0, 'numReads'=>0, 'numWrites'=>0, 'numErrors'=>0];
|
||||
return ['count'=>0, 'temp'=>0, 'power'=>0, 'fsSize'=>0, 'fsUsed'=>0, 'fsFree'=>0, 'ioReads'=>0, 'ioWrites'=>0, 'numReads'=>0, 'numWrites'=>0, 'numErrors'=>0];
|
||||
}
|
||||
function model($id) {
|
||||
return substr($id,0,strrpos($id,'_'));
|
||||
}
|
||||
function power($power) {
|
||||
global $display;
|
||||
$number = _var($display,'number','.,');
|
||||
return $power ? ' / '.number_format($power,2,$number[0]).' W' : '';
|
||||
}
|
||||
function device_info(&$disk,$online) {
|
||||
global $pools, $var, $crypto;
|
||||
if (!$online || _var($disk,'fsStatus')!='Mounted' || (in_array(_var($disk,'type'),['Parity','Cache']) && (!in_array(_var($disk,'name'),$pools) || isSubpool(_var($disk,'name'))))) {
|
||||
@@ -115,12 +120,7 @@ function device_desc(&$disk) {
|
||||
$log = _var($var,'fsState')=='Started'
|
||||
? "<a class='info hand' onclick=\"openTerminal('disklog','"._var($disk,'device')."','')\"><i class='icon-$type icon'></i><span>"._('Disk Log Information')."</span></a>"
|
||||
: "<a class='static'><i class='icon-$type icon'></i></a>";
|
||||
$powerstatevalue = "";
|
||||
if (_var($var,'fsState',)=='Started' && _var($disk,'transport')=='nvme') {
|
||||
$nvme = get_nvme_powerstate(_var($disk,'device'));
|
||||
$powerstatevalue = ' • '._var($nvme,'powerstatevalue','? W');
|
||||
}
|
||||
return $log."<span style='font-family:bitstream'>".my_id(_var($disk,'id'))."</span> - $size $unit ("._var($disk,'device').$powerstatevalue.")";
|
||||
return $log."<span style='font-family:bitstream'>".my_id(_var($disk,'id'))."</span> - $size $unit ("._var($disk,'device').")";
|
||||
}
|
||||
function assignment(&$disk) {
|
||||
global $var, $devs;
|
||||
@@ -180,6 +180,7 @@ function my_diskio($data) {
|
||||
}
|
||||
function array_offline(&$disk, $pool='') {
|
||||
global $var, $disks;
|
||||
$disk['power'] ??= (_var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['power'] : 0);
|
||||
$echo = []; $warning = '';
|
||||
$status = ['DISK_DSBL','DISK_INVALID','DISK_DSBL_NEW','DISK_NEW','DISK_WRONG'];
|
||||
$text = "<span class='red-text'><em>"._('All existing data on this device will be OVERWRITTEN when array is Started')."</em></span>";
|
||||
@@ -214,7 +215,7 @@ function array_offline(&$disk, $pool='') {
|
||||
case 'DISK_NEW':
|
||||
$echo[] = "<td>".device_info($disk,false)."</td>";
|
||||
$echo[] = "<td>".assignment($disk)."</td>";
|
||||
$echo[] = "<td>".my_temp(_var($disk,'temp','*'))."</td>";
|
||||
$echo[] = "<td>".my_temp(_var($disk,'temp','*')).power($disk['power'])."</td>";
|
||||
if ($warning) {
|
||||
$echo[] = "<td colspan='7'>$warning</td>";
|
||||
} else {
|
||||
@@ -241,6 +242,7 @@ function array_offline(&$disk, $pool='') {
|
||||
}
|
||||
function array_online(&$disk, $fstype='') {
|
||||
global $pools, $sum, $diskio;
|
||||
$disk['power'] ??= (_var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['power'] : 0);
|
||||
$echo = [];
|
||||
$data = [0,0];
|
||||
if (_var($disk,'device')) {
|
||||
@@ -253,6 +255,7 @@ function array_online(&$disk, $fstype='') {
|
||||
$sum['count']++;
|
||||
$sum['temp'] += $disk['temp'];
|
||||
}
|
||||
$sum['power'] += _var($disk,'power',0);
|
||||
$sum['numReads'] += _var($disk,'numReads',0);
|
||||
$sum['numWrites'] += _var($disk,'numWrites',0);
|
||||
$sum['numErrors'] += _var($disk,'numErrors',0);
|
||||
@@ -281,7 +284,7 @@ function array_online(&$disk, $fstype='') {
|
||||
default:
|
||||
$echo[] = "<td>".device_info($disk,true)."</td>";
|
||||
$echo[] = "<td>".device_desc($disk)."</td>";
|
||||
$echo[] = "<td>".my_temp(_var($disk,'temp','*'))."</td>";
|
||||
$echo[] = "<td>".my_temp(_var($disk,'temp','*')).power($disk['power'])."</td>";
|
||||
$echo[] = "<td><span class='diskio'>".my_diskio($data[0])."</span><span class='number'>".my_number(_var($disk,'numReads',0))."</span></td>";
|
||||
$echo[] = "<td><span class='diskio'>".my_diskio($data[1])."</span><span class='number'>".my_number(_var($disk,'numWrites',0))."</span></td>";
|
||||
$echo[] = "<td>".my_number(_var($disk,'numErrors',0))."</td>";
|
||||
@@ -293,6 +296,7 @@ function array_online(&$disk, $fstype='') {
|
||||
}
|
||||
function show_totals($text,$array,$name) {
|
||||
global $var, $display, $sum, $locale;
|
||||
$number = _var($display,'number','.,');
|
||||
$ctrl1 = "onclick=\"toggle_state('Device','$name','down')\"";
|
||||
$ctrl2 = "onclick=\"toggle_state('Device','$name','up')\"";
|
||||
$help1 = _('Spin Down').' '._(ucfirst(substr($name,0,-1)));
|
||||
@@ -301,7 +305,7 @@ function show_totals($text,$array,$name) {
|
||||
$echo[] = "<tr class='tr_last'>";
|
||||
$echo[] = "<td><a class='info'><i class='fa fa-fw fa-toggle-down control' $ctrl1></i><span>$help1</span></a><a class='info'><i class='fa fa-fw fa-toggle-up control' $ctrl2></i><span>$help2</span></a></td>";
|
||||
$echo[] = "<td><a class='static'><i class='icon-disks icon'></i></a><span></span>$text</td>";
|
||||
$echo[] = "<td>".($sum['count']>0 ? my_temp(round($sum['temp']/$sum['count'],1)) : '*')."</td>";
|
||||
$echo[] = "<td>".($sum['count']>0 ? my_temp(round($sum['temp']/$sum['count'],1)) : '*').power($sum['power'])."</td>";
|
||||
$echo[] = "<td><span class='diskio'>".my_diskio($sum['ioReads'])."</span><span class='number'>".my_number($sum['numReads'])."</span></td>";
|
||||
$echo[] = "<td><span class='diskio'>".my_diskio($sum['ioWrites'])."</span><span class='number'>".my_number($sum['numWrites'])."</span></td>";
|
||||
$echo[] = "<td>".my_number($sum['numErrors'])."</td>";
|
||||
|
||||
@@ -160,9 +160,9 @@ function device_temp(&$disk, &$red, &$orange) {
|
||||
$spin = strpos(_var($disk,'color'),'blink')===false;
|
||||
$temp = _var($disk,'temp','*');
|
||||
$nvme = _var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['cctemp'] : -1;
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($nvme => 0 ? $nvme : (_var($display,'max',-1)>=0 ? $display['max'] : 0));
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($nvme>=0 ? $nvme : (_var($display,'max',-1)>=0 ? $display['max'] : 0));
|
||||
$nvme = _var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['wctemp'] : -1;
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($nvme => 0 ? $nvme : (_var($display,'hot',-1)>=0 ? $display['hot'] : 0));
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($nvme>=0 ? $nvme : (_var($display,'hot',-1)>=0 ? $display['hot'] : 0));
|
||||
$top = $display['top'] ?? 120;
|
||||
$heat = false; $color = 'green';
|
||||
if (exceed($temp,$max,$top)) {
|
||||
|
||||
@@ -48,9 +48,9 @@ function check_temp(&$disk,$text,$info) {
|
||||
$named = no_tilde($name);
|
||||
$temp = _var($disk,'temp','*');
|
||||
$nvme = _var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['cctemp'] : -1;
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($nvme => 0 ? $nvme : (_var($display,'max',-1)>=0 ? $display['max'] : 0));
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($nvme>=0 ? $nvme : (_var($display,'max',-1)>=0 ? $display['max'] : 0));
|
||||
$nvme = _var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['wctemp'] : -1;
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($nvme => 0 ? $nvme : (_var($display,'hot',-1)>=0 ? $display['hot'] : 0));
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($nvme>=0 ? $nvme : (_var($display,'hot',-1)>=0 ? $display['hot'] : 0));
|
||||
$warn = exceed($temp,$max,$top) ? 'alert' : (exceed($temp,$hot,$top) ? 'warning' : false);
|
||||
$item = 'temp';
|
||||
$last = $saved[$item][$named] ?? 0;
|
||||
|
||||
@@ -95,9 +95,9 @@ function my_array(&$disk) {
|
||||
global $data,$display,$error0,$error1,$error2,$error3;
|
||||
$name = _var($disk,'name');
|
||||
$nvme = _var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['cctemp'] : -1;
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($nvme => 0 ? $nvme : (_var($display,'max',-1)>=0 ? $display['max'] : 0));
|
||||
$max = _var($disk,'maxTemp',-1)>=0 ? $disk['maxTemp'] : ($nvme>=0 ? $nvme : (_var($display,'max',-1)>=0 ? $display['max'] : 0));
|
||||
$nvme = _var($disk,'transport')=='nvme' ? get_nvme_powerstate(_var($disk,'device'))['wctemp'] : -1;
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($nvme => 0 ? $nvme : (_var($display,'hot',-1)>=0 ? $display['hot'] : 0));
|
||||
$hot = _var($disk,'hotTemp',-1)>=0 ? $disk['hotTemp'] : ($nvme>=0 ? $nvme : (_var($display,'hot',-1)>=0 ? $display['hot'] : 0));
|
||||
if (strpos(_var($disk,'status'),'_NP')!==false) return false;
|
||||
$temp = _var($disk,'temp');
|
||||
if ($max>0 && $temp>=$max) {
|
||||
|
||||
Reference in New Issue
Block a user