Updated: NVME power state / temp threshold

This commit is contained in:
bergware
2023-11-30 21:29:45 +01:00
parent cf580c9522
commit 04cc604bd5
10 changed files with 32 additions and 36 deletions

View File

@@ -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):

View File

@@ -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'>&nbsp;</td></tr>";?>
</tbody>

View File

@@ -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'>&nbsp;</td></tr>"?>

View File

@@ -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):

View File

@@ -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);

View File

@@ -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

View File

@@ -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 = ' &bullet; '._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>";

View File

@@ -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)) {

View File

@@ -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;

View File

@@ -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) {