protected function getContent($action)
{
$html = '';
// Generate content by action ...
switch ($action) {
case self::ACTION_DASHBOARD:
$time = time();
$data = $this->aggregateStatistics($this->getHosts());
$data['grade'] = $data['bytes'] * 100 / $data['limit_maxbytes'];
if ($data['grade'] >= $this->getConfig()->cluster->thresholds->notice) {
if ($data['grade'] < $this->getConfig()->cluster->thresholds->warning) {
// is notice
$thumbColor = self::CLUSTER_HEALTH_NOTICE_COLOR;
$thumbMessage = $this->renderString(self::CLUSTER_HEALTH_NOTICE_MESSAGE, array('clusterName' => $this->getConfig()->cluster->name));
} elseif ($data['grade'] < $this->getConfig()->cluster->thresholds->error) {
// is warning
$thumbColor = self::CLUSTER_HEALTH_WARNING_COLOR;
$thumbMessage = $this->renderString(self::CLUSTER_HEALTH_WARNING_MESSAGE, array('clusterName' => $this->getConfig()->cluster->name));
} else {
// is error
$thumbColor = self::CLUSTER_HEALTH_ERROR_COLOR;
$thumbMessage = $this->renderString(self::CLUSTER_HEALTH_ERROR_MESSAGE, array('clusterName' => $this->getConfig()->cluster->name));
}
} else {
$thumbColor = self::CLUSTER_HEALTH_TOP_COLOR;
$thumbMessage = $this->renderString(self::CLUSTER_HEALTH_TOP_MESSAGE, array('clusterName' => $this->getConfig()->cluster->name));
}
$this->defaultTemplateVariables['thumbColor'] = $thumbColor;
$this->defaultTemplateVariables['thumbMessage'] = $thumbMessage;
// Convert units for some values ...
$data['limit_maxmbytes'] = $data['limit_maxbytes'] / 1024 / 1024;
$data['starttime'] = date(self::DEFAULT_DATEFORMAT, $time - $data['uptime']) . '.000Z';
// Request data
$hitsGet = $data['get_hits'];
$missesGet = $data['get_misses'];
$hitsDelete = $data['delete_hits'];
$missesDelete = $data['delete_misses'];
$hitsIncr = $data['incr_hits'];
$missesIncr = $data['incr_misses'];
$hitsDecr = $data['decr_hits'];
$missesDecr = $data['decr_misses'];
$hitsCas = $data['cas_hits'];
$missesCas = $data['cas_misses'];
$hits = $hitsGet + $hitsDelete + $hitsIncr + $hitsDecr + $hitsCas;
$misses = $missesGet + $missesDelete + $missesIncr + $missesDecr + $missesCas;
$factorSecond = $data['uptime'];
$factorMinute = $factorSecond / 60;
$factorHour = $factorMinute / 60;
$factorDay = $factorHour / 24;
$sets = $data['cmd_set'];
$requestRateSeconds = sprintf('%.2f', ($hits + $misses) / $factorSecond);
$hitRateSeconds = sprintf('%.2f', $hits / $factorSecond);
$missesRateSeconds = sprintf('%.2f', $misses / $factorSecond);
$setRateSeconds = sprintf('%.2f', $sets / $factorSecond);
$requestRateMinutes = sprintf('%.2f', ($hits + $misses) / $factorMinute);
$hitRateMinutes = sprintf('%.2f', $hits / $factorMinute);
$missesRateMinutes = sprintf('%.2f', $misses / $factorMinute);
$setRateMinutes = sprintf('%.2f', $sets / $factorMinute);
$requestRateHours = sprintf('%.2f', ($hits + $misses) / $factorHour);
$hitRateHours = sprintf('%.2f', $hits / $factorHour);
$missesRateHours = sprintf('%.2f', $misses / $factorHour);
$setRateHours = sprintf('%.2f', $sets / $factorHour);
$requestRateDays = sprintf('%.2f', ($hits + $misses) / $factorDay);
$hitRateDays = sprintf('%.2f', $hits / $factorDay);
$missesRateDays = sprintf('%.2f', $misses / $factorDay);
$setRateDays = sprintf('%.2f', $sets / $factorDay);
$data['seconds'] = array('requestRate' => $requestRateSeconds, 'hitRate' => $hitRateSeconds, 'missesRate' => $missesRateSeconds, 'setRate' => $setRateSeconds);
$data['minutes'] = array('requestRate' => $requestRateMinutes, 'hitRate' => $hitRateMinutes, 'missesRate' => $missesRateMinutes, 'setRate' => $setRateMinutes);
$data['hours'] = array('requestRate' => $requestRateHours, 'hitRate' => $hitRateHours, 'missesRate' => $missesRateHours, 'setRate' => $setRateHours);
$data['days'] = array('requestRate' => $requestRateDays, 'hitRate' => $hitRateDays, 'missesRate' => $missesRateDays, 'setRate' => $setRateDays);
$seconds = '[';
foreach ($data['seconds'] as $key => $value) {
$seconds .= ($value !== null && $value !== false ? $value : '0') . ',';
}
$seconds .= ']';
$minutes = '[';
foreach ($data['minutes'] as $key => $value) {
$minutes .= ($value !== null && $value !== false ? $value : '0') . ',';
}
$minutes .= ']';
$hours = '[';
foreach ($data['hours'] as $key => $value) {
$hours .= ($value !== null && $value !== false ? $value : '0') . ',';
}
$hours .= ']';
$days = '[';
foreach ($data['days'] as $key => $value) {
$days .= ($value !== null && $value !== false ? $value : '0') . ',';
}
$days .= ']';
$data['seconds'] = $seconds;
$data['minutes'] = $minutes;
$data['hours'] = $hours;
$data['days'] = $days;
$data['latestVersion'] = '';
$data['latestVersionHeight'] = 40;
if ($this->getConfig()->updatecheck === true) {
try {
$version = $this->getMemcachedLatestVersion();
} catch (Exception $e) {
$this->setInfo($e->getMessage());
$version = '1.0.0';
}
if ($version !== '1.0.0' && $version < $data['version']) {
$data['latestVersion'] = '<span class="label label-danger pull-right"><b><a href="https://code.google.com/p/memcached/wiki/ReleaseNotes' . str_replace('.', '', $version) . '" style="color: #fff;" target="_blank">' . $version . ' available</a></b></span>';
$data['latestVersionHeight'] = 60;
}
}
$hits = array('get' => $hitsGet, 'delete' => $hitsDelete, 'incr' => $hitsIncr, 'decr' => $hitsDecr, 'cas' => $hitsCas);
$misses = array('get' => $missesGet, 'delete' => $missesDelete, 'incr' => $missesIncr, 'decr' => $missesDecr, 'cas' => $missesCas);
$hitsJson = '[';
foreach ($hits as $key => $value) {
$hitsJson .= ($value !== null && $value !== false ? $value : '0') . ',';
}
$hitsJson = rtrim($hitsJson, ',') . ']';
$missesJson = '[';
foreach ($misses as $key => $value) {
$missesJson .= ($value !== null && $value !== false ? $value : '0') . ',';
}
$missesJson = rtrim($missesJson, ',') . ']';
$data['requestHits'] = $hitsJson;
$data['requestMisses'] = $missesJson;
/**
* Render subcontent for settings table
*/
$subcontent = '';
$settings = $this->getSettings($this->getActiveHost());
$template = $this->loadTemplates('content-host-dashboard-settings-entity');
foreach ($settings as $setting => $value) {
$templateVariables = array('key' => $setting, 'value' => $value);
$subcontent .= $this->renderTemplate($template, $templateVariables);
}
$data['subcontent'] = $subcontent;
$template = $this->loadTemplates('content-cluster-dashboard-environment');
$html .= $this->renderTemplate($template, $data);
break;
case self::ACTION_HOST_DETAILS:
$time = time();
$data = $this->aggregateStatistics(array($this->getActiveHost()));
// Convert units for some values ...
$data['limit_maxmbytes'] = $data['limit_maxbytes'] / 1024 / 1024;
$data['starttime'] = date(self::DEFAULT_DATEFORMAT, $time - $data['uptime']) . '.000Z';
// Request data
$hitsGet = $data['get_hits'];
$missesGet = $data['get_misses'];
$hitsDelete = $data['delete_hits'];
$missesDelete = $data['delete_misses'];
$hitsIncr = $data['incr_hits'];
$missesIncr = $data['incr_misses'];
$hitsDecr = $data['decr_hits'];
$missesDecr = $data['decr_misses'];
$hitsCas = $data['cas_hits'];
$missesCas = $data['cas_misses'];
$hits = $hitsGet + $hitsDelete + $hitsIncr + $hitsDecr + $hitsCas;
$misses = $missesGet + $missesDelete + $missesIncr + $missesDecr + $missesCas;
$factorSecond = $data['uptime'];
$factorMinute = $factorSecond / 60;
$factorHour = $factorMinute / 60;
$factorDay = $factorHour / 24;
$sets = $data['cmd_set'];
$requestRateSeconds = sprintf('%.2f', ($hits + $misses) / $factorSecond);
$hitRateSeconds = sprintf('%.2f', $hits / $factorSecond);
$missesRateSeconds = sprintf('%.2f', $misses / $factorSecond);
$setRateSeconds = sprintf('%.2f', $sets / $factorSecond);
$requestRateMinutes = sprintf('%.2f', ($hits + $misses) / $factorMinute);
$hitRateMinutes = sprintf('%.2f', $hits / $factorMinute);
$missesRateMinutes = sprintf('%.2f', $misses / $factorMinute);
$setRateMinutes = sprintf('%.2f', $sets / $factorMinute);
$requestRateHours = sprintf('%.2f', ($hits + $misses) / $factorHour);
$hitRateHours = sprintf('%.2f', $hits / $factorHour);
$missesRateHours = sprintf('%.2f', $misses / $factorHour);
$setRateHours = sprintf('%.2f', $sets / $factorHour);
$requestRateDays = sprintf('%.2f', ($hits + $misses) / $factorDay);
$hitRateDays = sprintf('%.2f', $hits / $factorDay);
$missesRateDays = sprintf('%.2f', $misses / $factorDay);
$setRateDays = sprintf('%.2f', $sets / $factorDay);
$data['seconds'] = array('requestRate' => $requestRateSeconds, 'hitRate' => $hitRateSeconds, 'missesRate' => $missesRateSeconds, 'setRate' => $setRateSeconds);
$data['minutes'] = array('requestRate' => $requestRateMinutes, 'hitRate' => $hitRateMinutes, 'missesRate' => $missesRateMinutes, 'setRate' => $setRateMinutes);
$data['hours'] = array('requestRate' => $requestRateHours, 'hitRate' => $hitRateHours, 'missesRate' => $missesRateHours, 'setRate' => $setRateHours);
$data['days'] = array('requestRate' => $requestRateDays, 'hitRate' => $hitRateDays, 'missesRate' => $missesRateDays, 'setRate' => $setRateDays);
$seconds = '[';
foreach ($data['seconds'] as $key => $value) {
$seconds .= ($value !== null && $value !== false ? $value : '0') . ',';
}
$seconds .= ']';
$minutes = '[';
foreach ($data['minutes'] as $key => $value) {
$minutes .= ($value !== null && $value !== false ? $value : '0') . ',';
}
$minutes .= ']';
$hours = '[';
foreach ($data['hours'] as $key => $value) {
$hours .= ($value !== null && $value !== false ? $value : '0') . ',';
}
$hours .= ']';
$days = '[';
foreach ($data['days'] as $key => $value) {
$days .= ($value !== null && $value !== false ? $value : '0') . ',';
}
$days .= ']';
$data['seconds'] = $seconds;
$data['minutes'] = $minutes;
$data['hours'] = $hours;
$data['days'] = $days;
$data['latestVersion'] = '';
$data['latestVersionHeight'] = 40;
if ($this->getConfig()->updatecheck === true) {
try {
$version = $this->getMemcachedLatestVersion();
} catch (Exception $e) {
$this->setInfo($e->getMessage());
$version = '1.0.0';
}
if ($version !== '1.0.0' && $version < $data['version']) {
$data['latestVersion'] = '<span class="label label-danger pull-right"><b><a href="https://code.google.com/p/memcached/wiki/ReleaseNotes' . str_replace('.', '', $version) . '" style="color: #fff;" target="_blank">' . $version . ' available</a></b></span>';
$data['latestVersionHeight'] = 60;
}
}
$hits = array('get' => $hitsGet, 'delete' => $hitsDelete, 'incr' => $hitsIncr, 'decr' => $hitsDecr, 'cas' => $hitsCas);
$misses = array('get' => $missesGet, 'delete' => $missesDelete, 'incr' => $missesIncr, 'decr' => $missesDecr, 'cas' => $missesCas);
$hitsJson = '[';
foreach ($hits as $key => $value) {
$hitsJson .= ($value !== null && $value !== false ? $value : '0') . ',';
}
$hitsJson = rtrim($hitsJson, ',') . ']';
$missesJson = '[';
foreach ($misses as $key => $value) {
$missesJson .= ($value !== null && $value !== false ? $value : '0') . ',';
}
$missesJson = rtrim($missesJson, ',') . ']';
$data['requestHits'] = $hitsJson;
$data['requestMisses'] = $missesJson;
/**
* Render subcontent for settings table
*/
$subcontent = '';
$settings = $this->getSettings($this->getActiveHost());
$template = $this->loadTemplates('content-host-dashboard-settings-entity');
foreach ($settings as $setting => $value) {
$templateVariables = array('key' => $setting, 'value' => $value);
$subcontent .= $this->renderTemplate($template, $templateVariables);
}
$data['subcontent'] = $subcontent;
$template = $this->loadTemplates('content-host-dashboard-environment');
$html .= $this->renderTemplate($template, $data);
$template = $this->loadTemplates('content-host-dashboard-stored-keys');
$html .= $this->renderTemplate($template, $data);
$template = $this->loadTemplates('content-host-dashboard-memory');
$html .= $this->renderTemplate($template, $data);
$template = $this->loadTemplates('content-host-dashboard-requests');
$html .= $this->renderTemplate($template, $data);
$template = $this->loadTemplates('content-host-dashboard-average-load');
$html .= $this->renderTemplate($template, $data);
$template = $this->loadTemplates('content-host-dashboard-settings');
$html .= $this->renderTemplate($template, $data);
break;
case self::ACTION_DASHBOARD:
/*
// Output only on dashboard
if ($this->getAction() < 2) {
$template .= '<li class="list-group-item"><span class="badge">' . count($this->getHosts()) . ' </span>Hosts</li>';
}
*/
break;
case self::ACTION_DATA_MANAGEMENT:
$entityHtml = $this->loadTemplates('content-data-management-entity');
$host = $this->getActiveHost(true);
$entries = $this->dumpEntries($host[0], $host[1], null, true);
// Iterate the entries and generate one block of HTML per entry! each with own controls
foreach ($entries as $key => $data) {
$data['valueType'] = ucfirst(gettype($data['value']));
if (is_array($data['value']) === true || is_object($data['value']) === true) {
$data['bytes'] = sizeof($data['value']);
$data['value'] = var_export($data['value'], true);
} elseif (is_int($data['value']) === true || is_double($data['value']) === true) {
$data['bytes'] = 2;
} else {
$data['bytes'] = strlen($data['value']);
}
$data['bytes'] = number_format($data['bytes'], 0, ',', '.');
// Format FLAGS
$flags = decbin($data['flags']);
$flags = str_pad($flags, self::UINT_32, 0, STR_PAD_LEFT);
$flags = str_split($flags, 16);
$flags = 'UINT 32-bit' . "\n" . implode('↵' . PHP_EOL, $flags) . '↵';
$data['flags'] = $data['flags'] . ' <span title="' . $flags . '" data-placement="bottom" class="tooltips pull-right"><span class="text-muted glyphicon glyphicon-eye-open"></span></span>';
// Format CAS
$cas = decbin($data['cas']);
$cas = str_pad($cas, self::UINT_64, 0, STR_PAD_LEFT);
$cas = str_split($cas, 16);
$cas = 'UINT 64-bit' . "\n" . implode('↵' . PHP_EOL, $cas) . '↵';
$data['cas'] = $data['cas'] . ' <span title="' . $cas . '" data-placement="bottom" class="tooltips pull-right"><span class="text-muted glyphicon glyphicon-eye-open"></span></span>';
switch ($data['valueType']) {
case 'String':
$data['buttons'] = $this->getDeleteButtonHtml($data['key']) . $this->getEditButtonHtml($data['key'], $data['value']) . $this->getAppendButtonHtml($data['key']) . $this->getPrependButtonHtml($data['key']);
break;
case 'Double':
$data['buttons'] = $this->getDeleteButtonHtml($data['key']) . $this->getEditButtonHtml($data['key'], $data['value']);
break;
case 'Integer':
$data['buttons'] = $this->getDeleteButtonHtml($data['key']) . $this->getEditButtonHtml($data['key'], $data['value']) . $this->getDecrementButtonHtml($data['key']) . $this->getIncrementButtonHtml($data['key']);
break;
default:
$data['buttons'] = $this->getDeleteButtonHtml($data['key']);
break;
}
$html .= $this->renderTemplate($entityHtml, $data);
}
break;
default:
// Intentionally left blank
break;
}
return $html;
}