mirror of
https://github.com/unraid/webgui.git
synced 2026-04-22 18:19:14 -05:00
merge ronalds changes from upstream + some vm and dashboard fixes
This commit is contained in:
@@ -11,20 +11,37 @@
|
||||
*/
|
||||
?>
|
||||
<?
|
||||
$path = '/webGui/images';
|
||||
|
||||
function normalize($type,$count) {
|
||||
$words = explode('_',$type);
|
||||
foreach ($words as &$word) $word = $word==strtoupper($word) ? $word : preg_replace(['/^(ct|cnt)$/','/^blk$/'],['count','block'],strtolower($word));
|
||||
return ucfirst(implode(' ',$words)).": ".str_replace('_',' ',strtolower($count))."\n";
|
||||
}
|
||||
function my_insert(&$source,$string) {
|
||||
$source = substr_replace($source,$string,4,0);
|
||||
}
|
||||
function my_smart(&$source,$name) {
|
||||
global $path;
|
||||
function my_smart(&$source,$name,$page) {
|
||||
global $var,$disks,$path,$failed,$numbers,$saved;
|
||||
$disk = &$disks[$name];
|
||||
$select = isset($disk['smSelect']) ? $disk['smSelect'] : -1; if ($select==-1) $select = isset($var['smSelect']) ? $var['smSelect'] : 0;
|
||||
$level = isset($disk['smLevel']) ? $disk['smLevel'] : -1; if ($level==-1) $level = isset($var['smLevel']) ? $var['smLevel'] : 1;
|
||||
$events = isset($disk['smEvents']) ? explode('|',$disk['smEvents']) : (isset($var['smEvents']) ? explode('|',$var['smEvents']) : $numbers);
|
||||
$thumb = 'good';
|
||||
$saved = @parse_ini_file("/var/local/emhttp/monitor.ini",true);
|
||||
$last = isset($saved["smart"]["$name.5"]) ? $saved["smart"]["$name.5"] : 0;
|
||||
$smart = exec("grep -Pom1 '^ 5.+ \K\d+$' /var/local/emhttp/smart/$name");
|
||||
if (!$smart) $smart = 0;
|
||||
if (($last == 0 && $smart > 0) || ($last > 0 && $smart > $last)) $thumb = 'bad';
|
||||
my_insert($source, "<a href=\"/Main/Device?name=$name\" onclick=\"$.cookie('one','tab2',{path:'/'})\" title=\"$smart reallocated sectors\"><img src=\"$path/$thumb.png\"></a>");
|
||||
$file = "state/smart/$name";
|
||||
if (file_exists("$file.ssa") && in_array(file_get_contents("$file.ssa"),$failed)) {
|
||||
$thumb = 'bad';
|
||||
} else {
|
||||
if (empty($saved["smart"]["$name.ack"])) {
|
||||
exec("awk 'NR>7{print $1,$2,$4,$6,$9,$10}' $file 2>/dev/null", $codes);
|
||||
foreach ($codes as $code) {
|
||||
if (!$code) continue;
|
||||
list($id,$class,$value,$thres,$when,$raw) = explode(' ',$code);
|
||||
$fail = strpos($when,'FAILING_NOW')!==false;
|
||||
if (!$fail && !in_array($id,$events)) continue;
|
||||
if ($fail || ($select ? $thres>0 && $value<=$thres*$level : $raw>0)) {$thumb = 'alert'; break;};
|
||||
}
|
||||
}
|
||||
}
|
||||
my_insert($source, "<span id='smart-$name' name='$page' class='$thumb'><img src=\"$path/$thumb.png\" onmouseover=\"this.style.cursor='pointer'\" title=\"Click to get context menu\"></span>");
|
||||
}
|
||||
function my_usage(&$source,$used) {
|
||||
my_insert($source, $used ? "<div class='usage-disk all'><span style='width:$used'>$used</span></div>" : "-");
|
||||
@@ -48,33 +65,28 @@ function mhz($speed) {
|
||||
function rpm($speed) {
|
||||
return "$speed RPM";
|
||||
}
|
||||
$path = '/webGui/images';
|
||||
$failed = ['FAILED','NOK'];
|
||||
switch ($_POST['cmd']) {
|
||||
case 'disk':
|
||||
$i = 2;
|
||||
$disks = parse_ini_file("state/disks.ini",true);
|
||||
$devs = parse_ini_file("state/devs.ini",true);
|
||||
$row1 = array_fill(0,26,"<td></td>"); my_insert($row1[0],"Active");
|
||||
$row2 = array_fill(0,26,"<td></td>"); my_insert($row2[0],"Inactive");
|
||||
$row3 = array_fill(0,26,"<td></td>"); my_insert($row3[0],"Unassigned");
|
||||
$row4 = array_fill(0,26,"<td></td>"); my_insert($row4[0],"Faulty");
|
||||
$row5 = array_fill(0,26,"<td></td>"); my_insert($row5[0],"Heat alarm");
|
||||
$row6 = array_fill(0,26,"<td></td>"); my_insert($row6[0],"SMART status");
|
||||
$row7 = array_fill(0,26,"<td></td>"); my_insert($row7[0],"Utilization");
|
||||
foreach ($disks as $disk) {
|
||||
$state = $disk['color'];
|
||||
$n = 0;
|
||||
switch ($disk['type']) {
|
||||
case 'Parity':
|
||||
if ($disk['status']!='DISK_NP') $n = 1;
|
||||
break;
|
||||
case 'Data':
|
||||
if ($disk['status']!='DISK_NP') $n = $i++;
|
||||
break;
|
||||
case 'Cache':
|
||||
if ($disk['status']!='DISK_NP') $n = $i++;
|
||||
if ($disk['name']!='cache') $disk['fsStatus']=='-';
|
||||
break;}
|
||||
$i = 1;
|
||||
$var = [];
|
||||
$disks = @parse_ini_file('state/disks.ini',true);
|
||||
$devs = @parse_ini_file('state/devs.ini',true);
|
||||
$saved = @parse_ini_file('state/monitor.ini',true);
|
||||
require_once 'CustomMerge.php';
|
||||
require_once 'Preselect.php';
|
||||
$slots = max(count($disks)+count($devs)-1, 25)+1;
|
||||
$row1 = array_fill(0,$slots,'<td></td>'); my_insert($row1[0],'Active');
|
||||
$row2 = array_fill(0,$slots,'<td></td>'); my_insert($row2[0],'Inactive');
|
||||
$row3 = array_fill(0,$slots,'<td></td>'); my_insert($row3[0],'Unassigned');
|
||||
$row4 = array_fill(0,$slots,'<td></td>'); my_insert($row4[0],'Faulty');
|
||||
$row5 = array_fill(0,$slots,'<td></td>'); my_insert($row5[0],'Heat alarm');
|
||||
$row6 = array_fill(0,$slots,'<td></td>'); my_insert($row6[0],'SMART status');
|
||||
$row7 = array_fill(0,$slots,'<td></td>'); my_insert($row7[0],'Utilization');
|
||||
$funcRenderRow = function($n,$disk) use (&$row1,&$row2,&$row3,&$row4,&$row5,&$row6,&$row7,$path,$_POST) {
|
||||
if ($n>0) {
|
||||
$state = $disk['color'];
|
||||
switch ($state) {
|
||||
case 'grey-off':
|
||||
break; //ignore
|
||||
@@ -89,15 +101,34 @@ case 'disk':
|
||||
my_insert($row3[$n],"<img src=$path/$state.png>");
|
||||
break;
|
||||
default:
|
||||
my_insert($row4[$n],"<img src=$path/$state.png>");
|
||||
if ($disk['type']=='Parity' && $disk['status']=='DISK_NP_DSBL')
|
||||
my_insert($row3[$n],"<img src=$path/$state.png>"); //parity is really unassigned
|
||||
else
|
||||
my_insert($row4[$n],"<img src=$path/$state.png>");
|
||||
break;}
|
||||
$temp = $disk['temp'];
|
||||
if ($temp>=$_POST['hot']) my_insert($row5[$n],"<span class='heat-img'><img src='$path/".($temp>=$_POST['max']?'max':'hot').".png'></span><span class='heat-text' style='display:none'>".my_temp($temp,$_POST['unit'])."</span>");
|
||||
if ($disk['device'] && !strpos($state,'blink')) my_smart($row6[$n],$disk['name']);
|
||||
my_usage($row7[$n],($n>1 && $disk['fsStatus']=='Mounted')?(round((1-$disk['fsFree']/$disk['fsSize'])*100).'%'):'');
|
||||
if ($disk['device'] && !strpos($state,'blink')) my_smart($row6[$n],$disk['name'],'Device');
|
||||
my_usage($row7[$n],($disk['type']!='Parity' && $disk['fsStatus']=='Mounted')?(round((1-$disk['fsFree']/$disk['fsSize'])*100).'%'):'');
|
||||
}
|
||||
};
|
||||
foreach ($disks as $disk)
|
||||
if ($disk['type']=='Parity' && $disk['status']!='DISK_NP')
|
||||
$funcRenderRow($i++,$disk);
|
||||
foreach ($disks as $disk)
|
||||
if ($disk['type']=='Data' && $disk['status']!='DISK_NP')
|
||||
$funcRenderRow($i++,$disk);
|
||||
foreach ($disks as $disk)
|
||||
if ($disk['type']=='Cache' && $disk['status']!='DISK_NP') {
|
||||
if ($disk['name']!='cache') $disk['fsStatus']=='-';
|
||||
$funcRenderRow($i++,$disk);
|
||||
}
|
||||
foreach ($devs as $dev) {
|
||||
$device = $dev['device'];
|
||||
$state = exec("hdparm -C /dev/$device|grep -Po active") ? 'blue-on' : 'blue-blink';
|
||||
if ($state=='blue-on') my_smart($row6[$i],$device,'New');
|
||||
my_insert($row3[$i++],"<img src=$path/$state.png>");
|
||||
}
|
||||
foreach ($devs as $dev) my_insert($row3[$i++],"<img src=$path/blue-on.png>");
|
||||
echo "<tr>".implode('',$row1)."</tr>";
|
||||
echo "<tr>".implode('',$row2)."</tr>";
|
||||
echo "<tr>".implode('',$row3)."</tr>";
|
||||
@@ -139,20 +170,30 @@ case 'port':
|
||||
break;
|
||||
case 'port': exec("ifconfig -s|awk '/^(bond|eth|lo)/{print $3\"#\"$7}'",$ports); break;
|
||||
case 'link': exec("ifconfig -s|awk '/^(bond|eth|lo)/{print \"Errors: \"$4\"<br>Drops: \"$5\"<br>Overruns: \"$6\"#Errors: \"$8\"<br>Drops: \"$9\"<br>Overruns: \"$10}'",$ports); break;
|
||||
default: $ports = array();}
|
||||
default: $ports = [];}
|
||||
echo implode('#',$ports);
|
||||
break;
|
||||
case 'parity':
|
||||
$var = parse_ini_file("state/var.ini");
|
||||
echo "<span class='orange p0'><strong>".($var['mdNumInvalid']==0 ? 'Parity-Check' : ($var['mdInvalidDisk']==0 ? 'Parity-Sync' : 'Data-Rebuild'))." in progress... Completed: ".number_format(($var['mdResyncPos']/($var['mdResync']/100+1)),0)." %.</strong></span>".
|
||||
"<br><em>Elapsed time: ".my_clock(floor(($var['currTime']-$var['sbUpdated'])/60)).". Estimated finish: ".my_clock(round(((($var['mdResyncDt']*(($var['mdResync']-$var['mdResyncPos'])/($var['mdResyncDb']/100+1)))/100)/60),0))."</em>";
|
||||
$mode = '';
|
||||
if (strstr($var['mdResyncAction'],"recon")) {
|
||||
$mode = 'Parity-Sync / Data-Rebuild';
|
||||
} elseif (strstr($var['mdResyncAction'],"clear")) {
|
||||
$mode = 'Clearing';
|
||||
} elseif ($var['mdResyncAction']=="check") {
|
||||
$mode = 'Read-Check';
|
||||
} elseif (strstr($var['mdResyncAction'],"check")) {
|
||||
$mode = 'Parity-Check';
|
||||
}
|
||||
echo "<span class='orange p0'><strong>".$mode." in progress... Completed: ".number_format(($var['mdResyncPos']/($var['mdResync']/100+1)),0)." %.</strong></span>";
|
||||
echo "<br><em>Elapsed time: ".my_clock(floor(($var['currTime']-$var['sbUpdated'])/60)).". Estimated finish: ".my_clock(round(((($var['mdResyncDt']*(($var['mdResync']-$var['mdResyncPos'])/($var['mdResyncDb']/100+1)))/100)/60),0))."</em>";
|
||||
break;
|
||||
case 'shares':
|
||||
$names = explode(',',$_POST['names']);
|
||||
switch ($_POST['com']) {
|
||||
case 'smb':
|
||||
exec("lsof /mnt/user /mnt/disk* 2>/dev/null|awk '/^smbd/ && $0!~/\.AppleD(B|ouble)/ && $5==\"REG\"'|awk -F/ '{print $4}'",$lsof);
|
||||
$counts = array_count_values($lsof); $count = array();
|
||||
$counts = array_count_values($lsof); $count = [];
|
||||
foreach ($names as $name) $count[] = isset($counts[$name]) ? $counts[$name] : 0;
|
||||
echo implode('#',$count);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user