mirror of
https://github.com/unraid/webgui.git
synced 2026-01-14 13:39:58 -06:00
774 lines
36 KiB
Plaintext
774 lines
36 KiB
Plaintext
Menu="Dashboard"
|
|
---
|
|
<?PHP
|
|
/* Copyright 2005-2018, Lime Technology
|
|
* Copyright 2012-2018, Bergware International.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License version 2,
|
|
* as published by the Free Software Foundation.
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*/
|
|
?>
|
|
<?
|
|
function dmidecode($key,$n,$all=true) {
|
|
$entries = array_filter(explode($key,shell_exec("dmidecode -qt$n")));
|
|
$properties = [];
|
|
foreach ($entries as $entry) {
|
|
$property = [];
|
|
foreach (explode("\n",$entry) as $line) if (strpos($line,': ')!==false) {
|
|
list($key,$value) = explode(': ',trim($line));
|
|
$property[$key] = $value;
|
|
}
|
|
$properties[] = $property;
|
|
}
|
|
return $all ? $properties : $properties[0];
|
|
}
|
|
function truncate($string,$len) {
|
|
return strlen($string) < $len ? $string : substr($string,0,$len-3).'...';
|
|
}
|
|
function export_settings($protocol,$share) {
|
|
if ($protocol!='yes' || $share['export']=='-') return "-";
|
|
if ($share['export']=='e') return ucfirst($share['security']);
|
|
return '<em>'.ucfirst($share['security']).'</em>';
|
|
}
|
|
function data_devices($disk) {
|
|
return $disk['type']=='Data';
|
|
}
|
|
function cache_devices($disk) {
|
|
return $disk['type']=='Cache';
|
|
}
|
|
|
|
$dockerd = pgrep('dockerd');
|
|
$libvirtd = pgrep('libvirtd');
|
|
$started = $var['fsState']=='Started';
|
|
$array_size = $array_used = 0;
|
|
$cache_size = $cache_used = 0;
|
|
$extra_size = $extra_used = 0;
|
|
$cache_type = 'disk';
|
|
|
|
foreach ($disks as $disk) {
|
|
switch ($disk['type']) {
|
|
case 'Data':
|
|
if (isset($disk['fsFree'])) {
|
|
$array_size += $disk['fsSize'];
|
|
$array_used += $disk['fsSize']-$disk['fsFree'];
|
|
}
|
|
break;
|
|
case 'Cache':
|
|
if ($disk['name']=='cache') {
|
|
$cache_size = $disk['fsSize'];
|
|
$cache_used = $disk['fsSize']-$disk['fsFree'];
|
|
$cache_type = $disk['rotational'] ? ($disk['luksState'] ? 'disk-encrypted' : 'disk') : 'nvme';
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
foreach ($devs as $disk) {
|
|
$extra_size += $disk['sectors']*$disk['sector_size'];
|
|
}
|
|
$array_percent = my_scale(100*$array_used/$array_size, $u, 1, 0);
|
|
$cache_percent = my_scale(100*$cache_used/$cache_size, $u, 1, 0);
|
|
|
|
exec('cat /sys/devices/system/cpu/*/topology/thread_siblings_list|sort -nu', $cpus);
|
|
$fans = exec("sensors -uA 2>/dev/null|grep -c 'fan[0-9]_input'");
|
|
$group = $var['shareSMBEnabled']=='yes' | $var['shareAFPEnabled']=='yes' | $var['shareNFSEnabled']=='yes';
|
|
$url = "/webGui/include/DashUpdate.php";
|
|
|
|
$names = [];
|
|
$cache_only = $encrypted = 0;
|
|
foreach ($shares as $share) {
|
|
$names[] = $share['name'];
|
|
if ($share['useCache']=='only') $cache_only++;
|
|
if ($share['luksStatus']) $encrypted++;
|
|
}
|
|
$names = implode(',',$names);
|
|
|
|
$passwd = $nopass = 0;
|
|
foreach ($users as $user) if ($user['passwd']=='yes') $passwd++; else $nopass++;
|
|
|
|
$boot = "/boot/config";
|
|
$myfile = "case-model.cfg";
|
|
$mycase = file_exists("$boot/$myfile") ? file_get_contents("$boot/$myfile") : false;
|
|
|
|
$board = dmidecode('Base Board Information','2',0);
|
|
$serial = "s/n: {$board['Serial Number']}";
|
|
$board = "{$board['Manufacturer']} {$board['Product Name']} - v{$board['Version']}";
|
|
|
|
$bios = dmidecode('BIOS Information','0',0);
|
|
$biosdate = "BIOS dated: ".my_time(strtotime($bios['Release Date']),$display['date']);
|
|
$bios = "{$bios['Vendor']} - v{$bios['Version']}";
|
|
|
|
$cpu = dmidecode('Processor Information','4',0);
|
|
$cpumodel = str_ireplace(["Processor","(C)","(R)","(TM)"],["","©","®","™"],$cpu['Version']);
|
|
$cpumodel .= (strpos($cpumodel,'@')!==false ? "" : " @ {$cpu['Current Speed']}");
|
|
|
|
$total = exec("awk '/^MemTotal/{print $2*1024}' /proc/meminfo");
|
|
exec("ls /sys/class/net|grep -Po '^(lo|(bond|eth)\d+)$'",$ports);
|
|
|
|
$sizes = ['MB','GB','TB'];
|
|
$memory_type = $ecc = '';
|
|
$memory_installed = $memory_maximum = 0;
|
|
$memory_devices = dmidecode('Memory Device','17');
|
|
foreach ($memory_devices as $device) {
|
|
if ($device['Type']=='Unknown') continue;
|
|
list($size, $unit) = explode(' ',$device['Size']);
|
|
$base = array_search($unit,$sizes);
|
|
if ($base!==false) $memory_installed += $size*pow(1024,$base);
|
|
if (!$memory_type) $memory_type = $device['Type'];
|
|
}
|
|
$memory_array = dmidecode('Physical Memory Array','16');
|
|
foreach ($memory_array as $device) {
|
|
list($size, $unit) = explode(' ',$device['Maximum Capacity']);
|
|
$base = array_search($unit,$sizes);
|
|
if ($base>=1) $memory_maximum += $size*pow(1024,$base);
|
|
if (!$ecc && $device['Error Correction Type']!='None') $ecc = "{$device['Error Correction Type']} ";
|
|
}
|
|
if ($memory_installed >= 1024) {
|
|
$memory_installed = round($memory_installed/1024);
|
|
$memory_maximum = round($memory_maximum/1024);
|
|
$unit = 'GiB';
|
|
} else $unit = 'MiB';
|
|
|
|
// If maximum < installed then roundup maximum to the next power of 2 size of installed. E.g. 6 -> 8 or 12 -> 16
|
|
$low = $memory_maximum < $memory_installed;
|
|
if ($low) $memory_maximum = pow(2,ceil(log($memory_installed)/log(2)));
|
|
?>
|
|
<link type="text/css" rel="stylesheet" href="<?autov('/webGui/styles/jquery.ui.css')?>">
|
|
<style>
|
|
.switch-button-label{float:left;cursor:pointer}
|
|
.switch-button-background{float:left;position:relative;top:12px;background:#ccc;border:1px solid #aaa;margin:0 10px;border-radius:4px;cursor:pointer}
|
|
.switch-button-button{position:absolute;left:-1px;top:-1px;background:#fafafa;border:1px solid #aaa;border-radius:4px}
|
|
img.img,i.img{width:32px;height:32px;margin-right:10px}
|
|
span.outer{float:left;margin-bottom:20px;margin-right:20px;cursor:pointer}
|
|
span.outer.started>img,span.outer.started>i.img{opacity:1.0}
|
|
span.outer.stopped>img,span.outer.stopped>i.img{opacity:0.3}
|
|
span.outer.paused>img,span.outer.paused>i.img{opacity:0.6}
|
|
span.inner{width:135px;display:inline-block;vertical-align:top}
|
|
span.state{font-size:1.1rem;margin-left:7px}
|
|
</style>
|
|
<script src="<?autov('/webGui/javascript/jquery.switchbutton.js')?>"></script>
|
|
<script src="<?autov('/plugins/dynamix.docker.manager/javascript/docker.js')?>"></script>
|
|
<script src="<?autov('/plugins/dynamix.vm.manager/javascript/vmmanager.js')?>"></script>
|
|
|
|
<div style='float:left;margin:14px 0 36px 0'>
|
|
<table class='share_status dashboard box1'>
|
|
<thead><tr><td></td><td colspan='3'><?=$var['NAME']?><i class='fa blue-text chevron mt0' id='sys_view' onclick='toggleChevron("sys_view",0)'></i></td><td></td></tr></thead>
|
|
<tbody class='sys_view' style='display:none'>
|
|
<tr><td></td><td colspan='2' class='top'>
|
|
<span class='header'>Description</span><br>
|
|
<?=$var['COMMENT']?><br>
|
|
<?=$var['SYS_MODEL']?><br><br>
|
|
<span class='header'>Registration</span><br>Unraid OS <b><em><?=$var['regTy']?></em></b><br><br>
|
|
<span class='header'>Uptime</span><br><span class='uptime'></span>
|
|
</td><td class='top' style='text-align:center'>
|
|
<?if ($mycase):?>
|
|
<i id='mycase' class='case-<?=$mycase?>'></i><br>
|
|
<?else:?>
|
|
<i id='mycase' class='fa fa-wpexplorer'></i><br>
|
|
<?endif;?>
|
|
<input type='button' value='Edit' onclick='openBox("/webGui/include/SelectCase.php?file=<?=$myfile?>&csrf=<?=$var['csrf_token']?>","Select Case Model",600,900,true,"setCase");return false' style='margin:12px 0 0 0;padding:5px 10px'>
|
|
</td><td></td></tr>
|
|
</tbody>
|
|
<tbody>
|
|
<tr><td></td><td colspan='3' class='next'><i class='icon-motherboard'></i><div class='section'>Motherboard<br><span id='mb-temp'></span><br><br></div>
|
|
<i class='fa blue-text chevron' id='mb_view' onclick='toggleChevron("mb_view",0)'></i></td><td></td></tr>
|
|
<tr class='mb_view' style='display:none'><td></td><td colspan='3'><?=$board?><br><?=$bios?><br><?=$biosdate?></td><td></td></tr>
|
|
</tbody>
|
|
<tbody>
|
|
<tr><td></td><td colspan='3' class='next'><i class='icon-cpu'></i><div class='section'>Processor<br>
|
|
<span style='display:inline-block;width:80px'>Load: <span class='cpu'>0%</span></span><span id='cpu-temp'></span><br><br></div>
|
|
<i class='fa blue-text chevron' id='cpu_view' onclick='toggleChevron("cpu_view",1)'></i></td><td></td></tr>
|
|
<tr class='cpu_view' style='display:none'><td></td><td colspan='3'><?=$cpumodel?><br>
|
|
<a onclick='toggleCPU()' title='Click to toggle details' class='cpu_close' style='cursor:pointer'>Show details</a></td><td></td></tr>
|
|
<tr class='cpu_open' style='display:none'><td></td><td>Overall Load:</td>
|
|
<td colspan='2'><span class='cpu load'>0%</span><div class='usage-disk sys'><span id='cpu' style='width:0'></span></div></td><td></td></tr>
|
|
<?
|
|
foreach ($cpus as $pair) {
|
|
list($cpu1, $cpu2) = preg_split('/[,-]/',$pair);
|
|
echo "<tr class='cpu_open' style='display:none'><td></td>";
|
|
if ($cpu2)
|
|
echo "<td>CPU $cpu1 - HT $cpu2</td><td><span class='cpu$cpu1 load'>0%</span><div class='usage-disk sys'><span id='cpu$cpu1' style='width:0'></span></div></td><td><span class='cpu$cpu2 load'>0%</span><div class='usage-disk sys'><span id='cpu$cpu2' style='width:0'></span></div></td>";
|
|
else
|
|
echo "<td>CPU $cpu1</td><td><span class='cpu$cpu1 load'>0%</span><div class='usage-disk sys'><span id='cpu$cpu1' style='width:0'></span></div></td><td></td>";
|
|
echo "<td></td></tr>";
|
|
}
|
|
?>
|
|
</tbody>
|
|
<tbody>
|
|
<tr><td></td><td colspan='3' class='next'><i class='icon-ram'></i><div class='section'>Memory<br><span><?="$memory_installed $unit $memory_type $ecc"?><span style='margin-left:20px'>Utilization: <span class='sys0'>0%</span></span><br><br></div>
|
|
<i class='fa blue-text chevron' id='mem_view' onclick='toggleChevron("mem_view",0)'></i></td><td></td></tr>
|
|
<tr class='mem_view' style='display:none'><td></td><td>Maximum size: <?="$memory_maximum $unit"?><?=$low?'*':''?></td><td><i>RAM: </i><span class='sys0'>0%</span><div class='usage-disk sys mm'><span id='sys0' style='width:0'></span></div></td>
|
|
<td><i>Flash: </i><span class='sys1'>0%</span><div class='usage-disk sys mm'><span id='sys1' style='width:0'></span></div></td><td></td></tr>
|
|
<tr class='mem_view' style='display:none'><td></td><td>Usable size: <?=my_scale($total,$unit,1,null,1024)." $unit"?></td><td><i>Log: </i><span class='sys2'>0%</span><div class='usage-disk sys mm'><span id='sys2' style='width:0'></span></div></td>
|
|
<td><?if (exec("df /var/lib/docker|grep -om1 '^/'")):?><i>Docker: </i><span class='sys3'>0%</span><div class='usage-disk sys mm'><span id='sys3' style='width:0'></span></div><?endif;?></td><td></td></tr>
|
|
</tbody>
|
|
<tbody>
|
|
<tr><td></td><td colspan='3' class='next'><i class='icon-ethernet'></i><div class='section'>Interface<br>
|
|
<select name="port_select" size="1" onchange="portSelect(this.value)">
|
|
<?foreach ($ports as $port):?>
|
|
<?=mk_option("",$port,$port)?>
|
|
<?endforeach;?>
|
|
</select>
|
|
<span>Inbound: <span id='inbound' style='display:inline-block;width:70px'>---</span>Outbound: <span id='outbound'>---</span></span><br><br></div>
|
|
<i class='fa blue-text chevron' id='port_view' onclick='toggleChevron("port_view",2)'></i></td><td></td></tr>
|
|
<tr class='port_view' style='display:none'><td></td>
|
|
<td><select class='port_view' name="enter_view" size="1" style='display:none' onchange="changeView(this.value)">
|
|
<?=mk_option("", "0", "General info")?>
|
|
<?=mk_option("", "1", "Counters info")?>
|
|
<?=mk_option("", "2", "Errors info")?>
|
|
</select></td>
|
|
<td><i class='view1' style='display:none'>Mode of operation</i><i class='view2' style='display:none'>Received packets</i><i class='view3' style='display:none'>Receive counters</i></td>
|
|
<td><i class='view1' style='display:none'></i><i class='view2' style='display:none'>Transmitted packets</i><i class='view3' style='display:none'>Transmit counters</i></td><td></td></tr>
|
|
<?
|
|
$c = 0;
|
|
foreach ($ports as $port) {
|
|
$last = ($port=='lo')?' last':'';
|
|
echo "<tr class='view1{$last}' style='display:none'><td></td><td>$port</td><td colspan='2' id='main".($c++)."'></td><td></td></tr>";
|
|
}
|
|
$c = 0;
|
|
foreach ($ports as $port) {
|
|
$last = ($port=='lo')?' last':'';
|
|
echo "<tr class='view2{$last}' style='display:none'><td></td><td>$port</td><td id='port{$c}'></td><td id='port".($c+1)."'></td><td></td></tr>";
|
|
$c += 2;
|
|
}
|
|
$c = 0;
|
|
foreach ($ports as $port) {
|
|
echo "<tr class='view3' style='display:none'><td></td><td>$port</td><td id='link{$c}'></td><td id='link".($c+1)."'></td><td></td></tr>";
|
|
$c += 2;
|
|
}
|
|
?>
|
|
</tbody>
|
|
<?if ($fans>0) {
|
|
echo "<tbody>";
|
|
echo "<tr><td></td><td colspan='3' class='next'><i class='icon-fan'></i><div class='section'>Airflow<br><span>Fan count: $fans</span><br><br></div><i class='fa blue-text chevron' id='fan_view' onclick='toggleChevron(\"fan_view\",0)'></i></td><td></td></tr>";
|
|
for ($f=0; $f<$fans; $f+=2) {
|
|
if ($f+1<$fans) echo "<tr class='fan_view' style='display:none'><td></td><td>FAN ".($f)." - FAN ".($f+1)."</td><td id='fan{$f}'>"."</td><td id='fan".($f+1)."'></td><td></td></tr>";
|
|
else echo "<tr class='fan_view' style='display:none'><td></td><td>FAN ".($f)."</td><td colspan='2' id='fan{$f}'></td><td></td></tr>";
|
|
}
|
|
echo "</tbody>";
|
|
}?>
|
|
</table>
|
|
|
|
<table class='share_status dashboard box3'>
|
|
<?if ($display['dashapps']!='none'):?>
|
|
<?if ($display['dashapps']=='icons' || $display['dashapps']=='docker'):?>
|
|
<thead><tr><td></td><td colspan='4'>Docker Containers<i class='fa blue-text chevron mt0' id='docker_view' onclick='toggleChevron("docker_view",0)'></i><span class='info apps'><input type='checkbox' id='apps'></span></td><td></td></tr></thead>
|
|
<tbody class='docker_view' style='display:none'>
|
|
</tbody>
|
|
<?endif;?>
|
|
<?if ($display['dashapps']=='icons' || $display['dashapps']=='vms'):?>
|
|
<thead><tr><td></td><td colspan='4' class='next'>Virtual Machines<i class='fa blue-text chevron mt0' id='vm_view' onclick='toggleChevron("vm_view",0)'></i><span class='info vms'><input type='checkbox' id='vms'></span></td><td></td></tr></thead>
|
|
<tbody class='vm_view' style='display:none'>
|
|
</tbody>
|
|
<?endif;?>
|
|
<tbody class='split'><tr><td colspan='6'></td></tr></tbody>
|
|
<?endif;?>
|
|
<thead><tr><td></td><td colspan='4' class='next'>Shares<i class='fa blue-text chevron mt0' id='shares_view' onclick='toggleChevron("shares_view",4)'></i>
|
|
<span class='info'>Share count: <?=count($shares)?> with <?=$cache_only?> cache only and <?=$encrypted?> encrypted</span>
|
|
<?if ($group):?>
|
|
<select name="enter_share" size="1" onchange="changeMode(this.value)">
|
|
<?if ($var['shareSMBEnabled']=='yes'):?>
|
|
<?=mk_option("", "0", "SMB")?>
|
|
<?endif;?>
|
|
<?if ($var['shareAFPEnabled']=='yes'):?>
|
|
<?=mk_option("", "1", "AFP")?>
|
|
<?endif;?>
|
|
<?if ($var['shareNFSEnabled']=='yes'):?>
|
|
<?=mk_option("", "2", "NFS")?>
|
|
<?endif;?>
|
|
</select>
|
|
<?endif;?>
|
|
</td><td></td></tr>
|
|
<tr id='shares_view_on' style='display:none'><td></td><td>Name</td><td>Description</td><td>Security</td><td>Streams</td><td></td></tr>
|
|
</thead>
|
|
<?if ($var['shareSMBEnabled']=='yes'):?>
|
|
<tbody class='smb share share1' style='display:none'><?
|
|
$i = 0;
|
|
foreach ($shares as $name => $share) {
|
|
$i++;
|
|
$list = truncate($name,20);
|
|
if ($share['luksStatus']>0) $list = "<span class='green-text'>$list</span>";
|
|
elseif ($share['useCache']=='only') $list = "<span class='orange-text'>$list</span>";
|
|
$comment = truncate($share['comment'],40);
|
|
$security = export_settings($var['shareSMBEnabled'], $sec[$name]);
|
|
echo "<tr><td></td><td><i class='icon-folder'></i>$list</td><td>$comment</td><td>$security</td><td id='share{$i}'>0</td><td></td></tr>";
|
|
}
|
|
if (!count($shares)) echo "<tr><td></td><td colspan='4' style='text-align:center;padding-top:12px'>No shares present</td><td></td></tr>";
|
|
?></tbody>
|
|
<?endif;?>
|
|
<?if ($var['shareAFPEnabled']=='yes'):?>
|
|
<tbody class='afp share share2' style='display:none'><?
|
|
foreach ($shares as $name => $share) {
|
|
$list = truncate($name,20);
|
|
if ($share['luksStatus']>0) $list = "<span class='green-text'>$list</span>";
|
|
elseif ($share['useCache']=='only') $list = "<span class='orange-text'>$list</span>";
|
|
$comment = truncate($share['comment'],40);
|
|
$security = export_settings($var['shareAFPEnabled'], $sec_afp[$name]);
|
|
echo "<tr><td></td><td><i class='icon-folder'></i>$list</td><td>$comment</td><td>$security</td><td>-</td><td></td></tr>";
|
|
}
|
|
if (!count($shares)) echo "<tr><td></td><td colspan='4' style='text-align:center;padding-top:12px'>No shares present</td><td></td></tr>";
|
|
?></tbody>
|
|
<?endif;?>
|
|
<?if ($var['shareNFSEnabled']=='yes'):?>
|
|
<tbody class='nfs share share3' style='display:none'><?
|
|
foreach ($shares as $name => $share) {
|
|
$list = truncate($name,20);
|
|
if ($share['luksStatus']>0) $list = "<span class='green-text'>$list</span>";
|
|
elseif ($share['useCache']=='only') $list = "<span class='orange-text'>$list</span>";
|
|
$comment = truncate($share['comment'],40);
|
|
$security = export_settings($var['shareNFSEnabled'], $sec_nfs[$name]);
|
|
echo "<tr><td></td><td><i class='icon-folder'></i>$list</td><td>$comment</td><td>$security</td><td>-</td><td></td></tr>";
|
|
}
|
|
if (!count($shares)) echo "<tr><td></td><td colspan='4' style='text-align:center;padding-top:12px'>No shares present</td><td></td></tr>";
|
|
?></tbody>
|
|
<?endif;?>
|
|
<?if (!$group):?>
|
|
<tbody><?
|
|
foreach ($shares as $name => $share) {
|
|
$list = truncate($name,20);
|
|
if ($share['luksStatus']>0) $list = "<span class='green-text'>$list</span>";
|
|
elseif ($share['useCache']=='only') $list = "<span class='orange-text'>$list</span>";
|
|
$comment = truncate($share['comment'],40);
|
|
echo "<tr><td></td><td><i class='icon-folder'></i>$list</td><td>$comment</td><td>-</td><td>-</td><td></td></tr>";
|
|
}
|
|
if (!count($shares)) echo "<tr><td></td><td colspan='4' style='text-align:center;padding-top:12px'>No shares present</td><td></td></tr>";
|
|
?></tbody>
|
|
<?endif;?>
|
|
<tbody class='split'><tr><td colspan='6'></td></tr></tbody>
|
|
<thead><tr><td></td><td colspan='4'>Users<i class='fa blue-text chevron mt0' id='users_view' onclick='toggleChevron("users_view",3)'></i><span class='info'>User count: <?=count($users)?> with <?=$nopass?> unprotected</span>
|
|
</td><td></td></tr><tr id='users_view_on' style='display:none'><td></td><td>Name</td><td>Description</td><td>Write</td><td>Read</td><td></td></tr></thead>
|
|
<?if ($var['shareSMBEnabled']=='yes'):?>
|
|
<tbody class='smb user user1' style='display:none'><?
|
|
foreach ($users as $user) {
|
|
$list = truncate($user['name'],20);
|
|
$desc = truncate($user['desc'],40);
|
|
if ($list=='root') {
|
|
$write = '-'; $read = '-';
|
|
} else {
|
|
$write = 0; $read = 0;
|
|
foreach ($shares as $share) {
|
|
if (strpos($sec[$share['name']]['writeList'],$list)!==false) $write++;
|
|
if (strpos($sec[$share['name']]['readList'],$list)!==false) $read++;
|
|
}
|
|
}
|
|
if ($user['passwd']=='yes') $list = "<span class='green-text'>$list</span>";
|
|
echo "<tr><td></td><td><i class='icon-user'></i>$list</td><td>$desc</td><td>$write</td><td>$read</td><td></td></tr>";
|
|
}
|
|
?></tbody>
|
|
<?endif;?>
|
|
<?if ($var['shareAFPEnabled']=='yes'):?>
|
|
<tbody class='afp user user2' style='display:none'><?
|
|
foreach ($users as $user) {
|
|
$list = truncate($user['name'],20);
|
|
$desc = truncate($user['desc'],40);
|
|
if ($list=='root') {
|
|
$write = '-'; $read = '-';
|
|
} else {
|
|
$write = 0; $read = 0;
|
|
foreach ($shares as $share) {
|
|
if (strpos($sec_afp[$share['name']]['writeList'],$list)!==false) $write++;
|
|
if (strpos($sec_afp[$share['name']]['readList'],$list)!==false) $read++;
|
|
}
|
|
}
|
|
if ($user['passwd']=='yes') $list = "<span class='green-text'>$list</span>";
|
|
echo "<tr><td></td><td><i class='icon-user'></i>$list</td><td>$desc</td><td>$write</td><td>$read</td><td></td></tr>";
|
|
}
|
|
?></tbody>
|
|
<?endif;?>
|
|
<?if ($var['shareNFSEnabled']=='yes'):?>
|
|
<tbody class='nfs user user3' style='display:none'><?
|
|
foreach ($users as $user) {
|
|
$list = truncate($user['name'],20);
|
|
$desc = truncate($user['desc'],40);
|
|
$write = '-'; $read = '-';
|
|
if ($user['passwd']=='yes') $list = "<span class='green-text'>$list</span>";
|
|
echo "<tr><td></td><td><i class='icon-user'></i>$list</td><td>$desc</td><td>$write</td><td>$read</td><td></td></tr>";
|
|
}
|
|
?></tbody>
|
|
<?endif;?>
|
|
<?if (!$group):?>
|
|
<tbody><?
|
|
foreach ($users as $user) {
|
|
$list = truncate($user['name'],20);
|
|
$desc = truncate($user['desc'],40);
|
|
if ($user['passwd']=='yes') $list = "<span class='green-text'>$list</span>";
|
|
echo "<tr><td></td><td><i class='icon-user'></i>$list</td><td>$desc</td><td>-</td><td>-</td><td></td></tr>";
|
|
}
|
|
?></tbody>
|
|
<?endif;?>
|
|
</table>
|
|
|
|
<table class='share_status dashboard box2'>
|
|
<thead><tr><td></td><td colspan='5'>Parity<i class='fa blue-text chevron mt0' id='parity_view' onclick='toggleChevron("parity_view",0)'></i><span class='info title'></span></td><td></td></tr></thead>
|
|
<tbody class='parity_view' style='display:none'>
|
|
<tr><td></td><td colspan='5' id='parity'></td><td></td></tr>
|
|
<tr><td></td><td colspan='5' id='program'></td><td></td></tr>
|
|
</tbody>
|
|
<thead><tr><td></td><td colspan='5' class='next'>Array<?if (!$started):?> not started<?endif;?><i class='fa blue-text chevron mt0' id='array_view' onclick='toggleChevron("array_view",0)'></i>
|
|
<?if ($started):?><span class='info'><?=my_scale($array_used*1024,$unit)." $unit"?> used of <?=my_scale($array_size*1024,$unit,-1,-1)." $unit"?> (<?=$array_percent?> %)</span><?endif;?>
|
|
</td><td></td></tr>
|
|
<tr style='display:none'><td></td><td id='array_info' colspan='5'></td><td></td></tr>
|
|
<tr id='array_view_on' style='display:none'><td></td><td>Device</td><td>Status</td><td>Temp</td><td>SMART</td><td>Utilization</td><td></td></tr>
|
|
</thead>
|
|
<tbody class='array_view' id='array_list' style='display:none'></tbody>
|
|
<?if (isset($disks['cache'])):?>
|
|
<thead><tr><td></td><td colspan='5' class='next'>Cache<?if (!$started):?> not started<?endif;?><i class='fa blue-text chevron mt0' id='cache_view' onclick='toggleChevron("cache_view",0)'></i>
|
|
<?if ($started):?><span class='info'><?=my_scale($cache_used*1024,$unit)." $unit"?> used of <?=my_scale($cache_size*1024,$unit,-1,-1)." $unit"?> (<?=$cache_percent?> %)</span><?endif;?>
|
|
</td><td></td></tr>
|
|
<tr style='display:none'><td></td><td id='cache_info' colspan='5'></td><td></td></tr>
|
|
<tr id='cache_view_on' style='display:none'><td></td><td>Device</td><td>Status</td><td>Temp</td><td>SMART</td><td>Utilization</td><td></td></tr>
|
|
</thead>
|
|
<tbody class='cache_view' id='cache_list' style='display:none'></tbody>
|
|
<?endif;?>
|
|
<?if ($devs):?>
|
|
<thead><tr><td></td><td colspan='5' class='next'>Extra<i class='fa blue-text chevron mt0' id='extra_view' onclick='toggleChevron("extra_view",0)'></i><span class='info'></span></td><td></td></tr>
|
|
<tr style='display:none'><td></td><td id='extra_info' colspan='5'></td><td></td></tr>
|
|
<tr id='extra_view_on' style='display:none'><td></td><td>Device</td><td>Status</td><td>Temp</td><td>SMART</td><td>Utilization</td><td></td></tr>
|
|
</thead>
|
|
<tbody class='extra_view' id='extra_list' style='display:none'></tbody>
|
|
<?endif;?>
|
|
</table>
|
|
</div>
|
|
<div id="iframe-popup" style="display:none;-webkit-overflow-scrolling:touch"></div>
|
|
<script>
|
|
var timer30 = null;
|
|
var orange = 70;
|
|
var red = 90;
|
|
var timestamp = 0, rx_bytes = 0, tx_bytes = 0;
|
|
var port_select = $.cookie('port_select')||'<?=$ports[0]?>';
|
|
|
|
function noApps() {
|
|
if ($('span.outer.apps:visible').length==0) $('#no_apps').show(); else $('#no_apps').hide();
|
|
}
|
|
function noVMs() {
|
|
if ($('span.outer.vms:visible').length==0) $('#no_vms').show(); else $('#no_vms').hide();
|
|
}
|
|
function loadlist(init) {
|
|
if (init) {
|
|
$('#apps').switchButton({labels_placement:'left', off_label:'All Apps', on_label:'Started only', checked:$.cookie('my_apps')=='startedOnly'});
|
|
$('#vms').switchButton({labels_placement:'left', off_label:'All VMs', on_label:'Started only', checked:$.cookie('my_vms')=='startedOnly'});
|
|
$('#apps').change(function(){
|
|
$('span.outer.apps.stopped').finish().toggle('fast',function(){noApps();})
|
|
$('#apps').is(':checked') ? $.cookie('my_apps','startedOnly',{expires:3650}) : $.removeCookie('my_apps');
|
|
});
|
|
$('#vms').change(function(){
|
|
$('span.outer.vms.stopped').finish().toggle('fast',function(){noVMs();});
|
|
$('#vms').is(':checked') ? $.cookie('my_vms','startedOnly',{expires:3650}) : $.removeCookie('my_vms');
|
|
});
|
|
context.init({preventDoubleContext:false,left:true,above:false});
|
|
}
|
|
$.post('/webGui/include/DashboardApps.php',{display:'<?=$display['dashapps']?>',docker:'<?=$dockerd?>',vm:'<?=$libvirtd?>'},function(d) {
|
|
var data = d.split(/\0/);
|
|
$('.docker_view').html(data[0]);
|
|
$('.vm_view').html(data[1]);
|
|
var script = document.createElement('script');
|
|
script.innerHTML = data[2];
|
|
document.head.appendChild(script);
|
|
if ($.cookie('my_apps')!=null) $('span.apps.stopped').hide(0,function(){noApps();});
|
|
if ($.cookie('my_vms')!=null) $('span.vms.stopped').hide(0,function(){noVMs();});
|
|
context.init({preventDoubleContext:false,left:true,above:false});
|
|
});
|
|
}
|
|
function setCase() {
|
|
$.post('/webGui/include/SelectCase.php',{mode:'get',file:'<?=$myfile?>'},function(model){
|
|
if (model) {
|
|
$('#mycase').removeClass().addClass('case-'+model);
|
|
$('#myinfo').show(); $('#nocase').hide();
|
|
}
|
|
});
|
|
}
|
|
function changeMode(item) {
|
|
var user = $.cookie('users_view');
|
|
var share = $.cookie('shares_view');
|
|
if (item==0) $.removeCookie('enter_share',{path:'/'}); else $.cookie('enter_share',item,{path:'/',expires:3650});
|
|
<?if ($var['shareSMBEnabled']=='yes'):?>
|
|
if (item==0 && user==null) $('.smb.user1').show(); else $('.smb.user1').hide();
|
|
if (item==0 && share==null) $('.smb.share1').show(); else $('.smb.share1').hide();
|
|
<?endif;?>
|
|
<?if ($var['shareAFPEnabled']=='yes'):?>
|
|
if (item==1 && user==null) $('.afp.user2').show(); else $('.afp.user2').hide();
|
|
if (item==1 && share==null) $('.afp.share2').show(); else $('.afp.share2').hide();
|
|
<?endif;?>
|
|
<?if ($var['shareNFSEnabled']=='yes'):?>
|
|
if (item==2 && user==null) $('.nfs.user3').show(); else $('.nfs.user3').hide();
|
|
if (item==2 && share==null) $('.nfs.share3').show(); else $('.nfs.share3').hide();
|
|
<?endif;?>
|
|
}
|
|
function changeView(item) {
|
|
if (item==0) $.removeCookie('enter_view',{path:'/'}); else $.cookie('enter_view',item,{path:'/',expires:3650});
|
|
if (item==0) $('.view1').show(); else $('.view1').hide();
|
|
if (item==1) $('.view2').show(); else $('.view2').hide();
|
|
if (item==2) $('.view3').show(); else $('.view3').hide();
|
|
clearTimeout(timer30);
|
|
update30();
|
|
}
|
|
function smartMenu(table) {
|
|
$(table).find('[id^="smart-"]').each(function() {
|
|
var opts = [{header:$(this).attr('id'), image:'/webGui/icons/smart.png'}];
|
|
var id = '#'+$(this).attr('id');
|
|
var page = $(this).attr('name');
|
|
var view = $(this).attr('class');
|
|
var disk = id.substr(id.indexOf('-')+1);
|
|
opts.push({text:'Attributes',icon:'fa-sitemap',action:function(e){e.preventDefault();attributes(page,disk);}});
|
|
opts.push({divider:true});
|
|
opts.push({text:'Capabilities',icon:'fa-user',action:function(e){e.preventDefault();capabilities(page,disk);}});
|
|
opts.push({divider:true});
|
|
opts.push({text:'Identity',icon:'fa-home',action:function(e){e.preventDefault();identity(page,disk);}});
|
|
if (view.search('green-text') == -1) {
|
|
opts.push({divider:true});
|
|
opts.push({text:'Acknowledge',icon:'fa-check-square-o',action:function(e){e.preventDefault();acknowledge(disk);}});
|
|
}
|
|
context.attach(id,opts);
|
|
});
|
|
}
|
|
function portMenu() {
|
|
var select = 'select[name="port_select"]';
|
|
var option = $(select+' option');
|
|
for (var i=0; i < option.length; i++) {
|
|
if (option[i].value == port_select) {option[i].selected = true; break;}
|
|
}
|
|
}
|
|
function portSelect(name) {
|
|
$.cookie('port_select',name,{path:'/',expires:3650});
|
|
port_select = name;
|
|
timestamp = 0, rx_bytes = 0, tx_bytes = 0;
|
|
}
|
|
function moreInfo(data,table) {
|
|
var info = [];
|
|
if (data[1]>0) info.push(data[1]+" failed device"+(data[1]==1?'':'s'));
|
|
if (data[2]>0) info.push(data[2]+" heat warning"+(data[2]==1?'':'s'));
|
|
if (data[3]>0) info.push(data[3]+" SMART error"+(data[3]==1?'':'s'));
|
|
if (data[4]>0) info.push(data[4]+" utilization warning"+(data[4]==1?'':'s'));
|
|
return info.length ? "<i class='icon-u-triangle failed'></i><span class='failed'>"+table+" has "+info.join('. ')+".</span>" : "";
|
|
}
|
|
function update5() {
|
|
<?if ($fans>0):?>
|
|
$.post('<?=$url?>',{cmd:'fan'},function(data) {
|
|
$.each(data.split('\0'),function(k,v) {$('#fan'+k).html(v);});
|
|
});
|
|
<?endif;?>
|
|
$.post('<?=$url?>',{cmd:'speed',port:port_select,timestamp:timestamp,rx_bytes:rx_bytes,tx_bytes:tx_bytes},function(d) {
|
|
var data = d.split('\0');
|
|
$('#inbound').text(data[0]);
|
|
$('#outbound').text(data[1]);
|
|
timestamp = data[2];
|
|
rx_bytes = data[3];
|
|
tx_bytes = data[4];
|
|
setTimeout(update5,5000);
|
|
});
|
|
}
|
|
function update15() {
|
|
<?if ($var['fsState']=='Started'):?>
|
|
var tag = $('.smb').is(':visible') ? 'smb' : $('.afp').is(':visible') ? 'afp' : $('.nfs').is(':visible') ? 'nfs' : '';
|
|
$.post('<?=$url?>',{cmd:'shares',com:tag,names:'<?=addslashes(htmlspecialchars($names))?>'},function(data) {
|
|
$.each(data.split('\0'),function(k,v) {$('#share'+(k+1)).html(v);});
|
|
});
|
|
<?endif;?>
|
|
$.post('<?=$url?>',{cmd:'status',number:'<?=$display['number']?>'},function(data) {$('span.info.title').html(data);});
|
|
$.post('<?=$url?>',{cmd:'parity',time:'<?=$display['date'].($display['date']!='%c'?", {$display['time']}":"")?>'},function(d) {
|
|
var data = d.split('\0');
|
|
$('#parity').html(data[0]);
|
|
$('#program').html(data[1]);
|
|
setTimeout(update15,15000);
|
|
});
|
|
}
|
|
function update30() {
|
|
var tag = $.cookie('enter_view')==0 ? 'main' : $.cookie('enter_view')==1 ? 'port' : $.cookie('enter_view')==2 ? 'link' : 'main';
|
|
$.post('<?=$url?>',{cmd:'port',view:tag,ports:'<?=implode(',',$ports)?>'},function(data) {
|
|
$.each(data.split('\0'),function(k,v) {$('#'+tag+k).html(v);});
|
|
});
|
|
$.post('<?=$url?>',{cmd:'array',hot:'<?=$display['hot']?>',max:'<?=$display['max']?>',unit:'<?=$display['unit']?>',text:<?=$display['text']?>,critical:'<?=$display['critical']?>',warning:'<?=$display['warning']?>'},function(d) {
|
|
var data = d.split('\0');
|
|
var info = moreInfo(data,'Array');
|
|
$('#array_list').html(data[0]);
|
|
$('#array_info').parent().css('display',info?'':'none');
|
|
$('#array_info').html(info);
|
|
smartMenu('#array_list');
|
|
$.post('<?=$url?>',{cmd:'cache',hot:'<?=$display['hot']?>',max:'<?=$display['max']?>',unit:'<?=$display['unit']?>',text:<?=$display['text']?>,critical:'<?=$display['critical']?>',warning:'<?=$display['warning']?>'},function(d) {
|
|
var data = d.split('\0');
|
|
var info = moreInfo(data,'Cache');
|
|
$('#cache_list').html(data[0]);
|
|
$('#cache_info').parent().css('display',info?'':'none');
|
|
$('#cache_info').html(info);
|
|
smartMenu('#cache_list');
|
|
<?if ($devs):?>
|
|
$.post('<?=$url?>',{cmd:'extra',hot:'<?=$display['hot']?>',max:'<?=$display['max']?>',unit:'<?=$display['unit']?>',text:<?=$display['text']?>,critical:'<?=$display['critical']?>',warning:'<?=$display['warning']?>'},function(d) {
|
|
var data = d.split('\0');
|
|
var info = moreInfo(data,'Extra');
|
|
$('#extra_list').html(data[0]);
|
|
$('#extra_info').parent().css('display',info?'':'none');
|
|
$('#extra_info').html(info);
|
|
smartMenu('#extra_list');
|
|
});
|
|
<?endif;?>
|
|
});
|
|
timer30 = setTimeout(update30,30000);
|
|
});
|
|
}
|
|
function update60() {
|
|
$.post('<?=$url?>',{cmd:'sys'},function(data) {
|
|
$.each(data.split('\0'),function(k,v) {
|
|
var load = v.slice(0,-1);
|
|
if (load >= <?=$display['critical']?>) var color = 'redbar';
|
|
else if (load >= <?=$display['warning']?>) var color = 'orangebar';
|
|
else var color = '';
|
|
$('.sys'+k).text(v);
|
|
$('#sys'+k).animate({width:v},{step:function(){$('#sys'+k).css('overflow','visible').removeClass().addClass(color);}});
|
|
});
|
|
setTimeout(update60,60000);
|
|
});
|
|
}
|
|
function attributes(page,disk) {
|
|
var tab = page=='New' ? 'tab2' : 'tab3';
|
|
$.cookie('one',tab,{path:'/'});
|
|
location.replace('/Dashboard/'+page+'?name='+disk);
|
|
}
|
|
function capabilities(page,disk) {
|
|
var tab = page=='New' ? 'tab3' : 'tab4';
|
|
$.cookie('one',tab,{path:'/'});
|
|
location.replace('/Dashboard/'+page+'?name='+disk);
|
|
}
|
|
function identity(page,disk) {
|
|
var tab = page=='New' ? 'tab4' : 'tab5';
|
|
$.cookie('one',tab,{path:'/'});
|
|
location.replace('/Dashboard/'+page+'?name='+disk);
|
|
}
|
|
function acknowledge(disk) {
|
|
$.post('/webGui/include/Acknowledge.php',{disk:disk},function(){clearTimeout(timer30);update30();});
|
|
}
|
|
function dropdown(menu) {
|
|
var select = 'select[name="'+menu+'"]';
|
|
var size = $(select+' option').length;
|
|
var option = $.cookie(menu)||0;
|
|
if (option >= size) option = size - 1;
|
|
$(select+' option')[option].selected = true;
|
|
$(select).change();
|
|
}
|
|
function toggleChevron(field,action) {
|
|
switch (action) {
|
|
case 0:
|
|
case 1: var view = field; break;
|
|
case 2: var view = $.cookie('enter_view')||0; view++; view = 'view'+view; break;
|
|
case 3: var view = $.cookie('enter_share')||0; view++; view = 'user'+view; break;
|
|
case 4: var view = $.cookie('enter_share')||0; view++; view = 'share'+view; break;
|
|
}
|
|
toggleView(field,false,view);
|
|
var visible = $('.'+view).is(':visible');
|
|
var chevron = visible ? 'fa-chevron-up' : 'fa-chevron-down';
|
|
var remove = visible ? 'fa-chevron-down' : 'fa-chevron-up';
|
|
$('i#'+field).removeClass(remove).addClass(chevron);
|
|
if (action==1) {
|
|
if (visible) toggleCPU(true); else $('.cpu_open').hide();
|
|
} else if (action==2) {
|
|
$('.'+field).toggle();
|
|
}
|
|
}
|
|
function toggleCPU(init) {
|
|
if (!init) {if ($.cookie('cpu')===undefined) $.cookie('cpu','close',{path:'/',expires:3650}); else $.removeCookie('cpu',{path:'/'});}
|
|
if ($.cookie('cpu_view')===undefined) {
|
|
if ($.cookie('cpu')===undefined) {
|
|
$('.cpu_open').show();
|
|
$('.cpu_close').text('Hide details');
|
|
$('.cpu_view').find('td').css('padding-bottom','0');
|
|
} else {
|
|
$('.cpu_open').hide();
|
|
$('.cpu_close').text('Show details');
|
|
$('.cpu_view').find('td').css('padding-bottom','20px');
|
|
}
|
|
} else {
|
|
$('.cpu_open').hide();
|
|
}
|
|
}
|
|
function toggleView(field,init,view) {
|
|
if (!view) view = $.cookie(field)||field;
|
|
if (!init) {if ($.cookie(field)===undefined) $.cookie(field,view,{path:'/',expires:3650}); else $.removeCookie(field,{path:'/'});}
|
|
if ($.cookie(field)===undefined) $('.'+view).show(); else $('.'+view).hide();
|
|
var visible = $('.'+view).is(':visible');
|
|
var unset = true;
|
|
switch (field) {
|
|
case 'users_view':
|
|
visible = $('.user').is(':visible');
|
|
unset = false;
|
|
case 'shares_view':
|
|
if (unset) visible = $('.share').is(':visible');
|
|
case 'array_view':
|
|
case 'cache_view':
|
|
case 'extra_view':
|
|
var on = $('#'+field+'_on');
|
|
var off = $('#'+field+'_off');
|
|
if (visible) {on.show(); off.hide();} else {off.show(); on.hide();}
|
|
break;
|
|
case 'docker_view':
|
|
if (visible) $('span.info.apps').show(); else $('span.info.apps').hide();
|
|
if (init) setTimeout(noApps,200); else noApps();
|
|
break;
|
|
case 'vm_view':
|
|
if (visible) $('span.info.vms').show(); else $('span.info.vms').hide();
|
|
if (init) setTimeout(noVMs,200); else noVMs();
|
|
break;
|
|
}
|
|
if (init) {
|
|
var chevron = visible ? 'fa-chevron-up' : 'fa-chevron-down';
|
|
$('#'+field).addClass(chevron);
|
|
}
|
|
}
|
|
var cpuload = new NchanSubscriber('/sub/cpuload', /^((?!chrome|android).)*safari/i.test(navigator.userAgent) ? {subscriber:'longpoll'} : {});
|
|
cpuload.on('message',function(data) {
|
|
/*
|
|
message should be something like: {"cpuload": {"cpu":[0,0],"cpu0":[0,0],"cpu1":[0,0],"cpu2":[0,0],"cpu3":[0,0]}}
|
|
The array values are [<load-percentage>,<guest-percentage>]. guest-percentage is that part of load-percentage that is being consumed by VM guests
|
|
var json = $.parseJSON(message);
|
|
$.each(json["cpuload"],function(k,v) {
|
|
$('#'+k).animate({width:v[0]+'%'},{step:function(){$('#'+k).css('overflow','visible');}}).text(v[0]+'%');
|
|
});
|
|
*/
|
|
//data is the cpuload.ini file contents
|
|
var ini = parseINI(data);
|
|
$.each(ini,function(k,v) {
|
|
var load = v['host'];
|
|
if (load >= red) var color = 'redbar';
|
|
else if (load >= orange) var color = 'orangebar';
|
|
else var color = '';
|
|
load += '%';
|
|
$('.'+k).text(load);
|
|
$('#'+k).animate({width:load},{step:function(){$('#'+k).css('overflow','visible').removeClass().addClass(color);}});
|
|
});
|
|
});
|
|
$(function() {
|
|
dropdown('enter_share');
|
|
dropdown('enter_view');
|
|
update5();
|
|
update15();
|
|
update60();
|
|
toggleCPU(true);
|
|
toggleView('sys_view',true);
|
|
toggleView('mb_view',true);
|
|
toggleView('cpu_view',true);
|
|
toggleView('mem_view',true);
|
|
toggleView('port_view',true);
|
|
<?if ($fans>0):?>
|
|
toggleView('fan_view',true);
|
|
<?endif;?>
|
|
<?if ($display['dashapps']=='icons' || $display['dashapps']=='docker'):?>
|
|
toggleView('docker_view',true);
|
|
<?endif;?>
|
|
<?if ($display['dashapps']=='icons' || $display['dashapps']=='vms'):?>
|
|
toggleView('vm_view',true);
|
|
<?endif;?>
|
|
toggleView('parity_view',true);
|
|
toggleView('array_view',true);
|
|
toggleView('cache_view',true);
|
|
<?if ($devs):?>
|
|
toggleView('extra_view',true);
|
|
<?endif;?>
|
|
toggleView('users_view',true);
|
|
toggleView('shares_view',true);
|
|
portMenu();
|
|
loadlist(true);
|
|
cpuload.start();
|
|
});
|
|
</script>
|