clean up of the 'configure' method. Now provides more failure information
authorMarc Fiuczynski <mef@cs.princeton.edu>
Thu, 13 Aug 2009 16:16:31 +0000 (16:16 +0000)
committerMarc Fiuczynski <mef@cs.princeton.edu>
Thu, 13 Aug 2009 16:16:31 +0000 (16:16 +0000)
accounts.py

index 180a738..df33977 100644 (file)
@@ -85,24 +85,34 @@ class Account:
         logger.verbose('%s: in accounts:configure'%self.name)
         new_keys = rec['keys']
         if new_keys != self.keys:
-            self.keys = new_keys
+            # get the unix account info
             gid = grp.getgrnam("slices")[2]
             pw_info = pwd.getpwnam(self.name)
             uid = pw_info[2]
             pw_dir = pw_info[5]
 
-            dot_ssh = pw_dir + '/.ssh'
-            if not os.access(dot_ssh, os.F_OK): os.mkdir(dot_ssh)
-
-            auth_keys = dot_ssh + '/authorized_keys'
+            # write out authorized_keys file and conditionally create
+            # the .ssh subdir if need be.
+            dot_ssh = os.path.join(pw_dir,'.ssh')
+            if not os.path.isdir(dot_ssh):
+                if not os.path.isdir(pw_dir):
+                    logger.verbose('WARNING: homedir %s does not exist for %s!'%(pw_dir,self.name))
+                    os.mkdir(pw_dir)
+                    os.chown(pw_dir, uid, gid)
+                os.mkdir(dot_ssh)
+
+            auth_keys = os.path.join(dot_ssh,'authorized_keys')
             tools.write_file(auth_keys, lambda f: f.write(new_keys))
 
+            # set access permissions and ownership properly
             os.chmod(dot_ssh, 0700)
-            os.chmod(auth_keys, 0600)
-
             os.chown(dot_ssh, uid, gid)
+            os.chmod(auth_keys, 0600)
             os.chown(auth_keys, uid, gid)
 
+            # set self.keys to new_keys only when all of the above ops succeed
+            self.keys = new_keys
+
             logger.log('%s: installed ssh keys' % self.name)
 
     def start(self, delay=0): pass