diff options
Diffstat (limited to 'library/Toplevelview/Monitoring/HostgroupQuery.php')
-rw-r--r-- | library/Toplevelview/Monitoring/HostgroupQuery.php | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/library/Toplevelview/Monitoring/HostgroupQuery.php b/library/Toplevelview/Monitoring/HostgroupQuery.php new file mode 100644 index 0000000..62cc014 --- /dev/null +++ b/library/Toplevelview/Monitoring/HostgroupQuery.php @@ -0,0 +1,132 @@ +<?php +/* Copyright (C) 2017 Icinga Development Team <info@icinga.com> */ + +namespace Icinga\Module\Toplevelview\Monitoring; + +use Icinga\Module\Monitoring\Backend\Ido\Query\HostgroupQuery as IcingaHostgroupQuery; + +/** + * Patched version of HostgroupQuery + */ +class HostgroupQuery extends IcingaHostgroupQuery +{ + use IgnoredNotificationPeriods; + use Options; + + public function __construct($ds, $columns = null, $options = null) + { + $this->setOptions($options); + parent::__construct($ds, $columns); + } + + public function init() + { + if (($periods = $this->getOption('ignored_notification_periods')) !== null) { + $this->ignoreNotificationPeriods($periods); + } + + $patchedColumnMap = array( + 'servicestatus' => array( + 'service_notifications_enabled' => 'ss.notifications_enabled', + 'service_is_flapping' => 'ss.is_flapping', + 'service_state' => ' + CASE WHEN ss.has_been_checked = 0 OR ss.has_been_checked IS NULL + THEN 99 + ELSE CASE WHEN ss.state_type = 1 + THEN ss.current_state + ELSE ss.last_hard_state + END + END', + 'service_handled' => ' + CASE WHEN (ss.problem_has_been_acknowledged + COALESCE(hs.current_state, 0)) > 0 + THEN 1 + ELSE 0 + END', + 'service_handled_wo_host' => ' + CASE WHEN ss.problem_has_been_acknowledged > 0 + THEN 1 + ELSE 0 + END', + 'service_in_downtime' => ' + CASE WHEN (ss.scheduled_downtime_depth = 0) + THEN 0 + ELSE 1 + END', + ), + 'hoststatus' => array( + 'host_notifications_enabled' => 'hs.notifications_enabled', + 'host_is_flapping' => 'hs.is_flapping', + 'host_state' => ' + CASE WHEN hs.has_been_checked = 0 OR hs.has_been_checked IS NULL + THEN 99 + ELSE CASE WHEN hs.state_type = 1 + THEN hs.current_state + ELSE hs.last_hard_state + END + END', + 'host_handled' => ' + CASE WHEN hs.problem_has_been_acknowledged > 0 + THEN 1 + ELSE 0 + END', + 'host_in_downtime' => ' + CASE WHEN (hs.scheduled_downtime_depth = 0) + THEN 0 + ELSE 1 + END', + ), + 'servicenotificationperiod' => array( + 'service_notification_period' => 'ntpo.name1', + 'service_in_notification_period' => ' + CASE WHEN ntpo.object_id IS NULL + THEN 1 + ELSE CASE WHEN ntpr.timeperiod_id IS NOT NULL + THEN 1 + ELSE 0 + END + END', + ), + ); + + foreach ($patchedColumnMap as $table => $columns) { + foreach ($columns as $k => $v) { + $this->columnMap[$table][$k] = $v; + } + } + + parent::init(); + } + + protected function joinServicenotificationperiod() + { + $extraJoinCond = ''; + + if ($this->hasIgnoredNotifications()) { + $extraJoinCond .= $this->db->quoteInto( + ' AND ntpo.name1 NOT IN (?)', + $this->getIgnoredNotificationPeriods() + ); + } + + $this->select->joinLeft( + ['ntp' => $this->prefix . 'timeperiods'], + 'ntp.timeperiod_object_id = s.notification_timeperiod_object_id' + . ' AND ntp.config_type = 1 AND ntp.instance_id = s.instance_id', + [] + ); + $this->select->joinLeft( + ['ntpo' => $this->prefix . 'objects'], + 'ntpo.object_id = s.notification_timeperiod_object_id' . $extraJoinCond, + [] + ); + $this->select->joinLeft( + ['ntpr' => $this->prefix . 'timeperiod_timeranges'], + "ntpr.timeperiod_id = ntp.timeperiod_id + AND ntpr.day = DAYOFWEEK(CURRENT_DATE()) - 1 + AND ntpr.start_sec <= UNIX_TIMESTAMP() - UNIX_TIMESTAMP(CURRENT_DATE()) + AND ntpr.end_sec >= UNIX_TIMESTAMP() - UNIX_TIMESTAMP(CURRENT_DATE()) + ", + [] + ); + } +} |