from sfa.trust.certificate import Keypair, Certificate
from sfa.trust.credential import Credential
from sfa.util.geniclient import GeniClient
+from sfa.util.sfaticket import SfaTicket
from sfa.util.record import *
+from sfa.util.misc import *
from sfa.util.rspec import RSpec
from sfa.util.xmlrpcprotocol import ServerException
import sfa.util.xmlrpcprotocol as xmlrpcprotocol
from sfa.util.config import Config
+# utility methods here
+# display methods
+def display_rspec(rspec, format = 'rspec'):
+ if format in ['dns']:
+ spec = RSpec()
+ spec.parseString(rspec)
+ hostnames = []
+ nodespecs = spec.getDictsByTagName('NodeSpec')
+ for nodespec in nodespecs:
+ if nodespec.has_key('name') and nodespec['name']:
+ if isinstance(nodespec['name'], ListType):
+ hostnames.extend(nodespec['name'])
+ elif isinstance(nodespec['name'], StringTypes):
+ hostnames.append(nodespec['name'])
+ result = hostnames
+ elif format in ['ip']:
+ spec = RSpec()
+ spec.parseString(rspec)
+ ips = []
+ ifspecs = spec.getDictsByTagName('IfSpec')
+ for ifspec in ifspecs:
+ if ifspec.has_key('addr') and ifspec['addr']:
+ ips.append(ifspec['addr'])
+ result = ips
+ else:
+ result = rspec
+
+ print result
+ return
+
+def display_list(results):
+ for result in results:
+ print result
+
+
+def display_records(recordList, dump = False):
+ ''' Print all fields in the record'''
+ for record in recordList:
+ display_record(record, dump)
+
+def display_record(record, dump = False):
+ if dump:
+ record.dump()
+ else:
+ info = record.getdict()
+ print "%s (%s)" % (info['hrn'], info['type'])
+ return
+
+
+def filter_records(type, records):
+ filtered_records = []
+ for record in records:
+ if (record['type'] == type) or (type == "all"):
+ filtered_records.append(record)
+ return filtered_records
+
+
+# save methods
+def save_rspec_to_file(rspec, filename):
+ if not filename.endswith(".rspec"):
+ filename = filename + ".rspec"
+
+ f = open(filename, 'w')
+ f.write(rspec)
+ f.close()
+ return
+
+def save_records_to_file(filename, recordList):
+ index = 0
+ for record in recordList:
+ if index>0:
+ save_record_to_file(filename + "." + str(index), record)
+ else:
+ save_record_to_file(filename, record)
+ index = index + 1
+
+def save_record_to_file(filename, record):
+ if record['type'] in ['user']:
+ record = UserRecord(dict = record)
+ elif record['type'] in ['slice']:
+ record = SliceRecord(dict = record)
+ elif record['type'] in ['node']:
+ record = NodeRecord(dict = record)
+ elif record['type'] in ['authority', 'ma', 'sa']:
+ record = AuthorityRecord(dict = record)
+ else:
+ record = GeniRecord(dict = record)
+ str = record.save_to_string()
+ file(filename, "w").write(str)
+ return
+
+
+# load methods
+def load_record_from_file(filename):
+ str = file(filename, "r").read()
+ record = GeniRecord(string=str)
+ return record
+
+
+
class Sfi:
slicemgr = None
"slices": "",
"resources": "[name]",
"create": "name rspec",
+ "get_ticket": "name rspec",
+ "redeem_ticket": "ticket rspec"
"delete": "name",
"reset": "name",
"start": "name",
parser.add_option("-a", "--aggregate", dest="aggregate",
default=None, help="aggregate hrn")
- if command in ("create"):
+ if command in ("create", "get_ticket"):
parser.add_option("-a", "--aggregate", dest="aggregate",default=None,
help="aggregate hrn")
parser.add_option("-p", "--protocol",
dest="protocol", default="xmlrpc",
help="RPC protocol (xmlrpc or soap)")
- parser.add_option("-h", "--hashrequest",
+ parser.add_option("-k", "--hashrequest",
action="store_true", dest="hashrequest", default=False,
help="Create a hash of the request that will be authenticated on the server")
parser.disable_interspersed_args()
# - bootstrap slice credential from user credential
#
- def get_leaf(self,name):
- parts = name.split(".")
- return parts[-1]
def get_key_file(self):
- file = os.path.join(self.options.sfi_dir, self.get_leaf(self.user) + ".pkey")
+ file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".pkey")
if (os.path.isfile(file)):
return file
else:
def get_cert_file(self,key_file):
- file = os.path.join(self.options.sfi_dir, self.get_leaf(self.user) + ".cert")
+ file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".cert")
if (os.path.isfile(file)):
return file
else:
return file
def get_gid(self):
- file = os.path.join(self.options.sfi_dir, self.get_leaf(self.user) + ".gid")
+ file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".gid")
if (os.path.isfile(file)):
gid = GID(filename=file)
return gid
else:
cert_str = self.cert.save_to_string(save_parents=True)
- request_hash = self.key.compute_hash([cert_str, self.user, "user"])
+ request_hash=None
+ if self.hashrequest:
+ request_hash = self.key.compute_hash([cert_str, self.user, "user"])
gid_str = self.registry.get_gid(cert_str, self.user, "user", request_hash)
gid = GID(string=gid_str)
if self.options.verbose:
return gid
def get_user_cred(self):
- file = os.path.join(self.options.sfi_dir, self.get_leaf(self.user) + ".cred")
+ file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".cred")
if (os.path.isfile(file)):
user_cred = Credential(filename=file)
return user_cred
else:
# bootstrap user credential
cert_string = self.cert.save_to_string(save_parents=True)
- request_hash = self.key.compute_hash([cert_string, "user", self.user])
+ request_hash=None
+ if self.hashrequest:
+ request_hash = self.key.compute_hash([cert_string, "user", self.user])
user_cred = self.registry.get_self_credential(cert_string, "user", self.user, request_hash)
if user_cred:
cred = Credential(string=user_cred)
else:
print "Failed to get user credential"
sys.exit(-1)
-
+
def get_auth_cred(self):
+ if not self.authority:
+ print "no authority specified. Use -a or set SF_AUTH"
+ sys.exit(-1)
- if not self.authority:
- print "no authority specified. Use -a or set SF_AUTH"
- sys.exit(-1)
-
- file = os.path.join(self.options.sfi_dir, self.get_leaf("authority") +".cred")
- if (os.path.isfile(file)):
- auth_cred = Credential(filename=file)
- return auth_cred
- else:
- # bootstrap authority credential from user credential
- user_cred = self.get_user_cred().save_to_string(save_parents=True)
- request_hash = self.key.compute_hash([user_cred, "authority", self.authority])
- auth_cred = self.registry.get_credential(user_cred, "authority", self.authority, request_hash)
- if auth_cred:
- cred = Credential(string=auth_cred)
- cred.save_to_file(file, save_parents=True)
- if self.options.verbose:
- print "Writing authority credential to", file
- return cred
- else:
- print "Failed to get authority credential"
- sys.exit(-1)
+ file = os.path.join(self.options.sfi_dir, get_leaf("authority") +".cred")
+ if (os.path.isfile(file)):
+ auth_cred = Credential(filename=file)
+ return auth_cred
+ else:
+ # bootstrap authority credential from user credential
+ user_cred = self.get_user_cred().save_to_string(save_parents=True)
+ request_hash = None
+ if self.hashrequest:
+ request_hash = self.key.compute_hash([user_cred, "authority", self.authority])
+ auth_cred = self.registry.get_credential(user_cred, "authority", self.authority, request_hash)
+ if auth_cred:
+ cred = Credential(string=auth_cred)
+ cred.save_to_file(file, save_parents=True)
+ if self.options.verbose:
+ print "Writing authority credential to", file
+ return cred
+ else:
+ print "Failed to get authority credential"
+ sys.exit(-1)
def get_slice_cred(self,name):
- file = os.path.join(self.options.sfi_dir, "slice_" + self.get_leaf(name) + ".cred")
- if (os.path.isfile(file)):
- slice_cred = Credential(filename=file)
- return slice_cred
- else:
- # bootstrap slice credential from user credential
- user_cred = self.get_user_cred().save_to_string(save_parents=True)
- arg_list = [user_cred, "slice", name]
- request_hash = self.key.compute_hash(arg_list)
- slice_cred_str = self.registry.get_credential(user_cred, "slice", name, request_hash)
- if slice_cred_str:
- slice_cred = Credential(string=slice_cred_str)
- slice_cred.save_to_file(file, save_parents=True)
- if self.options.verbose:
- print "Writing slice credential to", file
- return slice_cred
- else:
- print "Failed to get slice credential"
- sys.exit(-1)
+ file = os.path.join(self.options.sfi_dir, "slice_" + get_leaf(name) + ".cred")
+ if (os.path.isfile(file)):
+ slice_cred = Credential(filename=file)
+ return slice_cred
+ else:
+ # bootstrap slice credential from user credential
+ user_cred = self.get_user_cred().save_to_string(save_parents=True)
+ arg_list = [user_cred, "slice", name]
+ request_hash=None
+ if self.hashrequest:
+ request_hash = self.key.compute_hash(arg_list)
+ slice_cred_str = self.registry.get_credential(user_cred, "slice", name, request_hash)
+ if slice_cred_str:
+ slice_cred = Credential(string=slice_cred_str)
+ slice_cred.save_to_file(file, save_parents=True)
+ if self.options.verbose:
+ print "Writing slice credential to", file
+ return slice_cred
+ else:
+ print "Failed to get slice credential"
+ sys.exit(-1)
def delegate_cred(self,cred, hrn, type = 'authority'):
# the gid and hrn of the object we are delegating
records = self.registry.resolve(cred, hrn)
- records = self.filter_records(type, records)
+ records = filter_records(type, records)
if not records:
raise Exception, "Error: Didn't find a %(type)s record for %(hrn)s" % locals()
def list(self,opts, args):
user_cred = self.get_user_cred().save_to_string(save_parents=True)
hrn = args[0]
- request_hash = self.key.compute_hash([user_cred, hrn])
+ request_hash=None
+ if self.hashrequest:
+ request_hash = self.key.compute_hash([user_cred, hrn])
try:
list = self.registry.list(user_cred, hrn, request_hash)
except IndexError:
# filter on person, slice, site, node, etc.
# THis really should be in the self.filter_records funct def comment...
- list = self.filter_records(opts.type, list)
+ list = filter_records(opts.type, list)
for record in list:
print "%s (%s)" % (record['hrn'], record['type'])
if opts.file:
- self.save_records_to_file(opts.file, list)
+ file = opts.file
+ if not file.startswith(os.sep):
+ file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".gid")
+ save_records_to_file(file, list)
return
# show named registry record
def show(self,opts, args):
user_cred = self.get_user_cred().save_to_string(save_parents=True)
hrn = args[0]
- request_hash = self.key.compute_hash([user_cred, hrn])
+ request_hash=None
+ if self.hashrequest:
+ request_hash = self.key.compute_hash([user_cred, hrn])
records = self.registry.resolve(user_cred, hrn, request_hash)
- records = self.filter_records(opts.type, records)
+ records = filter_records(opts.type, records)
if not records:
print "No record of type", opts.type
for record in records:
print record.save_to_string()
if opts.file:
- self.save_records_to_file(opts.file, records)
+ file = opts.file
+ if not file.startswith(os.sep):
+ file = os.path.join(self.options.sfi_dir, file)
+ save_records_to_file(file, records)
return
def delegate(self,opts, args):
return
records = self.registry.resolve(user_cred, args[0])
- records = self.filter_records("user", records)
+ records = filter_records("user", records)
if not records:
print "Error: Didn't find a user record for", args[0]
dcred.sign()
if opts.delegate_user:
- dest_fn = os.path.join(self.options.sfi_dir, self.get_leaf(delegee_hrn) + "_"
- + self.get_leaf(object_hrn) + ".cred")
+ dest_fn = os.path.join(self.options.sfi_dir, get_leaf(delegee_hrn) + "_"
+ + get_leaf(object_hrn) + ".cred")
elif opts.delegate_slice:
- dest_fn = os.path_join(self.options.sfi_dir, self.get_leaf(delegee_hrn) + "_slice_"
- + self.get_leaf(object_hrn) + ".cred")
+ dest_fn = os.path_join(self.options.sfi_dir, get_leaf(delegee_hrn) + "_slice_"
+ + get_leaf(object_hrn) + ".cred")
dcred.save_to_file(dest_fn, save_parents = True)
# removed named registry record
# - have to first retrieve the record to be removed
def remove(self,opts, args):
- auth_cred = self.get_auth_cred().save_to_string(save_parents=True)
- hrn = args[0]
- type = opts.type
- if type in ['all']:
- type = '*'
- arg_list = [auth_cred, type, hrn]
- request_hash = self.key.compute_hash(arg_list)
- return self.registry.remove(auth_cred, type, hrn, request_hash)
+ auth_cred = self.get_auth_cred().save_to_string(save_parents=True)
+ hrn = args[0]
+ type = opts.type
+ if type in ['all']:
+ type = '*'
+ request_hash=None
+ if self.hashrequest:
+ arg_list = [auth_cred, type, hrn]
+ request_hash = self.key.compute_hash(arg_list)
+ return self.registry.remove(auth_cred, type, hrn, request_hash)
# add named registry record
def add(self,opts, args):
- auth_cred = self.get_auth_cred().save_to_string(save_parents=True)
- record_filepath = args[0]
- rec_file = self.get_record_file(record_filepath)
- record = self.load_record_from_file(rec_file).as_dict()
- arg_list = [auth_cred]
- request_hash = self.key.compute_hash(arg_list)
- return self.registry.register(auth_cred, record, request_hash)
+ auth_cred = self.get_auth_cred().save_to_string(save_parents=True)
+ record_filepath = args[0]
+ rec_file = self.get_record_file(record_filepath)
+ record = load_record_from_file(rec_file).as_dict()
+ request_hash=None
+ if self.hashrequest:
+ arg_list = [auth_cred]
+ request_hash = self.key.compute_hash(arg_list)
+ return self.registry.register(auth_cred, record, request_hash)
# update named registry entry
def update(self,opts, args):
- user_cred = self.get_user_cred()
- rec_file = self.get_record_file(args[0])
- record = self.load_record_from_file(rec_file)
- if record['type'] == "user":
- if record.get_name() == user_cred.get_gid_object().get_hrn():
- cred = user_cred.save_to_string(save_parents=True)
- else:
- cred = self.get_auth_cred().save_to_string(save_parents=True)
- elif record['type'] in ["slice"]:
- try:
- cred = self.get_slice_cred(record.get_name()).save_to_string(save_parents=True)
- except ServerException, e:
+ user_cred = self.get_user_cred()
+ rec_file = self.get_record_file(args[0])
+ record = load_record_from_file(rec_file)
+ if record['type'] == "user":
+ if record.get_name() == user_cred.get_gid_object().get_hrn():
+ cred = user_cred.save_to_string(save_parents=True)
+ else:
+ cred = self.get_auth_cred().save_to_string(save_parents=True)
+ elif record['type'] in ["slice"]:
+ try:
+ cred = self.get_slice_cred(record.get_name()).save_to_string(save_parents=True)
+ except ServerException, e:
# XXX smbaker -- once we have better error return codes, update this
# to do something better than a string compare
if "Permission error" in e.args[0]:
cred = self.get_auth_cred().save_to_string(save_parents=True)
else:
raise
- elif record.get_type() in ["authority"]:
- cred = self.get_auth_cred().save_to_string(save_parents=True)
- elif record.get_type() == 'node':
- cred = self.get_auth_cred().save_to_string(save_parents=True)
- else:
- raise "unknown record type" + record.get_type()
- record = record.as_dict()
- arg_list = [cred]
- request_hash = self.key.compute_hash(arg_list)
- return self.registry.update(cred, record, request_hash)
+ elif record.get_type() in ["authority"]:
+ cred = self.get_auth_cred().save_to_string(save_parents=True)
+ elif record.get_type() == 'node':
+ cred = self.get_auth_cred().save_to_string(save_parents=True)
+ else:
+ raise "unknown record type" + record.get_type()
+ record = record.as_dict()
+ request_hash=None
+ if self.hashrequest:
+ arg_list = [cred]
+ request_hash = self.key.compute_hash(arg_list)
+ return self.registry.update(cred, record, request_hash)
def aggregates(self, opts, args):
+ """
+ return a list of details about known aggregates
+ """
user_cred = self.get_user_cred().save_to_string(save_parents=True)
hrn = None
if args:
hrn = args[0]
- arg_list = [user_cred, hrn]
- request_hash = self.key.compute_hash(arg_list)
+ request_hash=None
+ if self.hashrequest:
+ arg_list = [user_cred, hrn]
+ request_hash = self.key.compute_hash(arg_list)
result = self.registry.get_aggregates(user_cred, hrn, request_hash)
- self.display_list(result)
+ display_list(result)
return
def registries(self, opts, args):
+ """
+ return a list of details about known registries
+ """
user_cred = self.get_user_cred().save_to_string(save_parents=True)
hrn = None
if args:
hrn = args[0]
- arg_list = [user_cred, hrn]
- request_hash = self.key.compute_hash(arg_list)
+ request_hash=None
+ if self.hashrequest:
+ arg_list = [user_cred, hrn]
+ request_hash = self.key.compute_hash(arg_list)
result = self.registry.get_registries(user_cred, hrn, request_hash)
- self.display_list(result)
+ display_list(result)
+ return
+
+ def components(self, opts, args):
+ """
+ return a list of details about known components
+ """
+ user_cred = self.get_user_cred().save_to_string(save_parents=True)
+ hrn = None
+ if args:
+ hrn = args[0]
+ request_hash=None
+ if self.hashrequest:
+ arg_list = [user_cred, hrn]
+ request_hash = self.key.compute_hash(arg_list)
+ result = self.sm.components(user_cred, hrn, request_hash)
+ display_list(result)
return
#
# list instantiated slices
def slices(self,opts, args):
user_cred = self.get_user_cred().save_to_string(save_parents=True)
- arg_list = [user_cred]
- request_hash = self.key.compute_hash(arg_list)
+ request_hash=None
+ if self.hashrequest:
+ arg_list = [user_cred]
+ request_hash = self.key.compute_hash(arg_list)
results = self.slicemgr.get_slices(user_cred, request_hash)
- self.display_list(results)
+ display_list(results)
return
# show rspec for named slice
cred = user_cred
hrn = None
- arg_list = [cred, hrn]
- request_hash = self.key.compute_hash(arg_list)
+ request_hash=None
+ if self.hashrequest:
+ arg_list = [cred, hrn]
+ request_hash = self.key.compute_hash(arg_list)
result = server.get_resources(cred, hrn, request_hash)
format = opts.format
- self.display_rspec(result, format)
+ display_rspec(result, format)
if (opts.file is not None):
- self.save_rspec_to_file(result, opts.file)
+ file = opts.file
+ if not file.startswith(os.sep):
+ file = os.path.join(self.options.sfi_dir, file)
+ save_rspec_to_file(result, file)
return
# created named slice with given rspec
def create(self,opts, args):
- slice_hrn = args[0]
- user_cred = self.get_user_cred()
- slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
- rspec_file = self.get_rspec_file(args[1])
- rspec=open(rspec_file).read()
- server = self.slicemgr
- if opts.aggregate:
- aggregates = self.registry.get_aggregates(user_cred, opts.aggregate)
- if not aggregates:
- raise Exception, "No such aggregate %s" % opts.aggregate
- aggregate = aggregates[0]
- url = "http://%s:%s" % (aggregate['addr'], aggregate['port'])
- server = GeniClient(url, self.key_file, self.cert_file, self.options.protocol)
- arg_list = [slice_cred, slice_hrn, rspec]
- request_hash = self.key.compute_hash(arg_list)
- return server.create_slice(slice_cred, slice_hrn, rspec, request_hash)
-
+ slice_hrn = args[0]
+ user_cred = self.get_user_cred()
+ slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
+ rspec_file = self.get_rspec_file(args[1])
+ rspec=open(rspec_file).read()
+ server = self.slicemgr
+ if opts.aggregate:
+ aggregates = self.registry.get_aggregates(user_cred, opts.aggregate)
+ if not aggregates:
+ raise Exception, "No such aggregate %s" % opts.aggregate
+ aggregate = aggregates[0]
+ url = "http://%s:%s" % (aggregate['addr'], aggregate['port'])
+ server = GeniClient(url, self.key_file, self.cert_file, self.options.protocol)
+ request_hash=None
+ if self.hashrequest:
+ arg_list = [slice_cred, slice_hrn, rspec]
+ request_hash = self.key.compute_hash(arg_list)
+ return server.create_slice(slice_cred, slice_hrn, rspec, request_hash)
+
+ # get a ticket for the specified slice
+ def get_ticket(self, opts, args):
+ slice_hrn, rspec_path = args[0], args[1]
+ user_cred = self.get_user_cred()
+ slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
+ rspec_file = self.get_rspec_file(rspec_path)
+ rspec=open(rspec_file).read()
+ server = self.slicemgr
+ if opts.aggregate:
+ aggregates = self.registry.get_aggregates(user_cred, opts.aggregate)
+ if not aggregates:
+ raise Exception, "No such aggregate %s" % opts.aggregate
+ aggregate = aggregates[0]
+ url = "http://%s:%s" % (aggregate['addr'], aggregate['port'])
+ server = GeniClient(url, self.key_file, self.cert_file, self.options.protocol)
+ request_hash=None
+ if self.hashrequest:
+ arg_list = [slice_cred, slice_hrn, rspec]
+ request_hash = self.key.compute_hash(arg_list)
+ ticket_string = server.get_ticket(slice_cred, slice_hrn, rspec, request_hash)
+ file = os.path.join(self.options.sfi_dir, get_leaf(slice_hrn) + ".ticket")
+ print "writing ticket to ", file
+ ticket = SfaTicket(string=ticket_string)
+ ticket.save_to_file(filename=file, save_parents=True)
+ print ticket_string
+
+ def redeem_ticket(self, opts, args):
+ return
+
# delete named slice
def delete(self,opts, args):
slice_hrn = args[0]
slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
- arg_list = [slice_cred, slice_hrn]
- request_hash = self.key.compute_hash(arg_list)
+ request_hash=None
+ if self.hashrequest:
+ arg_list = [slice_cred, slice_hrn]
+ request_hash = self.key.compute_hash(arg_list)
return self.slicemgr.delete_slice(slice_cred, slice_hrn, request_hash)
# start named slice
def start(self,opts, args):
slice_hrn = args[0]
slice_cred = self.get_slice_cred(args[0])
- arg_list = [slice_cred, slice_hrn]
- request_hash = self.key.compute_hash(arg_list)
+ request_hash=None
+ if self.hashrequest:
+ arg_list = [slice_cred, slice_hrn]
+ request_hash = self.key.compute_hash(arg_list)
return self.slicemgr.start_slice(slice_cred, slice_hrn, request_hash)
# stop named slice
def stop(self,opts, args):
slice_hrn = args[0]
slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
- arg_list = [slice_cred, slice_hrn]
- request_hash = self.key.compute_hash(arg_list)
+ request_hash=None
+ if self.hashrequest:
+ arg_list = [slice_cred, slice_hrn]
+ request_hash = self.key.compute_hash(arg_list)
return self.slicemgr.stop_slice(slice_cred, slice_hrn, request_hash)
# reset named slice
def reset(self,opts, args):
slice_hrn = args[0]
slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
- arg_list = [slice_cred, slice_hrn]
- request_hash = self.key.compute_hash(arg_list)
+ request_hash=None
+ if self.hashrequest:
+ arg_list = [slice_cred, slice_hrn]
+ request_hash = self.key.compute_hash(arg_list)
return self.slicemgr.reset_slice(slice_cred, slice_hrn, request_hash)
- #
- #
- # Display, Save, and Filter RSpecs and Records
- # - to be replace by EMF-generated routines
- #
- #
-
- def display_rspec(self,rspec, format = 'rspec'):
- if format in ['dns']:
- spec = RSpec()
- spec.parseString(rspec)
- hostnames = []
- nodespecs = spec.getDictsByTagName('NodeSpec')
- for nodespec in nodespecs:
- if nodespec.has_key('name') and nodespec['name']:
- if isinstance(nodespec['name'], ListType):
- hostnames.extend(nodespec['name'])
- elif isinstance(nodespec['name'], StringTypes):
- hostnames.append(nodespec['name'])
- result = hostnames
- elif format in ['ip']:
- spec = RSpec()
- spec.parseString(rspec)
- ips = []
- ifspecs = spec.getDictsByTagName('IfSpec')
- for ifspec in ifspecs:
- if ifspec.has_key('addr') and ifspec['addr']:
- ips.append(ifspec['addr'])
- result = ips
- else:
- result = rspec
-
- print result
- return
-
- def display_list(self,results):
- for result in results:
- print result
-
- def save_rspec_to_file(self,rspec, filename):
- if not filename.startswith(os.sep):
- filename = self.options.sfi_dir + filename
- if not filename.endswith(".rspec"):
- filename = filename + ".rspec"
-
- f = open(filename, 'w')
- f.write(rspec)
- f.close()
- return
-
- def display_records(self,recordList, dump = False):
- ''' Print all fields in the record'''
- for record in recordList:
- self.display_record(record, dump)
-
- def display_record(self,record, dump = False):
- if dump:
- record.dump()
- else:
- info = record.getdict()
- print "%s (%s)" % (info['hrn'], info['type'])
- return
-
- def filter_records(self,type, records):
- filtered_records = []
- for record in records:
- if (record['type'] == type) or (type == "all"):
- filtered_records.append(record)
- return filtered_records
-
- def save_records_to_file(self,filename, recordList):
- index = 0
- for record in recordList:
- if index>0:
- self.save_record_to_file(filename + "." + str(index), record)
- else:
- self.save_record_to_file(filename, record)
- index = index + 1
-
- def save_record_to_file(self,filename, record):
- if record['type'] in ['user']:
- record = UserRecord(dict = record)
- elif record['type'] in ['slice']:
- record = SliceRecord(dict = record)
- elif record['type'] in ['node']:
- record = NodeRecord(dict = record)
- elif record['type'] in ['authority', 'ma', 'sa']:
- record = AuthorityRecord(dict = record)
- else:
- record = GeniRecord(dict = record)
- if not filename.startswith(os.sep):
- filename = self.options.sfi_dir + filename
- str = record.save_to_string()
- file(filename, "w").write(str)
- return
-
- def load_record_from_file(self,filename):
- str = file(filename, "r").read()
- record = GeniRecord(string=str)
- return record
-
#
# Main: parse arguments and dispatch to command
#