185 lines
5.1 KiB
PHP
185 lines
5.1 KiB
PHP
<?php
|
|
|
|
namespace Icinga\Module\Director\Objects;
|
|
|
|
use Icinga\Exception\ProgrammingError;
|
|
use Icinga\Module\Director\IcingaConfig\IcingaConfig;
|
|
use Icinga\Module\Director\IcingaConfig\IcingaConfigHelper as c;
|
|
use Icinga\Module\Director\Objects\IcingaService;
|
|
|
|
class IcingaServiceSet extends IcingaObject
|
|
{
|
|
protected $table = 'icinga_service_set';
|
|
|
|
protected $defaultProperties = array(
|
|
'id' => null,
|
|
'host_id' => null,
|
|
'object_name' => null,
|
|
'object_type' => null,
|
|
'description' => null,
|
|
'assign_filter' => null,
|
|
);
|
|
|
|
protected $keyName = array('host_id', 'object_name');
|
|
|
|
protected $supportsImports = true;
|
|
|
|
protected $supportsCustomVars = true;
|
|
|
|
protected $supportsApplyRules = true;
|
|
|
|
protected $supportedInLegacy = true;
|
|
|
|
protected $relations = array(
|
|
'host' => 'IcingaHost',
|
|
);
|
|
|
|
public function isDisabled()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public function supportsAssignments()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @return IcingaService
|
|
*/
|
|
public function getServiceObjects()
|
|
{
|
|
if ($this->host_id) {
|
|
$imports = $this->imports()->getObjects();
|
|
if (empty($imports)) {
|
|
return array();
|
|
}
|
|
return $this->getServiceObjectsForSet(array_shift($imports));
|
|
} else {
|
|
return $this->getServiceObjectsForSet($this);
|
|
}
|
|
}
|
|
|
|
protected function getServiceObjectsForSet(IcingaServiceSet $set)
|
|
{
|
|
if ($set->id === null) {
|
|
return array();
|
|
}
|
|
|
|
$connection = $this->getConnection();
|
|
$db = $this->getDb();
|
|
$ids = $db->fetchCol(
|
|
$db->select()->from('icinga_service', 'id')
|
|
->where('service_set_id = ?', $set->id)
|
|
);
|
|
|
|
$services = array();
|
|
foreach ($ids as $id) {
|
|
$service = IcingaService::load(array(
|
|
'id' => $id,
|
|
'object_type' => 'template'
|
|
), $connection);
|
|
|
|
$services[$service->object_name] = $service;
|
|
}
|
|
|
|
return $services;
|
|
}
|
|
|
|
public function renderToConfig(IcingaConfig $config)
|
|
{
|
|
if ($this->assign_filter === null && $this->isTemplate()) {
|
|
return;
|
|
}
|
|
|
|
if ($config->isLegacy()) {
|
|
return $this->renderToLegacyConfig($config);
|
|
}
|
|
|
|
$file = $this->getConfigFileWithHeader($config);
|
|
|
|
// Loop over all services belonging to this set
|
|
// add our assign rules and then add the service to the config
|
|
// eventually clone them beforehand to not get into trouble with caches
|
|
// figure out whether we might need a zone property
|
|
foreach ($this->getServiceObjects() as $service) {
|
|
// TODO: make them REAL applies
|
|
if ($this->assign_filter) {
|
|
$service->object_type = 'apply';
|
|
$service->assign_filter = $this->assign_filter;
|
|
} else {
|
|
$service->object_type = $this->object_type;
|
|
if ($this->isApplyRule()) {
|
|
$service->assign_filter = $this->assign_filter;
|
|
}
|
|
}
|
|
|
|
$service->vars = $this->vars;
|
|
$service->host_id = $this->host_id;
|
|
$file->addObject($service);
|
|
}
|
|
}
|
|
|
|
protected function getConfigFileWithHeader(IcingaConfig $config)
|
|
{
|
|
$file = $config->configFile(
|
|
'zones.d/' . $this->getRenderingZone($config) . '/servicesets'
|
|
);
|
|
|
|
$file->prepend($this->getConfigHeaderComment($config));
|
|
return $file;
|
|
}
|
|
|
|
protected function getConfigHeaderComment(IcingaConfig $config)
|
|
{
|
|
if ($config->isLegacy()) {
|
|
$comment = "## Service Set '%s'\n\n";
|
|
} else {
|
|
$comment = "/** Service Set '%s' **/\n\n";
|
|
}
|
|
|
|
return sprintf($comment, $this->object_name);
|
|
}
|
|
|
|
public function renderToLegacyConfig(IcingaConfig $config)
|
|
{
|
|
if ($this->isTemplate()) {
|
|
return;
|
|
}
|
|
|
|
if ($this->isApplyRule()) {
|
|
// Not yet
|
|
return;
|
|
}
|
|
|
|
// evaluate my assign rules once, get related hosts
|
|
// Loop over all services belonging to this set
|
|
// generate every service with host_name host1,host2...
|
|
|
|
$file = $config->configFile(
|
|
// TODO: zones.d?
|
|
'zones.d/' . $this->getRenderingZone($config) . '/servicesets'
|
|
);
|
|
|
|
$file->prepend($this->getConfigHeaderComment($config));
|
|
|
|
foreach ($this->getServiceObjects() as $service) {
|
|
$service->object_type = 'object';
|
|
$service->host_id = $this->host_id;
|
|
$service->vars = $this->vars;
|
|
$file->addLegacyObject($service);
|
|
}
|
|
}
|
|
|
|
public function getRenderingZone(IcingaConfig $config = null)
|
|
{
|
|
if ($this->host_id === null) {
|
|
return $this->connection->getDefaultGlobalZoneName();
|
|
} else {
|
|
$host = $this->getRelatedObject('host', $this->host_id);
|
|
return $host->getRenderingZone($config);
|
|
}
|
|
return $zone;
|
|
}
|
|
}
|