From 3c7082cabcfc229daeb7c12e50b5652b7891cfdb Mon Sep 17 00:00:00 2001 From: raviks789 <33730024+raviks789@users.noreply.github.com> Date: Thu, 3 Aug 2023 10:33:52 +0200 Subject: [PATCH] Modify `IcingaObjectFilterHelper::filterByTemplate` for director branches Icinga objects must be filterable based on templates when a director branch is active. --- .../Director/Db/IcingaObjectFilterHelper.php | 32 ++++++++++++++++++- .../Web/Controller/TemplateController.php | 3 ++ .../Director/Web/Table/TemplateUsageTable.php | 15 ++++++--- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/library/Director/Db/IcingaObjectFilterHelper.php b/library/Director/Db/IcingaObjectFilterHelper.php index 15069905..87f1cc5a 100644 --- a/library/Director/Db/IcingaObjectFilterHelper.php +++ b/library/Director/Db/IcingaObjectFilterHelper.php @@ -5,6 +5,7 @@ namespace Icinga\Module\Director\Db; use Icinga\Module\Director\Objects\IcingaObject; use Icinga\Module\Director\Resolver\TemplateTree; use InvalidArgumentException; +use Ramsey\Uuid\UuidInterface; use RuntimeException; use Zend_Db_Select as ZfSelect; @@ -46,13 +47,42 @@ class IcingaObjectFilterHelper ZfSelect $query, $template, $tableAlias = 'o', - $inheritanceType = self::INHERIT_DIRECT + $inheritanceType = self::INHERIT_DIRECT, + UuidInterface $branchuuid = null ) { $i = $tableAlias . 'i'; $o = $tableAlias; $type = $template->getShortTableName(); $db = $template->getDb(); $id = static::wantId($template); + + if ($branchuuid) { + if ($inheritanceType === self::INHERIT_DIRECT) { + return $query->where('imports LIKE \'%"' . $template->getObjectName() . '"%\''); + } elseif ($inheritanceType === self::INHERIT_INDIRECT + || $inheritanceType === self::INHERIT_DIRECT_OR_INDIRECT + ) { + $tree = new TemplateTree($type, $template->getConnection()); + $templateNames = $tree->getDescendantsFor($template); + + if ($inheritanceType === self::INHERIT_DIRECT_OR_INDIRECT) { + $templateNames[] = $template->getObjectName(); + } + + if (empty($templateNames)) { + $condition = '(1 = 0)'; + } else { + $condition = 'imports LIKE \'%"' . array_pop($templateNames) . '"%\''; + + foreach ($templateNames as $templateName) { + $condition .= " OR imports LIKE '%\"$templateName\"%'"; + } + } + + return $query->where($condition); + } + } + $sub = $db->select()->from( array($i => "icinga_{$type}_inheritance"), array('e' => '(1)') diff --git a/library/Director/Web/Controller/TemplateController.php b/library/Director/Web/Controller/TemplateController.php index bf5b68c6..47511bec 100644 --- a/library/Director/Web/Controller/TemplateController.php +++ b/library/Director/Web/Controller/TemplateController.php @@ -25,6 +25,8 @@ abstract class TemplateController extends CompatController { use DirectorDb; + use BranchHelper; + /** @var IcingaObject */ protected $template; @@ -43,6 +45,7 @@ abstract class TemplateController extends CompatController ObjectsTable::create($this->getType(), $this->db()) ->setAuth($this->Auth()) + ->setBranch($this->getBranch()) ->setBaseObjectUrl($this->getBaseObjectUrl()) ->filterTemplate($template, $this->getInheritance()) ->renderTo($this); diff --git a/library/Director/Web/Table/TemplateUsageTable.php b/library/Director/Web/Table/TemplateUsageTable.php index c6c27d7e..8c6d88c8 100644 --- a/library/Director/Web/Table/TemplateUsageTable.php +++ b/library/Director/Web/Table/TemplateUsageTable.php @@ -3,9 +3,11 @@ namespace Icinga\Module\Director\Web\Table; use Icinga\Exception\ProgrammingError; +use Icinga\Module\Director\Db\Branch\Branch; use Icinga\Module\Director\Objects\IcingaObject; use Icinga\Module\Director\Resolver\TemplateTree; use gipfl\IcingaWeb2\Link; +use Icinga\Module\Director\Web\Controller\BranchHelper; use ipl\Html\Table; use gipfl\Translation\TranslationHelper; @@ -13,10 +15,14 @@ class TemplateUsageTable extends Table { use TranslationHelper; + use TableWithBranchSupport; + protected $defaultAttributes = ['class' => 'pivot']; protected $objectType; + protected $searchColumns = []; + public function getTypes() { return [ @@ -37,14 +43,14 @@ class TemplateUsageTable extends Table * @param IcingaObject $template * @return TemplateUsageTable */ - public static function forTemplate(IcingaObject $template) + public static function forTemplate(IcingaObject $template, Branch $branch = null) { $type = ucfirst($template->getShortTableName()); $class = __NAMESPACE__ . "\\{$type}TemplateUsageTable"; if (class_exists($class)) { - return new $class($template); + return new $class($template, $branch); } else { - return new static($template); + return new static($template, $branch); } } @@ -58,7 +64,7 @@ class TemplateUsageTable extends Table ]; } - protected function __construct(IcingaObject $template) + protected function __construct(IcingaObject $template, Branch $branch = null) { if ($template->get('object_type') !== 'template') { @@ -68,6 +74,7 @@ class TemplateUsageTable extends Table ); } + $this->setBranch($branch); $this->objectType = $objectType = $template->getShortTableName(); $types = $this->getTypes(); $usage = $this->getUsageSummary($template);