[TikiWiki-commits] [Git][tikiwiki/tiki][master] [MOD] Support multiple system configuration (INI) files with precedence and legacy fallback
"John Livingston \(@JohnXLivingston\) via TikiWiki-cvs" <[email protected]>
| Newsgroups | gmane.comp.cms.tiki.cvs |
|---|---|
| Message-ID | <69fb16bcd8c8b_387528301169d@gitlab-sidekiq-low-urgency-cpu-bound-v2-86f6fb9995-vsdp6.mail> |
John Livingston pushed to branch master at Tiki Wiki CMS Groupware / Tiki
Commits:
5fedbb47 by Moïse Nturubika at 2026-05-06T12:06:28+02:00
[MOD] Support multiple system configuration (INI) files with precedence and legacy fallback
See merge request tikiwiki/tiki!10024
- - - - -
7 changed files:
- db/preconfiguration.php
- db/tiki-db.php
- installer/installlib.php
- lib/admin/adminlib.php
- lib/core/Tiki/Command/ConfigureCommand.php
- lib/core/Tiki/Command/PreferencesSetCommand.php
- tiki-admin.php
Changes:
=====================================
db/preconfiguration.php
=====================================
@@ -9,4 +9,5 @@
// $dbs_tiki_preconfig='tiki_db';
// Want configurations managed at the system level or restrict some preferences? http://doc.tiki.org/System+Configuration
-// $system_configuration_file = 'db/tiki.ini.php';
+// Multiple configuration files (files listed later override earlier ones):
+// $system_configuration_files = ['db/local.ini', 'db/system_local.ini'];
=====================================
db/tiki-db.php
=====================================
@@ -87,16 +87,29 @@ if (! empty($_SERVER['TIKI_INI_FILE']) && is_readable($_SERVER['TIKI_INI_FILE'])
$fail($_SERVER['TIKI_INI_FILE'] . ' could not be read');
}
-if (! empty($system_configuration_file)) {
- try {
- $ini = new Ini();
- $baseData = $ini->fromFile($system_configuration_file, $system_configuration_identifier ?? null);
- $systemConfiguration->merge($baseData);
- } catch (\Throwable $e) {
- $fail('Failed to load ' . $system_configuration_file . ': ' . $e->getMessage());
+// Normalize to array: support both legacy $system_configuration_file (string)
+// and the newer $system_configuration_files (array of file paths).
+// When using the array form, files listed later override keys from earlier files.
+if (isset($system_configuration_files)) {
+ if (! is_array($system_configuration_files)) {
+ $fail('$system_configuration_files must be an array.');
+ }
+} else {
+ $system_configuration_files = ! empty($system_configuration_file) ? [$system_configuration_file] : [];
+}
+
+foreach ($system_configuration_files as $configFile) {
+ if (! empty($configFile) && is_readable($configFile)) {
+ try {
+ $ini = new Ini();
+ $baseData = $ini->fromFile($configFile, $system_configuration_identifier ?? null);
+ $systemConfiguration->merge($baseData);
+ } catch (\Throwable $e) {
+ $fail('Failed to load ' . $configFile . ': ' . $e->getMessage());
+ }
+ } elseif (! empty($configFile) && ! is_readable($configFile)) {
+ $fail($configFile . ' could not be read');
}
-} elseif (! empty($system_configuration_file) && ! is_readable($system_configuration_file)) {
- $fail($system_configuration_file . ' could not be read');
}
if ($re === false) {
=====================================
installer/installlib.php
=====================================
@@ -63,8 +63,9 @@ function write_local_php($host_tiki, $user_tiki, $pass_tiki, $dbs_tiki, $client_
$filetowrite .= "// See http://tiki.org/ReleaseNotes5.0#Known_Issues and http://doc.tiki.org/Understanding+Encoding for more info\n\n";
$filetowrite .= "// If your php installation does not not have pdo extension\n";
$filetowrite .= "// Want configurations managed at the system level or restrict some preferences? http://doc.tiki.org/System+Configuration\n";
- $filetowrite .= "// \$system_configuration_file = '/etc/tiki.ini.php';\n";
- $filetowrite .= "// If \$system_configuration_identifier is present, it MUST match one of the top sections in your ini file. That section will be the active configuration.\n";
+ $filetowrite .= "// Multiple configuration files (files listed later override earlier ones):\n";
+ $filetowrite .= "// \$system_configuration_files = ['/etc/tiki/ansible_local.ini', '/etc/tiki/dev_local.ini'];\n";
+ $filetowrite .= "// If \$system_configuration_identifier is present, it MUST match one of the top sections in your ini file(s). That section will be the active configuration.\n";
$filetowrite .= "// \$system_configuration_identifier = 'example.com';\n\n";
fwrite($fw, $filetowrite);
fclose($fw);
=====================================
lib/admin/adminlib.php
=====================================
@@ -578,19 +578,22 @@ class AdminLib extends TikiLib
*/
public function checkSystemConfigurationFile()
{
- global $system_configuration_file;
+ global $system_configuration_files;
$show_warning = false;
if (file_exists(TIKI_CONFIG_FILE_PATH)) {
include(TIKI_CONFIG_FILE_PATH);
- if (isset($system_configuration_file) && file_exists($system_configuration_file)) {
- $tikiPath = realpath(TIKI_PATH);
- $configPath = realpath($system_configuration_file);
- if (strncmp($tikiPath, $configPath, strlen($tikiPath)) == 0) {
- $file_extension = pathinfo($system_configuration_file, PATHINFO_EXTENSION);
- if ($file_extension == 'ini') {
- $show_warning = true;
+ foreach ($system_configuration_files as $configFile) {
+ if (isset($configFile) && file_exists($configFile)) {
+ $tikiPath = realpath(TIKI_PATH);
+ $configPath = realpath($configFile);
+ if (strncmp($tikiPath, $configPath, strlen($tikiPath)) == 0) {
+ $file_extension = pathinfo($configFile, PATHINFO_EXTENSION);
+ if ($file_extension == 'ini') {
+ $show_warning = true;
+ break;
+ }
}
}
}
@@ -661,33 +664,43 @@ class AdminLib extends TikiLib
*/
public function retrieveConfigFileData($retrieve_all_data = false)
{
- global $system_configuration_identifier, $system_configuration_file;
+ global $system_configuration_identifier, $system_configuration_files;
- if (! is_readable($system_configuration_file)) {
- throw new Exception(tr('%0 configuration file could not be read', $system_configuration_file));
- }
- $configData = [];
- if ($retrieve_all_data || ! isset($system_configuration_identifier)) {
- $system_configuration_identifier = null;
- }
- $configReader = new Ini();
- $configReader->setFilterSection($system_configuration_identifier);
+ $mergedConfigData = [];
- if (preg_match('/\.ini.php$/', $system_configuration_file)) {
- $retrieveIniContent = function ($system_configuration_file) {
- ob_start();
- include($system_configuration_file);
- $system_configuration_file_content = ob_get_contents();
- ob_end_clean();
+ foreach ($system_configuration_files as $configFilePath) {
+ if (! is_readable($configFilePath)) {
+ throw new Exception(tr('%0 configuration file could not be read', $configFilePath));
+ }
- return $system_configuration_file_content;
- };
+ $configData = [];
+ $identifier = ($retrieve_all_data || ! isset($system_configuration_identifier))
+ ? null
+ : $system_configuration_identifier;
- $system_configuration_content = $retrieveIniContent($system_configuration_file);
- $configData = $configReader->fromString($system_configuration_content);
- } else {
- $configData = $configReader->fromFile($system_configuration_file);
+ $configReader = new Ini();
+ $configReader->setFilterSection($identifier);
+
+ if (preg_match('/\.ini.php$/', $configFilePath)) {
+ $retrieveIniContent = function ($file) {
+ ob_start();
+ include($file);
+ $content = ob_get_contents();
+ ob_end_clean();
+
+ return $content;
+ };
+
+ $iniContent = $retrieveIniContent($configFilePath);
+ $configData = $configReader->fromString($iniContent);
+ } else {
+ $configData = $configReader->fromFile($configFilePath);
+ }
+
+ // Merge: later files override earlier files (array_replace_recursive)
+ $mergedConfigData = array_replace_recursive($mergedConfigData, $configData);
}
- return $configData;
+
+ return $mergedConfigData;
}
}
=====================================
lib/core/Tiki/Command/ConfigureCommand.php
=====================================
@@ -78,8 +78,8 @@ class ConfigureCommand extends Command
// php installation should have pdo extension (adodb is deprecated in Tiki)
// Want configurations managed at the system level or restrict some preferences? http://doc.tiki.org/System+Configuration
-// \$system_configuration_file = 'db/tiki.ini.php';
-// \$system_configuration_file = '/etc/tiki.ini';
+// Multiple configuration files (files listed later override earlier ones):
+// \$system_configuration_files = ['/etc/tiki/ansible_local.ini', '/etc/tiki/dev_local.ini'];
// \$system_configuration_identifier = 'example.com';
LOCALPHP;
=====================================
lib/core/Tiki/Command/PreferencesSetCommand.php
=====================================
@@ -36,7 +36,7 @@ class PreferencesSetCommand extends Command
protected function execute(InputInterface $input, OutputInterface $output): int
{
- global $system_configuration_file;
+ global $system_configuration_files;
$logslib = TikiLib::lib('logs');
$preference = $input->getArgument('name');
@@ -80,7 +80,11 @@ class PreferencesSetCommand extends Command
$output->writeln(sprintf('Preference %s was successfully set to %s in the database.', $preference, $userValue));
if ($result['forced_by_config']) {
$configValue = $result['config_value'];
- $configFile = $system_configuration_file ?? 'unknown configuration file';
+ if (! empty($system_configuration_files)) {
+ $configFile = implode(', ', $system_configuration_files);
+ } else {
+ $configFile = 'unknown configuration file';
+ }
if ($userValue === $configValue) {
$output->writeln(sprintf(
'<comment>Note: The preference is overridden by ini file %s to effective value %s, which matches the set value.</comment>',
=====================================
tiki-admin.php
=====================================
@@ -419,7 +419,7 @@ $smarty->assign('admin_icons', $admin_icons);
$show_warning = $adminlib->checkSystemConfigurationFile();
$smarty->assign('show_system_configuration_warning', $show_warning);
-if (isset($system_configuration_file)) {
+if (! empty($system_configuration_files)) {
$config_file_errors = $adminlib->checkConfigurationFileErrors();
$smarty->assign('config_file_errors', $config_file_errors);
}
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/5fedbb47898a980d265976e83e420c949d76d2d5
--
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/5fedbb47898a980d265976e83e420c949d76d2d5
You're receiving this email because of your account on gitlab.com. Manage all notifications: https://gitlab.com/-/profile/notifications | Help: https://gitlab.com/help
_______________________________________________
TikiWiki-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tikiwiki-cvs