From e4d513f3a7170ee8da1a8b86b62cd498087be97f Mon Sep 17 00:00:00 2001
From: Marco Mariani <marco.mariani@nexedi.com>
Date: Fri, 28 Jun 2013 13:11:43 +0200
Subject: [PATCH] grid: allow overriding of variables like USER in buildout
 context

---
 slapos/grid/SlapObject.py |  8 ++++----
 slapos/grid/utils.py      | 32 +++++++++++++++++++++-----------
 2 files changed, 25 insertions(+), 15 deletions(-)

diff --git a/slapos/grid/SlapObject.py b/slapos/grid/SlapObject.py
index 23f7fa77f..52628c0a3 100644
--- a/slapos/grid/SlapObject.py
+++ b/slapos/grid/SlapObject.py
@@ -465,8 +465,8 @@ class Partition(object):
       process_handler = SlapPopen(invocation_list,
                                   preexec_fn=lambda: dropPrivileges(uid, gid, logger=self.logger),
                                   cwd=self.instance_path,
-                                  env=getCleanEnvironment(logger=self.logger,
-                                                          home_path=pwd.getpwuid(uid).pw_dir),
+                                  env=getCleanEnvironment(self.logger,
+                                                          {'HOME': pwd.getpwuid(uid).pw_dir}),
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.STDOUT,
                                   logger=self.logger)
@@ -571,8 +571,8 @@ class Partition(object):
       process_handler = SlapPopen([destroy_executable_location],
                                   preexec_fn=lambda: dropPrivileges(uid, gid, logger=self.logger),
                                   cwd=self.instance_path,
-                                  env=getCleanEnvironment(logger=self.logger,
-                                                          home_path=pwd.getpwuid(uid).pw_dir),
+                                  env=getCleanEnvironment(self.logger,
+                                                          {'HOME': pwd.getpwuid(uid).pw_dir}),
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.STDOUT,
                                   logger=self.logger)
diff --git a/slapos/grid/utils.py b/slapos/grid/utils.py
index 0eaa0d1a2..22f558911 100644
--- a/slapos/grid/utils.py
+++ b/slapos/grid/utils.py
@@ -118,20 +118,27 @@ def md5digest(url):
   return hashlib.md5(url).hexdigest()
 
 
-def getCleanEnvironment(logger, home_path='/tmp'):
-  changed_env = {}
-  removed_env = []
+def getCleanEnvironment(logger, override=None):
+  if override is None:
+    override = {}
+
+  if not 'HOME' in override:
+    raise KeyError('Overridden environment must contain the HOME variable.')
+
+  removed = []
   env = os.environ.copy()
   # Clean python related environment variables
   for k in PYTHON_ENVIRONMENT_REMOVE_LIST + SYSTEM_ENVIRONMENT_REMOVE_LIST \
         + LOCALE_ENVIRONMENT_REMOVE_LIST:
     old = env.pop(k, None)
-    if old is not None:
-      removed_env.append(k)
-  changed_env['HOME'] = env['HOME'] = home_path
-  for k in sorted(changed_env.iterkeys()):
-    logger.debug('Overridden %s = %r' % (k, changed_env[k]))
-  logger.debug('Removed from environment: %s' % ', '.join(sorted(removed_env)))
+    if old is not None and k not in override:
+      removed.append(k)
+
+  for k in sorted(override):
+    env[k] = override[k]
+    logger.debug("Overridden %s = '%s'", k, override[k])
+
+  logger.debug('Removed from environment: %s' % ', '.join(sorted(removed)))
   return env
 
 
@@ -308,8 +315,11 @@ def launchBuildout(path, buildout_binary, logger,
     process_handler = SlapPopen(invocation_list,
                                 preexec_fn=lambda: dropPrivileges(uid, gid, logger=logger),
                                 cwd=path,
-                                env=getCleanEnvironment(logger=logger,
-                                                        home_path=path),
+                                env=getCleanEnvironment(logger,
+                                                        {
+                                                          'HOME': path,
+                                                          'USER': pwd.getpwuid(uid).pw_name,
+                                                        }),
                                 stdout=subprocess.PIPE,
                                 stderr=subprocess.STDOUT,
                                 logger=logger)
-- 
2.30.9