require_once('Helpers.php');
$path = $_POST['path'];
$width = $_POST['width'];
$var = parse_ini_file("state/var.ini");
$devs = parse_ini_file("state/devs.ini",true);
$disks = parse_ini_file("state/disks.ini",true);
$screen = '/tmp/screen_buffer';
$temps=0; $counts=0; $tot_size=0; $tot_used=0; $tot_free=0; $reads=0; $writes=0; $errors=0;
extract(parse_plugin_cfg("dynamix",true));
function device_info($disk) {
global $path, $width, $var, $display, $screen;
$href = $disk['name'];
if ($href != 'preclear') {
$name = my_disk($href);
$type = $disk['type'];
} else {
$name = $disk['device'];
$type = 'Preclear';
$href = "{$disk['device']}&file=$screen";
}
if ($var['fsState']=='Started' && $type!='Flash' && $type!='Preclear' && strpos($disk['status'], 'DISK_NP')===false) {
$action = strpos($disk['color'],'blink')===false ? "down" : "up";
$ctrl = "";
}
else
$ctrl = "";
$ball = "/webGui/images/{$disk['color']}.png";
switch ($disk['color']) {
case 'green-on': $help = 'Normal operation, device is active'; break;
case 'green-blink': $help = 'Device is in standby mode (spun-down)'; break;
case 'blue-on': $help = ($disk['name']=='preclear' ? 'Unassigned device' : 'New device'); break;
case 'blue-blink': $help = ($disk['name']=='preclear' ? 'Unassigned device, in standby mode' : 'New device, in stadby mode (spun-down)'); break;
case 'yellow-on': $help = ($disk['type']=='Parity' ? 'Parity is invalid' : 'Device contents emulated'); break;
case 'yellow-blink': $help = 'Device contents emulated, in standby mode (spun-down)'; break;
case 'red-on':
case 'red-blink': $help = ($disk['type']=='Parity' ? 'Parity device is disabled' : 'Device is disabled, contents emulated'); break;
case 'red-off': $help = ($disk['type']=='Parity' ? 'Parity device missing' : 'Device is missing (disabled), contents emulated'); break;
case 'grey-off': $help = 'Device not present'; break;
}
switch ($type) {
case 'Flash':
$device = "Flash";
break;
default:
$device = "Device";
break;
}
$status = "
${help}";
$link = strpos($disk['status'], 'DISK_NP')===false ? "$name" : $name;
return $ctrl.$status.$link;
}
function device_browse($disk) {
global $path;
if ($disk['fsStatus']=='Mounted') {
$dir = $disk['name']=="flash" ? "/boot" : "/mnt/{$disk['name']}";
return "
";
}
}
function device_desc($disk) {
global $var;
$size = my_scale($disk['size']*1024, $unit);
return "{$disk['id']} - $size $unit ({$disk['device']})";
}
function assignment($disk) {
global $var, $disks, $devs, $screen;
$out = "
";
}
function render_used_and_free($disk) {
global $display;
if ($disk['type']=='Parity' || $disk['fsStatus']=='-') {
echo " | ";
} else if ($disk['fsStatus']=='Mounted') {
echo "{$disk['fsType']} | ";
echo "".my_scale($disk['fsSize']*1024, $unit)." $unit | ";
switch ($display['text']) {
case 0:
$text1 = true; $text2 = true; break;
case 1: case 2:
$text1 = false; $text2 = false; break;
case 10: case 20:
$text1 = true; $text2 = false; break;
case 11: case 21:
$text1 = false; $text2 = true; break;
}
if ($text1) {
echo "".my_scale($disk['fsUsed']*1024, $unit)." $unit | ";
} else {
$used = $disk['fsSize'] ? 100 - round(100*$disk['fsFree']/$disk['fsSize']) : 0;
echo "".my_scale($disk['fsUsed']*1024, $unit)." $unit | ";
}
if ($text2) {
echo "".my_scale($disk['fsFree']*1024, $unit)." $unit | ";
} else {
$free = $disk['fsSize'] ? round(100*$disk['fsFree']/$disk['fsSize']) : 0;
echo "".my_scale($disk['fsFree']*1024, $unit)." $unit | ";
}
} else {
echo " | {$disk['fsStatus']} | | ";
}
}
function array_offline($disk) {
echo "";
switch ($disk['status']) {
case "DISK_NP":
case "DISK_OK_NP":
case "DISK_NP_DSBL":
echo "| ".device_info($disk)." | ";
echo "".assignment($disk)." | ";
echo " | ";
break;
case "DISK_OK":
case "DISK_INVALID":
case "DISK_DSBL":
case "DISK_DSBL_NEW":
case "DISK_NEW":
echo "".device_info($disk)." | ";
echo "".assignment($disk)." | ";
echo "".my_temp($disk['temp'])." | ";
echo " | ";
break;
case "DISK_NP_MISSING":
echo "".device_info($disk)."Missing | ";
echo "".assignment($disk)."{$disk['idSb']} - ".my_scale($disk['sizeSb']*1024, $unit)." $unit | ";
echo " | ";
break;
case "DISK_WRONG":
echo "".device_info($disk)."Wrong | ";
echo "".assignment($disk)."{$disk['idSb']} - ".my_scale($disk['sizeSb']*1024, $unit)." $unit | ";
echo "".my_temp($disk['temp'])." | ";
echo " | ";
break;
}
echo "
";
}
function array_online($disk) {
global $display, $temps, $counts, $tot_size, $tot_used, $tot_free, $reads, $writes, $errors;
if (is_numeric($disk['temp'])) {
$temps += $disk['temp'];
$counts++;
}
$reads += $disk['numReads'];
$writes += $disk['numWrites'];
$errors += $disk['numErrors'];
if (isset($disk['fsFree']) && $disk['type']!='Parity') {
$disk['fsUsed'] = $disk['fsSize'] - $disk['fsFree'];
$tot_size += $disk['fsSize'];
$tot_free += $disk['fsFree'];
$tot_used += $disk['fsUsed'];
}
echo "";
switch ($disk['status']) {
case "DISK_NP":
// Suppress empty slots to keep device list short
// this actually should be configurable
// echo "| ".device_info($disk)." | ";
// echo "Not installed | ";
// echo " | ";
break;
case "DISK_OK_NP":
echo "".device_info($disk)." | ";
echo "Not Installed | ";
echo " | ";
render_used_and_free($disk);
echo "".device_browse($disk)." | ";
break;
case "DISK_NP_DSBL":
echo "".device_info($disk)." | ";
if ($disk['type']=="Parity") {
echo "Not installed | ";
echo " | ";
} else {
echo "Not installed | ";
echo " | ";
render_used_and_free($disk);
echo "".device_browse($disk)." | ";
}
break;
case "DISK_DSBL":
echo "".device_info($disk)." | ";
echo "".device_desc($disk)." | ";
echo "".my_temp($disk['temp'])." | ";
echo "".my_number($disk['numReads'])." | ";
echo "".my_number($disk['numWrites'])." | ";
echo "".my_number($disk['numErrors'])." | ";
if ($disk['type']=="Parity") {
echo " | ";
} else {
render_used_and_free($disk);
echo "".device_browse($disk)." | ";
}
break;
default:
echo "".device_info($disk)." | ";
echo "".device_desc($disk)." | ";
echo "".my_temp($disk['temp'])." | ";
echo "".my_number($disk['numReads'])." | ";
echo "".my_number($disk['numWrites'])." | ";
echo "".my_number($disk['numErrors'])." | ";
render_used_and_free($disk);
echo "".device_browse($disk)." | ";
break;
}
echo "
";
}
function my_clock($time) {
if (!$time) return 'less than a minute';
$days = floor($time/1440);
$hour = $time/60%24;
$mins = $time%60;
return plus($days,'day',($hour|$mins)==0).plus($hour,'hour',$mins==0).plus($mins,'minute',true);
}
function read_disk($device, $item) {
global $var;
$smart = "/var/local/emhttp/smart/$device";
if (!file_exists($smart) || (time()-filemtime($smart)>=$var['poll_attributes'])) exec("smartctl -n standby -A /dev/$device > $smart");
$temp = exec("awk '/Temperature/{print \$10;exit}' $smart");
switch ($item) {
case 'color': return $temp ? 'blue-on' : 'blue-blink';
case 'temp' : return $temp ? $temp : '*';
}
}
function show_totals($text) {
global $var, $display, $temps, $counts, $tot_size, $tot_used, $tot_free, $reads, $writes, $errors;
echo "";
echo " Total | ";
echo "$text | ";
echo "".($counts>0?my_temp(round($temps/$counts, 1)):'*')." | ";
echo "".my_number($reads)." | ";
echo "".my_number($writes)." | ";
echo "".my_number($errors)." | ";
echo " | ";
if (strstr($text,"Array") && ($var['startMode'] == "Normal")) {
echo "".my_scale($tot_size*1024, $unit)." $unit | ";
switch ($display['text']) {
case 0:
$text1 = true; $text2 = true; break;
case 1: case 2:
$text1 = false; $text2 = false; break;
case 10: case 20:
$text1 = true; $text2 = false; break;
case 11: case 21:
$text1 = false; $text2 = true; break;
}
if ($text1) {
echo "".my_scale($tot_used*1024, $unit)." $unit | ";
} else {
$used = $tot_size ? 100 - round(100*$tot_free/$tot_size) : 0;
echo "".my_scale($tot_used*1024, $unit)." $unit | ";
}
if ($text2) {
echo "".my_scale($tot_free*1024, $unit)." $unit | ";
} else {
$free = $tot_size ? round(100*$tot_free/$tot_size) : 0;
echo "".my_scale($tot_free*1024, $unit)." $unit | ";
}
echo " | ";
}
else
echo " | ";
echo "
";
}
function array_slots() {
global $var;
$min = max($var['sbNumDisks'], 3);
$max = $var['MAX_ARRAYSZ'];
$out = "";
$out .= "";
return $out;
}
function cache_slots() {
global $var;
$min = $var['cacheSbNumDisks'];
$max = $var['MAX_CACHESZ'];
$out = "";
$out .= "";
return $out;
}
switch ($_POST['device']) {
case 'array':
if ($var['fsState']=='Stopped') {
foreach ($disks as $disk) {if ($disk['type']=='Parity') array_offline($disk);}
foreach ($disks as $disk) {if ($disk['type']=='Data') array_offline($disk);}
echo " Slots: | ".array_slots()." | |
";
} else {
foreach ($disks as $disk) {if ($disk['type']=='Parity') array_online($disk);}
foreach ($disks as $disk) {if ($disk['type']=='Data') array_online($disk);}
if ($display['total']) show_totals("Array of ".my_word($var['mdNumDisks'])." devices");
}
break;
case 'flash':
$disk = &$disks['flash'];
$disk['fsUsed'] = $disk['fsSize'] - $disk['fsFree'];
echo "";
echo "| ".device_info($disk)." | ";
echo "".device_desc($disk)." | ";
echo "* | ";
echo "".my_number($disk['numReads'])." | ";
echo "".my_number($disk['numWrites'])." | ";
echo "".my_number($disk['numErrors'])." | ";
render_used_and_free($disk);
echo "".device_browse($disk)." | ";
echo "
";
break;
case 'cache':
if ($var['fsState']=='Stopped') {
foreach ($disks as $disk) {if ($disk['type']=='Cache') array_offline($disk);}
echo " Slots: | ".cache_slots()." | |
";
echo " | |
";
} else {
foreach ($disks as $disk) {if ($disk['type']=='Cache') array_online($disk);}
if ($display['total'] && $var['cacheSbNumDisks']>1) show_totals("Pool of ".my_word($var['cacheNumDevices'])." devices");
}
break;
case 'open':
$status = isset($confirm['preclear']) ? '' : '_NP';
foreach ($devs as $dev) {
$dev['name'] = 'preclear';
$dev['color'] = read_disk($dev['device'], 'color');
$dev['temp'] = read_disk($dev['device'], 'temp');
$dev['status'] = $status;
echo "";
echo "| ".device_info($dev)." | ";
echo "".device_desc($dev)." | ";
echo "".my_temp($dev['temp'])." | ";
if (file_exists("/tmp/preclear_stat_{$dev['device']}")) {
$text = exec("cut -d'|' -f3 /tmp/preclear_stat_{$dev['device']} | sed 's:\^n:\
:g'");
if (strpos($text,'Total time')===false) $text = 'Preclear in progress... '.$text;
echo "$text | ";
} else
echo " | ";
echo "
";
}
break;
case 'parity':
$data = array();
if ($var['mdResync']>0) {
$data[] = my_scale($var['mdResync']*1024, $unit)." $unit";
$data[] = my_clock(floor(($var['currTime']-$var['sbUpdated'])/60));
$data[] = my_scale($var['mdResyncPos']*1024, $unit)." $unit (".number_format(($var['mdResyncPos']/($var['mdResync']/100+1)),1,substr($display['number'],0,1),'')." %)";
$data[] = my_scale($var['mdResyncDb']/$var['mdResyncDt']*1024, $unit, 1)." $unit/sec";
$data[] = my_clock(round(((($var['mdResyncDt']*(($var['mdResync']-$var['mdResyncPos'])/($var['mdResyncDb']/100+1)))/100)/60),0));
$data[] = $var['sbSyncErrs'];
echo implode(';',$data);
}
break;
}
?>