* @license http://www.gnu.org/licenses/gpl-2.0.txt GPL, version 2 * @author Icinga Development Team */ // {{{ICINGA_LICENSE_HEADER}}} namespace Icinga\Application; use Zend_Config_Ini; /** * Global registry of application and module configuration. */ class Config extends Zend_Config_Ini { /** * Configuration directory where ALL (application and module) configuration is located * * @var string */ public static $configDir; /** * The INI file this configuration has been loaded from * * @var string */ private $configFile; /** * Application config instances per file * * @var array */ protected static $app = array(); /** * Module config instances per file * * @var array */ protected static $modules = array(); /** * Load configuration from the config file $filename * * @param string $filename The filename to parse * @see Zend_Config_Ini::__construct * @throws Exception When the file can't be read */ public function __construct($filename) { if (!@is_readable($filename)) { throw new \Exception('Cannot read config file: ' . $filename); }; $this->configFile = $filename; $section = null; $options = array( 'allowModifications' => true ); parent::__construct($filename, $section, $options); } /** * Retrieve a application config instance * * @param string $configname The configuration name (without ini suffix) to read and return * @param bool $fromDisk When set true, the configuration will be read from the disk, even * if it already has been read * * @return Config The configuration object that has been requested */ public static function app($configname = 'config', $fromDisk = false) { if (!isset(self::$app[$configname]) || $fromDisk) { $filename = self::$configDir . '/' . $configname . '.ini'; self::$app[$configname] = new Config(realpath($filename)); } return self::$app[$configname]; } /** * Retrieve a module config instance * * @param string $modulename * @param string $configname * @return Config */ public static function module($modulename, $configname = 'config') { if (!isset(self::$modules[$modulename])) { self::$modules[$modulename] = array(); } $moduleConfigs = self::$modules[$modulename]; if (!isset($moduleConfigs[$configname])) { $filename = self::$configDir . '/modules/' . $modulename . '/' . $configname . '.ini'; if (file_exists($filename)) { $moduleConfigs[$configname] = new Config(realpath($filename)); } else { $moduleConfigs[$configname] = null; } } return $moduleConfigs[$configname]; } /** * Retrieve names of accessible sections or properties * * @param $name * @return array */ public function keys($name = null) { if ($name === null) { return array_keys($this->toArray()); } elseif ($this->$name === null) { return array(); } else { return array_keys($this->$name->toArray()); } } public function getConfigFile() { return $this->configFile; } }