From: Thierry Parmentelat Date: Wed, 13 Feb 2013 17:51:16 +0000 (+0100) Subject: Merge branch 'master' of ssh://git.onelab.eu/git/sfa X-Git-Tag: sfa-2.1-25~5^2~2 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=435a8700876ce919c1fee3acfbb6dd9fefb6da96;hp=77bc7379e367d709d5e55cdb0c4db079881b8332;p=sfa.git Merge branch 'master' of ssh://git.onelab.eu/git/sfa --- diff --git a/sfa/client/common.py b/sfa/client/common.py new file mode 100644 index 00000000..b2e2fde5 --- /dev/null +++ b/sfa/client/common.py @@ -0,0 +1,89 @@ +# a few utilities common to sfi and sfaadmin + +def optparse_listvalue_callback(option, opt, value, parser): + former=getattr(parser.values,option.dest) + if not former: former=[] + setattr(parser.values, option.dest, former+value.split(',')) + +def optparse_dictvalue_callback (option, option_string, value, parser): + try: + (k,v)=value.split('=',1) + d=getattr(parser.values, option.dest) + d[k]=v + except: + parser.print_help() + sys.exit(1) + +# a code fragment that could be helpful for argparse which unfortunately is +# available with 2.7 only, so this feels like too strong a requirement for the client side +#class ExtraArgAction (argparse.Action): +# def __call__ (self, parser, namespace, values, option_string=None): +# would need a try/except of course +# (k,v)=values.split('=') +# d=getattr(namespace,self.dest) +# d[k]=v +##### +#parser.add_argument ("-X","--extra",dest='extras', default={}, action=ExtraArgAction, +# help="set extra flags, testbed dependent, e.g. --extra enabled=true") + +############################## +# these are not needed from the outside +def terminal_render_plural (how_many, name,names=None): + if not names: names="%ss"%name + if how_many<=0: return "No %s"%name + elif how_many==1: return "1 %s"%name + else: return "%d %s"%(how_many,names) + +def terminal_render_default (record,options): + print "%s (%s)" % (record['hrn'], record['type']) +def terminal_render_user (record, options): + print "%s (User)"%record['hrn'], + if record.get('reg-pi-authorities',None): print " [PI at %s]"%(" and ".join(record['reg-pi-authorities'])), + if record.get('reg-slices',None): print " [IN slices %s]"%(" and ".join(record['reg-slices'])), + user_keys=record.get('reg-keys',[]) + if not options.verbose: + print " [has %s]"%(terminal_render_plural(len(user_keys),"key")) + else: + print "" + for key in user_keys: print 8*' ',key.strip("\n") + +def terminal_render_slice (record, options): + print "%s (Slice)"%record['hrn'], + if record.get('reg-researchers',None): print " [USERS %s]"%(" and ".join(record['reg-researchers'])), +# print record.keys() + print "" +def terminal_render_authority (record, options): + print "%s (Authority)"%record['hrn'], + if record.get('reg-pis',None): print " [PIS %s]"%(" and ".join(record['reg-pis'])), + print "" +def terminal_render_node (record, options): + print "%s (Node)"%record['hrn'] + + +### used in sfi list +def terminal_render (records,options): + # sort records by type + grouped_by_type={} + for record in records: + type=record['type'] + if type not in grouped_by_type: grouped_by_type[type]=[] + grouped_by_type[type].append(record) + group_types=grouped_by_type.keys() + group_types.sort() + for type in group_types: + group=grouped_by_type[type] +# print 20 * '-', type + try: renderer=eval('terminal_render_'+type) + except: renderer=terminal_render_default + for record in group: renderer(record,options) + + +#################### +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 + + diff --git a/sfa/client/sfaadmin.py b/sfa/client/sfaadmin.py index 48fe4c33..febb1ba8 100755 --- a/sfa/client/sfaadmin.py +++ b/sfa/client/sfaadmin.py @@ -15,6 +15,8 @@ from sfa.trust.certificate import convert_public_key from sfa.client.candidates import Candidates +from sfa.client.common import optparse_listvalue_callback, terminal_render, filter_records + pprinter = PrettyPrinter(indent=4) try: @@ -22,9 +24,6 @@ try: except: help_basedir='*unable to locate Hierarchy().basedir' -def optparse_listvalue_callback(option, opt, value, parser): - setattr(parser.values, option.dest, value.split(',')) - def args(*args, **kwargs): def _decorator(func): func.__dict__.setdefault('options', []).insert(0, (args, kwargs)) @@ -52,15 +51,19 @@ class RegistryCommands(Commands): @args('-x', '--xrn', dest='xrn', metavar='', help='authority to list (hrn/urn - mandatory)') @args('-t', '--type', dest='type', metavar='', help='object type', default=None) @args('-r', '--recursive', dest='recursive', metavar='', help='list all child records', - action='store_true', default=False) - def list(self, xrn, type=None, recursive=False): + action='store_true', default=False) + @args('-v', '--verbose', dest='verbose', action='store_true', default=False) + def list(self, xrn, type=None, recursive=False, verbose=False): """List names registered at a given authority - possibly filtered by type""" xrn = Xrn(xrn, type) - options = {'recursive': recursive} - records = self.api.manager.List(self.api, xrn.get_hrn(), options=options) - for record in records: - if not type or record['type'] == type: - print "%s (%s)" % (record['hrn'], record['type']) + options_dict = {'recursive': recursive} + records = self.api.manager.List(self.api, xrn.get_hrn(), options=options_dict) + list = filter_records(type, records) + # terminal_render expects an options object + class Options: pass + options=Options() + options.verbose=verbose + terminal_render (list, options) @args('-x', '--xrn', dest='xrn', metavar='', help='object hrn/urn (mandatory)') @@ -222,6 +225,7 @@ Users having a GID/PubKey correpondence NOT OK: %s and are: \n%s\n\n"%(len(NOKEY def update(self, xrn, type=None, url=None, description=None, key=None, slices='', pis='', researchers=''): """Update an existing Registry record""" + print 'incoming PIS',pis record_dict = self._record_dict(xrn=xrn, type=type, url=url, description=description, key=key, slices=slices, researchers=researchers, pis=pis) self.api.manager.Update(self.api, record_dict) diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py index 32036245..b0deeb95 100644 --- a/sfa/client/sfi.py +++ b/sfa/client/sfi.py @@ -46,30 +46,8 @@ from sfa.client.candidates import Candidates CM_PORT=12346 -# utility methods here -def optparse_listvalue_callback(option, option_string, value, parser): - setattr(parser.values, option.dest, value.split(',')) - -# a code fragment that could be helpful for argparse which unfortunately is -# available with 2.7 only, so this feels like too strong a requirement for the client side -#class ExtraArgAction (argparse.Action): -# def __call__ (self, parser, namespace, values, option_string=None): -# would need a try/except of course -# (k,v)=values.split('=') -# d=getattr(namespace,self.dest) -# d[k]=v -##### -#parser.add_argument ("-X","--extra",dest='extras', default={}, action=ExtraArgAction, -# help="set extra flags, testbed dependent, e.g. --extra enabled=true") - -def optparse_dictvalue_callback (option, option_string, value, parser): - try: - (k,v)=value.split('=',1) - d=getattr(parser.values, option.dest) - d[k]=v - except: - parser.print_help() - sys.exit(1) +from sfa.client.common import optparse_listvalue_callback, optparse_dictvalue_callback, \ + terminal_render, filter_records # display methods def display_rspec(rspec, format='rspec'): @@ -107,14 +85,6 @@ def display_record(record, dump=False): 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 - - def credential_printable (credential_string): credential=Credential(string=credential_string) result="" @@ -197,54 +167,6 @@ def save_record_to_file(filename, record_dict): f.close() return -# used in sfi list -def terminal_render (records,options): - # sort records by type - grouped_by_type={} - for record in records: - type=record['type'] - if type not in grouped_by_type: grouped_by_type[type]=[] - grouped_by_type[type].append(record) - group_types=grouped_by_type.keys() - group_types.sort() - for type in group_types: - group=grouped_by_type[type] -# print 20 * '-', type - try: renderer=eval('terminal_render_'+type) - except: renderer=terminal_render_default - for record in group: renderer(record,options) - -def render_plural (how_many, name,names=None): - if not names: names="%ss"%name - if how_many<=0: return "No %s"%name - elif how_many==1: return "1 %s"%name - else: return "%d %s"%(how_many,names) - -def terminal_render_default (record,options): - print "%s (%s)" % (record['hrn'], record['type']) -def terminal_render_user (record, options): - print "%s (User)"%record['hrn'], - if record.get('reg-pi-authorities',None): print " [PI at %s]"%(" and ".join(record['reg-pi-authorities'])), - if record.get('reg-slices',None): print " [IN slices %s]"%(" and ".join(record['reg-slices'])), - user_keys=record.get('reg-keys',[]) - if not options.verbose: - print " [has %s]"%(render_plural(len(user_keys),"key")) - else: - print "" - for key in user_keys: print 8*' ',key.strip("\n") - -def terminal_render_slice (record, options): - print "%s (Slice)"%record['hrn'], - if record.get('reg-researchers',None): print " [USERS %s]"%(" and ".join(record['reg-researchers'])), -# print record.keys() - print "" -def terminal_render_authority (record, options): - print "%s (Authority)"%record['hrn'], - if record.get('reg-pis',None): print " [PIS %s]"%(" and ".join(record['reg-pis'])), - print "" -def terminal_render_node (record, options): - print "%s (Node)"%record['hrn'] - # minimally check a key argument def check_ssh_key (key): good_ssh_key = r'^.*(?:ssh-dss|ssh-rsa)[ ]+[A-Za-z0-9+/=]+(?: .*)?$'