diff options
Diffstat (limited to 'library/Toplevelview/Tree/TLVHostGroupNode.php')
-rw-r--r-- | library/Toplevelview/Tree/TLVHostGroupNode.php | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/library/Toplevelview/Tree/TLVHostGroupNode.php b/library/Toplevelview/Tree/TLVHostGroupNode.php new file mode 100644 index 0000000..a6dc7e4 --- /dev/null +++ b/library/Toplevelview/Tree/TLVHostGroupNode.php @@ -0,0 +1,134 @@ +<?php +/* Copyright (C) 2017 Icinga Development Team <info@icinga.com> */ + +namespace Icinga\Module\Toplevelview\Tree; + +use Icinga\Application\Benchmark; +use Icinga\Exception\NotFoundError; +use Icinga\Module\Toplevelview\Monitoring\Hostgroupsummary; + +class TLVHostGroupNode extends TLVIcingaNode +{ + protected $type = 'hostgroup'; + + protected $key = 'hostgroup'; + + protected static $titleKey = 'hostgroup'; + + public static function fetch(TLVTree $root) + { + Benchmark::measure('Begin fetching hostgroups'); + + if (! array_key_exists('hostgroup', $root->registeredObjects) or empty($root->registeredObjects['hostgroup'])) { + throw new NotFoundError('No hostgroups registered to fetch!'); + } + + $names = array_keys($root->registeredObjects['hostgroup']); + + $options = []; + foreach (['notification_periods', 'host_never_unhandled', 'ignored_notification_periods'] as $opt) { + $options[$opt] = $root->get($opt); + } + + // Note: this uses a patched version of Hostsgroupsummary / HostgroupsummaryQuery ! + $hostgroups = new Hostgroupsummary( + $root->getBackend(), + array( + 'hostgroup_name', + 'hosts_down_handled', + 'hosts_down_unhandled', + 'hosts_total', + 'hosts_unreachable_handled', + 'hosts_unreachable_unhandled', + 'hosts_downtime_handled', + 'hosts_downtime_active', + 'hosts_up', + 'services_critical_handled', + 'services_critical_unhandled', + 'services_ok', + 'services_total', + 'services_unknown_handled', + 'services_unknown_unhandled', + 'services_warning_handled', + 'services_warning_unhandled', + 'services_downtime_handled', + 'services_downtime_active', + ), + $options + ); + + $hostgroups->where('hostgroup_name', $names); + + foreach ($hostgroups as $hostgroup) { + $root->registeredObjects['hostgroup'][$hostgroup->hostgroup_name] = $hostgroup; + } + + Benchmark::measure('Finished fetching hostgroups'); + } + + public function getStatus() + { + if ($this->status === null) { + $this->status = $status = new TLVStatus(); + $key = $this->getKey(); + + if (($data = $this->root->getFetched($this->type, $key)) !== null) { + $status->set('total', $data->hosts_total + $data->services_total); + $status->set('ok', $data->hosts_up + $data->services_ok); + + $status->set('critical_handled', $data->services_critical_handled); + $status->set('critical_unhandled', $data->services_critical_unhandled); + + if ($this->getRoot()->get('host_never_unhandled') === true) { + $status->add( + 'critical_handled', + $data->hosts_down_handled + + $data->hosts_unreachable_handled + + $data->hosts_down_unhandled + + $data->hosts_unreachable_unhandled + ); + } else { + $status->add( + 'critical_handled', + $data->hosts_down_handled + + $data->hosts_unreachable_handled + ); + $status->add( + 'critical_unhandled', + $data->hosts_down_unhandled + + $data->hosts_unreachable_unhandled + ); + } + + $status->set('warning_handled', $data->services_warning_handled); + $status->set('warning_unhandled', $data->services_warning_unhandled); + $status->set('unknown_handled', $data->services_unknown_handled); + $status->set('unknown_unhandled', $data->services_unknown_unhandled); + + $status->set( + 'downtime_handled', + $data->hosts_downtime_handled + + $data->services_downtime_handled + ); + $status->set( + 'downtime_active', + $data->hosts_downtime_active + + $data->services_downtime_active + ); + + // extra metadata for view + $status->setMeta('hosts_total', $data->hosts_total); + $status->setMeta( + 'hosts_unhandled', + $data->hosts_down_unhandled + + $data->hosts_unreachable_unhandled + ); + + $status->set('missing', 0); + } else { + $status->add('missing', 1); + } + } + return $this->status; + } +} |