summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@codethink.co.uk>2015-09-18 09:53:15 +0000
committerRichard Maw <richard.maw@codethink.co.uk>2015-09-18 11:32:47 +0100
commitc9d0772119f99c911221b93159793ebcf4f9ca24 (patch)
tree7abf58f2c8aecfc1b4b5e2a264438f693113dc9b
parentb8de45e9efc1d7fcf7b98d8f6c17ea9ffd9eafa8 (diff)
downloaddefinitions-c9d0772119f99c911221b93159793ebcf4f9ca24.tar.gz
install-files: Allow definition of manifests in multiple variables
install-files was initially designed such that if you wanted to install multiple manifests you should put multiple whitespace separated paths in the INSTALL_FILES variable. This is clunky if you want to extend the set of files to install, particularly in cluster deployments with multiple systems, as otherwise you could make use of YAML merge keys. So now, like fstab.configure you can set multple options, by using environment variables that start with INSTALL_FILES. It's also easier to extend the set of install files on the command-line or in the environment this way too, since you don't need to parse the YAML to see what it originally had. Change-Id: I298db7ae9790a536e5a5f32b069d0908012695af
-rwxr-xr-xextensions/install-essential-files.configure10
-rwxr-xr-xextensions/install-files.configure12
-rw-r--r--extensions/install-files.configure.help12
3 files changed, 28 insertions, 6 deletions
diff --git a/extensions/install-essential-files.configure b/extensions/install-essential-files.configure
index 3d33fe03..8314b56d 100755
--- a/extensions/install-essential-files.configure
+++ b/extensions/install-essential-files.configure
@@ -27,6 +27,14 @@ import subprocess
import sys
target_root = sys.argv[1]
+
+# Clear all INSTALL_FILES environment variable options,
+# so we don't end up installing INSTALL_FILES_foo multiple times.
+for var in list(os.environ):
+ if var.startswith("INSTALL_FILES"):
+ del os.environ[var]
+
+# Force installation of the essential-files manifest
os.environ["INSTALL_FILES"] = "install-files/essential-files/manifest"
-command = os.path.join("extensions/install-files.configure")
+command = "extensions/install-files.configure"
subprocess.check_call([command, target_root])
diff --git a/extensions/install-files.configure b/extensions/install-files.configure
index 64fcecca..782065d1 100755
--- a/extensions/install-files.configure
+++ b/extensions/install-files.configure
@@ -16,7 +16,7 @@
''' A Morph configuration extension for adding arbitrary files to a system
-It will read the manifest files specified in the environment variable
+It will read the manifest files specified in environment variables starting
INSTALL_FILES, then use the contens of those files to determine which files
to install into the target system.
@@ -41,12 +41,14 @@ import writeexts
class InstallFilesConfigureExtension(writeexts.Extension):
def process_args(self, args):
- if not 'INSTALL_FILES' in os.environ:
+ if not any(var.startswith('INSTALL_FILES') for var in os.environ):
return
target_root = args[0]
- manifests = shlex.split(os.environ['INSTALL_FILES'])
- for manifest in manifests:
- self.install_manifest(manifest, target_root)
+ for manifest_var in sorted((var for var in os.environ
+ if var.startswith('INSTALL_FILES'))):
+ manifests = shlex.split(os.environ[manifest_var])
+ for manifest in manifests:
+ self.install_manifest(manifest, target_root)
def install_manifest(self, manifest, target_root):
manifest_dir = os.path.dirname(manifest)
diff --git a/extensions/install-files.configure.help b/extensions/install-files.configure.help
index 991c26c8..191e1378 100644
--- a/extensions/install-files.configure.help
+++ b/extensions/install-files.configure.help
@@ -40,6 +40,18 @@ help: |
INSTALL_FILES: sshkeysfiles/manifest
+ All variables starting INSTALL_FILES are considered, and are processed in
+ alphabetical order, so if INSTALL_FILES, INSTALL_FILES_distbuild and
+ INSTALL_FILES_openstack are given, manifests in INSTALL_FILES are processed
+ before those in INSTALL_FILES_distbuild, followed by INSTALL_FILES_openstack.
+
+ Multiple manifest files may be given in the same INSTALL_FILES variable,
+ by providing a whitespace separated list.
+
+ Shell word splitting is supported, so if a manifest's path has spaces in,
+ the path may be shell escaped.
+
+
More generally entries in the manifest are formatted as:
[overwrite] <octal mode> <uid decimal> <gid decimal> <filename>