Merge branch 'feature/main-detail-design-4823'

resolves #4823
This commit is contained in:
Eric Lippmann 2013-10-14 12:58:12 +02:00
commit cc80440aea
19 changed files with 519 additions and 264 deletions

View File

@ -112,10 +112,12 @@ class ActionController extends Zend_Controller_Action
$url = substr($url, strlen($this->getRequest()->getBaseUrl()));
// the host is mandatory, but ignored in Zend
$req = new Request('http://ignoredhost/' . $url);
$req->setBaseUrl($this->getRequest()->getBaseUrl());
$router = Zend_Controller_Front::getInstance()->getRouter();
$router->route($req);
Zend_Controller_Front::getInstance()->setRequest($req);
$detailHtml = $this->view->action($req->getActionName(), $req->getControllerName(), $req->getModuleName());
Zend_Controller_Front::getInstance()->setRequest($this->getRequest());
$this->_helper->layout->assign('detailContent', $detailHtml);
$this->_helper->layout->assign('detailClass', 'col-sm-12 col-xs-12 col-md-12 col-lg-6');
$this->_helper->layout->assign('mainClass', 'col-sm-12 col-xs-12 col-md-12 col-lg-6');

View File

@ -96,6 +96,13 @@ class Tab implements Widget
*/
private $iconCls = null;
/**
* Additional a tag attributes
*
* @var array
*/
private $tagParams;
/**
* Sets an icon image for this tab
*
@ -166,6 +173,16 @@ class Tab implements Widget
$this->urlParams = $urlParams;
}
/**
* Set additional a tag attributes
*
* @param array $tagParams
*/
public function setTagParams(array $tagParams)
{
$this->tagParams = $tagParams;
}
/**
* Create a new Tab with the given properties
*
@ -215,7 +232,13 @@ class Tab implements Widget
}
if ($this->url !== null) {
$this->url->overwriteParams($this->urlParams);
$tab = '<a href="' . $this->url->getAbsoluteUrl() . '">' . $caption . '</a>';
$tagParams = '';
if ($this->tagParams !== null) {
foreach ($this->tagParams as $key => $value) {
$tagParams .= ' ' . $key . '="' . $value . '"';
}
}
$tab = '<a' . $tagParams .' href="' . $this->url->getAbsoluteUrl() . '">' . $caption . '</a>';
} else {
$tab = $caption;
}

View File

@ -31,7 +31,7 @@
use \Icinga\Application\Benchmark;
use \Icinga\Data\Db\Query;
use \Icinga\File\Csv;
use \Icinga\Web\Controller\ActionController;
use \Icinga\Module\Monitoring\Controller as MonitoringController;
use \Icinga\Web\Hook;
use \Icinga\Web\Widget\Tabextension\DashboardAction;
use \Icinga\Web\Widget\Tabextension\OutputFormat;
@ -47,7 +47,7 @@ use Icinga\Module\Monitoring\DataView\Contactgroup as ContactgroupView;
use Icinga\Module\Monitoring\DataView\HostAndServiceStatus as HostAndServiceStatusView;
use Icinga\Module\Monitoring\DataView\Comment as CommentView;
class Monitoring_ListController extends ActionController
class Monitoring_ListController extends MonitoringController
{
/**
* The backend used for this controller
@ -137,39 +137,7 @@ class Monitoring_ListController extends ActionController
public function servicesAction()
{
$this->compactView = 'services-compact';
$query = HostAndServiceStatusView::fromRequest(
$this->_request,
array(
'host_name',
'host_state',
'host_state_type',
'host_last_state_change',
'host_address',
'host_handled',
'service_description',
'service_display_name',
'service_state' => 'service_state',
'service_in_downtime',
'service_acknowledged',
'service_handled',
'service_output',
'service_last_state_change' => 'service_last_state_change',
'service_icon_image',
'service_long_output',
'service_is_flapping',
'service_state_type',
'service_handled',
'service_severity',
'service_last_check',
'service_notifications_enabled',
'service_action_url',
'service_notes_url',
'service_last_comment',
'service_active_checks_enabled',
'service_passive_checks_enabled'
)
)->getQuery();
$this->view->services = $query->paginate();
$this->view->services = $this->fetchServices();
$this->setupSortControl(array(
'service_last_check' => 'Last Service Check',
'service_severity' => 'Severity',
@ -182,7 +150,6 @@ class Monitoring_ListController extends ActionController
'host_address' => 'Host Address',
'host_last_check' => 'Last Host Check'
));
$this->handleFormatRequest($query);
}
/**

View File

@ -28,7 +28,7 @@
// @codingStandardsIgnoreStart
use \Icinga\Module\Monitoring\Backend;
use \Icinga\Web\Controller\ActionController;
use Icinga\Module\Monitoring\Controller as MonitoringController;
use \Icinga\Web\Hook;
use \Icinga\Module\Monitoring\Object\Host;
use \Icinga\Module\Monitoring\Object\Service;
@ -43,7 +43,7 @@ use \Icinga\Web\Widget\Tabs;
*
* Actions for show context
*/
class Monitoring_ShowController extends ActionController
class Monitoring_ShowController extends MonitoringController
{
/**
* @var Backend
@ -86,7 +86,6 @@ class Monitoring_ShowController extends ActionController
public function serviceAction()
{
$this->view->object->prefetch();
$this->view->object->eventHistory = $this->view->object->eventHistory->limit(10)->fetchAll();
$this->view->preserve = array();
}
@ -96,14 +95,27 @@ class Monitoring_ShowController extends ActionController
public function hostAction()
{
$this->view->object->prefetch();
$this->view->object->eventHistory = $this->view->object->eventHistory->limit(10)->fetchAll();
$this->view->preserve = array();
}
public function historyAction()
{
$this->view->object->fetchEventHistory();
$this->view->history = $this->view->object->eventHistory->limit(10)->paginate();
}
public function servicesAction()
{
$params = $this->_request->getParams();
unset($params['service']);
$this->view->services = $this->fetchServices($params);
}
/**
* History entries for objects
*/
public function historyAction()
/* public function historyAction()
{
$this->view->history = $this->backend->select()
->from(
@ -130,7 +142,7 @@ class Monitoring_ShowController extends ActionController
$this->view->preserve['sort'] = $this->_getParam('sort');
}
$this->view->preserve = $this->view->history->getAppliedFilter()->toParams();
}
}*/
/**
* Creating tabs for this controller
@ -140,26 +152,66 @@ class Monitoring_ShowController extends ActionController
{
$object = $this->view->object;
$tabs = $this->getTabs();
if (!$this->view->host) {
return $tabs;
}
$params = array(
'host' => $this->view->host->host_name,
'host' => $object->host_name,
);
if ($backend = $this->_getParam('backend')) {
$params['backend'] = $backend;
}
if ($object instanceof Service) {
$params['service'] = $object->service_description;
} elseif ($service = $this->_getParam('service')) {
$params['service'] = $service;
}
if (isset($params['service'])) {
$tabs->add(
'service',
array(
'title' => 'Service',
'icon' => '',
'url' => 'monitoring/show/service',
'urlParams' => $params,
'tagParams' => array(
'data-icinga-target' => 'detail'
)
)
);
}
$tabs->add(
'host',
array(
'title' => 'Host',
'icon' => '',
'url' => 'monitoring/show/host',
'urlParams' => $params,
'tagParams' => array(
'data-icinga-target' => 'detail'
)
)
);
$tabs->add(
'services',
array(
'title' => 'Services',
'icon' => 'img/classic/service.png',
'url' => 'monitoring/show/services',
'urlParams' => $params,
'tagParams' => array(
'data-icinga-target' => 'detail'
)
)
);
$tabs->add(
'history',
array(
'title' => 'History',
'icon' => '',
'url' => 'monitoring/show/history',
'urlParams' => $params,
'tagParams' => array(
'data-icinga-target' => 'detail'
)
)
);
$tabs->extend(new OutputFormat())
->extend(new DashboardAction())
->extend(new BasketAction);
return $tabs;
->extend(new DashboardAction());
}
}
// @codingStandardsIgnoreEnd

View File

@ -8,7 +8,7 @@ $viewHelper = $this->getHelper('MonitoringState');
<div data-icinga-component="app/mainDetailGrid">
<?= $this->sortControl->render($this); ?>
<?= $this->paginationControl($this->services, null, null, array('preserve' => $this->preserve)); ?>
<?= $this->paginationControl($services, null, null, array('preserve' => $this->preserve)); ?>
<table class="table table-condensed">
<thead>

View File

@ -1,29 +1,19 @@
<?php if (!empty($object->comments)): ?>
<?
$commets = array();
foreach ($object->comments as $comment) {
$text = $this->escape($comment->comment_data);
$commets[] = sprintf(
'[%s] %s (%s): %s',
$this->escape($comment->comment_author),
$this->format()->timeSince($comment->comment_timestamp),
$comment->comment_type,
$text
);
}
?>
<?php endif; ?>
<div class="panel panel-default ">
<div class="panel-heading">
<span>{{COMMENT_ICON}} Comments</span>
</div>
<div class="panel-body">
<a href="#" class="button">{{COMMENT_COMMAND_BUTTON}}</a>
<a href="#" class="button">{{NOTIFICATION_COMMAND_BUTTON}}</a><br/>
<?php if (!empty($object->comments)): ?>
<blockquote> <?= implode('<br />', $commets); ?><a href="#" class="button">{{REMOVE_COMMENT_COMMAND}}</a></blockquote>
<?php else: ?>
No comments
<?php endif; ?>
</div>
<div>
Comments
<?php if (!empty($object->comments)): ?>
<blockquote>
<?php foreach ($object->comments as $comment): ?>
<p>
<?= sprintf(
'[%s] %s (%s): %s',
$this->escape($comment->comment_author),
$this->format()->timeSince($comment->comment_timestamp),
$comment->comment_type,
$comment->comment_data
); ?>
<a href="#" class="button">{{REMOVE_ICON}}</a>
</p>
<?php endforeach; ?>
</blockquote>
<?php endif; ?>
</div>

View File

@ -1,103 +0,0 @@
<?php if (!empty($object->eventHistory)): ?>
<div class="panel panel-default">
<div class="panel-heading">
<span>History</span>
</div>
<div class="panel-body">
<table class="table table-condensed">
<tbody>
<?php foreach ($object->eventHistory as $event): ?>
<tr>
<td><?= date('d.m. H:i', $event->timestamp); ?></td>
<td>
<?php if ($object instanceof Icinga\Module\Monitoring\Object\Service): ?>
<a href="<?= $this->href('monitoring/show/service', array(
'host' => $object->host_name,
'service' => $event->service_description
)); ?>">
<?= $event->service_description ?>
</a>
<?php else: ?>
<a href="<?= $this->href('monitoring/show/host', array(
'host' => $object->host_name
)); ?>">
<?= $event->host_name ?>
</a>
<?php endif; ?>
</td>
<td>
<?php
switch ($event->type) {
case 'notify':
$icon = '{{NOTIFICATION_ICON}}';
$title = 'Notification';
$msg = $event->output;
break;
case 'comment':
$icon = '{{COMMENT_ICON}}';
$title = 'Comment';
$msg = $event->output;
break;
case 'ack':
$icon = '{{ACKNOWLEDGEMENT_ICON}}';
$title = 'Acknowledgement';
$msg = '';
break;
case 'dt_comment':
$icon = '{{IN_DOWNTIME_ICON}}';
$title = 'In Downtime';
$msg = $event->output;
break;
case 'flapping':
$icon = '{{FLAPPING_ICON}}';
$title = 'Flapping';
$msg = '';
break;
case 'hard_state':
$icon = '{{HARDSTATE_ICON}}';
$title = 'Hard State';
$msg = '[' . $event->attempt . '/' . $event->max_attempts . ']';
break;
case 'soft_state':
$icon = '{{SOFTSTATE_ICON}}';
$title = 'Soft State';
$msg = '[' . $event->attempt . '/' . $event->max_attempts . ']';
break;
case 'dt_start':
$icon = '{{DOWNTIME_START_ICON}}';
$title = 'Downtime Start';
$msg = $event->output;
break;
case 'dt_end':
$icon = '{{DOWNTIME_END_ICON}}';
$title = 'Downtime End';
$msg = $event->output;
break;
}
?>
<a href="#" title="<?= $title ?>"><i><?= $icon ?></i></a>
<?php if (!empty($msg)) { echo $msg; } ?>
</td>
</tr>
<? endforeach; ?>
</tbody>
</table>
<?php if ($object instanceof Icinga\Module\Monitoring\Object\Service): ?>
<a href="<?= $this->href('monitoring/list/eventhistory', array(
'host' => $object->host_name,
'service' => $object->service_description
)); ?>">
All events for <?= $event->service_description ?>
</a>
<?php else: ?>
<a href="<?= $this->href('monitoring/list/eventhistory', array(
'host' => $object->host_name
)); ?>">
All events for <?= $event->host_name ?>
</a>
<?php endif; ?>
</div>
</div>
<?php endif; ?>

View File

@ -1,15 +1,93 @@
<div class="panel panel-default">
<div class="panel-heading">
<span>Properties</span>
</div>
<div class="panel-heading">Properties</div>
<div class="panel-body">
<table class="table table-bordered">
<?php foreach ($this->monitoringProperties($object) as $label => $value): ?>
<tr>
<th><?= $label ?></th>
<td><?= $value ?></td>
<th>Current Attempt</th>
<td>
<?= sprintf(
'%s/%s (%s state)',
$object->current_check_attempt,
$object->max_check_attempts,
($object->state_type === '1') ? 'HARD' : 'SOFT'
); ?>
</td>
</tr>
<tr>
<th>Check Type</th>
<td>
<?php if ($object->passive_checks_enabled === '1' && $object->active_checks_enabled === '0'): ?>
PASSIVE
<?php elseif ($object->passive_checks_enabled === '0' && $object->active_checks_enabled === '0'): ?>
DISABLED
<?php else: ?>
ACTIVE
<?php endif; ?>
</td>
</tr>
<tr>
<th>Check Latency / Duration</th>
<td>
<?php if ($object->passive_checks_enabled === '0' && $object->active_checks_enabled === '0'): ?>
N/A
<?php else: ?>
<?= sprintf('%.4f', $object->check_latency); ?> / <?= sprintf('%.4f', $object->check_execution_time); ?> seconds
<?php endif; ?>
</td>
</tr>
<tr>
<th>Last Notification</th>
<td>
<?php
if ($object->service_description) {
$notificationsHref = $this->href('monitoring/list/notifications',
array(
'host' => $object->host_name,
'service' => $object->service_description
)
);
} else {
$notificationsHref = $this->href('monitoring/list/notifications',
array(
'host' => $object->host_name
)
);
}
?>
<a href="<?= $notificationsHref ?>">
<?php if ($object->last_notification === '0000-00-00 00:00:00'): ?>
N/A
<?php else: ?>
<?= $object->last_notification ?>
<?php if ($object->current_notification_number > 0): ?>
<br />
<?= $object->current_notification_number ?> notifications sent during current problem state
<?php endif ;?>
<?php endif; ?>
</a>
</td>
</tr>
<tr>
<th>Is This <?= $object->service_description ? 'Service' : 'Host' ?> Flapping?</th>
<td>
<?php if ($object->is_flapping === '1'): ?>
YES
<?php else: ?>
NO
<?php endif; ?>
<?= sprintf('%.2f', $object->percent_state_change); ?>% state change
</td>
</tr>
<tr>
<th>In Scheduled Downtime?</th>
<td>
<?php if ($object->in_downtime === '1'): ?>
YES
<?php else: ?>
NO
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</table>
</div>
</div>

View File

@ -1,7 +1,103 @@
<?= $this->render('show/components/header.phtml') ?>
<?php
$history->limit(10);
$hhistory = $this->history->paginate();
<?= $this->tabs->render($this); ?>
?>
<h1>History</h1>
<?php if (!empty($history)): ?>
<div data-icinga-component="app/mainDetailGrid">
<?= $this->paginationControl($history, null, null, array('preserve' => $this->preserve)); ?>
<table class="table table-condensed">
<tbody>
<?php foreach ($history as $event): ?>
<tr>
<td><?= date('d.m. H:i', $event->timestamp); ?></td>
<td>
<?php if ($object instanceof Icinga\Module\Monitoring\Object\Service): ?>
<a href="<?= $this->href('monitoring/show/service', array(
'host' => $object->host_name,
'service' => $event->service_description
)); ?>">
<?= $event->service_description ?>
</a>
<?php else: ?>
<a href="<?= $this->href('monitoring/show/host', array(
'host' => $object->host_name
)); ?>">
<?= $event->host_name ?>
</a>
<?php endif; ?>
</td>
<td>
<?php
switch ($event->type) {
case 'notify':
$icon = '{{NOTIFICATION_ICON}}';
$title = 'Notification';
$msg = $event->output;
break;
case 'comment':
$icon = '{{COMMENT_ICON}}';
$title = 'Comment';
$msg = $event->output;
break;
case 'ack':
$icon = '{{ACKNOWLEDGEMENT_ICON}}';
$title = 'Acknowledgement';
$msg = '';
break;
case 'dt_comment':
$icon = '{{IN_DOWNTIME_ICON}}';
$title = 'In Downtime';
$msg = $event->output;
break;
case 'flapping':
$icon = '{{FLAPPING_ICON}}';
$title = 'Flapping';
$msg = '';
break;
case 'hard_state':
$icon = '{{HARDSTATE_ICON}}';
$title = 'Hard State';
$msg = '[' . $event->attempt . '/' . $event->max_attempts . ']';
break;
case 'soft_state':
$icon = '{{SOFTSTATE_ICON}}';
$title = 'Soft State';
$msg = '[' . $event->attempt . '/' . $event->max_attempts . ']';
break;
case 'dt_start':
$icon = '{{DOWNTIME_START_ICON}}';
$title = 'Downtime Start';
$msg = $event->output;
break;
case 'dt_end':
$icon = '{{DOWNTIME_END_ICON}}';
$title = 'Downtime End';
$msg = $event->output;
break;
}
?>
<a href="#" title="<?= $title ?>"><i><?= $icon ?></i></a>
<?php if (!empty($msg)) { echo $msg; } ?>
</td>
</tr>
<? endforeach; ?>
</tbody>
</table>
<?php if ($object instanceof Icinga\Module\Monitoring\Object\Service): ?>
<a href="<?= $this->href('monitoring/list/eventhistory', array(
'host' => $object->host_name,
'service' => $object->service_description
)); ?>">
All events for <?= $event->service_description ?>
</a>
<?php else: ?>
<a href="<?= $this->href('monitoring/list/eventhistory', array(
'host' => $object->host_name
)); ?>">
All events for <?= $event->host_name ?>
</a>
<?php endif; ?>
</div>
<?php endif; ?>

View File

@ -1,15 +1,61 @@
<div class="panel panel-default">
<div class="panel-heading">
<?= $this->tabs->render($this); ?>
<div>
<div class="row">
<div class="col-md-8">
<?php if ($this->object->host_icon_image): ?>
<img src="<?= $this->object->host_icon_image; ?>" alt="Host image" />
<?php else: ?>
{{HOST_ICON}}
<?php endif; ?>
<h1>Host Status <?= $this->escape($this->object->host_name); ?></h1>
<h4>
Host Status
<a href="<?= $this->href('monitoring/list/services', array('host' => $object->host_name)); ?>">
<?= $this->escape($this->object->host_name); ?>
</a>
<?php if ($this->object->host_address && $this->object->host_address !== $this->object->host_name): ?>
(<?= $this->object->host_address; ?>)
<?php endif; ?>
<?php if (isset($this->object->host_alias) && $this->object->host_alias !== $this->object->host_name): ?>
(<?= $this->object->host_alias; ?>)
<?php endif; ?>
</h4>
</div>
<div class="col-md-4">
<?= $this->util()->getHostStateName($this->object->host_state); ?>
since <?= $this->timeSince($this->object->host_last_state_change); ?>
</div>
</div>
<div class="panel-body">
<div>
<?= $this->pluginOutput($this->object->output); ?>
</div>
<a class="button" href="#">{{RECHECK_COMMAND}</a>
<div>
<?= $this->perfdata($this->object->perfdata); ?>
</div>
<div>
<?= $this->pluginOutput($this->object->long_output); ?>
</div>
<?= $this->render('show/components/comments.phtml'); ?>
<div>
Check Statistics
<dl class="dl-horizontal">
<dt>Last Check</dt>
<dd><?= $object->last_check; ?></dd>
<dt>Next Check</dt>
<dd><?= $object->next_check; ?> <a href="#" class="button">{{RESCHEDULE_COMMAND}}</a></dd>
</dl>
</div>
<div>
<table>
<i class="successIcon"></i>
<tr>
<?php if (!$object->host_handled && $object->host_state > 0): ?>
<td>
@ -27,37 +73,19 @@
<i>{{ACKNOWLEDGED_ICON}}</i>
</a>
</td>
<?php else: ?>
<td>
Status
</td>
<?php endif; ?>
<td>
<?= $this->util()->getHostStateName($this->object->host_state); ?>
since <?= $this->timeSince($this->object->host_last_state_change); ?>
</td>
<td><a class="button" href="#">{{RECHECK_COMMAND_BUTTON}</a></td>
</tr>
<tr>
<td>Last Check</td>
<td><?= $object->last_check ?></td>
<td></td>
</tr>
<tr>
<td>Next Check</td>
<td><?= $object->next_check ?></td>
<td><a href="#" class="button">{{RESCHEDULE_COMMAND_BUTTON}}</a></td>
<td></td>
<td></td>
</tr>
<?php if ($this->object->host_address && $this->object->host_address !== $this->object->host_name): ?>
<tr>
<td>Host Address</td>
<td><?= $this->escape($this->object->host_address); ?></td>
</tr>
<?php endif; ?>
<?php if (isset($this->object->host_alias) && $this->object->host_alias !== $this->object->host_name): ?>
<tr>
<td>Alias</td>
<td><?= $this->object->host_alias; ?></td>
<?php endif; ?>
<?php if ($this->object->host_action_url || $this->object->host_notes_url): ?>
<tr>
<td rowspan="2">
@ -70,40 +98,18 @@
</td>
</tr>
<?php endif; ?>
<tr>
<td>Plugin Output</td>
<td>
<?= $this->pluginOutput($this->object->output); ?>
<?= $this->pluginOutput($this->object->long_output); ?>
</td>
<td>
<a class="button" href="#">{{SUBMIT_PASSIVE_CHECK_RESULT_COMMAND}}</a>
</td>
</tr>
<?php if ($this->object->perfdata): ?>
<tr>
<td>Performance Data</td>
<td><?= $this->perfdata($this->object->perfdata); ?></td>
</tr>
<?php endif; ?>
<tr>
<td colspan="2">
<a href="<?= $this->href('monitoring/list/services', array('host' => $object->host_name)); ?>">
View Services For This Host
</a>
</td>
<td>
<a class="button" href="#">{{{RECHECK_ALL_SERVICES_COMMAND}}</a>
</td>
</tr>
</table>
</div>
</div>
<?= $this->render('show/components/downtime.phtml'); ?>
<?= $this->render('show/components/comments.phtml'); ?>
<?= $this->render('show/components/properties.phtml'); ?>
<?= $this->render('show/components/flags.phtml'); ?>

View File

@ -1,3 +1,5 @@
<?= $this->tabs->render($this); ?>
<div class="panel panel-default">
<div class="panel-heading">
{{SERVICE_ICON}} <h1>Service Status <?= $this->escape($this->object->service_description); ?></h1>

View File

@ -0,0 +1,7 @@
<?= $this->tabs->render($this); ?>
<?= $this->partial(
'list/services-compact.phtml',
'monitoring', array(
'services' => $services
)
); ?>

View File

@ -0,0 +1,93 @@
<?php
// {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Module\Monitoring;
use Icinga\Application\Config as IcingaConfig;
use Icinga\Module\Monitoring\DataView\HostAndServiceStatus as HostAndServiceStatusView;
use Icinga\Web\Controller\ActionController;
/**
* Base class for all monitoring action controller
*/
class Controller extends ActionController
{
/**
* Retrieve services from either given parameters or request
*
* @param array $params
*
* @return \Zend_Paginator
*/
protected function fetchServices(array $params = null)
{
$columns = array(
'host_name',
'host_state',
'host_state_type',
'host_last_state_change',
'host_address',
'host_handled',
'service_description',
'service_display_name',
'service_state',
'service_in_downtime',
'service_acknowledged',
'service_handled',
'service_output',
'service_last_state_change',
'service_icon_image',
'service_long_output',
'service_is_flapping',
'service_state_type',
'service_handled',
'service_severity',
'service_last_check',
'service_notifications_enabled',
'service_action_url',
'service_notes_url',
'service_last_comment',
'service_active_checks_enabled',
'service_passive_checks_enabled'
);
if ($params === null) {
$query = HostAndServiceStatusView::fromRequest(
$this->_request,
$columns
)->getQuery();
} else {
$params['backend'] = $this->_request->getParam('backend');
$query = HostAndServiceStatusView::fromParams(
$params,
$columns
)->getQuery();
}
$this->handleFormatRequest($query);
return $query->paginate();
}
private function handleFormatRequest($query)
{
if ($this->_getParam('format') === 'sql'
&& IcingaConfig::app()->global->get('environment', 'production') === 'development') {
echo '<pre>'
. htmlspecialchars(wordwrap($query->dump()))
. '</pre>';
exit;
}
if ($this->_getParam('format') === 'json'
|| $this->_request->getHeader('Accept') === 'application/json')
{
header('Content-type: application/json');
echo json_encode($query->fetchAll());
exit;
}
if ($this->_getParam('format') === 'csv'
|| $this->_request->getHeader('Accept') === 'text/csv') {
Csv::fromQuery($query)->dump();
exit;
}
}
}
// @codingStandardsIgnoreEnd

View File

@ -99,6 +99,33 @@ abstract class DataView
return $view;
}
/**
* Create view from params
*
* @param array $params
* @param array $columns
*
* @return static
*/
public static function fromParams(array $params, array $columns = null)
{
$view = new static(Backend::createBackend($params['backend']), $columns);
$view->filter($params);
$order = isset($params['order']) ? $params['order'] : null;
if ($order !== null) {
if (strtolower($order) === 'desc') {
$order = self::SORT_DESC;
} else {
$order = self::SORT_ASC;
}
}
$view->sort(
isset($params['sort']) ? $params['sort'] : null,
$order
);
return $view;
}
/**
* Filter rows that match all of the given filters. If a filter is not valid, it's silently ignored
*

View File

@ -150,7 +150,7 @@ abstract class AbstractObject
return $this;
}
protected function fetchEventHistory()
public function fetchEventHistory()
{
$this->foreign['eventHistory'] = $this->applyObjectFilter(
$this->backend->select()->from('eventHistory', array(

View File

@ -30,8 +30,7 @@ class Host extends AbstractObject
->fetchContacts()
->fetchContactgroups()
->fetchCustomvars()
->fetchComments()
->fetchEventHistory();
->fetchComments();
}
protected function fetchObject()
@ -42,7 +41,7 @@ class Host extends AbstractObject
'host_address',
'host_state',
'host_handled',
'host_in_downtime',
'in_downtime' => 'host_in_downtime',
'host_acknowledged',
'host_last_state_change',
'last_check' => 'host_last_check',
@ -59,7 +58,13 @@ class Host extends AbstractObject
'notifications_enabled' => 'host_notifications_enabled',
'event_handler_enabled' => 'host_event_handler_enabled',
'flap_detection_enabled' => 'host_flap_detection_enabled',
'active_checks_enabled' => 'host_active_checks_enabled'
'active_checks_enabled' => 'host_active_checks_enabled',
'current_check_attempt' => 'host_current_check_attempt',
'max_check_attempts' => 'host_max_check_attempts',
'last_notification' => 'host_last_notification',
'current_notification_number' => 'host_current_notification_number',
'percent_state_change' => 'host_percent_state_change',
'is_flapping' => 'host_is_flapping'
))->where('host_name', $this->name1)->fetchRow();
}
}

View File

@ -31,8 +31,7 @@ class Service extends AbstractObject
->fetchContacts()
->fetchContactgroups()
->fetchCustomvars()
->fetchComments()
->fetchEventHistory();
->fetchComments();
}
protected function fetchObject()

View File

@ -488,10 +488,15 @@ define(['jquery', 'logging', 'icinga/componentLoader', 'URIjs/URI', 'URIjs/URITe
if (Container.isExternalLink($(targetEl).attr('href'))) {
return true;
} else {
// detail links render to main by default;
Icinga.replaceBodyFromUrl(
mainContainer.updateContainerHref(URI($(targetEl).attr('href')).href())
);
if ($(targetEl).attr('data-icinga-target') === 'detail') {
Icinga.replaceBodyFromUrl(
detailContainer.updateContainerHref(URI($(targetEl).attr('href')).href())
);
} else {
Icinga.replaceBodyFromUrl(
mainContainer.updateContainerHref(URI($(targetEl).attr('href')).href())
);
}
ev.preventDefault();
ev.stopPropagation();
@ -512,4 +517,4 @@ define(['jquery', 'logging', 'icinga/componentLoader', 'URIjs/URI', 'URIjs/URITe
};
return Container;
});
});

View File

@ -166,10 +166,16 @@ function(Container, $, logger, URI) {
});
$('.pagination li a', contentNode.parent()).on('click', function(ev) {
var container = (new Container(this));
container.replaceDomFromUrl(
container.updateContainerHref($(this).attr('href'))
);
logger.debug("Pagination clicked in " + container.containerType);
// Detail will be removed when main pagination changes
if (container.containerType === 'icingamain') {
Icinga.replaceBodyFromUrl(URI($(this).attr('href')).removeQuery('detail'));
} else {
container.replaceDomFromUrl($(this).attr('href'));
}
ev.preventDefault();
ev.stopPropagation();
return false;
@ -207,7 +213,7 @@ function(Container, $, logger, URI) {
this.registerControls();
this.registerTableLinks();
this.registerHistoryChanges();
this.registerLoadIndicator();
};
this.construct(gridDomNode);