mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-13 07:24:13 +01:00
Configuration in json files by module
This commit is contained in:
@@ -20,7 +20,7 @@
|
||||
*/
|
||||
|
||||
|
||||
use Combodo\iTop\Core\Configuration\ConfigLoader;
|
||||
use Combodo\iTop\Core\Configuration\ConfigManager;
|
||||
|
||||
define('ITOP_APPLICATION', 'iTop');
|
||||
define('ITOP_APPLICATION_SHORT', 'iTop');
|
||||
@@ -2098,21 +2098,21 @@ class Config
|
||||
{
|
||||
$this->CheckFile('configuration', $sConfigFile);
|
||||
|
||||
[$MySettings, $MyModuleSettings, $MyModules] = ConfigLoader::GetInstance()->Load($sConfigFile);
|
||||
[$MySettings, $MyModuleSettings, $MyModules] = ConfigManager::GetInstance()->Load($sConfigFile);
|
||||
|
||||
$this->m_aAddons = $MyModules['addons'];
|
||||
|
||||
foreach ($MySettings as $sPropCode => $rawvalue)
|
||||
foreach ($MySettings as $sPropCode => $rawValue)
|
||||
{
|
||||
if ($this->IsProperty($sPropCode))
|
||||
{
|
||||
if (is_string($rawvalue))
|
||||
if (is_string($rawValue))
|
||||
{
|
||||
$value = trim($rawvalue);
|
||||
$value = trim($rawValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
$value = $rawvalue;
|
||||
$value = $rawValue;
|
||||
}
|
||||
$this->Set($sPropCode, $value, $sConfigFile, true);
|
||||
}
|
||||
|
||||
@@ -414,7 +414,7 @@ return array(
|
||||
'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientProviderFactory' => $baseDir . '/sources/Core/Authentication/Client/OAuth/OAuthClientProviderFactory.php',
|
||||
'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientProviderGoogle' => $baseDir . '/sources/Core/Authentication/Client/OAuth/OAuthClientProviderGoogle.php',
|
||||
'Combodo\\iTop\\Core\\CMDBChange\\CMDBChangeOrigin' => $baseDir . '/sources/Core/CMDBChange/CMDBChangeOrigin.php',
|
||||
'Combodo\\iTop\\Core\\Configuration\\ConfigLoader' => $baseDir . '/sources/Core/Configuration/ConfigLoader.php',
|
||||
'Combodo\\iTop\\Core\\Configuration\\ConfigManager' => $baseDir . '/sources/Core/Configuration/ConfigManager.php',
|
||||
'Combodo\\iTop\\Core\\DbConnectionWrapper' => $baseDir . '/core/DbConnectionWrapper.php',
|
||||
'Combodo\\iTop\\Core\\Email\\EMailSymfony' => $baseDir . '/sources/Core/Email/EmailSymfony.php',
|
||||
'Combodo\\iTop\\Core\\Email\\EmailFactory' => $baseDir . '/sources/Core/Email/EmailFactory.php',
|
||||
|
||||
@@ -779,7 +779,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
|
||||
'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientProviderFactory' => __DIR__ . '/../..' . '/sources/Core/Authentication/Client/OAuth/OAuthClientProviderFactory.php',
|
||||
'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientProviderGoogle' => __DIR__ . '/../..' . '/sources/Core/Authentication/Client/OAuth/OAuthClientProviderGoogle.php',
|
||||
'Combodo\\iTop\\Core\\CMDBChange\\CMDBChangeOrigin' => __DIR__ . '/../..' . '/sources/Core/CMDBChange/CMDBChangeOrigin.php',
|
||||
'Combodo\\iTop\\Core\\Configuration\\ConfigLoader' => __DIR__ . '/../..' . '/sources/Core/Configuration/ConfigLoader.php',
|
||||
'Combodo\\iTop\\Core\\Configuration\\ConfigManager' => __DIR__ . '/../..' . '/sources/Core/Configuration/ConfigManager.php',
|
||||
'Combodo\\iTop\\Core\\DbConnectionWrapper' => __DIR__ . '/../..' . '/core/DbConnectionWrapper.php',
|
||||
'Combodo\\iTop\\Core\\Email\\EMailSymfony' => __DIR__ . '/../..' . '/sources/Core/Email/EmailSymfony.php',
|
||||
'Combodo\\iTop\\Core\\Email\\EmailFactory' => __DIR__ . '/../..' . '/sources/Core/Email/EmailFactory.php',
|
||||
|
||||
@@ -1,115 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2025 Combodo SARL
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
namespace Combodo\iTop\Core\Configuration;
|
||||
|
||||
use ConfigException;
|
||||
use Error;
|
||||
use Exception;
|
||||
use IssueLog;
|
||||
|
||||
class ConfigLoader
|
||||
{
|
||||
private static ConfigLoader $oInstance;
|
||||
|
||||
protected function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
final public static function GetInstance(): ConfigLoader
|
||||
{
|
||||
if (!isset(static::$oInstance)) {
|
||||
static::$oInstance = new ConfigLoader();
|
||||
}
|
||||
|
||||
return static::$oInstance;
|
||||
}
|
||||
|
||||
public function Load(string $sConfigFile)
|
||||
{
|
||||
$sConfigCode = trim(file_get_contents($sConfigFile));
|
||||
|
||||
// Variables created when doing an eval() on the config file
|
||||
/** @var array $MySettings */
|
||||
$MySettings = null;
|
||||
/** @var array $MyModuleSettings */
|
||||
$MyModuleSettings = null;
|
||||
/** @var array $MyModules */
|
||||
$MyModules = null;
|
||||
|
||||
// This does not work on several lines
|
||||
// preg_match('/^<\\?php(.*)\\?'.'>$/', $sConfigCode, $aMatches)...
|
||||
// So, I've implemented a solution suggested in the PHP doc (search for phpWrapper)
|
||||
try
|
||||
{
|
||||
ob_start();
|
||||
eval('?'.'>'.trim($sConfigCode));
|
||||
$sNoise = trim(ob_get_contents());
|
||||
ob_end_clean();
|
||||
}
|
||||
catch (Error $e)
|
||||
{
|
||||
// PHP 7
|
||||
throw new ConfigException('Error in configuration file',
|
||||
array('file' => $sConfigFile, 'error' => $e->getMessage().' at line '.$e->getLine()));
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
// well, never reach in case of parsing error :-(
|
||||
// will be improved in PHP 6 ?
|
||||
throw new ConfigException('Error in configuration file',
|
||||
array('file' => $sConfigFile, 'error' => $e->getMessage()));
|
||||
}
|
||||
if (strlen($sNoise) > 0)
|
||||
{
|
||||
// Note: sNoise is an html output, but so far it was ok for me (e.g. showing the entire call stack)
|
||||
throw new ConfigException('Syntax error in configuration file',
|
||||
array('file' => $sConfigFile, 'error' => '<tt>'.utils::EscapeHtml($sNoise, ENT_QUOTES).'</tt>'));
|
||||
}
|
||||
|
||||
if (!isset($MySettings) || !is_array($MySettings))
|
||||
{
|
||||
throw new ConfigException('Missing array in configuration file',
|
||||
array('file' => $sConfigFile, 'expected' => '$MySettings'));
|
||||
}
|
||||
|
||||
if (!array_key_exists('addons', $MyModules))
|
||||
{
|
||||
throw new ConfigException('Missing item in configuration file',
|
||||
array('file' => $sConfigFile, 'expected' => '$MyModules[\'addons\']'));
|
||||
}
|
||||
if (!array_key_exists('user rights', $MyModules['addons']))
|
||||
{
|
||||
// Add one, by default
|
||||
$MyModules['addons']['user rights'] = '/addons/userrights/userrightsnull.class.inc.php';
|
||||
}
|
||||
|
||||
$this->LoadModulesConfig(dirname($sConfigFile), $MySettings, $MyModuleSettings, $MyModules);
|
||||
|
||||
return [$MySettings, $MyModuleSettings, $MyModules];
|
||||
}
|
||||
|
||||
private function LoadModulesConfig(string $sConfigDir, array &$MySettings, array &$MyModuleSettings, array &$MyModules)
|
||||
{
|
||||
foreach (glob($sConfigDir.'/modules/*/*.json') as $sJSONModuleFiles) {
|
||||
$aConf = json_decode(file_get_contents($sJSONModuleFiles), true);
|
||||
if (is_null($aConf)) {
|
||||
IssueLog::Exception('Error reading configuration file: '.$sJSONModuleFiles, new Exception());
|
||||
continue;
|
||||
}
|
||||
// TODO ajouter les confs dans les tableaux
|
||||
if (is_array($aConf['MySettings'])) {
|
||||
$MySettings = array_merge($MySettings, $aConf['MySettings']);
|
||||
}
|
||||
if (is_array($aConf['MyModuleSettings'])) {
|
||||
$MyModuleSettings = array_merge($MyModuleSettings, $aConf['MyModuleSettings']);
|
||||
}
|
||||
if (is_array($aConf['MyModules'])) {
|
||||
$MyModules = array_merge($MyModules, $aConf['MyModules']);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
167
sources/Core/Configuration/ConfigManager.php
Normal file
167
sources/Core/Configuration/ConfigManager.php
Normal file
@@ -0,0 +1,167 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (C) 2010-2025 Combodo SARL
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
namespace Combodo\iTop\Core\Configuration;
|
||||
|
||||
use ConfigException;
|
||||
use Error;
|
||||
use Exception;
|
||||
use IssueLog;
|
||||
use SetupUtils;
|
||||
use utils;
|
||||
|
||||
class ConfigManager
|
||||
{
|
||||
private static ConfigManager $oInstance;
|
||||
private ?array $aMySettings = null;
|
||||
private ?array $aMyModuleSettings = null;
|
||||
private ?array $aMyModules = null;
|
||||
|
||||
protected function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
final public static function GetInstance(): ConfigManager
|
||||
{
|
||||
if (!isset(static::$oInstance)) {
|
||||
static::$oInstance = new ConfigManager();
|
||||
}
|
||||
|
||||
return static::$oInstance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load iTop configuration from regular php file and json files
|
||||
* @param string $sConfigFile
|
||||
*
|
||||
* @return array returns [$MySettings, $MyModuleSettings, $MyModules]
|
||||
* @throws \ConfigException
|
||||
*/
|
||||
public function Load(string $sConfigFile): array
|
||||
{
|
||||
$sConfigCode = trim(file_get_contents($sConfigFile));
|
||||
|
||||
if (!is_null($this->aMySettings)) {
|
||||
return [$this->aMySettings, $this->aMyModuleSettings, $this->aMyModules];
|
||||
}
|
||||
|
||||
// Variables created when doing an eval() on the config file
|
||||
/** @var array $MySettings */
|
||||
$MySettings = null;
|
||||
/** @var array $MyModuleSettings */
|
||||
$MyModuleSettings = [];
|
||||
/** @var array $MyModules */
|
||||
$MyModules = null;
|
||||
|
||||
// This does not work on several lines
|
||||
// preg_match('/^<\\?php(.*)\\?'.'>$/', $sConfigCode, $aMatches)...
|
||||
// So, I've implemented a solution suggested in the PHP doc (search for phpWrapper)
|
||||
try
|
||||
{
|
||||
ob_start();
|
||||
eval('?'.'>'.trim($sConfigCode));
|
||||
$sNoise = trim(ob_get_contents());
|
||||
ob_end_clean();
|
||||
}
|
||||
catch (Error $e)
|
||||
{
|
||||
// PHP 7
|
||||
throw new ConfigException('Error in configuration file',
|
||||
array('file' => $sConfigFile, 'error' => $e->getMessage().' at line '.$e->getLine()));
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
// well, never reach in case of parsing error :-(
|
||||
// will be improved in PHP 6 ?
|
||||
throw new ConfigException('Error in configuration file',
|
||||
array('file' => $sConfigFile, 'error' => $e->getMessage()));
|
||||
}
|
||||
if (strlen($sNoise) > 0)
|
||||
{
|
||||
// Note: sNoise is an html output, but so far it was ok for me (e.g. showing the entire call stack)
|
||||
throw new ConfigException('Syntax error in configuration file',
|
||||
array('file' => $sConfigFile, 'error' => '<tt>'.utils::EscapeHtml($sNoise, ENT_QUOTES).'</tt>'));
|
||||
}
|
||||
|
||||
if (!is_array($MySettings))
|
||||
{
|
||||
throw new ConfigException('Missing array in configuration file',
|
||||
array('file' => $sConfigFile, 'expected' => '$MySettings'));
|
||||
}
|
||||
|
||||
if (!array_key_exists('addons', $MyModules))
|
||||
{
|
||||
throw new ConfigException('Missing item in configuration file',
|
||||
array('file' => $sConfigFile, 'expected' => '$MyModules[\'addons\']'));
|
||||
}
|
||||
if (!array_key_exists('user rights', $MyModules['addons']))
|
||||
{
|
||||
// Add one, by default
|
||||
$MyModules['addons']['user rights'] = '/addons/userrights/userrightsnull.class.inc.php';
|
||||
}
|
||||
|
||||
$this->aMySettings = $MySettings;
|
||||
$this->aMyModuleSettings = $MyModuleSettings;
|
||||
$this->aMyModules = $MyModules;
|
||||
|
||||
$this->LoadModulesConfig(dirname($sConfigFile));
|
||||
|
||||
return [$this->aMySettings, $this->aMyModuleSettings, $this->aMyModules];
|
||||
}
|
||||
|
||||
private function LoadModulesConfig(string $sConfigDir): void
|
||||
{
|
||||
foreach ($this->ListConfigFiles($sConfigDir) as $sJSONModuleFiles) {
|
||||
$aConf = json_decode(file_get_contents($sJSONModuleFiles), true);
|
||||
if (is_null($aConf)) {
|
||||
IssueLog::Exception('Error reading configuration file: '.$sJSONModuleFiles, new Exception());
|
||||
continue;
|
||||
}
|
||||
if (is_array($aConf['MySettings'] ?? null)) {
|
||||
$this->aMySettings = array_merge($this->aMySettings, $aConf['MySettings']);
|
||||
}
|
||||
if (is_array($aConf['MyModuleSettings'] ?? null)) {
|
||||
$this->aMyModuleSettings = array_merge($this->aMyModuleSettings, $aConf['MyModuleSettings']);
|
||||
}
|
||||
if (is_array($aConf['MyModules'] ?? null)) {
|
||||
$this->aMyModules = array_merge($this->aMyModules, $aConf['MyModules']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Find all json files under $sRootDir
|
||||
* @param string $sRootDir
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function ListConfigFiles(string $sRootDir): array
|
||||
{
|
||||
$aConfigFiles = [];
|
||||
while($aDirs = glob($sRootDir . '/*', GLOB_ONLYDIR)) {
|
||||
$sRootDir .= '/*';
|
||||
foreach ($aDirs as $sConfDir) {
|
||||
$aConfigFiles = array_merge($aConfigFiles, glob($sConfDir.'/*.json'));
|
||||
}
|
||||
}
|
||||
|
||||
return $aConfigFiles;
|
||||
}
|
||||
|
||||
public function SaveModuleConfig(string $sModule, array $MyModuleSettings, array $MySettings = null, array $MyModules = null): void
|
||||
{
|
||||
$sConfigFile = dirname(utils::GetConfigFilePath()).'/modules/'.$sModule.'/'.$sModule.'.json';
|
||||
SetupUtils::builddir(dirname($sConfigFile));
|
||||
$aConf = ['MyModuleSettings' => $MyModuleSettings];
|
||||
if (is_array($MySettings)) {
|
||||
$aConf['MySettings'] = $MySettings;
|
||||
}
|
||||
if (is_array($MyModules)) {
|
||||
$aConf['MyModules'] = $MyModules;
|
||||
}
|
||||
file_put_contents($sConfigFile, json_encode($aConf, JSON_PRETTY_PRINT));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user