expects the 'interfaces' key in GetSlivers - review logs to always mention module
[nodemanager.git] / accounts.py
index 180a738..f07cb19 100644 (file)
@@ -1,3 +1,6 @@
+# $Id$
+# $URL$
+
 """Functionality common to all account classes.
 
 Each subclass of Account must provide five methods: create() and
@@ -69,7 +72,7 @@ def get(name):
 
 class Account:
     def __init__(self, rec):
-        logger.verbose('Initing account %s'%rec['name'])
+        logger.verbose('accounts: Initing account %s'%rec['name'])
         self.name = rec['name']
         self.keys = ''
         self.initscriptchanged = False
@@ -82,28 +85,38 @@ class Account:
 
     def configure(self, rec):
         """Write <rec['keys']> to my authorized_keys file."""
-        logger.verbose('%s: in accounts:configure'%self.name)
+        logger.verbose('accounts: configuring %s'%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('accounts: 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)
 
-            logger.log('%s: installed ssh keys' % self.name)
+            # set self.keys to new_keys only when all of the above ops succeed
+            self.keys = new_keys
+
+            logger.log('accounts: %s: installed ssh keys' % self.name)
 
     def start(self, delay=0): pass
     def stop(self): pass
@@ -145,7 +158,7 @@ class Worker:
             status = True
         else:
             status = False
-            logger.verbose("Worker(%s): is not running" % self.name)
+            logger.verbose("accounts: Worker(%s): is not running" % self.name)
         return status
 
     def _destroy(self, curr_class):