diff --git a/library/Director/Objects/IcingaObject.php b/library/Director/Objects/IcingaObject.php index e4a467e3..76ed572b 100644 --- a/library/Director/Objects/IcingaObject.php +++ b/library/Director/Objects/IcingaObject.php @@ -8,6 +8,7 @@ use Icinga\Module\Director\Db; use Icinga\Module\Director\IcingaConfig\IcingaConfig; use Icinga\Module\Director\IcingaConfig\IcingaConfigRenderer; use Icinga\Module\Director\IcingaConfig\IcingaConfigHelper as c; +use Icinga\Module\Director\IcingaConfig\IcingaLegacyConfigHelper as c1; use Icinga\Data\Filter\Filter; use Icinga\Exception\ConfigurationError; use Icinga\Exception\ProgrammingError; @@ -1098,6 +1099,56 @@ abstract class IcingaObject extends DbObject implements IcingaConfigRenderer DirectorActivityLog::logRemoval($this, $this->connection); } + public function renderToLegacyConfig(IcingaConfig $config) + { + if ($this->isExternal()) { + return; + } + + $type = $this->getShortTableName(); + + if ($this->isTemplate()) { + $filename = strtolower($type) . '_templates'; + } elseif ($this->isApplyRule()) { + $filename = strtolower($type) . '_apply'; + } else { + $filename = strtolower($type) . 's'; + } + + if ($config->isLegacy()) { + + if ($this->getResolvedProperty('zone_id')) { + + $a = clone($this); + $a->enable_active_checks = true; + + $b = clone($this); + $a->enable_active_checks = false; + + $config->configFile( + 'director/master/' . $filename, + '.cfg' + )->addLegacyObject($a); + + $config->configFile( + 'director/' . $this->getRenderingZone($config) . '/' . $filename, + '.cfg' + )->addLegacyObject($b); + + } else { + $config->configFile( + 'director/' . $this->getRenderingZone($config) . '/' . $filename, + '.cfg' + )->addLegacyObject($this); + } + + } else { + $config->configFile( + 'director/' . $this->getRenderingZone($config) . '/' . $filename + )->addObject($this); + } + } + public function renderToConfig(IcingaConfig $config) { if ($this->isExternal()) { @@ -1143,12 +1194,78 @@ abstract class IcingaObject extends DbObject implements IcingaConfigRenderer } } + protected function renderLegacyImports() + { + if ($this->supportsImports()) { + return $this->imports()->toLegacyConfigString(); + } else { + return ''; + } + } + // Disabled is a virtual property protected function renderDisabled() { return ''; } + /** + * @codingStandardsIgnoreStart + */ + protected function renderLegacyEnable_active_checks() + { + return $this->renderLegacyBooleanProperty( + 'enable_active_checks', + 'active_checks_enabled' + ); + } + + protected function renderLegacyEnable_passive_checks() + { + return $this->renderLegacyBooleanProperty( + 'enable_passive_checks', + 'passive_checks_enabled' + ); + } + + protected function renderLegacyEnable_event_handler() + { + return $this->renderLegacyBooleanProperty( + 'enable_active_checks', + 'event_handler_enabled' + ); + } + + protected function renderLegacyEnable_notifications() + { + return $this->renderLegacyBooleanProperty( + 'enable_notifications', + 'notifications_enabled' + ); + } + + protected function renderLegacyEnable_perfdata() + { + return $this->renderLegacyBooleanProperty( + 'enable_perfdata', + 'process_perf_data' + ); + } + + protected function renderLegacyVolatile() + { + // @codingStandardsIgnoreEnd + return $this->renderLegacyBooleanProperty( + 'volatile', + 'is_volatile' + ); + } + + protected function renderLegacyBooleanProperty($property, $legacyKey) + { + return c1::renderKeyValue($legacyKey, c1::renderBoolean($this->$property)); + } + protected function renderProperties() { $out = ''; @@ -1169,6 +1286,26 @@ abstract class IcingaObject extends DbObject implements IcingaConfigRenderer return $out; } + protected function renderLegacyProperties() + { + $out = ''; + $blacklist = array_merge(array( + 'id', + 'object_name', + 'object_type', + ), array() /* $this->prioritizedProperties */); + + foreach ($this->properties as $key => $value) { + if (in_array($key, $blacklist)) { + continue; + } + + $out .= $this->renderLegacyObjectProperty($key, $value); + } + + return $out; + } + protected function renderPrioritizedProperties() { $out = ''; @@ -1230,6 +1367,48 @@ abstract class IcingaObject extends DbObject implements IcingaConfigRenderer return c::renderKeyValue($key, c::renderString($value)); } + protected function renderLegacyObjectProperty($key, $value) + { + if (substr($key, -3) === '_id') { + $short = substr($key, 0, -3); + if ($this->hasUnresolvedRelatedProperty($key)) { + return c1::renderKeyValue( + $short, // NOT + c1::renderString($this->$short) + ); + + return ''; + } + } + + if ($value === null) { + return ''; + } + + $method = 'renderLegacy' . ucfirst($key); + if (method_exists($this, $method)) { + return $this->$method($value); + } + + $method = 'render' . ucfirst($key); + if (method_exists($this, $method)) { + return $this->$method($value); + } + + if ($this->propertyIsBoolean($key)) { + if ($value === $this->defaultProperties[$key]) { + return ''; + } else { + return c1::renderKeyValue( + $this->booleans[$key], + c1::renderBoolean($value) + ); + } + } + + return c1::renderKeyValue($key, c1::renderString($value)); + } + protected function renderBooleanProperty($key) { return c::renderKeyValue($key, c::renderBoolean($this->$key)); @@ -1245,6 +1424,11 @@ abstract class IcingaObject extends DbObject implements IcingaConfigRenderer return "}\n\n"; } + protected function renderLegacySuffix() + { + return "}\n\n"; + } + /** * @return string */ @@ -1370,6 +1554,75 @@ abstract class IcingaObject extends DbObject implements IcingaConfigRenderer } } + protected function renderLegacyObjectHeader() + { + $type = strtolower($this->getType()); + + if ($this->isTemplate()) { + $name = c1::renderKeyValue('name', c1::renderString($this->getObjectName())); + } else { + $name = c1::renderKeyValue($type . '_name', c1::renderString($this->getObjectName())); + } + + $str = sprintf( + "define %s {\n$name", + $type, + $name + ); + + if ($this->isTemplate()) { + $str .= c1::renderKeyValue('register', '0'); + } + + return $str; + } + + public function toLegacyConfigString() + { + $str = implode(array( + $this->renderLegacyObjectHeader(), + $this->renderLegacyImports(), + $this->renderLegacyProperties(), + //$this->renderRanges(), + //$this->renderArguments(), + //$this->renderRelatedSets(), + //$this->renderGroups(), + //$this->renderMultiRelations(), + //$this->renderCustomExtensions(), + //$this->renderCustomVars(), + //$this->renderAssignments(), + $this->renderLegacySuffix() + )); + + $str = $this->alignLegacyProperties($str); + + if ($this->isDisabled()) { + return "/* --- This object has been disabled ---\n" + . $str . "*/\n"; + } else { + return $str; + } + } + + protected function alignLegacyProperties($configString) + { + $lines = preg_split('/\n/', $configString); + $len = 24; + + foreach ($lines as &$line) { + if (preg_match('/^\s{4}([^\t]+)\t+(.+)$/', $line, $m)) { + if ($len - strlen($m[1]) < 0) { + var_dump($m); + exit; + } + + $line = ' ' . $m[1] . str_repeat(' ', $len - strlen($m[1])) . $m[2]; + } + } + + return implode("\n", $lines); + } + public function toConfigString() { $str = implode(array( diff --git a/library/Director/Objects/IcingaObjectImports.php b/library/Director/Objects/IcingaObjectImports.php index 20e1dfcb..289df9f0 100644 --- a/library/Director/Objects/IcingaObjectImports.php +++ b/library/Director/Objects/IcingaObjectImports.php @@ -7,6 +7,7 @@ use Iterator; use Countable; use Icinga\Module\Director\IcingaConfig\IcingaConfigRenderer; use Icinga\Module\Director\IcingaConfig\IcingaConfigHelper as c; +use Icinga\Module\Director\IcingaConfig\IcingaLegacyConfigHelper as c1; class IcingaObjectImports implements Iterator, Countable, IcingaConfigRenderer { @@ -351,6 +352,20 @@ class IcingaObjectImports implements Iterator, Countable, IcingaConfigRenderer return $ret; } + public function toLegacyConfigString() + { + $ret = ''; + + foreach ($this->imports as $name => $o) { + $ret .= c1::renderKeyValue('use', c1::renderString($name)); + } + + if ($ret !== '') { + $ret .= "\n"; + } + return $ret; + } + public function __toString() { try {