From 431468366c82f3684ea3eb7331c0d8a61b110850 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 2 Dec 2021 16:39:01 +0100 Subject: [PATCH] Introduce implementation for hook `Icingadb/CustomVarRenderer` --- .../Icingadb/CustomVarRenderer.php | 147 ++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 library/Director/ProvidedHook/Icingadb/CustomVarRenderer.php diff --git a/library/Director/ProvidedHook/Icingadb/CustomVarRenderer.php b/library/Director/ProvidedHook/Icingadb/CustomVarRenderer.php new file mode 100644 index 00000000..30ce03af --- /dev/null +++ b/library/Director/ProvidedHook/Icingadb/CustomVarRenderer.php @@ -0,0 +1,147 @@ +get('db', 'resource'); + if (! $resourceName) { + throw new ConfigurationError('Cannot identify director db. No resource configured'); + } + + return Db::fromResourceName($resourceName); + } + + public function prefetchForObject(Model $object): bool + { + if ($object instanceof Host) { + $host = $object; + $service = null; + } elseif ($object instanceof Service) { + $host = $object->host; + $service = $object; + } else { + return false; + } + + $db = $this->db(); + + try { + $directorHostObj = IcingaHost::load($host->name, $db); + if ($service !== null) { + $directorServiceObj = IcingaService::load([ + 'host_id' => $directorHostObj->get('id'), + 'object_name' => $service->name + ], $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(string $key) + { + if (isset($this->fieldConfig[$key]['label'])) { + return $this->fieldConfig[$key]['label']; + } + + return null; + } + + public function renderCustomVarValue(string $key, $value) + { + if (isset($this->fieldConfig[$key])) { + if ($this->fieldConfig[$key]['visibility'] === 'hidden') { + return '***'; + } + + if (isset($this->datalistMaps[$key][$value])) { + return $this->datalistMaps[$key][$value]; + } + } + + return null; + } + + public function identifyCustomVarGroup(string $key): ?string + { + if (isset($this->fieldConfig[$key]['group'])) { + return $this->fieldConfig[$key]['group']; + } + + return null; + } +}