From 0824814df1df87e84f5640b032e1c7fa3b20b435 Mon Sep 17 00:00:00 2001 From: Thomas Gelf Date: Tue, 16 Feb 2016 14:09:16 +0100 Subject: [PATCH] TemplateSet/Store: new abstraction layer --- library/Graphite/TemplateSet.php | 105 +++++++++++++++++++++++++++++ library/Graphite/TemplateStore.php | 102 ++++++++++++++++++++++++++++ 2 files changed, 207 insertions(+) create mode 100644 library/Graphite/TemplateSet.php create mode 100644 library/Graphite/TemplateStore.php diff --git a/library/Graphite/TemplateSet.php b/library/Graphite/TemplateSet.php new file mode 100644 index 0000000..4c35401 --- /dev/null +++ b/library/Graphite/TemplateSet.php @@ -0,0 +1,105 @@ +basedir = dirname($configfile); + $this->name = basename($this->basedir); + + $config = parse_ini_file($configfile, true); + + if (isset($config['templateset']['name'])) { + $this->title = $config['templateset']['name']; + } + + if (isset($config['patterns'])) { + $this->patterns = $config['patterns']; + } + } + + public function getBasePatterns() + { + return $this->patterns; + } + + public function getTitle() + { + if ($this->title === null) { + return $this->name; + } + + return $this->title; + } + + public function getName() + { + return $this->name; + } + + public function enumTemplates() + { + $enum = array(); + return $this->extendEnumTemplates($enum); + } + + public function extendEnumTemplates(& $enum) + { + foreach ($this->loadTemplates() as $key => $template) { + $enum[sprintf('%s/%s', $this->name, $key)] = $template->getTitle(); + } + + return $enum; + } + + public function loadTemplate($name) + { + return $this->loadTemplates($name); + } + + public function loadTemplates($name = null) + { + $dir = $this->basedir; + $templates = array(); + + foreach (new DirectoryIterator($dir) as $file) { + if ($file->isDot()) continue; + $filename = $file->getFilename(); + if (substr($filename, -5) === '.conf') { + $tname = substr($filename, 0, -5); + if ($name !== null) { + if ($name !== $tname) continue; + } + $templates[$tname] = GraphTemplate::load( + file_get_contents($file->getPathname()) + ); + } + } + + if ($name !== null) { + if (! array_key_exists($name, $templates)) { + throw new NotFoundError( + 'The desired template "%s" doesn\'t exist', + $name + ); + } + + return $templates[$name]; + } + + ksort($templates); + return $templates; + } +} diff --git a/library/Graphite/TemplateStore.php b/library/Graphite/TemplateStore.php new file mode 100644 index 0000000..9443d7c --- /dev/null +++ b/library/Graphite/TemplateStore.php @@ -0,0 +1,102 @@ +basedir = $basedir; + } + } + + public function enumTemplateSets() + { + $enum = array(); + foreach ($this->loadTemplateSets() as $key => $set) { + $enum[$key] = $set->getTitle(); + } + + return $enum; + } + + public function getTemplateSets() + { + return $this->loadTemplateSets(); + } + + public function enumTemplates() + { + $enum = array(); + foreach ($this->loadTemplateSets() as $set) { + $enum[$set->getTitle()] = $set->enumTemplates(); + } + + return $enum; + } + + public function loadTemplate($name) + { + list($set, $name) = preg_split('~/~', $name, 2); + + return $this->loadTemplateSets($set)->loadTemplate($name); + } + + public function loadTemplateSets($name = null) + { + $dir = $this->getDir(); + $sets = array(); + + foreach (new DirectoryIterator($dir) as $file) { + if ($file->isDot()) continue; + if (! $file->isDir()) continue; + $setname = $file->getFilename(); + $iniFilename = $file->getPathName() . '/templateset.ini'; + if (! is_readable($iniFilename)) continue; + + $sets[$setname] = new TemplateSet($iniFilename); + } + + if ($name !== null) { + if (! array_key_exists($name, $sets)) { + throw new NotFoundError( + 'The desired template set "%s" doesn\'t exist', + $name + ); + } + + return $sets[$name]; + } + + ksort($sets); + return $sets; + } + + protected function getDir($suffix = null) + { + $this->detectBasedir(); + if ($suffix === null) { + return $this->basedir; + } else { + return $this->basedir . '/' . $suffix; + } + } + + protected function detectBasedir() + { + if ($this->basedir === null) { + $this->basedir = Icinga::app() + ->getModuleManager() + ->getModule('graphite') + ->getConfigDir() + . '/templates'; + } + } +}