diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 12:43:12 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 12:43:12 +0000 |
commit | cd989f9c3aff968e19a3aeabc4eb9085787a6673 (patch) | |
tree | fbff2135e7013f196b891bbde54618eb050e4aaf /library/Director/Web/ObjectPreview.php | |
parent | Initial commit. (diff) | |
download | icingaweb2-module-director-upstream.tar.xz icingaweb2-module-director-upstream.zip |
Adding upstream version 1.10.2.upstream/1.10.2upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'library/Director/Web/ObjectPreview.php')
-rw-r--r-- | library/Director/Web/ObjectPreview.php | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/library/Director/Web/ObjectPreview.php b/library/Director/Web/ObjectPreview.php new file mode 100644 index 0000000..e7648e1 --- /dev/null +++ b/library/Director/Web/ObjectPreview.php @@ -0,0 +1,182 @@ +<?php + +namespace Icinga\Module\Director\Web; + +use gipfl\Web\Widget\Hint; +use ipl\Html\Text; +use Icinga\Module\Director\Exception\NestingError; +use Icinga\Module\Director\Objects\IcingaObject; +use Icinga\Web\Request; +use ipl\Html\Html; +use gipfl\IcingaWeb2\Link; +use gipfl\Translation\TranslationHelper; +use gipfl\IcingaWeb2\Widget\ControlsAndContent; + +class ObjectPreview +{ + use TranslationHelper; + + /** @var IcingaObject */ + protected $object; + + /** @var Request */ + protected $request; + + public function __construct(IcingaObject $object, Request $request) + { + $this->object = $object; + $this->request = $request; + } + + /** + * @param ControlsAndContent $cc + * @throws \Icinga\Exception\NotFoundError + */ + public function renderTo(ControlsAndContent $cc) + { + $object = $this->object; + $url = $this->request->getUrl(); + $params = $url->getParams(); + $cc->addTitle( + $this->translate('Config preview: %s'), + $object->getObjectName() + ); + + if ($params->shift('resolved')) { + $object = $object::fromPlainObject( + $object->toPlainObject(true), + $object->getConnection() + ); + + $cc->actions()->add(Link::create( + $this->translate('Show normal'), + $url->without('resolved'), + null, + ['class' => 'icon-resize-small state-warning'] + )); + } else { + try { + if ($object->supportsImports() && $object->imports()->count() > 0) { + $cc->actions()->add(Link::create( + $this->translate('Show resolved'), + $url->with('resolved', true), + null, + ['class' => 'icon-resize-full'] + )); + } + } catch (NestingError $e) { + // No resolve link with nesting errors + } + } + + $content = $cc->content(); + if ($object->isDisabled()) { + $content->add(Hint::error( + $this->translate('This object will not be deployed as it has been disabled') + )); + } + if ($object->isExternal()) { + $content->add(Html::tag('p', null, $this->translate(( + 'This is an external object. It has been imported from Icinga 2 through the' + . ' Core API and cannot be managed with the Icinga Director. It is however' + . ' perfectly valid to create objects using this or referring to this object.' + . ' You might also want to define related Fields to make work based on this' + . ' object more enjoyable.' + )))); + } + $config = $object->toSingleIcingaConfig(); + + foreach ($config->getFiles() as $filename => $file) { + if (! $object->isExternal()) { + $content->add(Html::tag('h2', null, $filename)); + } + + $classes = array(); + if ($object->isDisabled()) { + $classes[] = 'disabled'; + } elseif ($object->isExternal()) { + $classes[] = 'logfile'; + } + + $type = $object->getShortTableName(); + + $plain = Html::wantHtml($file->getContent())->render(); + $plain = preg_replace_callback( + '/^(\s+import\s+\"\;)(.+)(\"\;)/m', + [$this, 'linkImport'], + $plain + ); + + if ($type !== 'command') { + $plain = preg_replace_callback( + '/^(\s+(?:check_|event_)?command\s+=\s+\"\;)(.+)(\"\;)/m', + [$this, 'linkCommand'], + $plain + ); + } + + $plain = preg_replace_callback( + '/^(\s+host_name\s+=\s+\"\;)(.+)(\"\;)/m', + [$this, 'linkHost'], + $plain + ); + $text = Text::create($plain)->setEscaped(); + + $content->add(Html::tag('pre', ['class' => $classes], $text)); + } + } + + /** + * @api internal + * @param $match + * @return string + */ + public function linkImport($match) + { + $blacklist = [ + 'plugin-notification-command', + 'plugin-check-command', + ]; + if (in_array($match[2], $blacklist)) { + return $match[1] . $match[2] . $match[3]; + } + + $urlObjectType = $this->object->getShortTableName(); + if ($urlObjectType === 'service_set') { + $urlObjectType = 'service'; + } + return $match[1] . Link::create( + $match[2], + sprintf("director/$urlObjectType"), + ['name' => $match[2]] + )->render() . $match[3]; + } + + /** + * @api internal + * @param $match + * @return string + */ + public function linkCommand($match) + { + return $match[1] . Link::create( + $match[2], + sprintf('director/command'), + ['name' => $match[2]] + )->render() . $match[3]; + } + + /** + * @api internal + * @param $match + * @return string + */ + public function linkHost($match) + { + return $match[1] . Link::create( + $match[2], + sprintf('director/host'), + ['name' => $match[2]] + )->render() . $match[3]; + } +} |