4 from sfa.util.faults import NonExistingRecord, RecordNotFound
5 from sfa.util.xrn import hrn_to_urn
6 from sfa.util.method import Method
7 from sfa.util.parameter import Parameter
8 from sfa.util.table import SfaTable
9 from sfa.trust.certificate import Keypair
10 from sfa.trust.gid import create_uuid
12 class get_key(Method):
14 Generate a new keypair and gid for requesting caller (component).
15 @return 1 If successful
18 interfaces = ['registry']
22 returns = Parameter(int, "1 if successful, faults otherwise")
25 # verify that the callers's ip address exist in the db and is an interface
26 # for a node in the db
27 (ip, port) = self.api.remote_addr
28 interfaces = self.api.driver.GetInterfaces({'ip': ip}, ['node_id'])
30 raise NonExistingRecord("no such ip %(ip)s" % locals())
31 nodes = self.api.driver.GetNodes([interfaces[0]['node_id']], ['node_id', 'hostname'])
33 raise NonExistingRecord("no such node using ip %(ip)s" % locals())
36 # look up the sfa record
38 records = table.findObjects({'type': 'node', 'pointer': node['node_id']})
40 raise RecordNotFound("pointer:" + str(node['node_id']))
43 # generate a new keypair and gid
45 pkey = Keypair(create=True)
46 urn = hrn_to_urn(record['hrn'], record['type'])
47 gid_object = self.api.auth.hierarchy.create_gid(urn, uuid, pkey)
48 gid = gid_object.save_to_string(save_parents=True)
55 # attempt the scp the key
56 # and gid onto the node
57 # this will only work for planetlab based components
58 (kfd, key_filename) = tempfile.mkstemp()
59 (gfd, gid_filename) = tempfile.mkstemp()
60 pkey.save_to_file(key_filename)
61 gid_object.save_to_file(gid_filename, save_parents=True)
62 host = node['hostname']
63 key_dest="/etc/sfa/node.key"
64 gid_dest="/etc/sfa/node.gid"
66 #identity = "/etc/planetlab/root_ssh_key.rsa"
67 identity = "/etc/sfa/root_ssh_key"
68 scp_options=" -i %(identity)s " % locals()
69 scp_options+="-o StrictHostKeyChecking=no " % locals()
70 scp_key_command="%(scp)s %(scp_options)s %(key_filename)s root@%(host)s:%(key_dest)s" %\
72 scp_gid_command="%(scp)s %(scp_options)s %(gid_filename)s root@%(host)s:%(gid_dest)s" %\
75 all_commands = [scp_key_command, scp_gid_command]
77 for command in all_commands:
78 (status, output) = commands.getstatusoutput(command)
80 raise Exception, output
82 for filename in [key_filename, gid_filename]: