Changeset 9e38ded


Ignore:
Timestamp:
Jun 3, 2010 12:40:38 AM (14 years ago)
Author:
Ted Faber <faber@…>
Branches:
axis_example, compt_changes, info-ops, master, version-3.01, version-3.02
Children:
05e8da8
Parents:
2c51061
Message:

Parse options from a file.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • fedd/compose.py

    r2c51061 r9e38ded  
    1313from federation.service_error import service_error
    1414from federation import topdl
     15
     16class config_error(RuntimeError): pass
    1517
    1618class constraint:
     
    180182                help='Allow multiple links between the same nodes " + \
    181183                        "to be created.')
     184        self.add_option('--config', dest='config', default=None,
     185                help='Configuration file of options')
    182186
    183187    @staticmethod
     
    624628    return (components, topos, names, constraints, provides, accepts)
    625629
     630def parse_config(fn, opts):
     631    """
     632    Pull configuration options from a file given in fn.  These mirror the
     633    command line options.
     634    """
     635    # These functions make up a jump table for parsing lines of config.
     636    # They're dispatched from directives below.
     637    def file(args, opts):
     638        i = args.find(',')
     639        if i == -1: opts.files.append((args, 1))
     640        else:
     641            try:
     642                opts.files.append((args[0:i], int(args[i+1:])))
     643            except ValueError:
     644                raise config_error("Cannot convert %s to an integer" % \
     645                        args[i+1:])
     646
     647    def url(args, opts):
     648        opts.url=args
     649
     650    def output(args, opts):
     651        opts.outfile=args
     652
     653    def format(args, opts):
     654        valid = ("xml", "topdl", "tcl", "ns")
     655        if args in valid:
     656            opts.format = args
     657        else:
     658            raise config_error("Bad format %s. Must be one of %s" % \
     659                    (args, valid))
     660
     661    def tb_out(args, opts):
     662        opts.output_testbeds = True
     663
     664    def tb_add(args, opts):
     665        opts.add_testbeds = True
     666
     667    def seed(args, opts):
     668        try:
     669            opts.seed = int(args)
     670        except ValueError:
     671            raise config_error("Cannot convert %s to an integer" % args)
     672
     673    def lax(args, opts):
     674        opts.lax = True
     675
     676    def same_node(args, opts):
     677        opts.same_node = True
     678
     679    def same_topo(args, opts):
     680        opts.same_topo = True
     681
     682    def same_pair(args, opts):
     683        opts.multi_pair = True
     684
     685    directives = {
     686            'file': file,
     687            'multifile': file,
     688            'output': output,
     689            'url': url,
     690            'format': format,
     691            'output_testbeds': tb_out,
     692            'add_testbeds': tb_add,
     693            'seed': seed,
     694            'lax': lax,
     695            'same_node': same_node,
     696            'same_topo': same_topo,
     697            'same_pair': same_pair,
     698            }
     699    comment_re = re.compile('^\s*#')
     700    blank_re = re.compile('^\s*$')
     701
     702    # Parse_config code begins
     703    f = open(fn, "r")
     704    try:
     705        for i, l in enumerate(f):
     706            if blank_re.match(l) or comment_re.match(l):
     707                continue
     708
     709            if l.find('=') != -1: dir, args = l.split('=', 1)
     710            else: dir, args = (l, "")
     711
     712            dir, args = (dir.strip(), args.strip())
     713
     714            try:
     715                if dir in directives: directives[dir](args, opts)
     716                else: file(dir, opts)
     717            except config_error, e:
     718                raise config_error("%s in line %d" % (e, i+1))
     719    finally:
     720        if f: f.close()
     721
     722
    626723# Main line begins
    627724parser = ComposeOptionParser()
    628725
    629726opts, args = parser.parse_args()
     727
     728if opts.config:
     729    try:
     730        parse_config(opts.config, opts)
     731    except EnvironmentError, e:
     732        sys.exit("Can't open configuration: %s" %e)
     733    except config_error, e:
     734        sys.exit(e)
    630735
    631736if opts.cert:
Note: See TracChangeset for help on using the changeset viewer.