X-Git-Url: http://git.onelab.eu/?p=sfa.git;a=blobdiff_plain;f=sfa%2Fplc%2Fapi.py;h=8a03a87c69433cbf33a576f40ae3c1524630c24d;hp=28e27483fe831ee7232bdacdeaf0396a1ec4a9f7;hb=1e95f8a388325499564df5f8eb6eb1fd10ca2d42;hpb=aea0ff5747601a9c9330db76f376655409228ab0 diff --git a/sfa/plc/api.py b/sfa/plc/api.py index 28e27483..8a03a87c 100644 --- a/sfa/plc/api.py +++ b/sfa/plc/api.py @@ -107,22 +107,47 @@ class SfaAPI(BaseAPI): self.hrn = self.config.SFA_INTERFACE_HRN self.time_format = "%Y-%m-%d %H:%M:%S" + def getPLCShell(self): self.plauth = {'Username': self.config.SFA_PLC_USER, 'AuthMethod': 'password', 'AuthString': self.config.SFA_PLC_PASSWORD} - try: - sys.path.append(os.path.dirname(os.path.realpath("/usr/bin/plcsh"))) - self.plshell_type = 'direct' - import PLC.Shell - shell = PLC.Shell.Shell(globals = globals()) - except: - self.plshell_type = 'xmlrpc' - url = self.config.SFA_PLC_URL - shell = xmlrpclib.Server(url, verbose = 0, allow_none = True) + + # The native shell (PLC.Shell.Shell) is more efficient than xmlrpc, + # but it leaves idle db connections open. use xmlrpc until we can figure + # out why PLC.Shell.Shell doesn't close db connection properly + #try: + # sys.path.append(os.path.dirname(os.path.realpath("/usr/bin/plcsh"))) + # self.plshell_type = 'direct' + # import PLC.Shell + # shell = PLC.Shell.Shell(globals = globals()) + #except: + self.plshell_type = 'xmlrpc' + url = self.config.SFA_PLC_URL + shell = xmlrpclib.Server(url, verbose = 0, allow_none = True) return shell + def get_server(self, interface, cred, timeout=30): + """ + Returns a connection to the specified interface. Use the specified + credential to determine the caller and look for the caller's key/cert + in the registry hierarchy cache. + """ + from sfa.trust.hierarchy import Hierarchy + if not isinstance(cred, Credential): + cred_obj = Credential(string=cred) + else: + cred_obj = cred + caller_gid = cred_obj.get_gid_caller() + hierarchy = Hierarchy() + auth_info = hierarchy.get_auth_info(caller_gid.get_hrn()) + key_file = auth_info.get_privkey_filename() + cert_file = auth_info.get_gid_filename() + server = interface.get_server(key_file, cert_file, timeout) + return server + + def getCredential(self): """ Return a valid credential for this interface. @@ -136,7 +161,7 @@ class SfaAPI(BaseAPI): cred = Credential(filename = cred_filename) # make sure cred isnt expired if not cred.get_expiration or \ - datetime.datetime.today() < cred.get_expiration(): + datetime.datetime.utcnow() < cred.get_expiration(): return cred.save_to_string(save_parents=True) # get a new credential @@ -154,20 +179,25 @@ class SfaAPI(BaseAPI): Attempt to find a credential delegated to us in the specified list of creds. """ + from sfa.trust.hierarchy import Hierarchy if creds and not isinstance(creds, list): creds = [creds] - delegated_creds = filter_creds_by_caller(creds,self.hrn) - if not delegated_creds: - return None - return delegated_creds[0] + hierarchy = Hierarchy() + + delegated_cred = None + for cred in creds: + if hierarchy.auth_exists(Credential(string=cred).get_gid_caller().get_hrn()): + delegated_cred = cred + break + return delegated_cred def __getCredential(self): """ Get our credential from a remote registry """ from sfa.server.registry import Registries - registries = Registries(self) - registry = registries[self.hrn] + registries = Registries() + registry = registries.get_server(self.hrn, self.key_file, self.cert_file) cert_string=self.cert.save_to_string(save_parents=True) # get self credential self_cred = registry.GetSelfCredential(cert_string, self.hrn, 'authority') @@ -222,6 +252,8 @@ class SfaAPI(BaseAPI): except IOError: self.credential = self.getCredentialFromRegistry() + + ## # Convert SFA fields to PLC fields for use when registering up updating # registry record in the PLC database @@ -501,7 +533,8 @@ class SfaAPI(BaseAPI): elif (type.startswith("authority")): record['url'] = None if record['hrn'] in self.aggregates: - record['url'] = self.aggregates[record['hrn']].url + + record['url'] = self.aggregates[record['hrn']].get_url() if record['pointer'] != -1: record['PI'] = [] @@ -543,12 +576,22 @@ class SfaAPI(BaseAPI): self.fill_record_sfa_info(records) def update_membership_list(self, oldRecord, record, listName, addFunc, delFunc): - # get a list of the HRNs tht are members of the old and new records + # get a list of the HRNs that are members of the old and new records if oldRecord: oldList = oldRecord.get(listName, []) else: oldList = [] newList = record.get(listName, []) + # ugly hack to see what's next + def normalize (value): + from types import StringTypes + from sfa.util.sfalogging import logger + if isinstance(value,StringTypes): return value + elif isinstance(value,dict): + newvalue=value['text'] + logger.info("Normalizing %s=>%s"%(value,newvalue)) + return newvalue + newList=[normalize(v) for v in newList] # if the lists are the same, then we don't have to update anything if (oldList == newList):