--- /dev/null
+#!/usr/bin/env /usr/share/plc_api/plcsh
+import os, sys
+from Test import Test
+from qa import utils
+
+class sync_person_key(Test):
+ """
+ Make sure specified users public key on file matches whats
+ recorded at plc. Create a public/private keypair for the
+ specified user if one doesnt exist already.
+ """
+
+ def make_keys(self, path, name):
+ if not os.path.isdir(path):
+ os.mkdir(path)
+ key_path = path + os.sep + name
+ command = "ssh-keygen -f %(key_path)s -t rsa -N ''" % locals()
+ (stdout, stderr) = utils.popen(command)
+
+ def call(self, email):
+ email_parts = email.split("@")
+ keys_filename = email_parts[0]
+ keys_path = self.config.KEYS_PATH
+ private_key_path = keys_path + os.sep + keys_filename
+ public_key_path = private_key_path + ".pub"
+
+ # Validate person
+ persons = GetPersons([email], ['person_id', 'key_ids'])
+ if not persons:
+ raise Exception, "No such person %(email)s"
+ person = persons[0]
+
+ # make keys if they dont already exist
+ if not os.path.isfile(private_key_path) or \
+ not os.path.isfile(public_key_path):
+ # Make new keys
+ self.make_keys(keys_path, keys_filename)
+ if self.config.verbose:
+ utils.header("Made new key pair %(private_key_path)s %(public_key_path)s " %\
+ locals())
+
+ # sync public key
+ public_key_file = open(public_key_path, 'r')
+ public_key = public_key_file.readline()
+
+ keys = GetKeys(person['key_ids'])
+ if not keys:
+ # Add current key to db
+ key_fields = {'key_type': 'ssh',
+ 'key': public_key}
+ AddPersonKey(person['person_id'], key_fields)
+ if self.config.verbose:
+ utils.header("Added public key in %(public_key_path)s to db" % locals() )
+ else:
+ # keys need to be checked and possibly updated
+ key = keys[0]
+ if key['key'] != public_key:
+ UpdateKey(key['key_id'], public_key)
+ if self.config.verbose:
+ utils.header("Updated plc with new public key in %(public_key_path)s " % locals())
+ else:
+ if self.config.verbose:
+ utils.header("Key in %(public_key_path)s matchs public key in plc" % locals())
+
+if __name__ == '__main__':
+ args = tuple(sys.argv[1:])
+ sync_person_key()(*args)