From 32be712cd32bbfb7babb27e5405db08967a5af71 Mon Sep 17 00:00:00 2001
From: Matthew Heon <matthew.heon@gmail.com>
Date: Thu, 1 Mar 2018 15:33:04 -0500
Subject: Change standard config path and add override config

The standard config has moved to /usr/share/containers/ per
discussion. An override configuration file is allowed at the
previous /etc/containers/ location. This override will be used in
place of the normal config if both are present, and exists to
override distro packaged configs without modifying the standard
config.

Signed-off-by: Matthew Heon <matthew.heon@gmail.com>

Closes: #430
Approved by: rhatdan
---
 Makefile          |  4 ++--
 libpod/runtime.go | 38 +++++++++++++++++++++++---------------
 2 files changed, 25 insertions(+), 17 deletions(-)

diff --git a/Makefile b/Makefile
index 50766900a..da007064f 100644
--- a/Makefile
+++ b/Makefile
@@ -10,9 +10,9 @@ PREFIX ?= ${DESTDIR}/usr/local
 BINDIR ?= ${PREFIX}/bin
 LIBEXECDIR ?= ${PREFIX}/libexec
 MANDIR ?= ${PREFIX}/share/man
+SHAREDIR_CONTAINERS ?= ${PREFIX}/share/containers
 ETCDIR ?= ${DESTDIR}/etc
 ETCDIR_LIBPOD ?= ${ETCDIR}/crio
-ETCDIR_CONTAINERS ?= ${ETCDIR}/containers
 BUILDTAGS ?= seccomp $(shell hack/btrfs_tag.sh) $(shell hack/libdm_tag.sh) $(shell hack/btrfs_installed_tag.sh) $(shell hack/ostree_tag.sh) $(shell hack/selinux_tag.sh)
 
 BASHINSTALLDIR=${PREFIX}/share/bash-completion/completions
@@ -152,7 +152,7 @@ install.man: docs
 	install ${SELINUXOPT} -m 644 $(filter %.1,$(MANPAGES)) -t $(MANDIR)/man1
 
 install.config:
-	install ${SELINUXOPT} -D -m 644 libpod.conf ${ETCDIR_CONTAINERS}/libpod.conf
+	install ${SELINUXOPT} -D -m 644 libpod.conf ${SHAREDIR_CONTAINERS}/libpod.conf
 	install ${SELINUXOPT} -D -m 644 seccomp.json $(ETCDIR_LIBPOD)/seccomp.json
 	install ${SELINUXOPT} -D -m 644 crio-umount.conf $(OCIUMOUNTINSTALLDIR)/crio-umount.conf
 
diff --git a/libpod/runtime.go b/libpod/runtime.go
index 3570290c0..a2331e38e 100644
--- a/libpod/runtime.go
+++ b/libpod/runtime.go
@@ -44,7 +44,11 @@ const (
 	// If it is not present, the builtin default config is used instead
 	// This path can be overridden when the runtime is created by using
 	// NewRuntimeFromConfig() instead of NewRuntime()
-	ConfigPath = "/etc/containers/libpod.conf"
+	ConfigPath = "/usr/share/containers/libpod.conf"
+	// OverrideConfigPath is the path to an override for the default libpod
+	// configuration file. If OverrideConfigPath exists, it will be used in
+	// place of the configuration file pointed to by ConfigPath.
+	OverrideConfigPath = "/etc/containers/libpod.conf"
 )
 
 // A RuntimeOption is a functional option which alters the Runtime created by
@@ -163,20 +167,24 @@ func NewRuntime(options ...RuntimeOption) (runtime *Runtime, err error) {
 	// Copy the default configuration
 	deepcopier.Copy(defaultRuntimeConfig).To(runtime.config)
 
-	// Now overwrite it with the given configuration file, if it exists
-	// Do not fail on error, instead just use the builtin defaults
-	if _, err := os.Stat(ConfigPath); err == nil {
-		// Read the contents of the config file
-		contents, err := ioutil.ReadFile(ConfigPath)
-		if err == nil {
-			// Only proceed if we successfully read the file
-			_, err := toml.Decode(string(contents), runtime.config)
-			if err != nil {
-				// We may have just ruined our RuntimeConfig
-				// Make a new one to be safe
-				runtime.config = new(RuntimeConfig)
-				deepcopier.Copy(defaultRuntimeConfig).To(runtime.config)
-			}
+	configPath := ConfigPath
+	foundConfig := true
+	if _, err := os.Stat(OverrideConfigPath); err == nil {
+		// Use the override configuration path
+		configPath = OverrideConfigPath
+	} else if _, err := os.Stat(ConfigPath); err != nil {
+		// Both stat checks failed, no config found
+		foundConfig = false
+	}
+
+	// If we have a valid configuration file, load it in
+	if foundConfig {
+		contents, err := ioutil.ReadFile(configPath)
+		if err != nil {
+			return nil, errors.Wrapf(err, "error reading configuration file %s", configPath)
+		}
+		if _, err := toml.Decode(string(contents), runtime.config); err != nil {
+			return nil, errors.Wrapf(err, "error decoding configuration file %s", configPath)
 		}
 	}
 
-- 
cgit v1.2.3-54-g00ecf