From 80d647a9b0303e43b9eaf602ee2cfec857f94a92 Mon Sep 17 00:00:00 2001
From: Bob Lantz <rlantz@cs.stanford.edu>
Date: Tue, 16 Sep 2014 13:31:51 -0700
Subject: [PATCH] add findUser() to clean up user identification

---
 examples/cluster.py | 26 +++++++++++++++++---------
 1 file changed, 17 insertions(+), 9 deletions(-)

diff --git a/examples/cluster.py b/examples/cluster.py
index e5f374b8..093df668 100755
--- a/examples/cluster.py
+++ b/examples/cluster.py
@@ -125,12 +125,8 @@ def __init__( self, name, server=None, user=None, serverIP=None,
         if server == 'localhost':
             server = None
         self.server = server
-        if not serverIP:
-                serverIP = self.findServerIP( server )
-        self.serverIP = serverIP
-        if not user:
-            user = quietRun( 'echo $SUDO_USER' )
-        self.user = user
+        self.serverIP = serverIP if serverIP else self.findServerIP( server )
+        self.user = user if user else self.findUser()
         if self.user and self.server:
             self.dest = '%s@%s' % ( self.user, self.serverIP )
         else:
@@ -146,6 +142,20 @@ def __init__( self, name, server=None, user=None, serverIP=None,
         self.splitInit = splitInit
         super( RemoteMixin, self ).__init__( name, **kwargs )
 
+    @staticmethod
+    def findUser():
+        "Try to return logged-in (usually non-root) user"
+        try:
+            # If we're running sudo
+            return os.environ[ 'SUDO_USER' ]
+        except:
+            try:
+                # Logged-in user (if we have a tty)
+                return quietRun( 'who am i' ).split()[ 0 ]
+            except:
+                # Give up and return effective user
+                return quietRun( 'whoami' )
+
     # Determine IP address of local host
     _ipMatchRegex = re.compile( r'\d+\.\d+\.\d+\.\d+' )
 
@@ -593,9 +603,7 @@ def __init__( self, *args, **kwargs ):
         if not self.serverIP:
             self.serverIP = { server: RemoteMixin.findServerIP( server )
                               for server in self.servers }
-        self.user = params.pop( 'user', None )
-        if self.servers and not self.user:
-            self.user = quietRun( 'echo $SUDO_USER' )
+        self.user = params.pop( 'user', RemoteMixin.findUser() )
         if params.pop( 'precheck' ):
             self.precheck()
         self.connections = {}
-- 
GitLab