From 3154e3313f496de2fb94132b77a01195d4a7e409 Mon Sep 17 00:00:00 2001 From: ValeDaRold <36924916+ValeDaRold@users.noreply.github.com> Date: Fri, 6 Aug 2021 11:43:09 +0200 Subject: [PATCH] Add new Host from Filter and Service from Filter in AddNodeForm.php (#300) refs #295 --- application/forms/AddNodeForm.php | 119 ++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/application/forms/AddNodeForm.php b/application/forms/AddNodeForm.php index df9fe66..1d87305 100644 --- a/application/forms/AddNodeForm.php +++ b/application/forms/AddNodeForm.php @@ -2,6 +2,7 @@ namespace Icinga\Module\Businessprocess\Forms; +use Icinga\Data\Filter\Filter; use Icinga\Module\Businessprocess\BpNode; use Icinga\Module\Businessprocess\BpConfig; use Icinga\Module\Businessprocess\ImportedNode; @@ -65,6 +66,12 @@ class AddNodeForm extends QuickForm case 'new-process': $this->addNewProcess(); break; + case 'hosts_from_filter': + $this->selectHostsFromFilter(); + break; + case 'services_from_filter': + $this->selectServicesFromFilter(); + break; case null: $this->setSubmitLabel($this->translate('Next')); return; @@ -157,6 +164,8 @@ class AddNodeForm extends QuickForm if ($this->hasParentNode()) { $types['host'] = $this->translate('Host'); $types['service'] = $this->translate('Service'); + $types['hosts_from_filter'] = $this->translate('Hosts from filter'); + $types['services_from_filter'] = $this->translate('Services from filter'); } elseif (! $this->hasProcesses()) { $this->addElement('hidden', 'node_type', array( 'ignore' => true, @@ -248,6 +257,53 @@ class AddNodeForm extends QuickForm ]); } + protected function addFilteredHostsElement($filter) + { + $this->addElement('submit', 'refresh', [ + 'label' => $this->translate('Refresh'), + 'class' => 'refresh-filter' + ]); + $this->addElement('multiselect', 'children', [ + 'label' => $this->translate('Hosts'), + 'required' => true, + 'size' => 8, + 'style' => 'width: 25em', + 'multiOptions' => $this->enumHostListByFilter($filter), + 'description' => $this->translate( + 'Hosts that should be part of this business process node' + ), + 'validators' => [[new NoDuplicateChildrenValidator($this, $this->bp, $this->parent), true]] + ]); + } + + protected function addFilteredServicesElement($filter) + { + $this->addElement('submit', 'refresh', [ + 'label' => $this->translate('Refresh'), + 'class' => 'refresh-filter' + ]); + $this->addElement('multiselect', 'children', [ + 'label' => $this->translate('Services'), + 'required' => true, + 'size' => 8, + 'style' => 'width: 25em', + 'multiOptions' => $this->enumServiceListByFilter($filter), + 'description' => $this->translate( + 'Services that should be part of this business process node' + ), + 'validators' => [[new NoDuplicateChildrenValidator($this, $this->bp, $this->parent), true]] + ]); + } + + protected function addFilterElement() + { + $this->addElement('text', 'filter', array( + 'label' => $this->translate('Filter'), + 'required' => true, + 'ignore' => true + )); + } + protected function addFileElement() { $this->addElement('select', 'file', [ @@ -301,6 +357,26 @@ class AddNodeForm extends QuickForm ]); } + protected function selectHostsFromFilter() + { + $this->addFilterElement(); + if ($filter = $this->getSentValue('filter')) { + $this->addFilteredHostsElement($filter); + } else { + $this->setSubmitLabel($this->translate('Next')); + } + } + + protected function selectServicesFromFilter() + { + $this->addFilterElement(); + if ($filter = $this->getSentValue('filter')) { + $this->addFilteredServicesElement($filter); + } else { + $this->setSubmitLabel($this->translate('Next')); + } + } + protected function selectProcess() { if ($this->hasParentNode()) { @@ -463,6 +539,47 @@ class AddNodeForm extends QuickForm return $serviceStateList; } + protected function enumHostListByFilter($filter) + { + $names = $this->backend + ->select() + ->from('hostStatus', ['hostname' => 'host_name']) + ->applyFilter(Filter::fromQueryString($filter)) + ->applyFilter($this->getRestriction('monitoring/filter/objects')) + ->order('host_name') + ->getQuery() + ->fetchColumn(); + + // fetchPairs doesn't seem to work when using the same column with + // different aliases twice + $res = array(); + $suffix = ';Hoststatus'; + foreach ($names as $name) { + $res[$name . $suffix] = $name; + } + + return $res; + } + + protected function enumServiceListByFilter($filter) + { + $objects = $this->backend + ->select() + ->from('serviceStatus', ['host' => 'host_name', 'service' => 'service_description']) + ->applyFilter(Filter::fromQueryString($filter)) + ->applyFilter($this->getRestriction('monitoring/filter/objects')) + ->order('service_description') + ->getQuery() + ->fetchAll(); + + $services = array(); + foreach ($objects as $object) { + $services[$object->host . ';' . $object->service] = $object->host . ':' . $object->service; + } + + return $services; + } + protected function hasProcesses() { return count($this->enumProcesses()) > 0; @@ -552,6 +669,8 @@ class AddNodeForm extends QuickForm // Fallthrough case 'process': + case 'hosts_from_filter': + case 'services_from_filter': if ($this->hasParentNode()) { $changes->addChildrenToNode($this->getValue('children'), $this->parent); } else {