from ganeti import constants
from ganeti import cli
from ganeti import utils
+from ganeti import build
# _autoconf shouldn't be imported from anywhere except constants.py, but we're
# making an exception here because this script is only used at build time.
sw.Write("# This script is automatically generated at build time.")
sw.Write("# Do not modify manually.")
+ sw.Write("_ganeti_dbglog() {")
+ sw.IncIndent()
+ try:
+ sw.Write("if [[ -n \"$GANETI_COMPL_LOG\" ]]; then")
+ sw.IncIndent()
+ try:
+ sw.Write("{")
+ sw.IncIndent()
+ try:
+ sw.Write("echo ---")
+ sw.Write("echo \"$@\"")
+ sw.Write("echo")
+ finally:
+ sw.DecIndent()
+ sw.Write("} >> $GANETI_COMPL_LOG")
+ finally:
+ sw.DecIndent()
+ sw.Write("fi")
+ finally:
+ sw.DecIndent()
+ sw.Write("}")
+
sw.Write("_ganeti_nodes() {")
sw.IncIndent()
try:
sw.DecIndent()
sw.Write("fi")
+ sw.Write("_ganeti_dbglog optcur=\"'$optcur'\"")
+
sw.Write("return 1")
finally:
sw.DecIndent()
sw.Write("}")
+ # Params: <compgen options>
+ # Result variable: $COMPREPLY
+ sw.Write("_ganeti_compgen() {")
+ sw.IncIndent()
+ try:
+ sw.Write("""COMPREPLY=( $(compgen "$@") )""")
+ sw.Write("_ganeti_dbglog COMPREPLY=\"${COMPREPLY[@]}\"")
+ finally:
+ sw.DecIndent()
+ sw.Write("}")
+
def WriteCompReply(sw, args, cur="\"$cur\""):
- sw.Write("""COMPREPLY=( $(compgen %s -- %s) )""", args, cur)
+ sw.Write("_ganeti_compgen %s -- %s", args, cur)
sw.Write("return")
WriteCompReply(sw, "-W \"$(_ganeti_os)\"", cur=cur)
elif suggest == cli.OPT_COMPL_ONE_IALLOCATOR:
WriteCompReply(sw, "-W \"$(_ganeti_iallocator)\"", cur=cur)
+ elif suggest == cli.OPT_COMPL_INST_ADD_NODES:
+ sw.Write("local tmp= node1= pfx= curvalue=\"${optcur#*:}\"")
+
+ sw.Write("if [[ \"$optcur\" == *:* ]]; then")
+ sw.IncIndent()
+ try:
+ sw.Write("node1=\"${optcur%%:*}\"")
+
+ sw.Write("if [[ \"$COMP_WORDBREAKS\" != *:* ]]; then")
+ sw.IncIndent()
+ try:
+ sw.Write("pfx=\"$node1:\"")
+ finally:
+ sw.DecIndent()
+ sw.Write("fi")
+ finally:
+ sw.DecIndent()
+ sw.Write("fi")
+
+ sw.Write("_ganeti_dbglog pfx=\"'$pfx'\" curvalue=\"'$curvalue'\""
+ " node1=\"'$node1'\"")
+
+ sw.Write("for i in $(_ganeti_nodes); do")
+ sw.IncIndent()
+ try:
+ sw.Write("if [[ -z \"$node1\" ]]; then")
+ sw.IncIndent()
+ try:
+ sw.Write("tmp=\"$tmp $i $i:\"")
+ finally:
+ sw.DecIndent()
+ sw.Write("elif [[ \"$i\" != \"$node1\" ]]; then")
+ sw.IncIndent()
+ try:
+ sw.Write("tmp=\"$tmp $i\"")
+ finally:
+ sw.DecIndent()
+ sw.Write("fi")
+ finally:
+ sw.DecIndent()
+ sw.Write("done")
+
+ WriteCompReply(sw, "-P \"$pfx\" -W \"$tmp\"", cur="\"$curvalue\"")
else:
WriteCompReply(sw, "-W %s" % utils.ShellQuote(suggest), cur=cur)
finally:
' prev="${COMP_WORDS[COMP_CWORD-1]}"'
' i first_arg_idx choices compgenargs arg_idx optcur')
- # Useful for debugging:
- #sw.Write("echo cur=\"$cur\" prev=\"$prev\"")
- #sw.Write("set | grep ^COMP_")
+ sw.Write("_ganeti_dbglog cur=\"$cur\" prev=\"$prev\"")
+ sw.Write("[[ -n \"$GANETI_COMPL_LOG\" ]] &&"
+ " _ganeti_dbglog \"$(set | grep ^COMP_)\"")
sw.Write("COMPREPLY=()")
raise Exception("Script %s doesn't have 'commands' attribute" %
filename)
+ # Add the implicit "--help" option
+ help_option = cli.cli_option("-h", "--help", default=False,
+ action="store_true")
+
+ for (_, _, optdef, _, _) in commands.itervalues():
+ if help_option not in optdef:
+ optdef.append(help_option)
+ if cli.DEBUG_OPT not in optdef:
+ optdef.append(cli.DEBUG_OPT)
+
# Use aliases
aliases = getattr(module, "aliases", {})
if aliases:
WriteCompletion(sw, scriptname,
GetFunctionName(scriptname),
commands=GetCommands(filename,
- utils.LoadModule(filename)))
+ build.LoadModule(filename)))
# Burnin script
- burnin = utils.LoadModule("tools/burnin")
+ burnin = build.LoadModule("tools/burnin")
WriteCompletion(sw, "%s/burnin" % constants.TOOLSDIR, "_ganeti_burnin",
opts=burnin.OPTIONS, args=burnin.ARGUMENTS)