X-Git-Url: http://git.onelab.eu/?p=sfa.git;a=blobdiff_plain;f=sfa%2Fserver%2Fsfa_component_setup.py;h=589a5720bbc1a779b184ba40b2332fe88e8f4e31;hp=fdc60f4df4037ccae13d5772a75acb5619b2b3ec;hb=935de64c2ed3a68566da471c68447a1ac384455d;hpb=5207bcc1ebd91a7ab3a240c765cac08ca3bfe24f diff --git a/sfa/server/sfa_component_setup.py b/sfa/server/sfa_component_setup.py index fdc60f4d..589a5720 100755 --- a/sfa/server/sfa_component_setup.py +++ b/sfa/server/sfa_component_setup.py @@ -3,14 +3,32 @@ import sys import os import tempfile from optparse import OptionParser + +from sfa.util.faults import ConnectionKeyGIDMismatch from sfa.util.config import Config -import sfa.util.xmlrpcprotocol as xmlrpcprotocol -import sfa.util.misc as misc +from sfa.client.sfaserverproxy import SfaServerProxy +from sfa.util.plxrn import hrn_to_pl_slicename, slicename_to_hrn + from sfa.trust.certificate import Keypair, Certificate from sfa.trust.credential import Credential from sfa.trust.gid import GID +from sfa.trust.hierarchy import Hierarchy + +KEYDIR = "/var/lib/sfa/" +CONFDIR = "/etc/sfa/" + +def handle_gid_mismatch_exception(f): + def wrapper(*args, **kwds): + try: return f(*args, **kwds) + except ConnectionKeyGIDMismatch: + # clean regen server keypair and try again + print "cleaning keys and trying again" + clean_key_cred() + return f(args, kwds) + + return wrapper -def get_server(url=None, port=None, keyfile=None, certfile=None,verbose=False): +def server_proxy(url=None, port=None, keyfile=None, certfile=None,verbose=False): """ returns an xmlrpc connection to the service a the specified address @@ -30,7 +48,7 @@ def get_server(url=None, port=None, keyfile=None, certfile=None,verbose=False): if verbose: print "Contacting registry at: %(url)s" % locals() - server = xmlrpcprotocol.get_server(url, keyfile, certfile) + server = SfaServerProxy(url, keyfile, certfile) return server @@ -44,13 +62,33 @@ def create_default_dirs(): for dir in all_dirs: if not os.path.exists(dir): os.makedirs(dir) + +def has_node_key(): + key_file = KEYDIR + os.sep + 'server.key' + return os.path.exists(key_file) + +def clean_key_cred(): + """ + remove the existing keypair and cred and generate new ones + """ + files = ["server.key", "server.cert", "node.cred"] + for f in files: + filepath = KEYDIR + os.sep + f + if os.path.isfile(filepath): + os.unlink(f) + + # install the new key pair + # GetCredential will take care of generating the new keypair + # and credential + GetCredential() + def get_node_key(registry=None, verbose=False): # this call requires no authentication, # so we can generate a random keypair here subject="component" - keyfile = tempfile.mktemp() - certfile = tempfile.mktemp() + (kfd, keyfile) = tempfile.mkstemp() + (cfd, certfile) = tempfile.mkstemp() key = Keypair(create=True) key.save_to_file(keyfile) cert = Certificate(subject=subject) @@ -59,8 +97,8 @@ def get_node_key(registry=None, verbose=False): cert.sign() cert.save_to_file(certfile) - registry = get_server(service_url = options.registry, keyfile=keyfile, certfile=certfile) - registry.get_key() + registry = server_proxy(url = registry, keyfile=keyfile, certfile=certfile) + registry.get_key_from_incoming_ip() def create_server_keypair(keyfile=None, certfile=None, hrn="component", verbose=False): """ @@ -73,8 +111,9 @@ def create_server_keypair(keyfile=None, certfile=None, hrn="component", verbose= cert.set_pubkey(key) cert.sign() cert.save_to_file(certfile, save_parents=True) - -def get_credential(registry=registry, verbose=False): + +@handle_gid_mismatch_exception +def GetCredential(registry=None, force=False, verbose=False): config = Config() hierarchy = Hierarchy() key_dir= hierarchy.basedir @@ -82,7 +121,7 @@ def get_credential(registry=registry, verbose=False): config_dir = config.config_path credfile = data_dir + os.sep + 'node.cred' # check for existing credential - if os.path.exists(credfile): + if not force and os.path.exists(credfile): if verbose: print "Loading Credential from %(credfile)s " % locals() cred = Credential(filename=credfile).save_to_string(save_parents=True) @@ -106,20 +145,23 @@ def get_credential(registry=registry, verbose=False): create_server_keypair(keyfile, certfile, hrn, verbose) # get credential from registry - registry = get_server(url=registry, keyfile=keyfile, certfile=certfile) + registry = server_proxy(url=registry, keyfile=keyfile, certfile=certfile) + cert = Certificate(filename=certfile) cert_str = cert.save_to_string(save_parents=True) - cred = registry.get_self_credential(cert_str, 'node', hrn) - Credential(string=cred).save_to_file(credfile) + cred = registry.GetSelfCredential(cert_str, 'node', hrn) + Credential(string=cred).save_to_file(credfile, save_parents=True) return cred +@handle_gid_mismatch_exception def get_trusted_certs(registry=None, verbose=False): """ refresh our list of trusted certs. """ # define useful variables config = Config() - data_dir = config.data_path + data_dir = config.SFA_DATA_DIR + config_dir = config.SFA_CONFIG_DIR trusted_certs_dir = config.get_trustedroots_dir() keyfile = data_dir + os.sep + "server.key" certfile = data_dir + os.sep + "server.cert" @@ -127,10 +169,10 @@ def get_trusted_certs(registry=None, verbose=False): node_gid = GID(filename=node_gid_file) hrn = node_gid.get_hrn() # get credential - cred = get_credential(registry=registry, verbose=verbose) + cred = GetCredential(registry=registry, verbose=verbose) # make sure server key cert pair exists create_server_keypair(keyfile=keyfile, certfile=certfile, hrn=hrn, verbose=verbose) - registry = get_server(url=registry, keyfile=keyfile, certfile=certfile) + registry = server_proxy(url=registry, keyfile=keyfile, certfile=certfile) # get the trusted certs and save them in the right place if verbose: print "Getting trusted certs from registry" @@ -139,8 +181,9 @@ def get_trusted_certs(registry=None, verbose=False): for gid_str in trusted_certs: gid = GID(string=gid_str) gid.decode() - trusted_gid_names.append(gid.get_hrn()) - gid_filename = trusted_certs_dir + os.sep + gid.get_hrn() + ".gid" + relative_filename = gid.get_hrn() + ".gid" + trusted_gid_names.append(relative_filename) + gid_filename = trusted_certs_dir + os.sep + relative_filename if verbose: print "Writing GID for %s as %s" % (gid.get_hrn(), gid_filename) gid.save_to_file(gid_filename, save_parents=True) @@ -149,8 +192,11 @@ def get_trusted_certs(registry=None, verbose=False): all_gids_names = os.listdir(trusted_certs_dir) for gid_name in all_gids_names: if gid_name not in trusted_gid_names: + if verbose: + print "Removing old gid ", gid_name os.unlink(trusted_certs_dir + os.sep + gid_name) +@handle_gid_mismatch_exception def get_gids(registry=None, verbose=False): """ Get the gid for all instantiated slices on this node and store it @@ -159,6 +205,7 @@ def get_gids(registry=None, verbose=False): # define useful variables config = Config() data_dir = config.data_path + config_dir = config.SFA_CONFIG_DIR trusted_certs_dir = config.get_trustedroots_dir() keyfile = data_dir + os.sep + "server.key" certfile = data_dir + os.sep + "server.cert" @@ -167,45 +214,61 @@ def get_gids(registry=None, verbose=False): hrn = node_gid.get_hrn() interface_hrn = config.SFA_INTERFACE_HRN # get credential - cred = get_credential(registry=registry, verbose=verbose) + cred = GetCredential(registry=registry, verbose=verbose) # make sure server key cert pair exists create_server_keypair(keyfile=keyfile, certfile=certfile, hrn=hrn, verbose=verbose) - registry = get_server(url=registry, keyfile=keyfile, certfile=certfile) + registry = server_proxy(url=registry, keyfile=keyfile, certfile=certfile) if verbose: print "Getting current slices on this node" # get a list of slices on this node - from sfa.plc.api import ComponentAPI - api = ComponentAPI() - slicenames = api.nodemanger.GetXIDs().keys() - slicename_to_hrn = lambda name: ".".join([interface_hrn, name.replace('_', '.')]) - hrns = map(slicename_to_hrn, slicenames) + from sfa.generic import Generic + generic=Generic.the_flavour() + api = generic.make_api(interface='component') + xids_tuple = api.driver.nodemanager.GetXIDs() + slices = eval(xids_tuple[1]) + slicenames = slices.keys() + # generate a list of slices that dont have gids installed + slices_without_gids = [] + for slicename in slicenames: + if not os.path.isfile("/vservers/%s/etc/slice.gid" % slicename) \ + or not os.path.isfile("/vservers/%s/etc/node.gid" % slicename): + slices_without_gids.append(slicename) + + # convert slicenames to hrns + hrns = [slicename_to_hrn(interface_hrn, slicename) \ + for slicename in slices_without_gids] + + # exit if there are no gids to install + if not hrns: + return + if verbose: print "Getting gids for slices on this node from registry" # get the gids # and save them in the right palce - records = registry.get_gids(cred, hrns) + records = registry.GetGids(hrns, cred) for record in records: # if this isnt a slice record skip it if not record['type'] == 'slice': continue - slicename = misc.hrn_to_pl_slicename(record['hrn']) + slicename = hrn_to_pl_slicename(record['hrn']) # if this slice isnt really instatiated skip it if not os.path.exists("/vservers/%(slicename)s" % locals()): continue # save the slice gid in /etc/sfa/ in the vservers filesystem - vserver_path = "/vserver/%(slicename)s" % locals() + vserver_path = "/vservers/%(slicename)s" % locals() gid = record['gid'] - slice_gid_filename = os.sep.join([vserver_path, config_dir, "slice.gid"]) + slice_gid_filename = os.sep.join([vserver_path, "etc", "slice.gid"]) if verbose: print "Saving GID for %(slicename)s as %(slice_gid_filename)s" % locals() GID(string=gid).save_to_file(slice_gid_filename, save_parents=True) # save the node gid in /etc/sfa - node_gid_filename = os.sep.join([vserver_path, config_dir, "node.gid"]) + node_gid_filename = os.sep.join([vserver_path, "etc", "node.gid"]) if verbose: - print "Saving node GID for %(slicename)s as %(slice_gid_filename)s" % locals() + print "Saving node GID for %(slicename)s as %(node_gid_filename)s" % locals() node_gid.save_to_file(node_gid_filename, save_parents=True) @@ -213,17 +276,17 @@ def dispatch(options, args): create_default_dirs() if options.key: - if verbose: + if options.verbose: print "Getting the component's pkey" - get_node_key(options.registry, options.verbose) + get_node_key(registry=options.registry, verbose=options.verbose) if options.certs: if options.verbose: print "Getting the component's trusted certs" - get_certs(options.verbose) + get_trusted_certs(verbose=options.verbose) if options.gids: if options.verbose: print "Geting the component's GIDs" - get_gids(options.verbose) + get_gids(verbose=options.verbose) def main(): args = sys.argv