# SFA XML-RPC and SOAP interfaces
#
-import sys
import os
-import traceback
-import string
+import tempfile
import datetime
import xmlrpclib
-from sfa.util.faults import *
-from sfa.util.api import *
-from sfa.util.config import *
+from sfa.util.faults import RecordNotFound, MissingSfaInfo
+from sfa.util.api import BaseAPI
+from sfa.util.config import Config
from sfa.util.sfalogging import logger
import sfa.util.xmlrpcprotocol as xmlrpcprotocol
-from sfa.trust.auth import Auth
-from sfa.trust.rights import Right, Rights, determine_rights
-from sfa.trust.credential import Credential,Keypair
-from sfa.trust.certificate import Certificate
-from sfa.util.xrn import get_authority, hrn_to_urn
-from sfa.util.plxrn import hostname_to_hrn, hrn_to_pl_slicename, hrn_to_pl_slicename, slicename_to_hrn
+from sfa.util.xrn import hrn_to_urn
+from sfa.util.plxrn import hostname_to_hrn, hrn_to_pl_slicename, \
+ hrn_to_pl_slicename, slicename_to_hrn, hrn_to_pl_login_base
from sfa.util.nodemanager import NodeManager
+
+from sfa.trust.auth import Auth
+from sfa.trust.rights import determine_rights
+from sfa.trust.credential import Credential
+from sfa.trust.certificate import Certificate, Keypair
+from sfa.trust.gid import GID
try:
from collections import defaultdict
except:
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',
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.
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
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')
except IOError:
self.credential = self.getCredentialFromRegistry()
+
+
##
# Convert SFA fields to PLC fields for use when registering up updating
# registry record in the PLC database
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'] = []
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):
def sliver_exists(self):
sliver_dict = self.nodemanager.GetXIDs()
+ ### xxx slicename is undefined
if slicename in sliver_dict.keys():
return True
else:
cert_str = Certificate(filename=cert_filename).save_to_string(save_parents=True)
registry = self.get_registry()
cred = registry.GetSelfCredential(cert_str, hrn, 'node')
+ # xxx credfile is undefined
Credential(string=cred).save_to_file(credfile, save_parents=True)
return cred
"""
files = ["server.key", "server.cert", "node.cred"]
for f in files:
+ # xxx KEYDIR is undefined, could be meant to be "/var/lib/sfa/" from sfa_component_setup.py
filepath = KEYDIR + os.sep + f
if os.path.isfile(filepath):
os.unlink(f)