Statistics
| Branch: | Tag: | Revision:

root / autotools / build-bash-completion @ 13718ded

History | View | Annotate | Download (18.4 kB)

1 4f3d5b76 Michael Hanselmann
#!/usr/bin/python
2 4f3d5b76 Michael Hanselmann
#
3 4f3d5b76 Michael Hanselmann
4 f5ce7613 Iustin Pop
# Copyright (C) 2009, 2010, 2011, 2012 Google Inc.
5 4f3d5b76 Michael Hanselmann
#
6 4f3d5b76 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 4f3d5b76 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 4f3d5b76 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 4f3d5b76 Michael Hanselmann
# (at your option) any later version.
10 4f3d5b76 Michael Hanselmann
#
11 4f3d5b76 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 4f3d5b76 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 4f3d5b76 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 4f3d5b76 Michael Hanselmann
# General Public License for more details.
15 4f3d5b76 Michael Hanselmann
#
16 4f3d5b76 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 4f3d5b76 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 4f3d5b76 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 4f3d5b76 Michael Hanselmann
# 02110-1301, USA.
20 4f3d5b76 Michael Hanselmann
21 4f3d5b76 Michael Hanselmann
22 b4086ce8 Michael Hanselmann
"""Script to generate bash_completion script for Ganeti.
23 b4086ce8 Michael Hanselmann
24 b4086ce8 Michael Hanselmann
"""
25 b4086ce8 Michael Hanselmann
26 b459a848 Andrea Spadaccini
# pylint: disable=C0103
27 b4086ce8 Michael Hanselmann
# [C0103] Invalid name build-bash-completion
28 b4086ce8 Michael Hanselmann
29 4f3d5b76 Michael Hanselmann
import os
30 4f3d5b76 Michael Hanselmann
import re
31 49283373 Michael Hanselmann
import itertools
32 4f3d5b76 Michael Hanselmann
from cStringIO import StringIO
33 4f3d5b76 Michael Hanselmann
34 4f3d5b76 Michael Hanselmann
from ganeti import constants
35 4f3d5b76 Michael Hanselmann
from ganeti import cli
36 4f3d5b76 Michael Hanselmann
from ganeti import utils
37 e948770c Michael Hanselmann
from ganeti import build
38 13718ded Michael Hanselmann
from ganeti import pathutils
39 4f3d5b76 Michael Hanselmann
40 4f3d5b76 Michael Hanselmann
# _autoconf shouldn't be imported from anywhere except constants.py, but we're
41 4f3d5b76 Michael Hanselmann
# making an exception here because this script is only used at build time.
42 4f3d5b76 Michael Hanselmann
from ganeti import _autoconf
43 4f3d5b76 Michael Hanselmann
44 49283373 Michael Hanselmann
#: Regular expression describing desired format of option names. Long names can
45 49283373 Michael Hanselmann
#: contain lowercase characters, numbers and dashes only.
46 49283373 Michael Hanselmann
_OPT_NAME_RE = re.compile(r"^-[a-zA-Z0-9]|--[a-z][-a-z0-9]+$")
47 49283373 Michael Hanselmann
48 4f3d5b76 Michael Hanselmann
49 4f3d5b76 Michael Hanselmann
def WritePreamble(sw):
50 4f3d5b76 Michael Hanselmann
  """Writes the script preamble.
51 4f3d5b76 Michael Hanselmann
52 4f3d5b76 Michael Hanselmann
  Helper functions should be written here.
53 4f3d5b76 Michael Hanselmann
54 4f3d5b76 Michael Hanselmann
  """
55 4f3d5b76 Michael Hanselmann
  sw.Write("# This script is automatically generated at build time.")
56 4f3d5b76 Michael Hanselmann
  sw.Write("# Do not modify manually.")
57 4f3d5b76 Michael Hanselmann
58 3db199ea Michael Hanselmann
  sw.Write("_gnt_log() {")
59 5b0ca9d4 Michael Hanselmann
  sw.IncIndent()
60 5b0ca9d4 Michael Hanselmann
  try:
61 5b0ca9d4 Michael Hanselmann
    sw.Write("if [[ -n \"$GANETI_COMPL_LOG\" ]]; then")
62 5b0ca9d4 Michael Hanselmann
    sw.IncIndent()
63 5b0ca9d4 Michael Hanselmann
    try:
64 5b0ca9d4 Michael Hanselmann
      sw.Write("{")
65 5b0ca9d4 Michael Hanselmann
      sw.IncIndent()
66 5b0ca9d4 Michael Hanselmann
      try:
67 5b0ca9d4 Michael Hanselmann
        sw.Write("echo ---")
68 5b0ca9d4 Michael Hanselmann
        sw.Write("echo \"$@\"")
69 5b0ca9d4 Michael Hanselmann
        sw.Write("echo")
70 5b0ca9d4 Michael Hanselmann
      finally:
71 5b0ca9d4 Michael Hanselmann
        sw.DecIndent()
72 5b0ca9d4 Michael Hanselmann
      sw.Write("} >> $GANETI_COMPL_LOG")
73 5b0ca9d4 Michael Hanselmann
    finally:
74 5b0ca9d4 Michael Hanselmann
      sw.DecIndent()
75 5b0ca9d4 Michael Hanselmann
    sw.Write("fi")
76 5b0ca9d4 Michael Hanselmann
  finally:
77 5b0ca9d4 Michael Hanselmann
    sw.DecIndent()
78 5b0ca9d4 Michael Hanselmann
  sw.Write("}")
79 5b0ca9d4 Michael Hanselmann
80 4f3d5b76 Michael Hanselmann
  sw.Write("_ganeti_nodes() {")
81 4f3d5b76 Michael Hanselmann
  sw.IncIndent()
82 4f3d5b76 Michael Hanselmann
  try:
83 13718ded Michael Hanselmann
    node_list_path = os.path.join(pathutils.DATA_DIR, "ssconf_node_list")
84 5a78e2e7 Michael Hanselmann
    sw.Write("cat %s 2>/dev/null || :", utils.ShellQuote(node_list_path))
85 4f3d5b76 Michael Hanselmann
  finally:
86 4f3d5b76 Michael Hanselmann
    sw.DecIndent()
87 4f3d5b76 Michael Hanselmann
  sw.Write("}")
88 4f3d5b76 Michael Hanselmann
89 4f3d5b76 Michael Hanselmann
  sw.Write("_ganeti_instances() {")
90 4f3d5b76 Michael Hanselmann
  sw.IncIndent()
91 4f3d5b76 Michael Hanselmann
  try:
92 13718ded Michael Hanselmann
    instance_list_path = os.path.join(pathutils.DATA_DIR,
93 4f3d5b76 Michael Hanselmann
                                      "ssconf_instance_list")
94 5a78e2e7 Michael Hanselmann
    sw.Write("cat %s 2>/dev/null || :", utils.ShellQuote(instance_list_path))
95 4f3d5b76 Michael Hanselmann
  finally:
96 4f3d5b76 Michael Hanselmann
    sw.DecIndent()
97 4f3d5b76 Michael Hanselmann
  sw.Write("}")
98 4f3d5b76 Michael Hanselmann
99 4f3d5b76 Michael Hanselmann
  sw.Write("_ganeti_jobs() {")
100 4f3d5b76 Michael Hanselmann
  sw.IncIndent()
101 4f3d5b76 Michael Hanselmann
  try:
102 4f3d5b76 Michael Hanselmann
    # FIXME: this is really going into the internals of the job queue
103 5a78e2e7 Michael Hanselmann
    sw.Write(("local jlist=$( shopt -s nullglob &&"
104 5a78e2e7 Michael Hanselmann
              " cd %s 2>/dev/null && echo job-* || : )"),
105 13718ded Michael Hanselmann
             utils.ShellQuote(pathutils.QUEUE_DIR))
106 5a78e2e7 Michael Hanselmann
    sw.Write('echo "${jlist//job-/}"')
107 4f3d5b76 Michael Hanselmann
  finally:
108 4f3d5b76 Michael Hanselmann
    sw.DecIndent()
109 4f3d5b76 Michael Hanselmann
  sw.Write("}")
110 4f3d5b76 Michael Hanselmann
111 30d44392 Michael Hanselmann
  for (fnname, paths) in [
112 13718ded Michael Hanselmann
    ("os", pathutils.OS_SEARCH_PATH),
113 5ae4945a Iustin Pop
    ("iallocator", constants.IALLOCATOR_SEARCH_PATH),
114 5ae4945a Iustin Pop
    ]:
115 30d44392 Michael Hanselmann
    sw.Write("_ganeti_%s() {", fnname)
116 30d44392 Michael Hanselmann
    sw.IncIndent()
117 30d44392 Michael Hanselmann
    try:
118 30d44392 Michael Hanselmann
      # FIXME: Make querying the master for all OSes cheap
119 30d44392 Michael Hanselmann
      for path in paths:
120 30d44392 Michael Hanselmann
        sw.Write("( shopt -s nullglob && cd %s 2>/dev/null && echo * || : )",
121 30d44392 Michael Hanselmann
                 utils.ShellQuote(path))
122 30d44392 Michael Hanselmann
    finally:
123 30d44392 Michael Hanselmann
      sw.DecIndent()
124 30d44392 Michael Hanselmann
    sw.Write("}")
125 4f3d5b76 Michael Hanselmann
126 36e247e1 Guido Trotter
  sw.Write("_ganeti_nodegroup() {")
127 36e247e1 Guido Trotter
  sw.IncIndent()
128 36e247e1 Guido Trotter
  try:
129 13718ded Michael Hanselmann
    nodegroups_path = os.path.join(pathutils.DATA_DIR, "ssconf_nodegroups")
130 36e247e1 Guido Trotter
    sw.Write("cat %s 2>/dev/null || :", utils.ShellQuote(nodegroups_path))
131 36e247e1 Guido Trotter
  finally:
132 36e247e1 Guido Trotter
    sw.DecIndent()
133 36e247e1 Guido Trotter
  sw.Write("}")
134 36e247e1 Guido Trotter
135 4f3d5b76 Michael Hanselmann
  # Params: <offset> <options with values> <options without values>
136 4f3d5b76 Michael Hanselmann
  # Result variable: $first_arg_idx
137 4f3d5b76 Michael Hanselmann
  sw.Write("_ganeti_find_first_arg() {")
138 4f3d5b76 Michael Hanselmann
  sw.IncIndent()
139 4f3d5b76 Michael Hanselmann
  try:
140 4f3d5b76 Michael Hanselmann
    sw.Write("local w i")
141 4f3d5b76 Michael Hanselmann
142 4f3d5b76 Michael Hanselmann
    sw.Write("first_arg_idx=")
143 4f3d5b76 Michael Hanselmann
    sw.Write("for (( i=$1; i < COMP_CWORD; ++i )); do")
144 4f3d5b76 Michael Hanselmann
    sw.IncIndent()
145 4f3d5b76 Michael Hanselmann
    try:
146 4f3d5b76 Michael Hanselmann
      sw.Write("w=${COMP_WORDS[$i]}")
147 4f3d5b76 Michael Hanselmann
148 4f3d5b76 Michael Hanselmann
      # Skip option value
149 4f3d5b76 Michael Hanselmann
      sw.Write("""if [[ -n "$2" && "$w" == @($2) ]]; then let ++i""")
150 4f3d5b76 Michael Hanselmann
151 4f3d5b76 Michael Hanselmann
      # Skip
152 4f3d5b76 Michael Hanselmann
      sw.Write("""elif [[ -n "$3" && "$w" == @($3) ]]; then :""")
153 4f3d5b76 Michael Hanselmann
154 4f3d5b76 Michael Hanselmann
      # Ah, we found the first argument
155 4f3d5b76 Michael Hanselmann
      sw.Write("else first_arg_idx=$i; break;")
156 4f3d5b76 Michael Hanselmann
      sw.Write("fi")
157 4f3d5b76 Michael Hanselmann
    finally:
158 4f3d5b76 Michael Hanselmann
      sw.DecIndent()
159 4f3d5b76 Michael Hanselmann
    sw.Write("done")
160 4f3d5b76 Michael Hanselmann
  finally:
161 4f3d5b76 Michael Hanselmann
    sw.DecIndent()
162 4f3d5b76 Michael Hanselmann
  sw.Write("}")
163 4f3d5b76 Michael Hanselmann
164 4f3d5b76 Michael Hanselmann
  # Params: <list of options separated by space>
165 4f3d5b76 Michael Hanselmann
  # Input variable: $first_arg_idx
166 4f3d5b76 Michael Hanselmann
  # Result variables: $arg_idx, $choices
167 4f3d5b76 Michael Hanselmann
  sw.Write("_ganeti_list_options() {")
168 4f3d5b76 Michael Hanselmann
  sw.IncIndent()
169 4f3d5b76 Michael Hanselmann
  try:
170 4f3d5b76 Michael Hanselmann
    sw.Write("""if [[ -z "$first_arg_idx" ]]; then""")
171 4f3d5b76 Michael Hanselmann
    sw.IncIndent()
172 4f3d5b76 Michael Hanselmann
    try:
173 4f3d5b76 Michael Hanselmann
      sw.Write("arg_idx=0")
174 4f3d5b76 Michael Hanselmann
      # Show options only if the current word starts with a dash
175 4f3d5b76 Michael Hanselmann
      sw.Write("""if [[ "$cur" == -* ]]; then""")
176 4f3d5b76 Michael Hanselmann
      sw.IncIndent()
177 4f3d5b76 Michael Hanselmann
      try:
178 4f3d5b76 Michael Hanselmann
        sw.Write("choices=$1")
179 4f3d5b76 Michael Hanselmann
      finally:
180 4f3d5b76 Michael Hanselmann
        sw.DecIndent()
181 4f3d5b76 Michael Hanselmann
      sw.Write("fi")
182 4f3d5b76 Michael Hanselmann
      sw.Write("return")
183 4f3d5b76 Michael Hanselmann
    finally:
184 4f3d5b76 Michael Hanselmann
      sw.DecIndent()
185 4f3d5b76 Michael Hanselmann
    sw.Write("fi")
186 4f3d5b76 Michael Hanselmann
187 4f3d5b76 Michael Hanselmann
    # Calculate position of current argument
188 4f3d5b76 Michael Hanselmann
    sw.Write("arg_idx=$(( COMP_CWORD - first_arg_idx ))")
189 4f3d5b76 Michael Hanselmann
    sw.Write("choices=")
190 4f3d5b76 Michael Hanselmann
  finally:
191 4f3d5b76 Michael Hanselmann
    sw.DecIndent()
192 4f3d5b76 Michael Hanselmann
  sw.Write("}")
193 4f3d5b76 Michael Hanselmann
194 d4b94fe8 Michael Hanselmann
  # Params: <long options with equal sign> <all options>
195 d4b94fe8 Michael Hanselmann
  # Result variable: $optcur
196 3db199ea Michael Hanselmann
  sw.Write("_gnt_checkopt() {")
197 d4b94fe8 Michael Hanselmann
  sw.IncIndent()
198 d4b94fe8 Michael Hanselmann
  try:
199 d4b94fe8 Michael Hanselmann
    sw.Write("""if [[ -n "$1" && "$cur" == @($1) ]]; then""")
200 d4b94fe8 Michael Hanselmann
    sw.IncIndent()
201 d4b94fe8 Michael Hanselmann
    try:
202 d4b94fe8 Michael Hanselmann
      sw.Write("optcur=\"${cur#--*=}\"")
203 d4b94fe8 Michael Hanselmann
      sw.Write("return 0")
204 d4b94fe8 Michael Hanselmann
    finally:
205 d4b94fe8 Michael Hanselmann
      sw.DecIndent()
206 d4b94fe8 Michael Hanselmann
    sw.Write("""elif [[ -n "$2" && "$prev" == @($2) ]]; then""")
207 d4b94fe8 Michael Hanselmann
    sw.IncIndent()
208 d4b94fe8 Michael Hanselmann
    try:
209 d4b94fe8 Michael Hanselmann
      sw.Write("optcur=\"$cur\"")
210 d4b94fe8 Michael Hanselmann
      sw.Write("return 0")
211 d4b94fe8 Michael Hanselmann
    finally:
212 d4b94fe8 Michael Hanselmann
      sw.DecIndent()
213 d4b94fe8 Michael Hanselmann
    sw.Write("fi")
214 d4b94fe8 Michael Hanselmann
215 3db199ea Michael Hanselmann
    sw.Write("_gnt_log optcur=\"'$optcur'\"")
216 5b0ca9d4 Michael Hanselmann
217 d4b94fe8 Michael Hanselmann
    sw.Write("return 1")
218 d4b94fe8 Michael Hanselmann
  finally:
219 d4b94fe8 Michael Hanselmann
    sw.DecIndent()
220 d4b94fe8 Michael Hanselmann
  sw.Write("}")
221 d4b94fe8 Michael Hanselmann
222 a10caf87 Michael Hanselmann
  # Params: <compgen options>
223 a10caf87 Michael Hanselmann
  # Result variable: $COMPREPLY
224 3db199ea Michael Hanselmann
  sw.Write("_gnt_compgen() {")
225 a10caf87 Michael Hanselmann
  sw.IncIndent()
226 a10caf87 Michael Hanselmann
  try:
227 a10caf87 Michael Hanselmann
    sw.Write("""COMPREPLY=( $(compgen "$@") )""")
228 3db199ea Michael Hanselmann
    sw.Write("_gnt_log COMPREPLY=\"${COMPREPLY[@]}\"")
229 a10caf87 Michael Hanselmann
  finally:
230 a10caf87 Michael Hanselmann
    sw.DecIndent()
231 a10caf87 Michael Hanselmann
  sw.Write("}")
232 a10caf87 Michael Hanselmann
233 4f3d5b76 Michael Hanselmann
234 632d5090 Michael Hanselmann
def WriteCompReply(sw, args, cur="\"$cur\""):
235 3db199ea Michael Hanselmann
  sw.Write("_gnt_compgen %s -- %s", args, cur)
236 4f3d5b76 Michael Hanselmann
  sw.Write("return")
237 4f3d5b76 Michael Hanselmann
238 4f3d5b76 Michael Hanselmann
239 4f3d5b76 Michael Hanselmann
class CompletionWriter:
240 4f3d5b76 Michael Hanselmann
  """Command completion writer class.
241 4f3d5b76 Michael Hanselmann
242 4f3d5b76 Michael Hanselmann
  """
243 4f3d5b76 Michael Hanselmann
  def __init__(self, arg_offset, opts, args):
244 4f3d5b76 Michael Hanselmann
    self.arg_offset = arg_offset
245 4f3d5b76 Michael Hanselmann
    self.opts = opts
246 4f3d5b76 Michael Hanselmann
    self.args = args
247 4f3d5b76 Michael Hanselmann
248 4f3d5b76 Michael Hanselmann
    for opt in opts:
249 f59418db Michael Hanselmann
      # While documented, these variables aren't seen as public attributes by
250 b459a848 Andrea Spadaccini
      # pylint. pylint: disable=W0212
251 4f3d5b76 Michael Hanselmann
      opt.all_names = sorted(opt._short_opts + opt._long_opts)
252 4f3d5b76 Michael Hanselmann
253 49283373 Michael Hanselmann
      invalid = list(itertools.ifilterfalse(_OPT_NAME_RE.match, opt.all_names))
254 49283373 Michael Hanselmann
      if invalid:
255 49283373 Michael Hanselmann
        raise Exception("Option names don't match regular expression '%s': %s" %
256 49283373 Michael Hanselmann
                        (_OPT_NAME_RE.pattern, utils.CommaJoin(invalid)))
257 49283373 Michael Hanselmann
258 4f3d5b76 Michael Hanselmann
  def _FindFirstArgument(self, sw):
259 4f3d5b76 Michael Hanselmann
    ignore = []
260 4f3d5b76 Michael Hanselmann
    skip_one = []
261 4f3d5b76 Michael Hanselmann
262 4f3d5b76 Michael Hanselmann
    for opt in self.opts:
263 4f3d5b76 Michael Hanselmann
      if opt.takes_value():
264 4f3d5b76 Michael Hanselmann
        # Ignore value
265 4f3d5b76 Michael Hanselmann
        for i in opt.all_names:
266 580ef58d Michael Hanselmann
          if i.startswith("--"):
267 580ef58d Michael Hanselmann
            ignore.append("%s=*" % utils.ShellQuote(i))
268 4f3d5b76 Michael Hanselmann
          skip_one.append(utils.ShellQuote(i))
269 4f3d5b76 Michael Hanselmann
      else:
270 4f3d5b76 Michael Hanselmann
        ignore.extend([utils.ShellQuote(i) for i in opt.all_names])
271 4f3d5b76 Michael Hanselmann
272 4f3d5b76 Michael Hanselmann
    ignore = sorted(utils.UniqueSequence(ignore))
273 4f3d5b76 Michael Hanselmann
    skip_one = sorted(utils.UniqueSequence(skip_one))
274 4f3d5b76 Michael Hanselmann
275 4f3d5b76 Michael Hanselmann
    if ignore or skip_one:
276 4f3d5b76 Michael Hanselmann
      # Try to locate first argument
277 4f3d5b76 Michael Hanselmann
      sw.Write("_ganeti_find_first_arg %s %s %s",
278 4f3d5b76 Michael Hanselmann
               self.arg_offset + 1,
279 4f3d5b76 Michael Hanselmann
               utils.ShellQuote("|".join(skip_one)),
280 4f3d5b76 Michael Hanselmann
               utils.ShellQuote("|".join(ignore)))
281 4f3d5b76 Michael Hanselmann
    else:
282 4f3d5b76 Michael Hanselmann
      # When there are no options the first argument is always at position
283 4f3d5b76 Michael Hanselmann
      # offset + 1
284 4f3d5b76 Michael Hanselmann
      sw.Write("first_arg_idx=%s", self.arg_offset + 1)
285 4f3d5b76 Michael Hanselmann
286 4f3d5b76 Michael Hanselmann
  def _CompleteOptionValues(self, sw):
287 4f3d5b76 Michael Hanselmann
    # Group by values
288 4f3d5b76 Michael Hanselmann
    # "values" -> [optname1, optname2, ...]
289 4f3d5b76 Michael Hanselmann
    values = {}
290 4f3d5b76 Michael Hanselmann
291 4f3d5b76 Michael Hanselmann
    for opt in self.opts:
292 4f3d5b76 Michael Hanselmann
      if not opt.takes_value():
293 4f3d5b76 Michael Hanselmann
        continue
294 4f3d5b76 Michael Hanselmann
295 4f3d5b76 Michael Hanselmann
      # Only static choices implemented so far (e.g. no node list)
296 4f3d5b76 Michael Hanselmann
      suggest = getattr(opt, "completion_suggest", None)
297 4f3d5b76 Michael Hanselmann
298 e7b61bb0 Iustin Pop
      # our custom option type
299 e7b61bb0 Iustin Pop
      if opt.type == "bool":
300 e7b61bb0 Iustin Pop
        suggest = ["yes", "no"]
301 e7b61bb0 Iustin Pop
302 4f3d5b76 Michael Hanselmann
      if not suggest:
303 4f3d5b76 Michael Hanselmann
        suggest = opt.choices
304 4f3d5b76 Michael Hanselmann
305 63d44c55 Michael Hanselmann
      if (isinstance(suggest, (int, long)) and
306 63d44c55 Michael Hanselmann
          suggest in cli.OPT_COMPL_ALL):
307 63d44c55 Michael Hanselmann
        key = suggest
308 63d44c55 Michael Hanselmann
      elif suggest:
309 63d44c55 Michael Hanselmann
        key = " ".join(sorted(suggest))
310 4f3d5b76 Michael Hanselmann
      else:
311 63d44c55 Michael Hanselmann
        key = ""
312 4f3d5b76 Michael Hanselmann
313 63d44c55 Michael Hanselmann
      values.setdefault(key, []).extend(opt.all_names)
314 4f3d5b76 Michael Hanselmann
315 4f3d5b76 Michael Hanselmann
    # Don't write any code if there are no option values
316 4f3d5b76 Michael Hanselmann
    if not values:
317 4f3d5b76 Michael Hanselmann
      return
318 4f3d5b76 Michael Hanselmann
319 d4b94fe8 Michael Hanselmann
    cur = "\"$optcur\""
320 d4b94fe8 Michael Hanselmann
321 d4b94fe8 Michael Hanselmann
    wrote_opt = False
322 d4b94fe8 Michael Hanselmann
323 f5ce7613 Iustin Pop
    for (suggest, allnames) in values.items():
324 d4b94fe8 Michael Hanselmann
      longnames = [i for i in allnames if i.startswith("--")]
325 d4b94fe8 Michael Hanselmann
326 d4b94fe8 Michael Hanselmann
      if wrote_opt:
327 d4b94fe8 Michael Hanselmann
        condcmd = "elif"
328 d4b94fe8 Michael Hanselmann
      else:
329 d4b94fe8 Michael Hanselmann
        condcmd = "if"
330 d4b94fe8 Michael Hanselmann
331 3db199ea Michael Hanselmann
      sw.Write("%s _gnt_checkopt %s %s; then", condcmd,
332 d4b94fe8 Michael Hanselmann
               utils.ShellQuote("|".join(["%s=*" % i for i in longnames])),
333 d4b94fe8 Michael Hanselmann
               utils.ShellQuote("|".join(allnames)))
334 d4b94fe8 Michael Hanselmann
      sw.IncIndent()
335 d4b94fe8 Michael Hanselmann
      try:
336 63d44c55 Michael Hanselmann
        if suggest == cli.OPT_COMPL_MANY_NODES:
337 63d44c55 Michael Hanselmann
          # TODO: Implement comma-separated values
338 63d44c55 Michael Hanselmann
          WriteCompReply(sw, "-W ''", cur=cur)
339 63d44c55 Michael Hanselmann
        elif suggest == cli.OPT_COMPL_ONE_NODE:
340 63d44c55 Michael Hanselmann
          WriteCompReply(sw, "-W \"$(_ganeti_nodes)\"", cur=cur)
341 63d44c55 Michael Hanselmann
        elif suggest == cli.OPT_COMPL_ONE_INSTANCE:
342 63d44c55 Michael Hanselmann
          WriteCompReply(sw, "-W \"$(_ganeti_instances)\"", cur=cur)
343 63d44c55 Michael Hanselmann
        elif suggest == cli.OPT_COMPL_ONE_OS:
344 63d44c55 Michael Hanselmann
          WriteCompReply(sw, "-W \"$(_ganeti_os)\"", cur=cur)
345 63d44c55 Michael Hanselmann
        elif suggest == cli.OPT_COMPL_ONE_IALLOCATOR:
346 63d44c55 Michael Hanselmann
          WriteCompReply(sw, "-W \"$(_ganeti_iallocator)\"", cur=cur)
347 36e247e1 Guido Trotter
        elif suggest == cli.OPT_COMPL_ONE_NODEGROUP:
348 36e247e1 Guido Trotter
          WriteCompReply(sw, "-W \"$(_ganeti_nodegroup)\"", cur=cur)
349 2d3ed64b Michael Hanselmann
        elif suggest == cli.OPT_COMPL_INST_ADD_NODES:
350 2d3ed64b Michael Hanselmann
          sw.Write("local tmp= node1= pfx= curvalue=\"${optcur#*:}\"")
351 2d3ed64b Michael Hanselmann
352 2d3ed64b Michael Hanselmann
          sw.Write("if [[ \"$optcur\" == *:* ]]; then")
353 2d3ed64b Michael Hanselmann
          sw.IncIndent()
354 2d3ed64b Michael Hanselmann
          try:
355 2d3ed64b Michael Hanselmann
            sw.Write("node1=\"${optcur%%:*}\"")
356 2d3ed64b Michael Hanselmann
357 2d3ed64b Michael Hanselmann
            sw.Write("if [[ \"$COMP_WORDBREAKS\" != *:* ]]; then")
358 2d3ed64b Michael Hanselmann
            sw.IncIndent()
359 2d3ed64b Michael Hanselmann
            try:
360 2d3ed64b Michael Hanselmann
              sw.Write("pfx=\"$node1:\"")
361 2d3ed64b Michael Hanselmann
            finally:
362 2d3ed64b Michael Hanselmann
              sw.DecIndent()
363 2d3ed64b Michael Hanselmann
            sw.Write("fi")
364 2d3ed64b Michael Hanselmann
          finally:
365 2d3ed64b Michael Hanselmann
            sw.DecIndent()
366 2d3ed64b Michael Hanselmann
          sw.Write("fi")
367 2d3ed64b Michael Hanselmann
368 3db199ea Michael Hanselmann
          sw.Write("_gnt_log pfx=\"'$pfx'\" curvalue=\"'$curvalue'\""
369 2d3ed64b Michael Hanselmann
                   " node1=\"'$node1'\"")
370 2d3ed64b Michael Hanselmann
371 2d3ed64b Michael Hanselmann
          sw.Write("for i in $(_ganeti_nodes); do")
372 2d3ed64b Michael Hanselmann
          sw.IncIndent()
373 2d3ed64b Michael Hanselmann
          try:
374 2d3ed64b Michael Hanselmann
            sw.Write("if [[ -z \"$node1\" ]]; then")
375 2d3ed64b Michael Hanselmann
            sw.IncIndent()
376 2d3ed64b Michael Hanselmann
            try:
377 2d3ed64b Michael Hanselmann
              sw.Write("tmp=\"$tmp $i $i:\"")
378 2d3ed64b Michael Hanselmann
            finally:
379 2d3ed64b Michael Hanselmann
              sw.DecIndent()
380 2d3ed64b Michael Hanselmann
            sw.Write("elif [[ \"$i\" != \"$node1\" ]]; then")
381 2d3ed64b Michael Hanselmann
            sw.IncIndent()
382 2d3ed64b Michael Hanselmann
            try:
383 2d3ed64b Michael Hanselmann
              sw.Write("tmp=\"$tmp $i\"")
384 2d3ed64b Michael Hanselmann
            finally:
385 2d3ed64b Michael Hanselmann
              sw.DecIndent()
386 2d3ed64b Michael Hanselmann
            sw.Write("fi")
387 2d3ed64b Michael Hanselmann
          finally:
388 2d3ed64b Michael Hanselmann
            sw.DecIndent()
389 2d3ed64b Michael Hanselmann
          sw.Write("done")
390 2d3ed64b Michael Hanselmann
391 2d3ed64b Michael Hanselmann
          WriteCompReply(sw, "-P \"$pfx\" -W \"$tmp\"", cur="\"$curvalue\"")
392 63d44c55 Michael Hanselmann
        else:
393 63d44c55 Michael Hanselmann
          WriteCompReply(sw, "-W %s" % utils.ShellQuote(suggest), cur=cur)
394 d4b94fe8 Michael Hanselmann
      finally:
395 d4b94fe8 Michael Hanselmann
        sw.DecIndent()
396 d4b94fe8 Michael Hanselmann
397 d4b94fe8 Michael Hanselmann
      wrote_opt = True
398 d4b94fe8 Michael Hanselmann
399 d4b94fe8 Michael Hanselmann
    if wrote_opt:
400 d4b94fe8 Michael Hanselmann
      sw.Write("fi")
401 d4b94fe8 Michael Hanselmann
402 d4b94fe8 Michael Hanselmann
    return
403 632d5090 Michael Hanselmann
404 4f3d5b76 Michael Hanselmann
  def _CompleteArguments(self, sw):
405 4f3d5b76 Michael Hanselmann
    if not (self.opts or self.args):
406 4f3d5b76 Michael Hanselmann
      return
407 4f3d5b76 Michael Hanselmann
408 4f3d5b76 Michael Hanselmann
    all_option_names = []
409 4f3d5b76 Michael Hanselmann
    for opt in self.opts:
410 4f3d5b76 Michael Hanselmann
      all_option_names.extend(opt.all_names)
411 4f3d5b76 Michael Hanselmann
    all_option_names.sort()
412 4f3d5b76 Michael Hanselmann
413 4f3d5b76 Michael Hanselmann
    # List options if no argument has been specified yet
414 4f3d5b76 Michael Hanselmann
    sw.Write("_ganeti_list_options %s",
415 4f3d5b76 Michael Hanselmann
             utils.ShellQuote(" ".join(all_option_names)))
416 4f3d5b76 Michael Hanselmann
417 4f3d5b76 Michael Hanselmann
    if self.args:
418 4f3d5b76 Michael Hanselmann
      last_idx = len(self.args) - 1
419 4f3d5b76 Michael Hanselmann
      last_arg_end = 0
420 4f3d5b76 Michael Hanselmann
      varlen_arg_idx = None
421 4f3d5b76 Michael Hanselmann
      wrote_arg = False
422 4f3d5b76 Michael Hanselmann
423 4f3d5b76 Michael Hanselmann
      sw.Write("compgenargs=")
424 4f3d5b76 Michael Hanselmann
425 4f3d5b76 Michael Hanselmann
      for idx, arg in enumerate(self.args):
426 4f3d5b76 Michael Hanselmann
        assert arg.min is not None and arg.min >= 0
427 4f3d5b76 Michael Hanselmann
        assert not (idx < last_idx and arg.max is None)
428 4f3d5b76 Michael Hanselmann
429 4f3d5b76 Michael Hanselmann
        if arg.min != arg.max or arg.max is None:
430 4f3d5b76 Michael Hanselmann
          if varlen_arg_idx is not None:
431 4f3d5b76 Michael Hanselmann
            raise Exception("Only one argument can have a variable length")
432 4f3d5b76 Michael Hanselmann
          varlen_arg_idx = idx
433 4f3d5b76 Michael Hanselmann
434 4f3d5b76 Michael Hanselmann
        compgenargs = []
435 4f3d5b76 Michael Hanselmann
436 4f3d5b76 Michael Hanselmann
        if isinstance(arg, cli.ArgUnknown):
437 4f3d5b76 Michael Hanselmann
          choices = ""
438 4f3d5b76 Michael Hanselmann
        elif isinstance(arg, cli.ArgSuggest):
439 4f3d5b76 Michael Hanselmann
          choices = utils.ShellQuote(" ".join(arg.choices))
440 4f3d5b76 Michael Hanselmann
        elif isinstance(arg, cli.ArgInstance):
441 4f3d5b76 Michael Hanselmann
          choices = "$(_ganeti_instances)"
442 4f3d5b76 Michael Hanselmann
        elif isinstance(arg, cli.ArgNode):
443 4f3d5b76 Michael Hanselmann
          choices = "$(_ganeti_nodes)"
444 667dbd6b Adeodato Simo
        elif isinstance(arg, cli.ArgGroup):
445 667dbd6b Adeodato Simo
          choices = "$(_ganeti_nodegroup)"
446 4f3d5b76 Michael Hanselmann
        elif isinstance(arg, cli.ArgJobId):
447 4f3d5b76 Michael Hanselmann
          choices = "$(_ganeti_jobs)"
448 f9faf9c3 René Nussbaumer
        elif isinstance(arg, cli.ArgOs):
449 f9faf9c3 René Nussbaumer
          choices = "$(_ganeti_os)"
450 4f3d5b76 Michael Hanselmann
        elif isinstance(arg, cli.ArgFile):
451 4f3d5b76 Michael Hanselmann
          choices = ""
452 4f3d5b76 Michael Hanselmann
          compgenargs.append("-f")
453 4f3d5b76 Michael Hanselmann
        elif isinstance(arg, cli.ArgCommand):
454 4f3d5b76 Michael Hanselmann
          choices = ""
455 4f3d5b76 Michael Hanselmann
          compgenargs.append("-c")
456 83ec7961 Michael Hanselmann
        elif isinstance(arg, cli.ArgHost):
457 83ec7961 Michael Hanselmann
          choices = ""
458 83ec7961 Michael Hanselmann
          compgenargs.append("-A hostname")
459 4f3d5b76 Michael Hanselmann
        else:
460 4f3d5b76 Michael Hanselmann
          raise Exception("Unknown argument type %r" % arg)
461 4f3d5b76 Michael Hanselmann
462 4f3d5b76 Michael Hanselmann
        if arg.min == 1 and arg.max == 1:
463 4f3d5b76 Michael Hanselmann
          cmpcode = """"$arg_idx" == %d""" % (last_arg_end)
464 8adfb141 Michael Hanselmann
        elif arg.max is None:
465 8adfb141 Michael Hanselmann
          cmpcode = """"$arg_idx" -ge %d""" % (last_arg_end)
466 5431eff1 Michael Hanselmann
        elif arg.min <= arg.max:
467 4f3d5b76 Michael Hanselmann
          cmpcode = (""""$arg_idx" -ge %d && "$arg_idx" -lt %d""" %
468 4f3d5b76 Michael Hanselmann
                     (last_arg_end, last_arg_end + arg.max))
469 4f3d5b76 Michael Hanselmann
        else:
470 4f3d5b76 Michael Hanselmann
          raise Exception("Unable to generate argument position condition")
471 4f3d5b76 Michael Hanselmann
472 4f3d5b76 Michael Hanselmann
        last_arg_end += arg.min
473 4f3d5b76 Michael Hanselmann
474 4f3d5b76 Michael Hanselmann
        if choices or compgenargs:
475 4f3d5b76 Michael Hanselmann
          if wrote_arg:
476 4f3d5b76 Michael Hanselmann
            condcmd = "elif"
477 4f3d5b76 Michael Hanselmann
          else:
478 4f3d5b76 Michael Hanselmann
            condcmd = "if"
479 4f3d5b76 Michael Hanselmann
480 4f3d5b76 Michael Hanselmann
          sw.Write("""%s [[ %s ]]; then""", condcmd, cmpcode)
481 4f3d5b76 Michael Hanselmann
          sw.IncIndent()
482 4f3d5b76 Michael Hanselmann
          try:
483 4f3d5b76 Michael Hanselmann
            if choices:
484 4f3d5b76 Michael Hanselmann
              sw.Write("""choices="$choices "%s""", choices)
485 4f3d5b76 Michael Hanselmann
            if compgenargs:
486 8adfb141 Michael Hanselmann
              sw.Write("compgenargs=%s",
487 8adfb141 Michael Hanselmann
                       utils.ShellQuote(" ".join(compgenargs)))
488 4f3d5b76 Michael Hanselmann
          finally:
489 4f3d5b76 Michael Hanselmann
            sw.DecIndent()
490 4f3d5b76 Michael Hanselmann
491 4f3d5b76 Michael Hanselmann
          wrote_arg = True
492 4f3d5b76 Michael Hanselmann
493 4f3d5b76 Michael Hanselmann
      if wrote_arg:
494 4f3d5b76 Michael Hanselmann
        sw.Write("fi")
495 4f3d5b76 Michael Hanselmann
496 4f3d5b76 Michael Hanselmann
    if self.args:
497 4f3d5b76 Michael Hanselmann
      WriteCompReply(sw, """-W "$choices" $compgenargs""")
498 4f3d5b76 Michael Hanselmann
    else:
499 4f3d5b76 Michael Hanselmann
      # $compgenargs exists only if there are arguments
500 4f3d5b76 Michael Hanselmann
      WriteCompReply(sw, '-W "$choices"')
501 4f3d5b76 Michael Hanselmann
502 4f3d5b76 Michael Hanselmann
  def WriteTo(self, sw):
503 4f3d5b76 Michael Hanselmann
    self._FindFirstArgument(sw)
504 4f3d5b76 Michael Hanselmann
    self._CompleteOptionValues(sw)
505 4f3d5b76 Michael Hanselmann
    self._CompleteArguments(sw)
506 4f3d5b76 Michael Hanselmann
507 4f3d5b76 Michael Hanselmann
508 4f3d5b76 Michael Hanselmann
def WriteCompletion(sw, scriptname, funcname,
509 4f3d5b76 Michael Hanselmann
                    commands=None,
510 4f3d5b76 Michael Hanselmann
                    opts=None, args=None):
511 4f3d5b76 Michael Hanselmann
  """Writes the completion code for one command.
512 4f3d5b76 Michael Hanselmann
513 4f3d5b76 Michael Hanselmann
  @type sw: ShellWriter
514 4f3d5b76 Michael Hanselmann
  @param sw: Script writer
515 4f3d5b76 Michael Hanselmann
  @type scriptname: string
516 4f3d5b76 Michael Hanselmann
  @param scriptname: Name of command line program
517 4f3d5b76 Michael Hanselmann
  @type funcname: string
518 4f3d5b76 Michael Hanselmann
  @param funcname: Shell function name
519 4f3d5b76 Michael Hanselmann
  @type commands: list
520 4f3d5b76 Michael Hanselmann
  @param commands: List of all subcommands in this program
521 4f3d5b76 Michael Hanselmann
522 4f3d5b76 Michael Hanselmann
  """
523 4f3d5b76 Michael Hanselmann
  sw.Write("%s() {", funcname)
524 4f3d5b76 Michael Hanselmann
  sw.IncIndent()
525 4f3d5b76 Michael Hanselmann
  try:
526 580ef58d Michael Hanselmann
    sw.Write("local "
527 632d5090 Michael Hanselmann
             ' cur="${COMP_WORDS[COMP_CWORD]}"'
528 580ef58d Michael Hanselmann
             ' prev="${COMP_WORDS[COMP_CWORD-1]}"'
529 d4b94fe8 Michael Hanselmann
             ' i first_arg_idx choices compgenargs arg_idx optcur')
530 580ef58d Michael Hanselmann
531 3db199ea Michael Hanselmann
    sw.Write("_gnt_log cur=\"$cur\" prev=\"$prev\"")
532 5b0ca9d4 Michael Hanselmann
    sw.Write("[[ -n \"$GANETI_COMPL_LOG\" ]] &&"
533 3db199ea Michael Hanselmann
             " _gnt_log \"$(set | grep ^COMP_)\"")
534 4f3d5b76 Michael Hanselmann
535 4f3d5b76 Michael Hanselmann
    sw.Write("COMPREPLY=()")
536 4f3d5b76 Michael Hanselmann
537 4f3d5b76 Michael Hanselmann
    if opts is not None and args is not None:
538 4f3d5b76 Michael Hanselmann
      assert not commands
539 4f3d5b76 Michael Hanselmann
      CompletionWriter(0, opts, args).WriteTo(sw)
540 4f3d5b76 Michael Hanselmann
541 4f3d5b76 Michael Hanselmann
    else:
542 4f3d5b76 Michael Hanselmann
      sw.Write("""if [[ "$COMP_CWORD" == 1 ]]; then""")
543 4f3d5b76 Michael Hanselmann
      sw.IncIndent()
544 4f3d5b76 Michael Hanselmann
      try:
545 4f3d5b76 Michael Hanselmann
        # Complete the command name
546 4f3d5b76 Michael Hanselmann
        WriteCompReply(sw,
547 4f3d5b76 Michael Hanselmann
                       ("-W %s" %
548 4f3d5b76 Michael Hanselmann
                        utils.ShellQuote(" ".join(sorted(commands.keys())))))
549 4f3d5b76 Michael Hanselmann
      finally:
550 4f3d5b76 Michael Hanselmann
        sw.DecIndent()
551 4f3d5b76 Michael Hanselmann
      sw.Write("fi")
552 4f3d5b76 Michael Hanselmann
553 b33cad4a Michael Hanselmann
      # Group commands by arguments and options
554 b33cad4a Michael Hanselmann
      grouped_cmds = {}
555 f5ce7613 Iustin Pop
      for cmd, (_, argdef, optdef, _, _) in commands.items():
556 4f3d5b76 Michael Hanselmann
        if not (argdef or optdef):
557 4f3d5b76 Michael Hanselmann
          continue
558 b33cad4a Michael Hanselmann
        grouped_cmds.setdefault((tuple(argdef), tuple(optdef)), set()).add(cmd)
559 4f3d5b76 Michael Hanselmann
560 b33cad4a Michael Hanselmann
      # We're doing options and arguments to commands
561 b33cad4a Michael Hanselmann
      sw.Write("""case "${COMP_WORDS[1]}" in""")
562 f5ce7613 Iustin Pop
      sort_grouped = sorted(grouped_cmds.items(),
563 f5ce7613 Iustin Pop
                            key=lambda (_, y): sorted(y)[0])
564 f5ce7613 Iustin Pop
      for ((argdef, optdef), cmds) in sort_grouped:
565 b33cad4a Michael Hanselmann
        assert argdef or optdef
566 b33cad4a Michael Hanselmann
        sw.Write("%s)", "|".join(map(utils.ShellQuote, sorted(cmds))))
567 4f3d5b76 Michael Hanselmann
        sw.IncIndent()
568 4f3d5b76 Michael Hanselmann
        try:
569 4f3d5b76 Michael Hanselmann
          CompletionWriter(1, optdef, argdef).WriteTo(sw)
570 4f3d5b76 Michael Hanselmann
        finally:
571 4f3d5b76 Michael Hanselmann
          sw.DecIndent()
572 4f3d5b76 Michael Hanselmann
        sw.Write(";;")
573 4f3d5b76 Michael Hanselmann
      sw.Write("esac")
574 4f3d5b76 Michael Hanselmann
  finally:
575 4f3d5b76 Michael Hanselmann
    sw.DecIndent()
576 4f3d5b76 Michael Hanselmann
  sw.Write("}")
577 4f3d5b76 Michael Hanselmann
578 4f3d5b76 Michael Hanselmann
  sw.Write("complete -F %s -o filenames %s",
579 4f3d5b76 Michael Hanselmann
           utils.ShellQuote(funcname),
580 4f3d5b76 Michael Hanselmann
           utils.ShellQuote(scriptname))
581 4f3d5b76 Michael Hanselmann
582 4f3d5b76 Michael Hanselmann
583 4f3d5b76 Michael Hanselmann
def GetFunctionName(name):
584 4f3d5b76 Michael Hanselmann
  return "_" + re.sub(r"[^a-z0-9]+", "_", name.lower())
585 4f3d5b76 Michael Hanselmann
586 4f3d5b76 Michael Hanselmann
587 4f3d5b76 Michael Hanselmann
def GetCommands(filename, module):
588 4f3d5b76 Michael Hanselmann
  """Returns the commands defined in a module.
589 4f3d5b76 Michael Hanselmann
590 4f3d5b76 Michael Hanselmann
  Aliases are also added as commands.
591 4f3d5b76 Michael Hanselmann
592 4f3d5b76 Michael Hanselmann
  """
593 4f3d5b76 Michael Hanselmann
  try:
594 4f3d5b76 Michael Hanselmann
    commands = getattr(module, "commands")
595 f59418db Michael Hanselmann
  except AttributeError:
596 4f3d5b76 Michael Hanselmann
    raise Exception("Script %s doesn't have 'commands' attribute" %
597 4f3d5b76 Michael Hanselmann
                    filename)
598 4f3d5b76 Michael Hanselmann
599 1f4e391b Michael Hanselmann
  # Add the implicit "--help" option
600 1f4e391b Michael Hanselmann
  help_option = cli.cli_option("-h", "--help", default=False,
601 1f4e391b Michael Hanselmann
                               action="store_true")
602 1f4e391b Michael Hanselmann
603 5786c087 Michael Hanselmann
  for name, (_, _, optdef, _, _) in commands.items():
604 1f4e391b Michael Hanselmann
    if help_option not in optdef:
605 1f4e391b Michael Hanselmann
      optdef.append(help_option)
606 5786c087 Michael Hanselmann
    for opt in cli.COMMON_OPTS:
607 5786c087 Michael Hanselmann
      if opt in optdef:
608 5786c087 Michael Hanselmann
        raise Exception("Common option '%s' listed for command '%s' in %s" %
609 5786c087 Michael Hanselmann
                        (opt, name, filename))
610 5786c087 Michael Hanselmann
      optdef.append(opt)
611 1f4e391b Michael Hanselmann
612 4f3d5b76 Michael Hanselmann
  # Use aliases
613 4f3d5b76 Michael Hanselmann
  aliases = getattr(module, "aliases", {})
614 4f3d5b76 Michael Hanselmann
  if aliases:
615 4f3d5b76 Michael Hanselmann
    commands = commands.copy()
616 f5ce7613 Iustin Pop
    for name, target in aliases.items():
617 4f3d5b76 Michael Hanselmann
      commands[name] = commands[target]
618 4f3d5b76 Michael Hanselmann
619 4f3d5b76 Michael Hanselmann
  return commands
620 4f3d5b76 Michael Hanselmann
621 4f3d5b76 Michael Hanselmann
622 4f3d5b76 Michael Hanselmann
def main():
623 4f3d5b76 Michael Hanselmann
  buf = StringIO()
624 858905fb Michael Hanselmann
  sw = utils.ShellWriter(buf)
625 4f3d5b76 Michael Hanselmann
626 4f3d5b76 Michael Hanselmann
  WritePreamble(sw)
627 4f3d5b76 Michael Hanselmann
628 4f3d5b76 Michael Hanselmann
  # gnt-* scripts
629 4f3d5b76 Michael Hanselmann
  for scriptname in _autoconf.GNT_SCRIPTS:
630 4f3d5b76 Michael Hanselmann
    filename = "scripts/%s" % scriptname
631 4f3d5b76 Michael Hanselmann
632 4f3d5b76 Michael Hanselmann
    WriteCompletion(sw, scriptname,
633 4f3d5b76 Michael Hanselmann
                    GetFunctionName(scriptname),
634 d6f5892b Michael Hanselmann
                    commands=GetCommands(filename,
635 e948770c Michael Hanselmann
                                         build.LoadModule(filename)))
636 4f3d5b76 Michael Hanselmann
637 4f3d5b76 Michael Hanselmann
  # Burnin script
638 e948770c Michael Hanselmann
  burnin = build.LoadModule("tools/burnin")
639 13718ded Michael Hanselmann
  WriteCompletion(sw, "%s/burnin" % pathutils.TOOLSDIR, "_ganeti_burnin",
640 4f3d5b76 Michael Hanselmann
                  opts=burnin.OPTIONS, args=burnin.ARGUMENTS)
641 4f3d5b76 Michael Hanselmann
642 4f3d5b76 Michael Hanselmann
  print buf.getvalue()
643 4f3d5b76 Michael Hanselmann
644 4f3d5b76 Michael Hanselmann
645 4f3d5b76 Michael Hanselmann
if __name__ == "__main__":
646 4f3d5b76 Michael Hanselmann
  main()