diff options
Diffstat (limited to 'library/Director/Settings.php')
-rw-r--r-- | library/Director/Settings.php | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/library/Director/Settings.php b/library/Director/Settings.php new file mode 100644 index 0000000..d3e0987 --- /dev/null +++ b/library/Director/Settings.php @@ -0,0 +1,219 @@ +<?php + +namespace Icinga\Module\Director; + +class Settings +{ + protected $connection; + + protected $db; + + protected $cache; + + protected $defaults = [ + 'default_global_zone' => 'director-global', + 'icinga_package_name' => 'director', + 'config_format' => 'v2', + 'override_services_varname' => '_override_servicevars', + 'override_services_templatename' => 'host var overrides (Director)', + 'disable_all_jobs' => 'n', // 'y' + 'enable_audit_log' => 'n', + 'deployment_mode_v1' => 'active-passive', + 'deployment_path_v1' => null, + 'activation_script_v1' => null, + 'self-service/agent_name' => 'fqdn', + 'self-service/transform_hostname' => '0', + 'self-service/resolve_parent_host' => '0', + 'self-service/global_zones' => ['director-global'], + 'ignore_bug7530' => 'n', + 'feature_custom_endpoint' => 'n', + // 'experimental_features' => null, // 'allow' + // 'master_zone' => null, + ]; + + protected $jsonEncode = [ + 'self-service/global_zones', + 'self-service/installer_hashes', + ]; + + public function __construct(Db $connection) + { + $this->connection = $connection; + $this->db = $connection->getDbAdapter(); + } + + /** + * @return Db + */ + public function getConnection() + { + return $this->connection; + } + + /** + * @return \Zend_Db_Adapter_Abstract + */ + public function getDb() + { + return $this->db; + } + + /** + * @param $key + * @param null $default + * @return mixed|null + */ + public function get($key, $default = null) + { + if (null === ($value = $this->getStoredValue($key, $default))) { + return $this->getDefaultValue($key); + } else { + return $value; + } + } + + /** + * @param $key + * @param null $default + * @return mixed|null + */ + public function getStoredValue($key, $default = null) + { + if (null === ($value = $this->getSetting($key))) { + return $default; + } else { + if (in_array($key, $this->jsonEncode)) { + $value = json_decode($value); + } + return $value; + } + } + + public function getDefaultValue($key) + { + if (array_key_exists($key, $this->defaults)) { + return $this->defaults[$key]; + } else { + return null; + } + } + + public function getStoredOrDefaultValue($key) + { + $value = $this->getStoredValue($key); + if ($value === null) { + return $this->getDefaultValue($key); + } else { + return $value; + } + } + + /** + * @param $name + * @param $value + * @return $this + * @throws \Zend_Db_Adapter_Exception + */ + public function set($name, $value) + { + $db = $this->db; + + if ($value === null) { + $db->delete( + 'director_setting', + $db->quoteInto('setting_name = ?', $name) + ); + + unset($this->cache[$name]); + + return $this; + } + + if (in_array($name, $this->jsonEncode)) { + $value = json_encode(array_values($value)); + } + + if ($this->getSetting($name) === $value) { + return $this; + } + + $updated = $db->update( + 'director_setting', + array('setting_value' => $value), + $db->quoteInto('setting_name = ?', $name) + ); + + if ($updated === 0) { + $db->insert( + 'director_setting', + array( + 'setting_name' => $name, + 'setting_value' => $value, + ) + ); + } + + if ($this->cache !== null) { + $this->cache[$name] = $value; + } + + return $this; + } + + public function clearCache() + { + $this->cache = null; + return $this; + } + + protected function getSetting($name, $default = null) + { + if ($this->cache === null) { + $this->refreshCache(); + } + + if (array_key_exists($name, $this->cache)) { + return $this->cache[$name]; + } + + return $default; + } + + protected function refreshCache() + { + $db = $this->db; + + $query = $db->select()->from( + array('s' => 'director_setting'), + array('setting_name', 'setting_value') + ); + + $this->cache = (array) $db->fetchPairs($query); + } + + /** + * @param $key + * @return mixed|null + */ + public function __get($key) + { + return $this->get($key); + } + + /** + * @param $key + * @param $value + * @throws \Zend_Db_Adapter_Exception + */ + public function __set($key, $value) + { + $this->set($key, $value); + } + + public function __destruct() + { + $this->clearCache(); + unset($this->db); + unset($this->connection); + } +} |