Introduce "static/env.config.php" for environment variable mapping to config cache entries
- Added new database.port config value (used for MYSQL_PORT) - Removed now obsolete db environment variable functionality - Added functionality to load env variables (overwrites DB based cached)
This commit is contained in:
parent
3587e89482
commit
d39ee428f0
8 changed files with 93 additions and 8 deletions
|
@ -36,6 +36,8 @@ class Cache
|
||||||
const SOURCE_DB = 1;
|
const SOURCE_DB = 1;
|
||||||
/** @var int Indicates that the cache entry is set by a server environment variable - High Priority */
|
/** @var int Indicates that the cache entry is set by a server environment variable - High Priority */
|
||||||
const SOURCE_ENV = 3;
|
const SOURCE_ENV = 3;
|
||||||
|
/** @var int Indicates that the cache entry is fixed and must not be changed */
|
||||||
|
const SOURCE_FIX = 4;
|
||||||
|
|
||||||
/** @var int Default value for a config source */
|
/** @var int Default value for a config source */
|
||||||
const SOURCE_DEFAULT = self::SOURCE_FILE;
|
const SOURCE_DEFAULT = self::SOURCE_FILE;
|
||||||
|
|
|
@ -66,7 +66,7 @@ class Database
|
||||||
protected $testmode = false;
|
protected $testmode = false;
|
||||||
private $relation = [];
|
private $relation = [];
|
||||||
|
|
||||||
public function __construct(Cache $configCache, Profiler $profiler, LoggerInterface $logger, array $server = [])
|
public function __construct(Cache $configCache, Profiler $profiler, LoggerInterface $logger)
|
||||||
{
|
{
|
||||||
// We are storing these values for being able to perform a reconnect
|
// We are storing these values for being able to perform a reconnect
|
||||||
$this->configCache = $configCache;
|
$this->configCache = $configCache;
|
||||||
|
|
|
@ -37,10 +37,10 @@ class ConfigFactory
|
||||||
*
|
*
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public function createCache(ConfigFileLoader $loader)
|
public function createCache(ConfigFileLoader $loader, array $server = [])
|
||||||
{
|
{
|
||||||
$configCache = new Cache();
|
$configCache = new Cache();
|
||||||
$loader->setupCache($configCache);
|
$loader->setupCache($configCache, $server);
|
||||||
|
|
||||||
return $configCache;
|
return $configCache;
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,11 +97,12 @@ class ConfigFileLoader
|
||||||
* expected local.config.php
|
* expected local.config.php
|
||||||
*
|
*
|
||||||
* @param Cache $config The config cache to load to
|
* @param Cache $config The config cache to load to
|
||||||
|
* @param array $server The $_SERVER array
|
||||||
* @param bool $raw Setup the raw config format
|
* @param bool $raw Setup the raw config format
|
||||||
*
|
*
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public function setupCache(Cache $config, $raw = false)
|
public function setupCache(Cache $config, array $server = [], $raw = false)
|
||||||
{
|
{
|
||||||
// Load static config files first, the order is important
|
// Load static config files first, the order is important
|
||||||
$config->load($this->loadStaticConfig('defaults'), Cache::SOURCE_FILE);
|
$config->load($this->loadStaticConfig('defaults'), Cache::SOURCE_FILE);
|
||||||
|
@ -114,10 +115,12 @@ class ConfigFileLoader
|
||||||
// Now load every other config you find inside the 'config/' directory
|
// Now load every other config you find inside the 'config/' directory
|
||||||
$this->loadCoreConfig($config);
|
$this->loadCoreConfig($config);
|
||||||
|
|
||||||
|
$config->load($this->loadEnvConfig($server), Cache::SOURCE_ENV);
|
||||||
|
|
||||||
// In case of install mode, add the found basepath (because there isn't a basepath set yet
|
// In case of install mode, add the found basepath (because there isn't a basepath set yet
|
||||||
if (!$raw && empty($config->get('system', 'basepath'))) {
|
if (!$raw && empty($config->get('system', 'basepath'))) {
|
||||||
// Setting at least the basepath we know
|
// Setting at least the basepath we know
|
||||||
$config->set('system', 'basepath', $this->baseDir);
|
$config->set('system', 'basepath', $this->baseDir, Cache::SOURCE_FILE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -192,6 +195,38 @@ class ConfigFileLoader
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tries to load environment specific variables, based on the `env.config.php` mapping table
|
||||||
|
*
|
||||||
|
* @param array $server The $_SERVER variable
|
||||||
|
*
|
||||||
|
* @return array The config array (empty if no config was found)
|
||||||
|
*
|
||||||
|
* @throws Exception if the configuration file isn't readable
|
||||||
|
*/
|
||||||
|
public function loadEnvConfig(array $server)
|
||||||
|
{
|
||||||
|
$filepath = $this->baseDir . DIRECTORY_SEPARATOR . // /var/www/html/
|
||||||
|
self::STATIC_DIR . DIRECTORY_SEPARATOR . // static/
|
||||||
|
"env.config.php"; // env.config.php
|
||||||
|
|
||||||
|
if (!file_exists($filepath)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$envConfig = $this->loadConfigFile($filepath);
|
||||||
|
|
||||||
|
$return = [];
|
||||||
|
|
||||||
|
foreach ($envConfig as $envKey => $configStructure) {
|
||||||
|
if (isset($server[$envKey])) {
|
||||||
|
$return[$configStructure[0]][$configStructure[1]] = $server[$envKey];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the config files of the config-directory
|
* Get the config files of the config-directory
|
||||||
*
|
*
|
||||||
|
|
|
@ -32,6 +32,11 @@ return [
|
||||||
// Can contain the port number with the syntax "hostname:port".
|
// Can contain the port number with the syntax "hostname:port".
|
||||||
'hostname' => '',
|
'hostname' => '',
|
||||||
|
|
||||||
|
// port (Integer)
|
||||||
|
// Port of the database server.
|
||||||
|
// Can be used instead of adding a port number to the hostname
|
||||||
|
'port' => null,
|
||||||
|
|
||||||
// user (String)
|
// user (String)
|
||||||
// Database user name. Please don't use "root".
|
// Database user name. Please don't use "root".
|
||||||
'username' => '',
|
'username' => '',
|
||||||
|
|
|
@ -75,13 +75,13 @@ return [
|
||||||
Util\ConfigFileLoader::class => [
|
Util\ConfigFileLoader::class => [
|
||||||
'shared' => true,
|
'shared' => true,
|
||||||
'constructParams' => [
|
'constructParams' => [
|
||||||
[Dice::INSTANCE => '$basepath'],
|
[Dice::INSTANCE => '$basepath']
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
Config\Cache::class => [
|
Config\Cache::class => [
|
||||||
'instanceOf' => Factory\ConfigFactory::class,
|
'instanceOf' => Factory\ConfigFactory::class,
|
||||||
'call' => [
|
'call' => [
|
||||||
['createCache', [], Dice::CHAIN_CALL],
|
['createCache', [$_SERVER], Dice::CHAIN_CALL],
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
App\Mode::class => [
|
App\Mode::class => [
|
||||||
|
@ -105,7 +105,6 @@ return [
|
||||||
Database::class => [
|
Database::class => [
|
||||||
'constructParams' => [
|
'constructParams' => [
|
||||||
[Dice::INSTANCE => \Psr\Log\NullLogger::class],
|
[Dice::INSTANCE => \Psr\Log\NullLogger::class],
|
||||||
$_SERVER,
|
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
/**
|
/**
|
||||||
|
|
31
static/env.config.php
Normal file
31
static/env.config.php
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @copyright Copyright (C) 2020, Friendica
|
||||||
|
*
|
||||||
|
* @license GNU AGPL version 3 or any later version
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Main mapping table of environment variables to correct config values
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
return [
|
||||||
|
'MYSQL_HOST' => ['database', 'hostname'],
|
||||||
|
'MYSQL_USERNAME' => ['database', 'username'],
|
||||||
|
'MYSQL_USER' => ['database', 'username'],
|
||||||
|
'MYSQL_PORT' => ['database', 'port'],
|
||||||
|
'MYSQL_PASSWORD' => ['database', 'password'],
|
||||||
|
'MYSQL_DATABASE' => ['database', 'database'],
|
||||||
|
];
|
|
@ -94,6 +94,19 @@ class CacheTest extends MockedTest
|
||||||
|
|
||||||
$this->assertEquals($override['system']['test'], $configCache->get('system', 'test'));
|
$this->assertEquals($override['system']['test'], $configCache->get('system', 'test'));
|
||||||
$this->assertEquals($override['system']['boolTrue'], $configCache->get('system', 'boolTrue'));
|
$this->assertEquals($override['system']['boolTrue'], $configCache->get('system', 'boolTrue'));
|
||||||
|
|
||||||
|
// Don't overwrite server ENV variables - even in load mode
|
||||||
|
$configCache->load($data, Cache::SOURCE_DB);
|
||||||
|
|
||||||
|
$this->assertEquals($override['system']['test'], $configCache->get('system', 'test'));
|
||||||
|
$this->assertEquals($override['system']['boolTrue'], $configCache->get('system', 'boolTrue'));
|
||||||
|
|
||||||
|
// Overwrite ENV variables with ENV variables
|
||||||
|
$configCache->load($data, Cache::SOURCE_ENV);
|
||||||
|
|
||||||
|
$this->assertConfigValues($data, $configCache);
|
||||||
|
$this->assertNotEquals($override['system']['test'], $configCache->get('system', 'test'));
|
||||||
|
$this->assertNotEquals($override['system']['boolTrue'], $configCache->get('system', 'boolTrue'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue