diff --git a/library/Director/ProvidedHook/Monitoring/CustomVarRenderer.php b/library/Director/ProvidedHook/Monitoring/CustomVarRenderer.php index 44a035ec..5ce4bc8e 100644 --- a/library/Director/ProvidedHook/Monitoring/CustomVarRenderer.php +++ b/library/Director/ProvidedHook/Monitoring/CustomVarRenderer.php @@ -6,9 +6,12 @@ use Icinga\Application\Config; use Icinga\Exception\ConfigurationError; use Icinga\Exception\NotFoundError; use Icinga\Module\Director\Db; +use Icinga\Module\Director\Db\AppliedServiceSetLoader; use Icinga\Module\Director\Objects\IcingaHost; use Icinga\Module\Director\Objects\IcingaService; +use Icinga\Module\Director\Objects\IcingaTemplateResolver; use Icinga\Module\Director\Web\Form\IcingaObjectFieldLoader; +use Icinga\Module\Director\Web\Table\IcingaHostAppliedServicesTable; use Icinga\Module\Monitoring\Hook\CustomVarRendererHook; use Icinga\Module\Monitoring\Object\Host; use Icinga\Module\Monitoring\Object\MonitoredObject; @@ -74,10 +77,83 @@ class CustomVarRenderer extends CustomVarRendererHook try { $directorHostObj = IcingaHost::load($host->getName(), $db); if ($service !== null) { - $directorServiceObj = IcingaService::load([ - 'host_id' => $directorHostObj->get('id'), - 'object_name' => $service->getName() - ], $db); + $serviceOrigin = ['direct', 'inherited', 'applied', 'service-set']; + $serviceName = $service->getName(); + $i = 0; + $directorServiceObj = null; + do { + if ($i > 3) { + return false; + } elseif ($serviceOrigin[$i] === 'direct') { + $directorServiceObj = IcingaService::loadOptional([ + 'host_id' => $directorHostObj->get('id'), + 'object_name' => $serviceName + ], $db); + } elseif ($serviceOrigin[$i] == 'inherited') { + $templateResolver = new IcingaTemplateResolver($directorHostObj); + + $parentIds = $templateResolver->listParentIds(); + + $query = $db->getDbAdapter()->select()->from('icinga_service') + ->where('object_name = ?', $serviceName) + ->where('host_id IN (?)', $parentIds); + + $directorServices = IcingaService::loadAll( + $db, + $query, + 'object_name' + ); + + $directorServiceObj = current($directorServices); + } elseif ($serviceOrigin[$i] === 'applied') { + $appliedFilterQuery = IcingaHostAppliedServicesTable::load($directorHostObj)->getQuery(); + + foreach ($appliedFilterQuery->fetchAll() as $appliedService) { + if ($appliedService->name === $serviceName) { + $query = $db->getDbAdapter()->select()->from('icinga_service') + ->where('object_name = ?', $serviceName) + ->where("object_type = 'apply'") + ->where('assign_filter = ?', $appliedService->assign_filter); + + $directorAppliedServices = IcingaService::loadAll( + $db, + $query, + 'object_name' + ); + + $directorServiceObj = current($directorAppliedServices); + + break; + } + } + } elseif ($serviceOrigin[$i] === 'service-set') { + $templateResolver = new IcingaTemplateResolver($directorHostObj); + + $hostServiceSets = $directorHostObj->fetchServiceSets() + + AppliedServiceSetLoader::fetchForHost($directorHostObj); + + $parents = $templateResolver->fetchParents(); + + foreach ($parents as $parent) { + $hostServiceSets += $parent->fetchServiceSets(); + $hostServiceSets += AppliedServiceSetLoader::fetchForHost($parent); + } + + foreach ($hostServiceSets as $hostServiceSet) { + foreach ($hostServiceSet->getServiceObjects() as $setServiceObject) { + if ($setServiceObject->getObjectName() === $serviceName) { + $directorServiceObj = $setServiceObject; + + break 2; + } + } + } + } else { + return false; + } + + $i++; + } while (! $directorServiceObj); } } catch (NotFoundError $_) { return false;