In the process, rename config.proto to config.defaults (because that is what it is now). Also use dict.get('key', default_value) when querying os.environ, rather than an if block, as it is more pythonic/readable/concise, and reduces the number of dict lookups. This change allows aurweb configuration to be done via either: - copying config.defaults to config and modifying values - creating a new config only containing modified values, next to a config.defaults containing unmodified values The motivation for this change is to enable ansible configuration in our flagship deployment by storing only changed values, and deferring to config.defaults otherwise. A side benefit is, it is easier to see what has changed by inspecting only the site configuration file. If a config.defaults file does not exist next to $AUR_CONFIG or in $AUR_CONFIG_DEFAULTS, it is ignored and *all* values are expected to live in the modified config file. Signed-off-by: Eli Schwartz <eschwartz@archlinux.org> --- v2: I opted to make the default location of the defaults config dependent on the location of the site config, since I think that makes more sense... Also reimplement the env getting code on python to be more pythonic INSTALL | 6 ++++-- TESTING | 2 +- aurweb/config.py | 10 ++++++---- conf/{config.proto => config.defaults} | 0 web/lib/confparser.inc.php | 12 +++++++++++- 5 files changed, 22 insertions(+), 8 deletions(-) rename conf/{config.proto => config.defaults} (100%) diff --git a/INSTALL b/INSTALL index c72c4a2..7170aea 100644 --- a/INSTALL +++ b/INSTALL @@ -40,8 +40,10 @@ read the instructions below. Ensure to enable the pdo_mysql extension in php.ini. -3) Copy conf/config.proto to /etc/aurweb/config and adjust the configuration - (pay attention to disable_http_login, enable_maintenance and aur_location). +3) Optionally copy conf/config.defaults to /etc/aurweb/. Create or copy + /etc/aurweb/config (this is expected to contain all configuration settings + if the defaults file does not exist) and adjust the configuration (pay + attention to disable_http_login, enable_maintenance and aur_location). 4) Create a new MySQL database and a user and import the aurweb SQL schema: diff --git a/TESTING b/TESTING index 53ffef2..b0a5f62 100644 --- a/TESTING +++ b/TESTING @@ -23,7 +23,7 @@ INSTALL. $ sqlite3 ../aurweb.sqlite3 < aur-schema-sqlite.sql $ sqlite3 ../aurweb.sqlite3 < out.sql -4) Copy conf/config.proto to conf/config and adjust the configuration +4) Copy conf/config.defaults to conf/config and adjust the configuration (pay attention to disable_http_login, enable_maintenance and aur_location). Be sure to change backend to sqlite and name to the file location of your diff --git a/aurweb/config.py b/aurweb/config.py index a52d942..52ec461 100644 --- a/aurweb/config.py +++ b/aurweb/config.py @@ -8,11 +8,13 @@ def _get_parser(): global _parser if not _parser: + path = os.environ.get('AUR_CONFIG', '/etc/aurweb/config') + defaults = os.environ.get('AUR_CONFIG_DEFAULTS', path + '.defaults') + _parser = configparser.RawConfigParser() - if 'AUR_CONFIG' in os.environ: - path = os.environ.get('AUR_CONFIG') - else: - path = "/etc/aurweb/config" + if os.path.isfile(defaults): + with open(defaults) as f: + _parser.read_file(f) _parser.read(path) return _parser diff --git a/conf/config.proto b/conf/config.defaults similarity index 100% rename from conf/config.proto rename to conf/config.defaults diff --git a/web/lib/confparser.inc.php b/web/lib/confparser.inc.php index 499481d..29f17e8 100644 --- a/web/lib/confparser.inc.php +++ b/web/lib/confparser.inc.php @@ -8,11 +8,21 @@ function config_load() { if (!$path) { $path = "/etc/aurweb/config"; } + $defaults_path = getenv('AUR_CONFIG_DEFAULTS'); + if (!$defaults_path) { + $defaults_path = path . ".defaults"; + } + if (file_exists($defaults_path)) { + $default_config = parse_ini_file($defaults_path, true, INI_SCANNER_RAW); + } else { + $default_config = []; + } if (file_exists($path)) { - $AUR_CONFIG = parse_ini_file($path, true, INI_SCANNER_RAW); + $config = parse_ini_file($path, true, INI_SCANNER_RAW); } else { die("aurweb config file not found"); } + $AUR_CONFIG = array_replace_recursive($default_config, $config) } } -- 2.17.0