summaryrefslogtreecommitdiffstats
path: root/src/lib/Options.py
diff options
context:
space:
mode:
authorNarayan Desai <desai@mcs.anl.gov>2006-04-10 20:38:45 +0000
committerNarayan Desai <desai@mcs.anl.gov>2006-04-10 20:38:45 +0000
commit5ab4e0879b1e53184c2319a4bc03c8340cdec326 (patch)
treecf6f19b4a73a55c197c13da918901cec0f9ece29 /src/lib/Options.py
parent8a55ac710d0e30cbb1b09ceb750821083bb7bda6 (diff)
downloadbcfg2-5ab4e0879b1e53184c2319a4bc03c8340cdec326.tar.gz
bcfg2-5ab4e0879b1e53184c2319a4bc03c8340cdec326.tar.bz2
bcfg2-5ab4e0879b1e53184c2319a4bc03c8340cdec326.zip
Add Options library
git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@1830 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src/lib/Options.py')
-rw-r--r--src/lib/Options.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/lib/Options.py b/src/lib/Options.py
new file mode 100644
index 000000000..7b3ef109f
--- /dev/null
+++ b/src/lib/Options.py
@@ -0,0 +1,93 @@
+'''Option parsing library for utilities'''
+__revision__ = '$Revision$'
+
+import getopt, os, sys, ConfigParser
+# (option, env, cfpath, default value, option desc, boolean, arg desc)
+# ((option, arg desc, opt desc), env, cfpath, default, boolean)
+bootstrap = {'configfile': (('-C', '<configfile>', 'Path to config file'),
+ 'BCFG2_CONF', False, '/etc/bcfg2.conf', False)}
+
+class OptionFailure(Exception):
+ pass
+
+class BasicOptionParser:
+ '''Basic OptionParser takes input from command line arguments, environment variables, and defaults'''
+ def __init__(self, name, optionspec, configfile=False, dogetopt=False):
+ self.name = name
+ self.dogetopt = dogetopt
+ self.configfile = configfile
+ self.optionspec = optionspec
+ if dogetopt:
+ self.shortopt = ''
+ self.helpmsg = ''
+ # longopts aren't yet supported
+ self.longopt = []
+ for option, info in optionspec.iteritems():
+ (opt, argd, optd) = info[0]
+ self.helpmsg += opt.ljust(3)
+ if opt.count('-') == 1:
+ self.shortopt += opt[1]
+ else:
+ print "unsupported option %s" % (opt)
+ continue
+ if info[4]:
+ self.helpmsg += 24 * ' '
+ else:
+ self.shortopt += ':'
+ self.helpmsg += "%-24s" % (argd)
+ self.helpmsg += "%s\n" % (optd)
+
+ def parse(self):
+ '''Parse options'''
+ ret = {}
+ if self.dogetopt:
+ try:
+ opts, args = getopt.getopt(sys.argv[1:], self.shortopt, self.longopt)
+ except getopt.GetoptError, err:
+ print "%s Usage:" % (self.name)
+ print err
+ print self.helpmsg
+ raise OptionFailure, err
+ if '-h' in sys.argv:
+ print "%s Usage:" % (self.name)
+ print self.helpmsg
+ raise SystemExit, 1
+ if self.configfile:
+ cf = ConfigParser.ConfigParser()
+ cf.read(self.configfile)
+ for key, (option, envvar, cfpath, default, boolean) in self.optionspec.iteritems():
+ if self.dogetopt:
+ optinfo = [opt[1] for opt in opts if opt[0] == option[0]]
+ if optinfo:
+ if boolean:
+ ret[key] = True
+ else:
+ ret[key] = optinfo[0]
+ continue
+ if option[0] in sys.argv:
+ if boolean:
+ ret[key] = True
+ else:
+ ret[key] = sys.argv[sys.argv.index(option[0]) + 1]
+ continue
+ elif envvar and os.environ.has_key(envvar):
+ ret[key] = os.environ[envvar]
+ continue
+ elif self.configfile and cfpath:
+ try:
+ value = apply(cf.get, cfpath)
+ ret[key] = value
+ continue
+ except:
+ pass
+ else:
+ ret[key] = default
+ continue
+ return ret
+
+class OptionParser(BasicOptionParser):
+ '''OptionParser bootstraps option parsing, getting the value of the config file'''
+ def __init__(self, name, ospec):
+ # first find the cf file
+ cfpath = BasicOptionParser('bootstrap', bootstrap).parse()['configfile']
+ BasicOptionParser.__init__(self, name, ospec, cfpath, dogetopt=True)