* gnu/packages/admin.scm (debops): New variable. * gnu/packages/patches/debops-constants-for-external-program-names.patch, gnu/packages/patches/debops-debops-defaults-fall-back-to-less.patch: New files. * gnu/local.mk: Add them.
		
			
				
	
	
		
			276 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			276 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 78d5cddafebb28e2e54efeb781495b5607ddb356 Mon Sep 17 00:00:00 2001
 | |
| From: Hartmut Goebel <h.goebel@crazy-compilers.com>
 | |
| Date: Thu, 8 Aug 2019 15:19:48 +0200
 | |
| Subject: [PATCH] Scripts: Use constants for external program names.
 | |
| 
 | |
| This makes it much, much easier to replace the program
 | |
| with one using an absolute path. This is necessary for
 | |
| e.g. Guix to keep references to these external programs.
 | |
| ---
 | |
|  bin/debops              | 10 +++++++---
 | |
|  bin/debops-padlock      | 21 +++++++++++++++------
 | |
|  bin/debops-task         |  7 +++++--
 | |
|  bin/debops-update       | 18 +++++++++++-------
 | |
|  debops/__init__.py      | 17 ++++++++++++-----
 | |
|  debops/cmds/__init__.py |  6 +++++-
 | |
|  6 files changed, 55 insertions(+), 24 deletions(-)
 | |
| 
 | |
| diff --git a/bin/debops b/bin/debops
 | |
| index 2b7ad3f88..caaeb892f 100755
 | |
| --- a/bin/debops
 | |
| +++ b/bin/debops
 | |
| @@ -59,6 +59,10 @@ ConfigFileHeader = """\
 | |
|  # You can manipulate the contents of this file via `.debops.cfg`.
 | |
|  """
 | |
|  
 | |
| +# External programms used. List here for easy substitution for
 | |
| +# hard-coded paths.
 | |
| +ANSIBLE_PLAYBOOK = 'ansible-playbook'
 | |
| +
 | |
|  
 | |
|  def write_config(filename, config):
 | |
|      cfgparser = configparser.ConfigParser()
 | |
| @@ -131,7 +135,7 @@ def gen_ansible_cfg(filename, config, project_root, playbooks_path,
 | |
|              os.path.join(playbooks_path, "roles"),
 | |
|              "/etc/ansible/roles")))
 | |
|  
 | |
| -    ansible_version_out = subprocess.check_output(["ansible-playbook",
 | |
| +    ansible_version_out = subprocess.check_output([ANSIBLE_PLAYBOOK,
 | |
|                                                     "--version"]).decode()
 | |
|  
 | |
|      # Get first line and split by spaces to get second 'word'.
 | |
| @@ -197,7 +201,7 @@ def main(cmd_args):
 | |
|          playbooks_path = '/nonexistent'
 | |
|  
 | |
|      # Make sure required commands are present
 | |
| -    require_commands('ansible-playbook')
 | |
| +    require_commands(ANSIBLE_PLAYBOOK)
 | |
|  
 | |
|      # Check if user specified a potential playbook name as the first
 | |
|      # argument. If yes, use it as the playbook name and remove it from
 | |
| @@ -256,7 +260,7 @@ def main(cmd_args):
 | |
|          print("Running Ansible playbooks:")
 | |
|          for element in play_list:
 | |
|              print(element)
 | |
| -        return subprocess.call(['ansible-playbook'] + play_list + arg_list)
 | |
| +        return subprocess.call([ANSIBLE_PLAYBOOK] + play_list + arg_list)
 | |
|      finally:
 | |
|          if revert_unlock:
 | |
|              padlock_lock(encfs_encrypted)
 | |
| diff --git a/bin/debops-padlock b/bin/debops-padlock
 | |
| index bfdfb8e06..2a97716cd 100755
 | |
| --- a/bin/debops-padlock
 | |
| +++ b/bin/debops-padlock
 | |
| @@ -67,6 +67,14 @@ devrandom = os.environ.get('DEVRANDOM', "/dev/urandom")
 | |
|  
 | |
|  SCRIPT_FILENAME = 'padlock-script'
 | |
|  
 | |
| +# External programms used. List here for easy substitution for
 | |
| +# hard-coded paths.
 | |
| +ENCFS = 'encfs'
 | |
| +FIND = 'find'
 | |
| +FUSERMOUNT = 'fusermount'
 | |
| +UMOUNT = 'umount'
 | |
| +GPG = 'gpg'
 | |
| +
 | |
|  # ---- DebOps environment setup ----
 | |
|  
 | |
|  
 | |
| @@ -80,9 +88,9 @@ def main(subcommand_func, **kwargs):
 | |
|      # Make sure required commands are present
 | |
|      # OS X compatibility
 | |
|      if sys.platform == 'darwin':
 | |
| -        require_commands('encfs', 'find', 'umount', 'gpg')
 | |
| +        require_commands(ENCFS, FIND, UMOUNT, GPG)
 | |
|      else:
 | |
| -        require_commands('encfs', 'find', 'fusermount', 'gpg')
 | |
| +        require_commands(ENCFS, FIND, FUSERMOUNT, GPG)
 | |
|  
 | |
|      inventory_path = find_inventorypath(project_root, required=False)
 | |
|      # If inventory hasn't been found automatically, assume it's the default
 | |
| @@ -121,7 +129,7 @@ def init(encfs_decrypted, encfs_encrypted, recipients):
 | |
|      # Generate a random password and encrypt it with GPG keys of recipients.
 | |
|      print("Generating a random", ENCFS_KEYFILE_LENGTH, "char password")
 | |
|      pwd = gen_pwd()
 | |
| -    gpg = subprocess.Popen(['gpg', '--encrypt', '--armor',
 | |
| +    gpg = subprocess.Popen([GPG, '--encrypt', '--armor',
 | |
|                              '--output', encfs_keyfile] + recipients,
 | |
|                             stdin=subprocess.PIPE)
 | |
|      gpg.communicate(pwd.encode('utf-8'))
 | |
| @@ -133,9 +141,10 @@ def init(encfs_decrypted, encfs_encrypted, recipients):
 | |
|      # NB2: We can not use padlock_unlock here, because the config file
 | |
|      # does not yet exist.
 | |
|      encfs = subprocess.Popen([
 | |
| -        'encfs', encfs_encrypted, encfs_decrypted,
 | |
| +        ENCFS, encfs_encrypted, encfs_decrypted,
 | |
|          '--extpass',
 | |
| -        'gpg --decrypt --no-mdc-warning --output - '+shquote(encfs_keyfile)],
 | |
| +        GPG + ' --decrypt --no-mdc-warning --output - '
 | |
| +        + shquote(encfs_keyfile)],
 | |
|          stdin=subprocess.PIPE)
 | |
|      encfs.communicate(('p\n'+pwd).encode('utf-8'))
 | |
|  
 | |
| @@ -154,7 +163,7 @@ def init(encfs_decrypted, encfs_encrypted, recipients):
 | |
|  
 | |
|      # Protect the EncFS configuration file by also encrypting it with
 | |
|      # the GPG keys of recipients.
 | |
| -    subprocess.call(['gpg', '--encrypt', '--armor',
 | |
| +    subprocess.call([GPG, '--encrypt', '--armor',
 | |
|                       '--output', encfs_configfile+'.asc']
 | |
|                      + recipients + [encfs_configfile])
 | |
|      os.remove(encfs_configfile)
 | |
| diff --git a/bin/debops-task b/bin/debops-task
 | |
| index 223e5f834..dc31ad4e6 100755
 | |
| --- a/bin/debops-task
 | |
| +++ b/bin/debops-task
 | |
| @@ -49,11 +49,14 @@ project_root = find_debops_project(required=True)
 | |
|  # todo: need to decide on semantics!
 | |
|  # config = read_config(project_root)
 | |
|  
 | |
| +# External programms used. List here for easy substitution for
 | |
| +# hard-coded paths.
 | |
| +ANSIBLE = 'ansible'
 | |
|  
 | |
|  # ---- Main script ----
 | |
|  
 | |
|  # Make sure required commands are present
 | |
| -require_commands('ansible')
 | |
| +require_commands(ANSIBLE)
 | |
|  
 | |
|  ansible_inventory = find_inventorypath(project_root)
 | |
|  
 | |
| @@ -71,5 +74,5 @@ if INSECURE:
 | |
|      os.environ['ANSIBLE_HOST_KEY_CHECKING'] = 'False'
 | |
|  
 | |
|  # Run ansible with custom environment
 | |
| -cmd = ['ansible'] + module + sys.argv[1:]
 | |
| +cmd = [ANSIBLE] + module + sys.argv[1:]
 | |
|  subprocess.call(cmd)
 | |
| diff --git a/bin/debops-update b/bin/debops-update
 | |
| index 88c5e2c82..cc7e57cb0 100755
 | |
| --- a/bin/debops-update
 | |
| +++ b/bin/debops-update
 | |
| @@ -90,6 +90,10 @@ GALAXY_REQUIREMENTS = "galaxy/requirements.txt"
 | |
|  # Default Ansible Galaxy user account name
 | |
|  GALAXY_ACCOUNT = "debops"
 | |
|  
 | |
| +# External programms used. List here for easy substitution for
 | |
| +# hard-coded paths.
 | |
| +GIT = 'git'
 | |
| +
 | |
|  
 | |
|  # ---- Functions ----
 | |
|  
 | |
| @@ -137,7 +141,7 @@ def clone_git_repository(repo_uri, branch, destination, dry_run=False):
 | |
|      if dry_run:
 | |
|          print("Cloning '%s' to %s..." % (repo_uri, destination))
 | |
|      else:
 | |
| -        subprocess.call(['git', 'clone', '--quiet', '--branch', branch,
 | |
| +        subprocess.call([GIT, 'clone', '--quiet', '--branch', branch,
 | |
|                           repo_uri, destination])
 | |
|  
 | |
|  
 | |
| @@ -152,22 +156,22 @@ def update_git_repository(path, dry_run=False, remote_uri=False):
 | |
|      os.chdir(path)
 | |
|  
 | |
|      if dry_run:
 | |
| -        subprocess.call(['git', 'fetch'])
 | |
| -        subprocess.call(['git', 'diff', 'HEAD', 'origin', '--stat'])
 | |
| +        subprocess.call([GIT, 'fetch'])
 | |
| +        subprocess.call([GIT, 'diff', 'HEAD', 'origin', '--stat'])
 | |
|      else:
 | |
|          # Get the current sha of the head branch
 | |
|          current_sha = subprocess.check_output(
 | |
| -                ['git', 'rev-parse', 'HEAD']).strip()
 | |
| +                [GIT, 'rev-parse', 'HEAD']).strip()
 | |
|  
 | |
|          # Fetch it silently and store the new sha
 | |
| -        subprocess.call(['git', 'fetch', '--quiet'])
 | |
| +        subprocess.call([GIT, 'fetch', '--quiet'])
 | |
|          fetch_sha = subprocess.check_output(
 | |
| -                ['git', 'rev-parse', 'FETCH_HEAD']).strip()
 | |
| +                [GIT, 'rev-parse', 'FETCH_HEAD']).strip()
 | |
|  
 | |
|          if current_sha != fetch_sha:
 | |
|              print()
 | |
|              print('--')
 | |
| -            subprocess.call(['git', 'merge', fetch_sha])
 | |
| +            subprocess.call([GIT, 'merge', fetch_sha])
 | |
|  
 | |
|              if remote_uri:
 | |
|                  compare_uri = (remote_uri + '/compare/' + current_sha[:7]
 | |
| diff --git a/debops/__init__.py b/debops/__init__.py
 | |
| index 1c2cedcb0..da8430e41 100644
 | |
| --- a/debops/__init__.py
 | |
| +++ b/debops/__init__.py
 | |
| @@ -93,6 +93,13 @@ ENCFS_KEYFILE = ".encfs6.keyfile"
 | |
|  # Length of the random EncFS password stored in encrypted keyfile
 | |
|  ENCFS_KEYFILE_LENGTH = 256
 | |
|  
 | |
| +# External programms used. List here for easy substitution for
 | |
| +# hard-coded paths.
 | |
| +ENCFS = 'encfs'
 | |
| +FUSERMOUNT = 'fusermount'
 | |
| +UMOUNT = 'umount'
 | |
| +GPG = 'gpg'
 | |
| +
 | |
|  
 | |
|  # ---- Functions ----
 | |
|  
 | |
| @@ -180,9 +187,9 @@ def padlock_lock(encrypted_path):
 | |
|          return False
 | |
|      # OS X compatibility
 | |
|      if sys.platform == 'darwin':
 | |
| -        subprocess.call(['umount', decrypted_path])
 | |
| +        subprocess.call([UMOUNT, decrypted_path])
 | |
|      else:
 | |
| -        subprocess.call(['fusermount', '-u', decrypted_path])
 | |
| +        subprocess.call([FUSERMOUNT, '-u', decrypted_path])
 | |
|      return True
 | |
|  
 | |
|  
 | |
| @@ -237,14 +244,14 @@ def padlock_unlock(encrypted_path):
 | |
|      # Start encfs. It will wait for input on the `configfile` named
 | |
|      # pipe.
 | |
|      encfs = subprocess.Popen([
 | |
| -        'encfs', encrypted_path, decrypted_path,
 | |
| +        ENCFS, encrypted_path, decrypted_path,
 | |
|          '--extpass',
 | |
| -        'gpg --decrypt --no-mdc-warning --output - %s' % shquote(keyfile)])
 | |
| +        GPG + ' --decrypt --no-mdc-warning --output - %s' % shquote(keyfile)])
 | |
|      # now decrypt the config and write it into the named pipe
 | |
|      with open(configfile, 'w') as fh:
 | |
|          # NB: gpg must write to stdout to avoid it is asking whether
 | |
|          # the file should be overwritten
 | |
| -        subprocess.Popen(['gpg',
 | |
| +        subprocess.Popen([GPG,
 | |
|                            '--decrypt', '--no-mdc-warning', '--output', '-',
 | |
|                            crypted_configfile], stdout=fh).wait()
 | |
|      encfs.wait()
 | |
| diff --git a/debops/cmds/__init__.py b/debops/cmds/__init__.py
 | |
| index b221fa191..9fabf43a5 100644
 | |
| --- a/debops/cmds/__init__.py
 | |
| +++ b/debops/cmds/__init__.py
 | |
| @@ -55,6 +55,10 @@ SCRIPT_NAME = os.path.basename(sys.argv[0])
 | |
|  # command line)
 | |
|  INSECURE = bool(os.environ.get('INSECURE', False))
 | |
|  
 | |
| +# External programms used. List here for easy substitution for
 | |
| +# hard-coded paths.
 | |
| +WHICH = 'which'
 | |
| +
 | |
|  
 | |
|  def error_msg(message, severity="Error"):
 | |
|      """
 | |
| @@ -70,7 +74,7 @@ def require_commands(*cmd_names):
 | |
|      Check if required commands exist.
 | |
|      """
 | |
|      def command_exists(cmd_name):
 | |
| -        which = "where" if platform.system() == "Windows" else "which"
 | |
| +        which = "where" if platform.system() == "Windows" else WHICH
 | |
|          return not subprocess.call([which, cmd_name],
 | |
|                                     stdout=DEVNULL, stderr=subprocess.STDOUT)
 | |
|  
 | |
| -- 
 | |
| 2.21.0
 | |
| 
 |