Add contact and contactgroup views

Create the new views, extend backend queries to fetch timeperiods and add
navigation bar entries

refs #4713
This commit is contained in:
Matthias Jentsch 2013-10-04 10:09:00 +02:00 committed by Eric Lippmann
parent ba77713af0
commit 5d4533a6ad
9 changed files with 305 additions and 6 deletions

View File

@ -13,6 +13,8 @@ Hosts = "/monitoring/list/hosts"
Services = "/monitoring/list/services" Services = "/monitoring/list/services"
Downtimes = "/monitoring/list/downtimes" Downtimes = "/monitoring/list/downtimes"
Notifications = "/monitoring/list/notifications" Notifications = "/monitoring/list/notifications"
Contacts = "/monitoring/list/contacts"
Contact Groups = "/monitoring/list/contactgroups"
;Remove component as of #4583 since it's not working ;Remove component as of #4583 since it's not working
;Summaries = "/monitoring/summary/group/by/hostgroup" ;Summaries = "/monitoring/summary/group/by/hostgroup"

View File

@ -42,6 +42,8 @@ use \Icinga\Application\Config as IcingaConfig;
use Icinga\Module\Monitoring\DataView\Notification as NotificationView; use Icinga\Module\Monitoring\DataView\Notification as NotificationView;
use Icinga\Module\Monitoring\DataView\Downtime as DowntimeView; use Icinga\Module\Monitoring\DataView\Downtime as DowntimeView;
use Icinga\Module\Monitoring\DataView\Contact as ContactView;
use Icinga\Module\Monitoring\DataView\Contactgroup as ContactgroupView;
use Icinga\Module\Monitoring\DataView\HostAndServiceStatus as HostAndServiceStatusView; use Icinga\Module\Monitoring\DataView\HostAndServiceStatus as HostAndServiceStatusView;
class Monitoring_ListController extends ActionController class Monitoring_ListController extends ActionController
@ -114,7 +116,6 @@ class Monitoring_ListController extends ActionController
'host_last_comment', 'host_last_comment',
'host_active_checks_enabled', 'host_active_checks_enabled',
'host_passive_checks_enabled' 'host_passive_checks_enabled'
) )
)->getQuery(); )->getQuery();
$this->view->hosts = $query->paginate(); $this->view->hosts = $query->paginate();
@ -245,7 +246,62 @@ class Monitoring_ListController extends ActionController
)->getQuery(); )->getQuery();
$this->view->notifications = $query->paginate(); $this->view->notifications = $query->paginate();
$this->setupSortControl(array( $this->setupSortControl(array(
'notification_start_time' => 'Notification Start' 'notification_start_time' => 'Notification Start'
));
$this->handleFormatRequest($query);
}
public function contactsAction()
{
$query = ContactView::fromRequest(
$this->_request,
array(
'contact_name',
'contact_id',
'contact_alias',
'contact_email',
'contact_pager',
'contact_notify_service_timeperiod',
'contact_notify_service_recovery',
'contact_notify_service_warning',
'contact_notify_service_critical',
'contact_notify_service_unknown',
'contact_notify_service_flapping',
'contact_notify_service_downtime',
'contact_notify_host_timeperiod',
'contact_notify_host_recovery',
'contact_notify_host_down',
'contact_notify_host_unreachable',
'contact_notify_host_flapping',
'contact_notify_host_downtime',
)
)->getQuery();
$this->view->contacts = $query->paginate();
$this->setupSortControl(array(
'contact_name' => 'Name',
'contact_alias' => 'Alias',
'contact_email' => 'Email',
'contact_pager' => 'Pager Address / Number',
'contact_notify_service_timeperiod' => 'Service Notification Timeperiod',
'contact_notify_host_timeperiod' => 'Host Notification Timeperiod'
));
$this->handleFormatRequest($query);
}
public function contactgroupsAction()
{
$query = ContactgroupView::fromRequest(
$this->_request,
array(
'contactgroup_name',
'contactgroup_alias',
'contact_name'
)
)->getQuery();
$this->view->contactgroups = $query->paginate();
$this->setupSortControl(array(
'contactgroup_name' => 'Group Name',
'contactgroup_alias' => 'Group Alias'
)); ));
$this->handleFormatRequest($query); $this->handleFormatRequest($query);
} }

View File

@ -0,0 +1,40 @@
<?php
class Zend_View_Helper_ContactFlags extends Zend_View_Helper_Abstract
{
/**
* Get the human readable flag name for the given contact notification option
*
* @param string $tableName the name of the option table
*/
public function getNotificationOptionName($tableName) {
$exploded = explode('_', $tableName);
$name = end($exploded);
return ucfirst($name);
}
/**
* Build all active notification options to a readable string
*
* @param object $contact The contact retrieved from a backend
* @param string $type Whether to display the flags for 'host' or 'service'
* @param string $glue The symbol to use to concatenate the flag names
*
* @return string A string that contains a human readable list of active options
*/
public function contactFlags($contact, $type, $glue = ', ')
{
$out = array();
foreach ($contact as $key => $value) {
if (preg_match('/^contact_notify_' . $type . '_.*/', $key) && $value == True) {
$option = $this->getNotificationOptionName($key);
if (strtolower($option) != 'timeperiod') {
array_push($out, $option);
}
}
}
return implode($glue, $out);
}
}

View File

@ -0,0 +1,44 @@
<?= $this->tabs->render($this); ?>
<?php
$viewHelper = $this->getHelper('MonitoringState');
$knownGroups = array()
?>
<div data-icinga-component="app/mainDetailGrid">
<?= $this->sortControl->render($this); ?>
<?= $this->paginationControl($contactgroups, null, null, array('preserve' => $this->preserve)); ?>
<table class="table table-condensed">
<thead>
<tr>
<th> Group Name </th>
<th> Description </th>
<th> Member Name </th>
</tr>
</thead>
<tbody>
<?php foreach($contactgroups as $contact): ?>
<?php $periodLink = $this->href('monitoring/show/contacts', array('contact' => $contact->contact_name)); ?>
<tr class="active">
<?php
$groupName = $contact->contactgroup_name;
if (!array_key_exists($groupName, $knownGroups)) {
echo '<td>' . $groupName . '</td><td>' . $contact->contactgroup_alias . '</td>';
$knownGroups[$groupName] = True;
} else {
echo '<td></td><td></td>';
}
?>
<td>
<a href="<?= $periodLink ?>"">
<?= $contact->contact_name ?>
</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?= $this->paginationControl($contactgroups, null, null, array('preserve' => $this->preserve)); ?>
</div>

View File

@ -0,0 +1,41 @@
<?= $this->tabs->render($this); ?>
<?php
$viewHelper = $this->getHelper('MonitoringState');
$contactHelper = $this->getHelper('ContactFlags');
?>
<div data-icinga-component="app/mainDetailGrid">
<?= $this->sortControl->render($this); ?>
<?= $this->paginationControl($contacts, null, null, array('preserve' => $this->preserve)); ?>
<table class="table table-condensed">
<thead>
<tr>
<th> Contact Name </th>
<th> Alias </th>
<th> Email Address </th>
<th> Pager Address / Number </th>
<th> Service Notification Options </th>
<th> Host Notification Options </th>
<th> Service Notification Period </th>
<th> Host Notification Period </th>
</tr>
</thead>
<tbody>
<?php foreach($contacts as $contact): ?>
<?php $periodLink = $this->href('monitoring/show/contacts', array('contact' => $contact->contact_name)); ?>
<tr class="active">
<td> <?= $contact->contact_name ?> </td>
<td> <?= $contact->contact_alias ?> </td>
<td> <?= $contact->contact_email ?> </td>
<td> <?= $contact->contact_pager ?> </td>
<td> <?= $contactHelper->contactFlags($contact, 'service') ?> </td>
<td> <?= $contactHelper->contactFlags($contact, 'host') ?> </td>
<td> <?= $contact->contact_notify_service_timeperiod ?> </td>
<td> <?= $contact->contact_notify_host_timeperiod ?> </td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?= $this->paginationControl($contacts, null, null, array('preserve' => $this->preserve)); ?>
</div>

View File

@ -4,13 +4,12 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query;
class ContactQuery extends AbstractQuery class ContactQuery extends AbstractQuery
{ {
// TODO: join host/service timeperiod
protected $columnMap = array( protected $columnMap = array(
'contacts' => array( 'contacts' => array(
'contact_id' => 'c.contact_id',
'contact_name' => 'co.name1 COLLATE latin1_general_ci', 'contact_name' => 'co.name1 COLLATE latin1_general_ci',
'contact_alias' => 'c.alias', 'contact_alias' => 'c.alias COLLATE latin1_general_ci',
'contact_email' => 'c.email_address', 'contact_email' => 'c.email_address COLLATE latin1_general_ci',
'contact_pager' => 'c.pager_address', 'contact_pager' => 'c.pager_address',
'contact_has_host_notfications' => 'c.host_notifications_enabled', 'contact_has_host_notfications' => 'c.host_notifications_enabled',
'contact_has_service_notfications' => 'c.service_notifications_enabled', 'contact_has_service_notfications' => 'c.service_notifications_enabled',
@ -27,6 +26,10 @@ class ContactQuery extends AbstractQuery
'contact_notify_host_flapping' => 'c.notify_host_flapping', 'contact_notify_host_flapping' => 'c.notify_host_flapping',
'contact_notify_host_downtime' => 'c.notify_host_downtime', 'contact_notify_host_downtime' => 'c.notify_host_downtime',
), ),
'timeperiods' => array(
'contact_notify_host_timeperiod' => 'ht.alias COLLATE latin1_general_ci',
'contact_notify_service_timeperiod' => 'st.alias COLLATE latin1_general_ci'
),
'hosts' => array( 'hosts' => array(
'host_object_id' => 'ho.object_id', 'host_object_id' => 'ho.object_id',
'host_name' => 'ho.name1 COLLATE latin1_general_ci', 'host_name' => 'ho.name1 COLLATE latin1_general_ci',
@ -87,4 +90,17 @@ class ContactQuery extends AbstractQuery
); );
} }
protected function joinTimeperiods()
{
$this->baseQuery->join(
array('ht' => $this->prefix . 'timeperiods'),
'ht.timeperiod_object_id = c.host_timeperiod_object_id',
array()
);
$this->baseQuery->join(
array('st' => $this->prefix . 'timeperiods'),
'st.timeperiod_object_id = c.service_timeperiod_object_id',
array()
);
}
} }

View File

@ -0,0 +1,61 @@
<?php
namespace Icinga\Module\Monitoring\DataView;
/**
* Describes the data needed by the 'Contact' DataView
*/
class Contact extends DataView
{
/**
* Retrieve columns provided by this view
*
* @return array
*/
public function getColumns()
{
return array(
'contact_name',
'contact_alias',
'contact_email',
'contact_pager',
'contact_notify_hosts',
'contact_notify_services',
'contact_has_host_notfications',
'contact_has_service_notfications',
'contact_can_submit_commands',
'contact_notify_service_recovery',
'contact_notify_service_warning',
'contact_notify_service_critical',
'contact_notify_service_unknown',
'contact_notify_service_flapping',
'contact_notify_service_downtime',
'contact_notify_host_recovery',
'contact_notify_host_down',
'contact_notify_host_unreachable',
'contact_notify_host_flapping',
'contact_notify_host_downtime',
'host_object_id',
'host_name',
'service_object_id',
'service_host_name',
'service_description'
);
}
/**
* Retrieve default sorting rules for particular columns. These involve sort order and potential additional to sort
*
* @return array
*/
public function getSortRules()
{
return array(
'contact_alias' => array(
'default_dir' => self::SORT_ASC,
'order' => self::SORT_DESC
)
);
}
}

View File

@ -0,0 +1,39 @@
<?php
namespace Icinga\Module\Monitoring\DataView;
/**
* Describes the data needed by the Contactgroup DataView
*/
class Contactgroup extends DataView
{
/**
* Retrieve columns provided by this view
*
* @return array
*/
public function getColumns()
{
return array(
'contact_name',
'contactgroup_name',
'contactgroup_alias'
);
}
/**
* Retrieve default sorting rules for particular columns. These involve sort order and potential additional to sort
*
* @return array
*/
public function getSortRules()
{
return array(
'contactgroup_name' => array(
'default_dir' => self::SORT_ASC,
'order' => self::SORT_DESC
)
);
}
}

0
var/log/.gitkeep Normal file → Executable file
View File