[aur-dev][PATCH v2] config: allow reading both the defaults file and the modified config

Eli Schwartz eschwartz at archlinux.org
Sun Apr 15 14:29:43 UTC 2018


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 at 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


More information about the aur-dev mailing list