monitoring: Fix host and service detail history style

fixes #10317
This commit is contained in:
Eric Lippmann 2015-11-03 10:37:34 +01:00
parent 9385196d39
commit 55f0863649
4 changed files with 162 additions and 316 deletions

View File

@ -1,166 +0,0 @@
<?php
use Icinga\Module\Monitoring\Object\Host;
use Icinga\Module\Monitoring\Object\Service;
function contactsLink($match, $view) {
$links = array();
foreach (preg_split('/,\s/', $match[1]) as $contact) {
$links[] = $view->qlink(
$contact,
'monitoring/show/contact',
array('contact_name' => $contact),
array('title' => sprintf($view->translate('Show detailed information about %s'), $contact))
);
}
return '[' . implode(', ', $links) . ']';
}
$self = $this;
$url = $this->url();
$limit = (int) $url->getParam('limit', 25);
if (! $url->hasParam('page') || ($page = (int) $url->getParam('page')) < 1) {
$page = 1;
}
$history->limit($limit * $page);
if (! $this->compact): ?>
<div class="controls">
<?= $this->tabs; ?>
<?= $this->render('partials/object/host-header.phtml'); ?>
<h1><?= $this->translate('This Host\'s Event History'); ?></h1>
<?= $this->sortBox; ?>
<?= $this->limiter; ?>
<a href="#load-more">
<?= $this->translate('Scroll to the bottom of this page to load additional events'); ?>
</a>
<?= $this->filterEditor; ?>
</div>
<?php endif ?>
<div class="content">
<table data-base-target="_next" class="action objecthistory">
<tbody>
<?php foreach ($history->peekAhead() as $event): ?>
<?php
$stateClass = 'invalid';
$msg = $this->escape($event->output);
$isService = isset($event->service_description);
switch ($event->type) {
case 'notify':
$icon = 'notification';
$title = $this->translate('Notification');
$stateClass = $isService ? Service::getStateText($event->state) : Host::getStateText($event->state);
$msg = $msg ? preg_replace_callback(
'/^\[([^\]]+)\]/',
function($match) use ($self) { return contactsLink($match, $self); },
$msg
) : $this->translate('This notification was not sent out to any contact.');
break;
case 'comment':
$icon = 'comment';
$title = $this->translate('Comment');
break;
case 'comment_deleted':
$icon = 'remove';
$title = $this->translate('Comment deleted');
break;
case 'ack':
$icon = 'acknowledgement';
$title = $this->translate('Acknowledge');
break;
case 'ack_deleted':
$icon = 'remove';
$title = $this->translate('Ack removed');
break;
case 'dt_comment':
$icon = 'in_downtime';
$title = $this->translate('In Downtime');
break;
case 'dt_comment_deleted':
$icon = 'remove';
$title = $this->translate('Downtime removed');
break;
case 'flapping':
$icon = 'flapping';
$title = $this->translate('Flapping');
break;
case 'flapping_deleted':
$icon = 'remove';
$title = $this->translate('Flapping stopped');
break;
case 'hard_state':
$stateClass = $isService ? Service::getStateText($event->state) : Host::getStateText($event->state);
$icon = 'attention-alt';
$title = $isService ? Service::getStateText($event->state) : Host::getStateText($event->state);
break;
case 'soft_state':
$icon = 'spinner';
$stateClass = $isService ? Service::getStateText($event->state) : Host::getStateText($event->state);
$title = $isService ? Service::getStateText($event->state) : Host::getStateText($event->state);
break;
case 'dt_start':
$icon = 'downtime_start';
$title = $this->translate('Downtime Start');
break;
case 'dt_end':
$icon = 'downtime_end';
$title = $this->translate('Downtime End');
break;
}
?>
<tr>
<td class="state-col state-<?= $stateClass; ?>">
<?php if ($history->getIteratorPosition() % $limit === 0): ?>
<a id="page-<?= $history->getIteratorPosition() / $limit + 1; ?>"></a>
<?php endif ?>
<strong><?= $this->escape($title); ?></strong>
<p><?= date('d.m. H:i', $event->timestamp); ?></p>
</td>
<td>
<?php if ($isService): ?>
<?= sprintf(
$this->translate('%s on %s', 'Service running on host'),
$this->qlink(
$event->service_display_name,
'monitoring/service/show',
array(
'host' => $event->host_name,
'service' => $event->service_description
),
array('title' => sprintf(
$this->translate('Show detailed information for service %s on host %s'),
$event->service_display_name,
$event->host_display_name
))
),
$event->host_display_name
) ?>
<?php else: ?>
<?= $this->escape($event->host_name); ?>
<?php endif ?>
<p class="plugin-output">
<?= $this->icon($icon, $title); ?> <?= $this->createTicketLinks($msg) ?>
</p>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php if (! $history->hasResult()): ?>
<?= $this->translate('No history events found matching the filter'); ?>
<?php elseif ($history->hasMore()): ?>
<?= $this->qlink(
$this->translate('Load More'),
$url->setAnchor('page-' . ($page + 1)),
array(
'page' => $page + 1,
),
array(
'id' => 'load-more',
'class' => 'pull-right action-link'
)
); ?>
<?php endif ?>
</div>

View File

@ -0,0 +1,161 @@
<?php
use Icinga\Module\Monitoring\Object\Host;
use Icinga\Module\Monitoring\Object\Service;
function contactsLink($match, $view) {
$links = array();
foreach (preg_split('/,\s/', $match[1]) as $contact) {
$links[] = $view->qlink(
$contact,
'monitoring/show/contact',
array('contact_name' => $contact),
array('title' => sprintf($view->translate('Show detailed information about %s'), $contact))
);
}
return '[' . implode(', ', $links) . ']';
}
$self = $this;
$url = $this->url();
$limit = (int) $url->getParam('limit', 25);
if (! $url->hasParam('page') || ($page = (int) $url->getParam('page')) < 1) {
$page = 1;
}
$history->limit($limit * $page);
if (! $this->compact): ?>
<div class="controls separated">
<?= $this->tabs ?>
<?php if ($object->type === 'service') {
echo $this->render('partials/object/service-header.phtml');
} else {
echo $this->render('partials/object/host-header.phtml');
} ?>
</div>
<?php endif ?>
<div class="content">
<?php if (! $history->hasResult()): ?>
<p><?= $this->translate('No historical events found matching the filter.') ?></p>
</div>
<?php return; endif ?>
<table data-base-target="_next">
<tbody>
<?php foreach ($history->peekAhead() as $event):
$icon = '';
$iconCssClass = '';
$isService = isset($event->service_description);
$msg = $event->output;
$stateName = 'no-state';
switch ($event->type) {
case 'notify':
$icon = 'bell-alt';
$label = $this->translate('NOTIFICATION');
$msg = $msg ? preg_replace_callback(
'/^\[([^\]]+)\]/',
function($match) use ($self) { return contactsLink($match, $self); },
$msg
) : $this->translate('This notification was not sent out to any contact.');
$stateName = $isService ? Service::getStateText($event->state) : Host::getStateText($event->state);
break;
case 'comment':
$icon = 'comment';
$label = $this->translate('COMMENT');
break;
case 'comment_deleted':
$icon = 'cancel';
$label = $this->translate('COMMENT DELETED');
break;
case 'ack':
$icon = 'ok';
$label = $this->translate('ACKNOWLEDGED');
break;
case 'ack_deleted':
$icon = 'ok';
$iconCssClass = 'icon-strikethrough';
$label = $this->translate('ACKNOWLEDGEMENT REMOVED');
break;
case 'dt_comment':
// TODO(el): Does not appear in history
$icon = 'plug';
$label = $this->translate('SCHEDULED DOWNTIME');
break;
case 'dt_comment_deleted':
// TODO(el): Does not appear in history
$icon = 'plug';
$iconCssClass = 'icon-strikethrough';
$label = $this->translate('DOWNTIME DELETED');
break;
case 'flapping':
// TODO(el): Icon
$label = $this->translate('FLAPPING');
break;
case 'flapping_deleted':
// TODO(el): Icon
$label = $this->translate('FLAPPING STOPPED');
break;
case 'hard_state':
$label = $isService ? Service::getStateText($event->state, true) : Host::getStateText($event->state, true);
$stateName = $isService ? Service::getStateText($event->state) : Host::getStateText($event->state);
break;
case 'soft_state':
$label = $isService ? Service::getStateText($event->state, true) : Host::getStateText($event->state, true);
$stateName = $isService ? Service::getStateText($event->state) : Host::getStateText($event->state);
break;
case 'dt_start':
$icon = 'plug';
$label = $this->translate('DOWNTIME START');
break;
case 'dt_end':
$icon = 'plug';
$iconCssClass = 'icon-strikethrough';
$label = $this->translate('DOWNTIME END');
break;
} ?>
<tr>
<td class="state-col state-<?= $stateName ?>">
<?php if ($history->getIteratorPosition() % $limit === 0): ?>
<a id="page-<?= $history->getIteratorPosition() / $limit + 1 ?>"></a>
<?php endif ?>
<div class="state-label"><?= $this->escape($label) ?></div>
<div class="state-meta"><?= $this->timeAgo($event->timestamp, $this->compact) ?></div>
</td>
<td>
<?php if ($icon) {
echo $this->icon($icon, null, $iconCssClass ? array('class' => $iconCssClass) : array());
} ?>
<?= $this->escape($event->host_name) ?><?php if ($isService): ?>&#58;
<?= $this->qlink(
$event->service_display_name,
'monitoring/service/show',
array(
'host' => $event->host_name,
'service' => $event->service_description
),
array('title' => sprintf(
$this->translate('Show detailed information for service %s on host %s'),
$event->service_display_name,
$event->host_display_name
))
) ?>
<?php endif ?>
<p class="overview-plugin-output">
<?= nl2br($this->createTicketLinks($this->escape($msg)), false) ?>
</p>
</td>
</tr>
<?php endforeach ?>
</tbody>
</table>
<?php if ($history->hasMore()): ?>
<div class="action-links">
<?= $this->qlink(
$this->translate('Load More'),
$url->setAnchor('page-' . ($page + 1)),
array('page' => $page + 1,),
array('class' => 'action-link')
) ?>
</div>
<?php endif ?>
</div>

View File

@ -1,150 +0,0 @@
<?php
use Icinga\Module\Monitoring\Object\Service;
function contactsLink($match, $view) {
$links = array();
foreach (preg_split('/,\s/', $match[1]) as $contact) {
$links[] = $view->qlink(
$contact,
'monitoring/show/contact',
array('contact_name' => $contact),
array('title' => sprintf($view->translate('Show detailed information about %s'), $contact))
);
}
return '[' . implode(', ', $links) . ']';
}
$self = $this;
$url = $this->url();
$limit = (int) $url->getParam('limit', 25);
if (! $url->hasParam('page') || ($page = (int) $url->getParam('page')) < 1) {
$page = 1;
}
$history->limit($limit * $page);
if (! $this->compact): ?>
<div class="controls">
<?= $this->tabs; ?>
<?= $this->render('partials/object/service-header.phtml'); ?>
<h1><?= $this->translate('This Service\'s Event History'); ?></h1>
<?= $this->sortBox; ?>
<?= $this->limiter; ?>
<a href="#load-more">
<?= $this->translate('Scroll to the bottom of this page to load additional events'); ?>
</a>
<?= $this->filterEditor; ?>
</div>
<?php endif ?>
<div class="content">
<table data-base-target="_next" class="action objecthistory">
<tbody>
<?php foreach ($history->peekAhead() as $event): ?>
<?php
$stateClass = 'invalid';
$msg = $this->escape($event->output);
switch ($event->type) {
case 'notify':
$icon = 'notification';
$title = $this->translate('Notification');
$stateClass = Service::getStateText($event->state);
$msg = $msg ? preg_replace_callback(
'/^\[([^\]]+)\]/',
function($match) use ($self) { return contactsLink($match, $self); },
$msg
) : $this->translate('This notification was not sent out to any contact.');
break;
case 'comment':
$icon = 'comment';
$title = $this->translate('Comment');
break;
case 'comment_deleted':
$icon = 'remove';
$title = $this->translate('Comment deleted');
break;
case 'ack':
$icon = 'acknowledgement';
$title = $this->translate('Acknowledge');
break;
case 'ack_deleted':
$icon = 'remove';
$title = $this->translate('Ack removed');
break;
case 'dt_comment':
$icon = 'in_downtime';
$title = $this->translate('In Downtime');
break;
case 'dt_comment_deleted':
$icon = 'remove';
$title = $this->translate('Downtime removed');
break;
case 'flapping':
$icon = 'flapping';
$title = $this->translate('Flapping');
break;
case 'flapping_deleted':
$icon = 'remove';
$title = $this->translate('Flapping stopped');
break;
case 'hard_state':
$stateClass = Service::getStateText($event->state);
$icon = 'attention-alt';
$title = Service::getStateText($event->state);
break;
case 'soft_state':
$icon = 'spinner';
$stateClass = Service::getStateText($event->state);
$title = Service::getStateText($event->state);
break;
case 'dt_start':
$icon = 'downtime_start';
$title = $this->translate('Downtime Start');
break;
case 'dt_end':
$icon = 'downtime_end';
$title = $this->translate('Downtime End');
break;
}
?>
<tr class="state <?= $stateClass; ?>">
<td class="state">
<?php if ($history->getIteratorPosition() % $limit === 0): ?>
<a id="page-<?= $history->getIteratorPosition() / $limit + 1; ?>"></a>
<?php endif ?>
<strong><?= $this->escape($title); ?></strong>
<br>
<?= date('d.m. H:i', $event->timestamp); ?>
</td>
<td>
<?= sprintf(
$this->translate('%s on %s', 'Service running on host'),
$this->escape($event->service_display_name),
$event->host_display_name
) ?>
<br>
<div>
<?= $this->icon($icon, $title); ?> <?= $this->createTicketLinks($msg) ?>
</div>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php if (! $history->hasResult()): ?>
<?= $this->translate('No history events found matching the filter'); ?>
<?php elseif ($history->hasMore()): ?>
<?= $this->qlink(
$this->translate('Load More'),
$url->setAnchor('page-' . ($page + 1)),
array(
'page' => $page + 1,
),
array(
'id' => 'load-more',
'class' => 'pull-right action-link'
)
); ?>
<?php endif ?>
</div>

View File

@ -108,6 +108,7 @@ abstract class MonitoredObjectController extends Controller
$this->setupLimitControl(50);
$this->setupPaginationControl($this->view->history, 50);
$this->view->object = $this->object;
$this->render('object/detail-history', null, true);
}
/**