From c20b477df8d159a6c300bbfaee86670056fe58fb Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 2 Dec 2021 16:38:19 +0100 Subject: [PATCH] Introduce implementation for hook `Monitoring/CustomVarRenderer` --- .../Monitoring/CustomVarRenderer.php | 152 ++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 library/Director/ProvidedHook/Monitoring/CustomVarRenderer.php diff --git a/library/Director/ProvidedHook/Monitoring/CustomVarRenderer.php b/library/Director/ProvidedHook/Monitoring/CustomVarRenderer.php new file mode 100644 index 00000000..8d2bc256 --- /dev/null +++ b/library/Director/ProvidedHook/Monitoring/CustomVarRenderer.php @@ -0,0 +1,152 @@ +get('db', 'resource'); + if (! $resourceName) { + throw new ConfigurationError('Cannot identify director db. No resource configured'); + } + + return Db::fromResourceName($resourceName); + } + + public function prefetchForObject(MonitoredObject $object) + { + if ($object instanceof Host) { + $host = $object; + $service = null; + } elseif ($object instanceof Service) { + $host = $object->getHost(); + $service = $object; + } else { + return false; + } + + $db = $this->db(); + + try { + $directorHostObj = IcingaHost::load($host->getName(), $db); + if ($service !== null) { + $directorServiceObj = IcingaService::load([ + 'host_id' => $directorHostObj->get('id'), + 'object_name' => $service->getName() + ], $db); + } + } catch (NotFoundError $_) { + return false; + } + + if ($service === null) { + $fields = (new IcingaObjectFieldLoader($directorHostObj))->getFields(); + } else { + $fields = (new IcingaObjectFieldLoader($directorServiceObj))->getFields(); + } + + if (empty($fields)) { + return false; + } + + $fieldsWithDataLists = []; + foreach ($fields as $field) { + $this->fieldConfig[$field->get('varname')] = [ + 'label' => $field->get('caption'), + 'group' => $field->getCategoryName(), + 'visibility' => $field->getSetting('visibility') + ]; + + if ($field->get('datatype') === 'Icinga\Module\Director\DataType\DataTypeDatalist') { + $fieldsWithDataLists[$field->get('id')] = $field; + } + } + + if (! empty($fieldsWithDataLists)) { + $dataListEntries = $db->select()->from( + ['dds' => 'director_datafield_setting'], + [ + 'dds.datafield_id', + 'dde.entry_name', + 'dde.entry_value' + ] + )->join( + ['dde' => 'director_datalist_entry'], + 'dds.setting_value = dde.list_id', + [] + )->where('dds.datafield_id', array_keys($fieldsWithDataLists)) + ->where('dds.setting_name', 'datalist_id'); + + foreach ($dataListEntries as $dataListEntry) { + $field = $fieldsWithDataLists[$dataListEntry->datafield_id]; + $this->datalistMaps[$field->get('varname')][$dataListEntry->entry_name] = $dataListEntry->entry_value; + } + } + + return true; + } + + public function renderCustomVarKey($key) + { + if (isset($this->fieldConfig[$key]['label'])) { + return new HtmlElement( + 'span', + Attributes::create(['title' => $this->fieldConfig[$key]['label'] . " [$key]"]), + Text::create($this->fieldConfig[$key]['label']) + ); + } + } + + public function renderCustomVarValue($key, $value) + { + if (isset($this->fieldConfig[$key])) { + if ($this->fieldConfig[$key]['visibility'] === 'hidden') { + return '***'; + } + + if (isset($this->datalistMaps[$key][$value])) { + return new HtmlElement( + 'span', + Attributes::create(['title' => $this->datalistMaps[$key][$value] . " [$value]"]), + Text::create($this->datalistMaps[$key][$value]) + ); + } + } + } + + public function identifyCustomVarGroup($key) + { + if (isset($this->fieldConfig[$key]['group'])) { + return $this->fieldConfig[$key]['group']; + } + } +}