Revision ef9fa5b9 lib/cli.py
b/lib/cli.py | ||
---|---|---|
29 | 29 |
import logging |
30 | 30 |
import errno |
31 | 31 |
import itertools |
32 |
import shlex |
|
32 | 33 |
from cStringIO import StringIO |
33 | 34 |
|
34 | 35 |
from ganeti import utils |
... | ... | |
1297 | 1298 |
] |
1298 | 1299 |
|
1299 | 1300 |
|
1300 |
def _ParseArgs(argv, commands, aliases): |
|
1301 |
def _ParseArgs(argv, commands, aliases, env_override):
|
|
1301 | 1302 |
"""Parser for the command line arguments. |
1302 | 1303 |
|
1303 | 1304 |
This function parses the arguments and returns the function which |
... | ... | |
1307 | 1308 |
@param commands: dictionary with special contents, see the design |
1308 | 1309 |
doc for cmdline handling |
1309 | 1310 |
@param aliases: dictionary with command aliases {'alias': 'target, ...} |
1311 |
@param env_override: list of env variables allowed for default args |
|
1310 | 1312 |
|
1311 | 1313 |
""" |
1314 |
assert not (env_override - set(commands)) |
|
1315 |
|
|
1312 | 1316 |
if len(argv) == 0: |
1313 | 1317 |
binary = "<command>" |
1314 | 1318 |
else: |
... | ... | |
1362 | 1366 |
|
1363 | 1367 |
cmd = aliases[cmd] |
1364 | 1368 |
|
1369 |
if cmd in env_override: |
|
1370 |
args_env_name = ("%s_%s" % (binary.replace("-", "_"), cmd)).upper() |
|
1371 |
env_args = os.environ.get(args_env_name) |
|
1372 |
if env_args: |
|
1373 |
argv = utils.InsertAtPos(argv, 1, shlex.split(env_args)) |
|
1374 |
|
|
1365 | 1375 |
func, args_def, parser_opts, usage, description = commands[cmd] |
1366 | 1376 |
parser = OptionParser(option_list=parser_opts + COMMON_OPTS, |
1367 | 1377 |
description=description, |
1368 | 1378 |
formatter=TitledHelpFormatter(), |
1369 | 1379 |
usage="%%prog %s %s" % (cmd, usage)) |
1370 | 1380 |
parser.disable_interspersed_args() |
1371 |
options, args = parser.parse_args() |
|
1381 |
options, args = parser.parse_args(args=argv[1:])
|
|
1372 | 1382 |
|
1373 | 1383 |
if not _CheckArguments(cmd, args_def, args): |
1374 | 1384 |
return None, None, None |
... | ... | |
2002 | 2012 |
return retcode, obuf.getvalue().rstrip("\n") |
2003 | 2013 |
|
2004 | 2014 |
|
2005 |
def GenericMain(commands, override=None, aliases=None): |
|
2015 |
def GenericMain(commands, override=None, aliases=None, |
|
2016 |
env_override=frozenset()): |
|
2006 | 2017 |
"""Generic main function for all the gnt-* commands. |
2007 | 2018 |
|
2008 |
Arguments: |
|
2009 |
- commands: a dictionary with a special structure, see the design doc |
|
2010 |
for command line handling. |
|
2011 |
- override: if not None, we expect a dictionary with keys that will |
|
2012 |
override command line options; this can be used to pass |
|
2013 |
options from the scripts to generic functions |
|
2014 |
- aliases: dictionary with command aliases {'alias': 'target, ...} |
|
2019 |
@param commands: a dictionary with a special structure, see the design doc |
|
2020 |
for command line handling. |
|
2021 |
@param override: if not None, we expect a dictionary with keys that will |
|
2022 |
override command line options; this can be used to pass |
|
2023 |
options from the scripts to generic functions |
|
2024 |
@param aliases: dictionary with command aliases {'alias': 'target, ...} |
|
2025 |
@param env_override: list of environment names which are allowed to submit |
|
2026 |
default args for commands |
|
2015 | 2027 |
|
2016 | 2028 |
""" |
2017 | 2029 |
# save the program name and the entire command line for later logging |
... | ... | |
2030 | 2042 |
aliases = {} |
2031 | 2043 |
|
2032 | 2044 |
try: |
2033 |
func, options, args = _ParseArgs(sys.argv, commands, aliases) |
|
2045 |
func, options, args = _ParseArgs(sys.argv, commands, aliases, env_override)
|
|
2034 | 2046 |
except errors.ParameterError, err: |
2035 | 2047 |
result, err_msg = FormatError(err) |
2036 | 2048 |
ToStderr(err_msg) |
Also available in: Unified diff