mirror of
https://github.com/Icinga/icingaweb2-module-director.git
synced 2025-09-26 03:09:11 +02:00
Monitoring/CustomVarRenderer: Look for the service in all of its types
The service could be directly created, or applied through an apply rule or could be an inherited service or a service applied through service set.
This commit is contained in:
parent
c78979b24a
commit
743997cb57
@ -6,9 +6,12 @@ use Icinga\Application\Config;
|
|||||||
use Icinga\Exception\ConfigurationError;
|
use Icinga\Exception\ConfigurationError;
|
||||||
use Icinga\Exception\NotFoundError;
|
use Icinga\Exception\NotFoundError;
|
||||||
use Icinga\Module\Director\Db;
|
use Icinga\Module\Director\Db;
|
||||||
|
use Icinga\Module\Director\Db\AppliedServiceSetLoader;
|
||||||
use Icinga\Module\Director\Objects\IcingaHost;
|
use Icinga\Module\Director\Objects\IcingaHost;
|
||||||
use Icinga\Module\Director\Objects\IcingaService;
|
use Icinga\Module\Director\Objects\IcingaService;
|
||||||
|
use Icinga\Module\Director\Objects\IcingaTemplateResolver;
|
||||||
use Icinga\Module\Director\Web\Form\IcingaObjectFieldLoader;
|
use Icinga\Module\Director\Web\Form\IcingaObjectFieldLoader;
|
||||||
|
use Icinga\Module\Director\Web\Table\IcingaHostAppliedServicesTable;
|
||||||
use Icinga\Module\Monitoring\Hook\CustomVarRendererHook;
|
use Icinga\Module\Monitoring\Hook\CustomVarRendererHook;
|
||||||
use Icinga\Module\Monitoring\Object\Host;
|
use Icinga\Module\Monitoring\Object\Host;
|
||||||
use Icinga\Module\Monitoring\Object\MonitoredObject;
|
use Icinga\Module\Monitoring\Object\MonitoredObject;
|
||||||
@ -74,10 +77,83 @@ class CustomVarRenderer extends CustomVarRendererHook
|
|||||||
try {
|
try {
|
||||||
$directorHostObj = IcingaHost::load($host->getName(), $db);
|
$directorHostObj = IcingaHost::load($host->getName(), $db);
|
||||||
if ($service !== null) {
|
if ($service !== null) {
|
||||||
$directorServiceObj = IcingaService::load([
|
$serviceOrigin = ['direct', 'inherited', 'applied', 'service-set'];
|
||||||
'host_id' => $directorHostObj->get('id'),
|
$serviceName = $service->getName();
|
||||||
'object_name' => $service->getName()
|
$i = 0;
|
||||||
], $db);
|
$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 $_) {
|
} catch (NotFoundError $_) {
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user