From f66ab8dae2f3d0418759f81a3a64dc9517a62449 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 14 Apr 2024 15:17:31 +0200 Subject: Adding upstream version 1.10.2. Signed-off-by: Daniel Baumann --- application/forms/IcingaDependencyForm.php | 309 +++++++++++++++++++++++++++++ 1 file changed, 309 insertions(+) create mode 100644 application/forms/IcingaDependencyForm.php (limited to 'application/forms/IcingaDependencyForm.php') diff --git a/application/forms/IcingaDependencyForm.php b/application/forms/IcingaDependencyForm.php new file mode 100644 index 0000000..ab30844 --- /dev/null +++ b/application/forms/IcingaDependencyForm.php @@ -0,0 +1,309 @@ +setupDependencyElements(); + } + + /*** + * @throws \Zend_Form_Exception + */ + protected function setupDependencyElements() + { + $this->addObjectTypeElement(); + if (! $this->hasObjectType()) { + $this->groupMainProperties(); + return; + } + + $this->addNameElement() + ->addDisabledElement() + ->addImportsElement() + ->addObjectsElement() + ->addBooleanElements() + ->addPeriodElement() + ->addAssignmentElements() + ->addEventFilterElements(['states']) + ->groupMainProperties() + ->addZoneSection() + ->setButtons(); + } + + /** + * @return $this + * @throws \Zend_Form_Exception + */ + protected function addZoneSection() + { + $this->addZoneElement(true); + + $elements = array( + 'zone_id', + ); + $this->addDisplayGroup($elements, 'clustering', array( + 'decorators' => array( + 'FormElements', + array('HtmlTag', array('tag' => 'dl')), + 'Fieldset', + ), + 'order' => self::GROUP_ORDER_CLUSTERING, + 'legend' => $this->translate('Zone settings') + )); + + return $this; + } + + /** + * @return $this + * @throws \Zend_Form_Exception + */ + protected function addNameElement() + { + $this->addElement('text', 'object_name', [ + 'label' => $this->translate('Name'), + 'required' => true, + 'description' => $this->translate('Name for the Icinga dependency you are going to create') + ]); + + return $this; + } + + /** + * @return $this + * @throws \Zend_Form_Exception + */ + protected function addAssignmentElements() + { + if (!$this->object || !$this->object->isApplyRule()) { + return $this; + } + + $this->addElement('select', 'apply_to', [ + 'label' => $this->translate('Apply to'), + 'description' => $this->translate( + 'Whether this dependency should affect hosts or services' + ), + 'required' => true, + 'class' => 'autosubmit', + 'multiOptions' => $this->optionalEnum([ + 'host' => $this->translate('Hosts'), + 'service' => $this->translate('Services'), + ]) + ]); + + $applyTo = $this->getSentOrObjectValue('apply_to'); + + if (! $applyTo) { + return $this; + } + + $suggestionContext = ucfirst($applyTo) . 'FilterColumns'; + $this->addAssignFilter([ + 'suggestionContext' => $suggestionContext, + 'description' => $this->translate( + 'This allows you to configure an assignment filter. Please feel' + . ' free to combine as many nested operators as you want. The' + . ' "contains" operator is valid for arrays only. Please use' + . ' wildcards and the = (equals) operator when searching for' + . ' partial string matches, like in *.example.com' + ) + ]); + + return $this; + } + + /** + * @return $this + * @throws \Zend_Form_Exception + */ + protected function addPeriodElement() + { + $periods = $this->db->enumTimeperiods(); + if (empty($periods)) { + return $this; + } + + $this->addElement( + 'select', + 'period_id', + array( + 'label' => $this->translate('Time period'), + 'description' => $this->translate( + 'The name of a time period which determines when this' + . ' notification should be triggered. Not set by default.' + ), + 'multiOptions' => $this->optionalEnum($periods), + ) + ); + + return $this; + } + + /** + * @return $this + */ + protected function addBooleanElements() + { + $this->addBoolean('disable_checks', [ + 'label' => $this->translate('Disable Checks'), + 'description' => $this->translate( + 'Whether to disable checks when this dependency fails.' + . ' Defaults to false.' + ) + ], null); + + $this->addBoolean('disable_notifications', [ + 'label' => $this->translate('Disable Notificiations'), + 'description' => $this->translate( + 'Whether to disable notifications when this dependency fails.' + . ' Defaults to true.' + ) + ], null); + + $this->addBoolean('ignore_soft_states', [ + 'label' => $this->translate('Ignore Soft States'), + 'description' => $this->translate( + 'Whether to ignore soft states for the reachability calculation.' + . ' Defaults to true.' + ) + ], null); + + return $this; + } + + /** + * @return $this + * @throws \Zend_Form_Exception + */ + protected function addObjectsElement() + { + $dependency = $this->getObject(); + $parentHost = $dependency->get('parent_host'); + if ($parentHost === null) { + $parentHostVar = $dependency->get('parent_host_var'); + if (\strlen($parentHostVar) > 0) { + $parentHost = '$' . $dependency->get('parent_host_var') . '$'; + } + } + $this->addElement('text', 'parent_host', [ + 'label' => $this->translate('Parent Host'), + 'description' => $this->translate( + 'The parent host. You might want to refer Host Custom Variables' + . ' via $host.vars.varname$' + ), + 'class' => "autosubmit director-suggest", + 'data-suggestion-context' => 'hostnames', + 'order' => 10, + 'required' => $this->isObject(), + 'value' => $parentHost + ]); + $sentParent = $this->getSentOrObjectValue('parent_host'); + + if (!empty($sentParent) || $dependency->isApplyRule()) { + $parentService = $dependency->get('parent_service'); + $this->addElement('text', 'parent_service', [ + 'label' => $this->translate('Parent Service'), + 'description' => $this->translate( + 'Optional. The parent service. If omitted this dependency' + . ' object is treated as host dependency.' + ), + 'class' => "autosubmit director-suggest", + 'data-suggestion-context' => 'servicenames', + 'data-suggestion-for-host' => $sentParent, + 'order' => 20, + 'value' => $parentService + ]); + } + + // If configuring Object, allow selection of child host and/or service, + // otherwise apply rules will determine child object. + if ($dependency->isObject()) { + $this->addElement('text', 'child_host', [ + 'label' => $this->translate('Child Host'), + 'description' => $this->translate('The child host.'), + 'value' => $dependency->get('child_host'), + 'order' => 30, + 'class' => 'autosubmit director-suggest', + 'required' => $this->isObject(), + 'data-suggestion-context' => 'hostnames', + ]); + + $sentChild = $this->getSentOrObjectValue('child_host'); + + if (!empty($sentChild)) { + $this->addElement('text', 'child_service', [ + 'label' => $this->translate('Child Service'), + 'description' => $this->translate( + 'Optional. The child service. If omitted this dependency' + . ' object is treated as host dependency.' + ), + 'class' => 'autosubmit director-suggest', + 'order' => 40, + 'value' => $this->getObject()->get('child_service'), + 'data-suggestion-context' => 'servicenames', + 'data-suggestion-for-host' => $sentChild, + ]); + } + } + + $elements = ['parent_host', 'child_host', 'parent_service', 'child_service']; + $this->addDisplayGroup($elements, 'related_objects', [ + 'decorators' => [ + 'FormElements', + ['HtmlTag', ['tag' => 'dl']], + 'Fieldset', + ], + 'order' => self::GROUP_ORDER_RELATED_OBJECTS, + 'legend' => $this->translate('Related Objects') + ]); + + return $this; + } + + /** + * Hint: this is unused. Why? + * + * @param IcingaDependency $dependency + * @return $this + */ + public function createApplyRuleFor(IcingaDependency $dependency) + { + $object = $this->object(); + $object->setImports($dependency->getObjectName()); + $object->set('object_type', 'apply'); + $object->set('object_name', $dependency->getObjectName()); + + return $this; + } + + protected function handleProperties(DbObject $object, &$values) + { + if ($this->hasBeenSent()) { + if (isset($values['parent_host']) + && $this->isCustomVar($values['parent_host']) + ) { + $values['parent_host_var'] = \trim($values['parent_host'], '$'); + $values['parent_host'] = ''; + } + } + + parent::handleProperties($object, $values); + } + + protected function isCustomVar($string) + { + return \preg_match('/^\$(?:host)\.vars\..+\$$/', $string); + // Eventually: return \preg_match('/^\$(?:host|service)\.vars\..+\$$/', $string); + } +} -- cgit v1.2.3