summaryrefslogtreecommitdiffstats
path: root/library/Director/Settings.php
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--library/Director/Settings.php219
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);
+ }
+}