diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 12:39:39 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 12:39:39 +0000 |
commit | 8ca6cc32b2c789a3149861159ad258f2cb9491e3 (patch) | |
tree | 2492de6f1528dd44eaa169a5c1555026d9cb75ec /modules/monitoring/application/views/scripts/partials | |
parent | Initial commit. (diff) | |
download | icingaweb2-upstream.tar.xz icingaweb2-upstream.zip |
Adding upstream version 2.11.4.upstream/2.11.4upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'modules/monitoring/application/views/scripts/partials')
16 files changed, 1010 insertions, 0 deletions
diff --git a/modules/monitoring/application/views/scripts/partials/command/object-command-form.phtml b/modules/monitoring/application/views/scripts/partials/command/object-command-form.phtml new file mode 100644 index 0000000..b4e5a9c --- /dev/null +++ b/modules/monitoring/application/views/scripts/partials/command/object-command-form.phtml @@ -0,0 +1,18 @@ +<?php use Icinga\Data\Filter\Filter; ?> +<div class="controls"> +<?php if (! $this->compact): ?> + <?= $this->tabs ?> +<?php endif ?> +<?php if ($object->getType() === $object::TYPE_HOST) { + echo $this->render('partials/object/host-header.phtml'); + $this->baseFilter = Filter::where('host', $object->host_name); + $this->stats = $object->stats; + echo $this->render('list/components/servicesummary.phtml'); +} else { + echo $this->render('partials/object/service-header.phtml'); +} ?> +<?= $this->render('partials/object/quick-actions.phtml') ?> +</div> +<div class="content object-command"> + <?= $form ?> +</div> diff --git a/modules/monitoring/application/views/scripts/partials/command/objects-command-form.phtml b/modules/monitoring/application/views/scripts/partials/command/objects-command-form.phtml new file mode 100644 index 0000000..8d241ee --- /dev/null +++ b/modules/monitoring/application/views/scripts/partials/command/objects-command-form.phtml @@ -0,0 +1,15 @@ +<div class="controls"> +<?php if (! $this->compact): ?> + <?= $tabs ?> +<?php endif ?> +<?php if (isset($serviceStates)): ?> + <?= $this->render('list/components/servicesummary.phtml') ?> + <?= $this->render('partials/service/objects-header.phtml') ?> +<?php else: ?> + <?= $this->render('list/components/hostssummary.phtml') ?> + <?= $this->render('partials/host/objects-header.phtml') ?> +<?php endif ?> +</div> +<div class="content objects-command"> + <?= $form ?> +</div> diff --git a/modules/monitoring/application/views/scripts/partials/comment/comment-description.phtml b/modules/monitoring/application/views/scripts/partials/comment/comment-description.phtml new file mode 100644 index 0000000..f35680c --- /dev/null +++ b/modules/monitoring/application/views/scripts/partials/comment/comment-description.phtml @@ -0,0 +1,24 @@ +<?php +switch ($comment->type) { + case 'flapping': + $icon = 'flapping'; + $title = $this->translate('Flapping'); + $tooltip = $this->translate('Comment was caused by a flapping host or service'); + break; + case 'comment': + $icon = 'user'; + $title = $this->translate('User Comment'); + $tooltip = $this->translate('Comment was created by an user'); + break; + case 'downtime': + $icon = 'plug'; + $title = $this->translate('Downtime'); + $tooltip = $this->translate('Comment was caused by a downtime'); + break; + case 'ack': + $icon = 'ok'; + $title = $this->translate('Acknowledgement'); + $tooltip = $this->translate('Comment was caused by an acknowledgement'); + break; +} +echo $this->icon($icon, $tooltip, array('class' => 'large-icon')); diff --git a/modules/monitoring/application/views/scripts/partials/comment/comment-detail.phtml b/modules/monitoring/application/views/scripts/partials/comment/comment-detail.phtml new file mode 100644 index 0000000..c603d3c --- /dev/null +++ b/modules/monitoring/application/views/scripts/partials/comment/comment-detail.phtml @@ -0,0 +1,82 @@ +<div class="comment-author"> +<?php if ($comment->objecttype === 'service') { + echo '<span class="service-on">'; + echo sprintf( + $this->translate('%s on %s', 'service on host'), + $this->qlink( + $comment->service_display_name, + 'monitoring/service/show', + [ + 'host' => $comment->host_name, + 'service' => $comment->service_description + ], + [ + 'title' => sprintf( + $this->translate('Show detailed information for service %s on host %s'), + $comment->service_display_name, + $comment->host_display_name + ) + ] + ), + $this->qlink( + $comment->host_display_name, + 'monitoring/host/show', + ['host' => $comment->host_name], + [ + 'title' => sprintf( + $this->translate('Show detailed information for host %s'), + $comment->host_display_name + ) + ] + ) + ); + echo '</span>'; +} else { + echo $this->qlink( + $comment->host_display_name, + 'monitoring/host/show', + array('host' => $comment->host_name), + array( + 'title' => sprintf( + $this->translate('Show detailed information for this comment about host %s'), + $comment->host_display_name + ) + ) + ); +} ?> + <span class="comment-time"> + <?= $this->translate('by') ?> + <?= $this->escape($comment->author) ?> + <?= $this->timeAgo($comment->timestamp) ?> + </span> + <span class="comment-icons" data-base-target="_self"> + <?= $comment->persistent ? $this->icon('attach', 'This comment is persistent') : '' ?> + <?= $comment->expiration ? $this->icon('clock', sprintf( + $this->translate('This comment expires on %s at %s'), + $this->formatDate($comment->expiration), + $this->formatTime($comment->expiration) + )) : '' ?> + <?php if (isset($delCommentForm)) { + // Form is unset if the current user lacks the respective permission + $uniqId = uniqid(); + $buttonId = 'delete-comment-' . $uniqId; + $textId = 'comment-' . $uniqId; + $deleteButton = clone $delCommentForm; + /** @var \Icinga\Module\Monitoring\Forms\Command\Object\DeleteCommentCommandForm $deleteButton */ + $deleteButton->setAttrib('class', $deleteButton->getAttrib('class') . ' remove-action dont-print'); + $deleteButton->populate( + array( + 'comment_id' => $comment->id, + 'comment_is_service' => isset($comment->service_description), + 'comment_name' => $comment->name + ) + ); + $deleteButton->getElement('btn_submit') + ->setAttrib('aria-label', $this->translate('Delete comment')) + ->setAttrib('id', $buttonId) + ->setAttrib('aria-describedby', $buttonId . ' ' . $textId); + echo $deleteButton; + } ?> + </span> +</div> +<?= $this->nl2br($this->markdownLine($comment->comment, isset($textId) ? ['id' => $textId, 'class' => 'caption'] : [ 'class' => 'caption'])) ?> diff --git a/modules/monitoring/application/views/scripts/partials/comment/comment-header.phtml b/modules/monitoring/application/views/scripts/partials/comment/comment-header.phtml new file mode 100644 index 0000000..4472479 --- /dev/null +++ b/modules/monitoring/application/views/scripts/partials/comment/comment-header.phtml @@ -0,0 +1,10 @@ +<table> + <tr> + <td class="icon-col"> + <?= $this->render('partials/comment/comment-description.phtml') ?> + </td> + <td> + <?= $this->render('partials/comment/comment-detail.phtml') ?> + </td> + </tr> +</table> diff --git a/modules/monitoring/application/views/scripts/partials/comment/comments-header.phtml b/modules/monitoring/application/views/scripts/partials/comment/comments-header.phtml new file mode 100644 index 0000000..c4c92da --- /dev/null +++ b/modules/monitoring/application/views/scripts/partials/comment/comments-header.phtml @@ -0,0 +1,32 @@ +<table> + <tbody> + <?php + foreach ($comments as $i => $comment): + if ($i === 5) { + break; + } + ?> + <tr> + <td class="icon-col"> + <?= $this->partial('partials/comment/comment-description.phtml', array('comment' => $comment)) ?> + </td> + <td> + <?= $this->partial('partials/comment/comment-detail.phtml', array('comment' => $comment)) ?> + </td> + </tr> + <?php endforeach ?> + </tbody> +</table> +<?php if ($comments->count() > 5): ?> +<p> + <?= $this->qlink( + sprintf($this->translate('List all %d comments'), $comments->count()), + $listAllLink, + null, + array( + 'data-base-target' => '_next', + 'icon' => 'down-open' + ) + ) ?> +</p> +<?php endif ?> diff --git a/modules/monitoring/application/views/scripts/partials/downtime/downtime-header.phtml b/modules/monitoring/application/views/scripts/partials/downtime/downtime-header.phtml new file mode 100644 index 0000000..dae6caa --- /dev/null +++ b/modules/monitoring/application/views/scripts/partials/downtime/downtime-header.phtml @@ -0,0 +1,101 @@ +<td class="state-col state-<?= $stateName; ?><?= $downtime->is_in_effect ? ' handled' : ''; ?>"> + <?php if ($downtime->start <= time() && ! $downtime->is_in_effect): ?> + <div class="state-label"><?= $this->translate('ENDS', 'Downtime status'); ?></div> + <div class="state-meta"><?= $this->timeUntil($downtime->is_flexible ? $downtime->scheduled_end : $downtime->end, $this->compact, true) ?></div> + <?php else: ?> + <div class="state-label"><?= $downtime->is_in_effect ? $this->translate('EXPIRES', 'Downtime status') : $this->translate('STARTS', 'Downtime status'); ?></div> + <div class="state-meta"><?= $this->timeUntil($downtime->is_in_effect ? $downtime->end : $downtime->start, $this->compact, true) ?></div> + <?php endif; ?> +</td> +<td> + <div class="comment-author"> + <?php if ($isService) { + echo '<span class="service-on">'; + echo sprintf( + $this->translate('%s on %s', 'service on host'), + $this->qlink( + $downtime->service_display_name, + 'monitoring/service/show', + [ + 'host' => $downtime->host_name, + 'service' => $downtime->service_description + ], + [ + 'title' => sprintf( + $this->translate('Show detailed information for service %s on host %s'), + $downtime->service_display_name, + $downtime->host_display_name + ) + ] + ), + $this->qlink( + $downtime->host_display_name, + 'monitoring/host/show', + ['host' => $downtime->host_name], + [ + 'title' => sprintf( + $this->translate('Show detailed information for host %s'), + $downtime->host_display_name + ) + ] + ) + ); + echo '</span>'; + } else { + echo $this->qlink( + $downtime->host_display_name, + 'monitoring/host/show', + array('host' => $downtime->host_name, 'downtime_id' => $downtime->id), + array( + 'title' => sprintf( + $this->translate('Show detailed information for this downtime scheduled for host %s'), + $downtime->host_display_name + ) + ) + ); + } ?> + <span class="comment-time"> + <?= $this->escape(sprintf( + $downtime->is_flexible + ? $this->translate('Flexible downtime by %s') + : $this->translate('Fixed downtime by %s'), + $downtime->author_name + )) ?> + </span> + <?php if (! $downtime->is_in_effect && $downtime->start >= time()): ?> + <span><?= sprintf($this->translate('expires %s'), $this->timeUntil($downtime->is_flexible ? $downtime->scheduled_end : $downtime->end, false, true)) ?></span> + <?php endif ?> + <span class="comment-icons"> + <?php if ($downtime->is_flexible): ?> + <?= $this->icon('magic', $this->translate('This downtime is flexible')); ?> + <?php endif ?> + + <?php if ($downtime->is_in_effect): ?> + <?= $this->icon('plug', $this->translate('This downtime is in effect')); ?> + <?php endif ?> + + <?php if (isset($delDowntimeForm)) { + // Form is unset if the current user lacks the respective permission + $uniqId = uniqid(); + $buttonId = 'delete-downtime-' . $uniqId; + $textId = 'downtime-' . $uniqId; + $deleteButton = clone $delDowntimeForm; + /** @var \Icinga\Module\Monitoring\Forms\Command\Object\DeleteDowntimeCommandForm $deleteButton */ + $deleteButton->setAttrib('class', $deleteButton->getAttrib('class') . ' remove-action dont-print'); + $deleteButton->populate( + array( + 'downtime_id' => $downtime->id, + 'downtime_is_service' => isset($downtime->service_description), + 'downtime_name' => $downtime->name + ) + ); + $deleteButton->getElement('btn_submit') + ->setAttrib('aria-label', $this->translate('Delete downtime')) + ->setAttrib('id', $buttonId) + ->setAttrib('aria-describedby', $buttonId . ' ' . $textId); + echo $deleteButton; + } ?> + </span> + </div> + <?= $this->nl2br($this->markdown($downtime->comment, isset($textId) ? ['id' => $textId] : null)) ?> +</td> diff --git a/modules/monitoring/application/views/scripts/partials/downtime/downtimes-header.phtml b/modules/monitoring/application/views/scripts/partials/downtime/downtimes-header.phtml new file mode 100644 index 0000000..e2582c1 --- /dev/null +++ b/modules/monitoring/application/views/scripts/partials/downtime/downtimes-header.phtml @@ -0,0 +1,40 @@ +<?php +use Icinga\Module\Monitoring\Object\Host; +use Icinga\Module\Monitoring\Object\Service; +?> +<table class="state-table common-table" data-base-target="_next"> + <tbody> + <?php + foreach ($this->downtimes as $i => $downtime): + if ($i > 5) { + break; + } + if ($downtime->objecttype === 'service') { + $this->isService = true; + $this->stateName = Service::getStateText($downtime->service_state); + } else { + $this->isService = false; + $this->stateName = Host::getStateText($downtime->host_state); + } + $this->downtime = $downtime; + $this->displayComment = false; + ?> + <tr> + <?= $this->render('partials/downtime/downtime-header.phtml') ?> + </tr> + <?php endforeach ?> + </tbody> +</table> +<?php if ($downtimes->count() > 5): ?> +<p> + <?= $this->qlink( + sprintf($this->translate('List all %d downtimes'), $downtimes->count()), + $listAllLink, + null, + array( + 'data-base-target' => '_next', + 'icon' => 'down-open' + ) + ) ?> +</p> +<?php endif ?> diff --git a/modules/monitoring/application/views/scripts/partials/event-history.phtml b/modules/monitoring/application/views/scripts/partials/event-history.phtml new file mode 100644 index 0000000..b81c95d --- /dev/null +++ b/modules/monitoring/application/views/scripts/partials/event-history.phtml @@ -0,0 +1,267 @@ +<?php +use Icinga\Module\Monitoring\Object\Host; +use Icinga\Module\Monitoring\Object\Service; +use Icinga\Web\Url; +use Icinga\Web\UrlParams; + +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; +} + +/** @var \Icinga\Module\Monitoring\DataView\EventHistory $history */ +$history->limit($limit * $page); +?> +<div class="content"> +<?php +$dateFormatter = new IntlDateFormatter(setlocale(LC_TIME, 0), IntlDateFormatter::FULL, IntlDateFormatter::NONE); +$lastDate = null; +$flappingMsg = $this->translate('Flapping with a %.2f%% state change rate'); +$rowAction = Url::fromPath('monitoring/event/show'); +?> + <?php foreach ($history->peekAhead() as $event): ?> +<?php if ($lastDate === null): ?> + <table class="table-row-selectable state-table" data-base-target="_next"> + <tbody> +<?php endif; + $icon = ''; + $iconTitle = null; + $isService = isset($event->service_description); + $msg = $event->output; + $stateName = 'no-state'; + + $rowAction->setParams(new UrlParams())->addParams(array( + 'type' => $event->type, + 'id' => $event->id + )); + switch ($event->type) { + case substr($event->type, 0, 13) === 'notification_': + $rowAction->setParam('type', 'notify'); + $icon = 'bell'; + switch (substr($event->type, 13)) { + case 'state': + $iconTitle = $this->translate('State notification', 'tooltip'); + $label = $this->translate('NOTIFICATION'); + $stateName = $isService ? Service::getStateText($event->state) : Host::getStateText($event->state); + break; + case 'ack': + $iconTitle = $this->translate('Ack Notification', 'tooltip'); + $label = $this->translate('ACK NOTIFICATION'); + break; + case 'dt_start': + $iconTitle = $this->translate('Downtime start notification', 'tooltip'); + $label = $this->translate('DOWNTIME START NOTIFICATION'); + break; + case 'dt_end': + $iconTitle = $this->translate('Downtime end notification', 'tooltip'); + $label = $this->translate('DOWNTIME END NOTIFICATION'); + break; + case 'flapping': + $iconTitle = $this->translate('Flapping notification', 'tooltip'); + $label = $this->translate('FLAPPING NOTIFICATION'); + break; + case 'flapping_end': + $iconTitle = $this->translate('Flapping end notification', 'tooltip'); + $label = $this->translate('FLAPPING END NOTIFICATION'); + break; + case 'custom': + $iconTitle = $this->translate('Custom notification', 'tooltip'); + $label = $this->translate('CUSTOM NOTIFICATION'); + break; + } + $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-empty'; + $iconTitle = $this->translate('Comment', 'tooltip'); + $label = $this->translate('COMMENT'); + break; + case 'comment_deleted': + $icon = 'cancel'; + $iconTitle = $this->translate('Comment removed', 'tooltip'); + $label = $this->translate('COMMENT DELETED'); + break; + case 'ack': + $icon = 'ok'; + $iconTitle = $this->translate('Acknowledged', 'tooltip'); + $label = $this->translate('ACKNOWLEDGED'); + break; + case 'ack_deleted': + $icon = 'ok'; + $iconTitle = $this->translate('Acknowledgement removed', 'tooltip'); + $label = $this->translate('ACKNOWLEDGEMENT REMOVED'); + break; + case 'dt_comment': + $icon = 'plug'; + $iconTitle = $this->translate('Downtime scheduled', 'tooltip'); + $label = $this->translate('SCHEDULED DOWNTIME'); + break; + case 'dt_comment_deleted': + $icon = 'plug'; + $iconTitle = $this->translate('Downtime removed', 'tooltip'); + $label = $this->translate('DOWNTIME DELETED'); + break; + case 'flapping': + $icon = 'flapping'; + $iconTitle = $this->translate('Flapping started', 'tooltip'); + $label = $this->translate('FLAPPING'); + $msg = sprintf($flappingMsg, $msg); + break; + case 'flapping_deleted': + $icon = 'flapping'; + $iconTitle = $this->translate('Flapping stopped', 'tooltip'); + $label = $this->translate('FLAPPING STOPPED'); + $msg = sprintf($flappingMsg, $msg); + break; + case 'hard_state': + if ((int) $event->state === 0) { + $icon = 'thumbs-up'; + } else { + $icon = 'warning-empty'; + } + $iconTitle = $this->translate('Hard state', 'tooltip'); + $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': + $icon = 'spinner'; + $iconTitle = $this->translate('Soft state', 'tooltip'); + $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'; + $iconTitle = $this->translate('Downtime started', 'tooltip'); + $label = $this->translate('DOWNTIME START'); + break; + case 'dt_end': + $icon = 'plug'; + $iconTitle = $this->translate('Downtime ended', 'tooltip'); + $label = $this->translate('DOWNTIME END'); + break; + } ?> + <?php + $currentDate = $dateFormatter->format($event->timestamp); + if ($currentDate !== $lastDate): + $lastDate = $currentDate; + ?> + <tr> + <th colspan="2"><?= $currentDate ?></th> + </tr> + <?php endif ?> + <tr href="<?= $rowAction ?>"> + <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->formatTime($event->timestamp) ?></div> + </td> + <td> + <div class="history-message-container"> + <?php if ($icon): ?> + <div class="history-message-icon"> + <?= $this->icon($icon, $iconTitle) ?> + </div> + <?php endif ?> + <div class="history-message-output"> + <?php if ($this->isOverview): ?> + <?php if ($isService) { + echo '<span class="service-on">'; + echo sprintf( + $this->translate('%s on %s', 'service on host'), + $this->qlink( + $event->service_display_name, + 'monitoring/service/show', + [ + 'host' => $event->host_name, + 'service' => $event->service_description + ], + [ + 'title' => sprintf( + $this->translate('Show detailed information for service %s on host %s'), + $event->service_display_name, + $event->host_display_name + ) + ] + ), + $this->qlink( + $event->host_display_name, + 'monitoring/host/show', + ['host' => $event->host_name], + [ + 'title' => sprintf( + $this->translate('Show detailed information for host %s'), + $event->host_display_name + ) + ] + ) + ); + echo '</span>'; + } else { + echo $this->qlink( + $event->host_display_name, + 'monitoring/host/show', + ['host' => $event->host_name], + [ + 'title' => sprintf( + $this->translate('Show detailed information for host %s'), + $event->host_display_name + ) + ] + ); + } ?> + <?php endif ?> + <?= $this->nl2br($this->createTicketLinks($this->markdown($msg, ['class' => 'overview-plugin-output']))) ?> + </div> + </div> + </td> + </tr> + <?php endforeach ?> +<?php if ($lastDate !== null): ?> + </tbody> + </table> +<?php endif ?> +<?php if ($history->hasMore()): ?> + <div class="action-links"> + <?php if ($this->compact) { + echo $this->qlink( + $this->translate('Show More'), + $url->without(array('showCompact', 'limit')), + null, + array( + 'class' => 'action-link', + 'data-base-target' => '_next' + ) + ); + } else { + echo $this->qlink( + $this->translate('Load More'), + $url->setAnchor('page-' . ($page + 1)), + array('page' => $page + 1,), + array('class' => 'action-link') + ); + } ?> + </div> +<?php endif ?> +</div> diff --git a/modules/monitoring/application/views/scripts/partials/host/objects-header.phtml b/modules/monitoring/application/views/scripts/partials/host/objects-header.phtml new file mode 100644 index 0000000..48141e2 --- /dev/null +++ b/modules/monitoring/application/views/scripts/partials/host/objects-header.phtml @@ -0,0 +1,41 @@ +<?php +use Icinga\Module\Monitoring\Object\Host; + +if (! ($hostCount = count($objects))): return; endif ?> +<table class="state-table host-detail-state"> +<tbody> +<?php foreach ($objects as $i => $host): /** @var Host $host */ + if ($i === 5) { + break; + } ?> + <tr> + <td class="state-col state-<?= Host::getStateText($host->host_state); ?><?= $host->host_handled ? ' handled' : '' ?>"> + <span class="sr-only"><?= Host::getStateText($host->host_state) ?></span> + <div class="state-meta"> + <?= $this->timeSince($host->host_last_state_change, $this->compact) ?> + </div> + </td> + <td> + <?= $this->link()->host( + $host->host_name, + $host->host_display_name + ) ?> + <?= $this->hostFlags($host) ?> + </td> + </tr> +<?php endforeach ?> +</tbody> +</table> +<?php if ($hostCount > 5): ?> +<div class="hosts-link"> + <?= $this->qlink( + sprintf($this->translate('List all %d hosts'), $hostCount), + $this->url()->setPath('monitoring/list/hosts'), + null, + array( + 'data-base-target' => '_next', + 'icon' => 'forward' + ) + ) ?> +</div> +<?php endif ?> diff --git a/modules/monitoring/application/views/scripts/partials/object/detail-content.phtml b/modules/monitoring/application/views/scripts/partials/object/detail-content.phtml new file mode 100644 index 0000000..62bfd2c --- /dev/null +++ b/modules/monitoring/application/views/scripts/partials/object/detail-content.phtml @@ -0,0 +1,53 @@ +<div class="content" data-base-target="_next"> + <?= $this->render('show/components/output.phtml') ?> + <?= $this->render('show/components/grapher.phtml') ?> + <?= $this->render('show/components/extensions.phtml') ?> + + <h2><?= $this->translate('Problem handling') ?></h2> + <table class="name-value-table"> + <tbody> + <?= $this->render('show/components/acknowledgement.phtml') ?> + <?= $this->render('show/components/comments.phtml') ?> + <?= $this->render('show/components/downtime.phtml') ?> + <?= $this->render('show/components/notes.phtml') ?> + <?= $this->render('show/components/actions.phtml') ?> + <?= $this->render('show/components/flapping.phtml') ?> + <?php if ($object->type === 'service'): ?> + <?= $this->render('show/components/servicegroups.phtml') ?> + <?php else: ?> + <?= $this->render('show/components/hostgroups.phtml') ?> + <?php endif ?> + </tbody> + </table> + + <?= $this->render('show/components/perfdata.phtml') ?> + + <h2><?= $this->translate('Notifications') ?></h2> + <table class="name-value-table"> + <tbody> + <?= $this->render('show/components/notifications.phtml') ?> + <?php if ($this->hasPermission('*') || ! $this->hasPermission('no-monitoring/contacts')): ?> + <?= $this->render('show/components/contacts.phtml') ?> + <?php endif ?> + </tbody> + </table> + + <h2><?= $this->translate('Check execution') ?></h2> + <table class="name-value-table"> + <tbody> + <?= $this->render('show/components/command.phtml') ?> + <?= $this->render('show/components/checksource.phtml') ?> + <?= $this->render('show/components/reachable.phtml') ?> + <?= $this->render('show/components/checkstatistics.phtml') ?> + <?= $this->render('show/components/checktimeperiod.phtml') ?> + </tbody> + </table> + + <?php if (! empty($object->customvars)): ?> + <h2><?= $this->translate('Custom Variables') ?></h2> + <div id="<?= $object->type ?>-customvars" data-visible-height="200" class="collapsible"> + <?= (new \Icinga\Module\Monitoring\Web\Widget\CustomVarTable($object->customvarsWithOriginalNames, $object)) ?> + </div> + <?php endif ?> + <?= $this->render('show/components/flags.phtml') ?> +</div> diff --git a/modules/monitoring/application/views/scripts/partials/object/host-header.phtml b/modules/monitoring/application/views/scripts/partials/object/host-header.phtml new file mode 100644 index 0000000..4de4a01 --- /dev/null +++ b/modules/monitoring/application/views/scripts/partials/object/host-header.phtml @@ -0,0 +1,51 @@ +<?php +use Icinga\Module\Monitoring\Object\Host; +use Icinga\Web\Url; + +/** @var Host $object */ + +$url = Url::fromRequest(); +$linkHostName = ! ($url->getPath() === 'monitoring/host/show' && $url->getParam('host') === $object->host_name); +?> +<table class="state-table host-detail-state"> + <tr> + <td class="state-col state-<?= Host::getStateText($object->host_state) ?><?= $object->host_handled ? ' handled' : '' ?>"> + <div class="state-header"><?= Host::getStateText($object->host_state, true) ?></div> + <div class="state-meta"> + <?= $this->timeSince($object->host_last_state_change) ?> + <?php if ((int) $object->host_state > 0 && (int) $object->host_state_type === 0): ?> + <div><?= $this->translate('Soft', 'Soft state') ?> <?= $object->host_attempt ?></div> + <?php endif ?> + </div> + </td> + <td> + <?= $this->iconImage()->host($object) ?> + <?php + if ($linkHostName) { + echo '<a href="' . Url::fromPath('monitoring/host/show', array('host' => $object->host_name)) . '">'; + } + ?> + <span class="selectable"><strong><?= $this->escape($object->host_display_name) ?></strong></span> + <?php if ($object->host_display_name !== $object->host_name): ?> + <span class="selectable host-meta">(<?= $this->escape($object->host_name) ?>)</span> + <?php endif ?> + <?php + if ($linkHostName) { + echo '</a>'; + } + ?> + <?php if ($object->host_alias !== $object->host_display_name && $object->host_alias !== $object->host_name): ?> + <div class="selectable host-meta"> + <?= $this->escape($this->translate('Alias', 'host') . ': ' . $object->host_alias) ?> + </div> + <?php endif ?> + <?= $this->hostFlags($object) ?> + <?php if ($object->host_address6 && $object->host_address6 !== $object->host_name): ?> + <div class="selectable host-meta" title="<?= $this->translate('IPv6 address') ?>"><?= $this->escape($object->host_address6) ?></div> + <?php endif ?> + <?php if ($object->host_address && $object->host_address !== $object->host_name): ?> + <div class="selectable host-meta" title="<?= $this->translate('IPv4 address') ?>"><?= $this->escape($object->host_address) ?></div> + <?php endif ?> + </td> + </tr> +</table> diff --git a/modules/monitoring/application/views/scripts/partials/object/quick-actions.phtml b/modules/monitoring/application/views/scripts/partials/object/quick-actions.phtml new file mode 100644 index 0000000..fe05a84 --- /dev/null +++ b/modules/monitoring/application/views/scripts/partials/object/quick-actions.phtml @@ -0,0 +1,144 @@ +<div class="quick-actions"> + <ul class="nav tab-nav"> + <?php if (isset($removeAckForm)): ?> + <li> + <?php + $removeAckForm = clone $removeAckForm; + $removeAckForm->setAttrib('id', 'quickAction_' . $removeAckForm->getName()); // Avoids id duplication + $removeAckForm->setLabelEnabled(true); + echo $removeAckForm; + ?> + </li> + <?php elseif /** @var \Icinga\Module\Monitoring\Object\MonitoredObject $object */ ($this->hasPermission('monitoring/command/acknowledge-problem') && ! (in_array((int) $object->state, array(0, 99))) ): ?> + <li> + <?php if ($object->getType() === $object::TYPE_HOST) { + echo $this->qlink( + $this->translate('Acknowledge'), + 'monitoring/host/acknowledge-problem', + array('host' => $object->getName()), + array( + 'class' => 'action-link', + 'data-base-target' => '_self', + 'icon' => 'edit', + 'title' => $this->translate( + 'Acknowledge this problem, suppress all future notifications for it and tag it as being handled' + ) + ) + ); + } else { + echo $this->qlink( + $this->translate('Acknowledge'), + 'monitoring/service/acknowledge-problem', + array('host' => $object->getHost()->getName(), 'service' => $object->getName()), + array( + 'class' => 'action-link', + 'data-base-target' => '_self', + 'icon' => 'edit', + 'title' => $this->translate( + 'Acknowledge this problem, suppress all future notifications for it and tag it as being handled' + ) + ) + ); + } ?> + </li> + <?php endif ?> + <?php if (isset($checkNowForm)): // Form is unset if the current user lacks the respective permission ?> + <?php ($checkNowForm = clone $checkNowForm)->setAttrib('id', 'quickAction_' . $checkNowForm->getName()); // Avoids id duplication ?> + <li><?= $checkNowForm ?></li> + <?php endif ?> + <?php if ($this->hasPermission('monitoring/command/comment/add')): ?> + <li> + <?php if ($object->getType() === $object::TYPE_HOST) { + echo $this->qlink( + $this->translate('Comment'), + 'monitoring/host/add-comment', + array('host' => $object->getName()), + array( + 'class' => 'action-link', + 'data-base-target' => '_self', + 'icon' => 'comment-empty', + 'title' => $this->translate('Add a new comment to this host') + ) + ); + } else { + echo $this->qlink( + $this->translate('Comment'), + 'monitoring/service/add-comment', + array('host' => $object->getHost()->getName(), 'service' => $object->getName()), + array( + 'class' => 'action-link', + 'data-base-target' => '_self', + 'icon' => 'comment-empty', + 'title' => $this->translate('Add a new comment to this service') + ) + ); + } ?> + </li> + <?php endif ?> + <?php if ($this->hasPermission('monitoring/command/send-custom-notification')): ?> + <li> + <?php if ($object->getType() === $object::TYPE_HOST) { + echo $this->qlink( + $this->translate('Notification'), + 'monitoring/host/send-custom-notification', + array('host' => $object->getName()), + array( + 'class' => 'action-link', + 'data-base-target' => '_self', + 'icon' => 'bell', + 'title' => $this->translate( + 'Send a custom notification to contacts responsible for this host' + ) + ) + ); + } else { + echo $this->qlink( + $this->translate('Notification'), + 'monitoring/service/send-custom-notification', + array('host' => $object->getHost()->getName(), 'service' => $object->getName()), + array( + 'class' => 'action-link', + 'data-base-target' => '_self', + 'icon' => 'bell', + 'title' => $this->translate( + 'Send a custom notification to contacts responsible for this service' + ) + ) + ); + } ?> + </li> + <?php endif ?> + <?php if ($this->hasPermission('monitoring/command/downtime/schedule')): ?> + <li><?php if ($object->getType() === $object::TYPE_HOST) { + echo $this->qlink( + $this->translate('Downtime'), + 'monitoring/host/schedule-downtime', + array('host' => $object->getName()), + array( + 'class' => 'action-link', + 'data-base-target' => '_self', + 'icon' => 'plug', + 'title' => $this->translate( + 'Schedule a downtime to suppress all problem notifications within a specific period of time' + ) + ) + ); + } else { + echo $this->qlink( + $this->translate('Downtime'), + 'monitoring/service/schedule-downtime', + array('host' => $object->getHost()->getName(), 'service' => $object->getName()), + array( + 'class' => 'action-link', + 'data-base-target' => '_self', + 'icon' => 'plug', + 'title' => $this->translate( + 'Schedule a downtime to suppress all problem notifications within a specific period of time' + ) + ) + ); + } ?> + </li> + <?php endif ?> + </ul> +</div> diff --git a/modules/monitoring/application/views/scripts/partials/object/service-header.phtml b/modules/monitoring/application/views/scripts/partials/object/service-header.phtml new file mode 100644 index 0000000..318fe49 --- /dev/null +++ b/modules/monitoring/application/views/scripts/partials/object/service-header.phtml @@ -0,0 +1,72 @@ +<?php +use Icinga\Module\Monitoring\Object\Host; +use Icinga\Module\Monitoring\Object\Service; +use Icinga\Web\Url; + +/** @var \Icinga\Module\Monitoring\Object\MonitoredObject $object */ + +$url = Url::fromRequest(); +$linkServiceName = ! ($url->getPath() === 'monitoring/service/show' && $url->getParam('service') === $object->service_description); +?> +<table class="state-table service-detail-state"> + <tr> + <td class="state-col state-<?= Host::getStateText($object->host_state) ?><?= $object->host_handled ? ' handled' : '' ?>"> + <div class="state-label"><?= Host::getStateText($object->host_state, true) ?></div> + <div class="state-meta"> + <?= $this->timeSince($object->host_last_state_change) ?> + <?php if ((int) $object->host_state > 0 && (int) $object->host_state_type === 0): ?> + <div><?= $this->translate('Soft', 'Soft state') ?> <?= $object->host_attempt ?></div> + <?php endif ?> + </div> + </td> + <td> + <?= $this->iconImage()->host($object) ?> + <a href="<?= Url::fromPath('monitoring/host/show', array('host' => $object->host_name)) ?>"> + <span class="selectable"><strong><?= $this->escape($object->host_display_name) ?></strong></span> + <?php if ($object->host_display_name !== $object->host_name): ?> + <span class="selectable host-meta">(<?= $this->escape($object->host_name) ?>)</span> + <?php endif ?> + </a> + <?= $this->hostFlags($object) ?> + <?php if ($object->host_address6 && $object->host_address6 !== $object->host_name): ?> + <div class="selectable host-meta" title="<?= $this->translate('IPv6 address') ?>"><?= $this->escape($object->host_address6) ?></div> + <?php endif ?> + <?php if ($object->host_address && $object->host_address !== $object->host_name): ?> + <div class="selectable host-meta" title="<?= $this->translate('IPv4 address') ?>"><?= $this->escape($object->host_address) ?></div> + <?php endif ?> + </td> + </tr> + <tr> + <td class="state-col state-<?= Service::getStateText($object->service_state) ?><?= $object->service_handled ? ' handled' : '' ?>"> + <div class="state-label"><?= Service::getStateText($object->service_state, true) ?></div> + <div class="state-meta"> + <?= $this->timeSince($object->service_last_state_change) ?> + <?php if ((int) $object->service_state > 0 && (int) $object->service_state_type === 0): ?> + <div><?= $this->translate('Soft', 'Soft state') ?> <?= $object->service_attempt ?></div> + <?php endif ?> + </div> + </td> + <td> + <?= $this->iconImage()->service($object) ?> + <?= $this->translate('Service') ?>: + <?php + if ($linkServiceName) { + echo '<a href="' . Url::fromPath('monitoring/service/show', array( + 'host' => $object->host_name, + 'service' => $object->service_description + )) . '">'; + } + ?> + <span class="selectable"><strong><?= $this->escape($object->service_display_name) ?></strong></span> + <?php if ($object->service_display_name !== $object->service_description): ?> + <span class="selectable service-meta">(<?= $this->escape($object->service_description) ?>)</span> + <?php endif ?> + <?php + if ($linkServiceName) { + echo '</a>'; + } + ?> + <?= $this->serviceFlags($object) ?> + </td> + </tr> +</table> diff --git a/modules/monitoring/application/views/scripts/partials/service/objects-header.phtml b/modules/monitoring/application/views/scripts/partials/service/objects-header.phtml new file mode 100644 index 0000000..d342d87 --- /dev/null +++ b/modules/monitoring/application/views/scripts/partials/service/objects-header.phtml @@ -0,0 +1,45 @@ +<?php +use Icinga\Module\Monitoring\Object\Host; +use Icinga\Module\Monitoring\Object\Service; + +if (! ($serviceCount = count($objects))): return; endif ?> +<table class="state-table service-detail-state"> +<tbody> +<?php foreach ($objects as $i => $service): /** @var Service $service */ + if ($i === 5) { + break; + } ?> + <tr> + <td class="state-col state-<?= Service::getStateText($service->service_state) ?><?= $service->service_handled ? ' handled' : '' ?>"> + <span class="sr-only"><?= Service::getStateText($service->service_state) ?></span> + <div class="state-meta"> + <?= $this->timeSince($service->service_last_state_change, $this->compact) ?> + </div> + </td> + <td> + <?= $this->link()->service( + $service->service_description, + $service->service_display_name, + $service->host_name, + $service->host_display_name + . ($service->host_state != 0 ? ' (' . Host::getStateText($service->host_state, true) . ')' : '') + ) ?> + <?= $this->serviceFlags($service) ?> + </td> + </tr> +<?php endforeach ?> +</tbody> +</table> +<?php if ($serviceCount > 5): ?> +<div class="services-link"> + <?= $this->qlink( + sprintf($this->translate('List all %d services'), $serviceCount), + $this->url()->setPath('monitoring/list/services'), + null, + array( + 'data-base-target' => '_next', + 'icon' => 'forward' + ) + ) ?> +</div> +<?php endif ?> diff --git a/modules/monitoring/application/views/scripts/partials/show-more.phtml b/modules/monitoring/application/views/scripts/partials/show-more.phtml new file mode 100644 index 0000000..fd6a99d --- /dev/null +++ b/modules/monitoring/application/views/scripts/partials/show-more.phtml @@ -0,0 +1,15 @@ +<?php +/** @var \Icinga\Module\Monitoring\DataView\DataView $dataView */ +if ($dataView->hasMore()): ?> +<div class="text-right"> + <?= $this->qlink( + $this->translate('Show More'), + $this->url()->without(array('showCompact', 'limit')), + null, + array( + 'data-base-target' => '_next', + 'class' => 'action-link' + ) + ) ?> +</div> +<?php endif ?> |