"; } 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 = "
"; $out .= ""; $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 .= "
"; $out .= ""; $out .= "
"; return $out; } function cache_slots() { global $var; $min = $var['cacheSbNumDisks']; $max = $var['MAX_CACHESZ']; $out = ""; $out .= "
"; $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; } ?>