root / kamaki / cli / command_shell.py @ 60c42f9f
History | View | Annotate | Download (12.1 kB)
1 | e3f01d64 | Stavros Sachtouris | # Copyright 2012-2013 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | b9331a9f | Stavros Sachtouris | #
|
3 | b9331a9f | Stavros Sachtouris | # Redistribution and use in source and binary forms, with or
|
4 | b9331a9f | Stavros Sachtouris | # without modification, are permitted provided that the following
|
5 | b9331a9f | Stavros Sachtouris | # conditions are met:
|
6 | b9331a9f | Stavros Sachtouris | #
|
7 | b9331a9f | Stavros Sachtouris | # 1. Redistributions of source code must retain the above
|
8 | fd5db045 | Stavros Sachtouris | # copyright notice, this list of conditions and the following
|
9 | fd5db045 | Stavros Sachtouris | # disclaimer.
|
10 | b9331a9f | Stavros Sachtouris | #
|
11 | b9331a9f | Stavros Sachtouris | # 2. Redistributions in binary form must reproduce the above
|
12 | fd5db045 | Stavros Sachtouris | # copyright notice, this list of conditions and the following
|
13 | fd5db045 | Stavros Sachtouris | # disclaimer in the documentation and/or other materials
|
14 | fd5db045 | Stavros Sachtouris | # provided with the distribution.
|
15 | b9331a9f | Stavros Sachtouris | #
|
16 | b9331a9f | Stavros Sachtouris | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | b9331a9f | Stavros Sachtouris | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | b9331a9f | Stavros Sachtouris | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | b9331a9f | Stavros Sachtouris | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | b9331a9f | Stavros Sachtouris | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | b9331a9f | Stavros Sachtouris | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | b9331a9f | Stavros Sachtouris | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | b9331a9f | Stavros Sachtouris | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | b9331a9f | Stavros Sachtouris | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | b9331a9f | Stavros Sachtouris | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | b9331a9f | Stavros Sachtouris | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | b9331a9f | Stavros Sachtouris | # POSSIBILITY OF SUCH DAMAGE.
|
28 | b9331a9f | Stavros Sachtouris | #
|
29 | b9331a9f | Stavros Sachtouris | # The views and conclusions contained in the software and
|
30 | b9331a9f | Stavros Sachtouris | # documentation are those of the authors and should not be
|
31 | b9331a9f | Stavros Sachtouris | # interpreted as representing official policies, either expressed
|
32 | b9331a9f | Stavros Sachtouris | # or implied, of GRNET S.A.
|
33 | b9331a9f | Stavros Sachtouris | |
34 | b9331a9f | Stavros Sachtouris | from cmd import Cmd |
35 | b9331a9f | Stavros Sachtouris | from os import popen |
36 | ce48608f | Stavros Sachtouris | from sys import stdout |
37 | d486baec | Stavros Sachtouris | |
38 | b6a99832 | Stavros Sachtouris | from kamaki.cli import exec_cmd, print_error_message, print_subcommands_help |
39 | 074f5027 | Stavros Sachtouris | from kamaki.cli.argument import ArgumentParseManager |
40 | b6a99832 | Stavros Sachtouris | from kamaki.cli.utils import print_dict, split_input |
41 | d486baec | Stavros Sachtouris | from kamaki.cli.history import History |
42 | db950b10 | Stavros Sachtouris | from kamaki.cli.errors import CLIError |
43 | fce93ff6 | Stavros Sachtouris | from kamaki.clients import ClientError |
44 | e3c2c890 | Stavros Sachtouris | from kamaki.cli.logger import add_file_logger |
45 | e3c2c890 | Stavros Sachtouris | |
46 | e3c2c890 | Stavros Sachtouris | log = add_file_logger(__name__) |
47 | b9331a9f | Stavros Sachtouris | |
48 | fd5db045 | Stavros Sachtouris | |
49 | 074f5027 | Stavros Sachtouris | def _init_shell(exe_string, parser): |
50 | 074f5027 | Stavros Sachtouris | parser.arguments.pop('version', None) |
51 | 75c3fc42 | Stavros Sachtouris | shell = Shell() |
52 | 75c3fc42 | Stavros Sachtouris | shell.set_prompt(exe_string) |
53 | 75c3fc42 | Stavros Sachtouris | from kamaki import __version__ as version |
54 | 75c3fc42 | Stavros Sachtouris | shell.greet(version) |
55 | 75c3fc42 | Stavros Sachtouris | shell.do_EOF = shell.do_exit |
56 | 75c3fc42 | Stavros Sachtouris | from kamaki.cli.command_tree import CommandTree |
57 | 75c3fc42 | Stavros Sachtouris | shell.cmd_tree = CommandTree( |
58 | 75c3fc42 | Stavros Sachtouris | 'kamaki', 'A command line tool for poking clouds') |
59 | 75c3fc42 | Stavros Sachtouris | return shell
|
60 | fd5db045 | Stavros Sachtouris | |
61 | b9331a9f | Stavros Sachtouris | |
62 | b9331a9f | Stavros Sachtouris | class Shell(Cmd): |
63 | fd5db045 | Stavros Sachtouris | """Kamaki interactive shell"""
|
64 | fd5db045 | Stavros Sachtouris | _prefix = '['
|
65 | 53254b46 | Stavros Sachtouris | _suffix = ']: '
|
66 | fd5db045 | Stavros Sachtouris | cmd_tree = None
|
67 | fd5db045 | Stavros Sachtouris | _history = None
|
68 | 834200da | Stavros Sachtouris | _context_stack = [] |
69 | 834200da | Stavros Sachtouris | _prompt_stack = [] |
70 | 074f5027 | Stavros Sachtouris | _parser = None
|
71 | f724cd35 | Stavros Sachtouris | auth_base = None
|
72 | 99085b30 | Stavros Sachtouris | cloud = None
|
73 | 834200da | Stavros Sachtouris | |
74 | fd5db045 | Stavros Sachtouris | undoc_header = 'interactive shell commands:'
|
75 | fd5db045 | Stavros Sachtouris | |
76 | 77e7bef7 | Stavros Sachtouris | def postcmd(self, post, line): |
77 | 77e7bef7 | Stavros Sachtouris | if self._context_stack: |
78 | 77e7bef7 | Stavros Sachtouris | self._roll_command()
|
79 | 77e7bef7 | Stavros Sachtouris | self._restore(self._context_stack.pop()) |
80 | 53254b46 | Stavros Sachtouris | self.set_prompt(
|
81 | 53254b46 | Stavros Sachtouris | self._prompt_stack.pop()[len(self._prefix):-len(self._suffix)]) |
82 | 77e7bef7 | Stavros Sachtouris | |
83 | 77e7bef7 | Stavros Sachtouris | return Cmd.postcmd(self, post, line) |
84 | 77e7bef7 | Stavros Sachtouris | |
85 | 42c739c0 | Stavros Sachtouris | def precmd(self, line): |
86 | 834200da | Stavros Sachtouris | if line.startswith('/'): |
87 | de73876b | Stavros Sachtouris | start, end = len(self._prefix), -len(self._suffix) |
88 | de73876b | Stavros Sachtouris | cur_cmd_path = self.prompt.replace(' ', '_')[start:end] |
89 | 524dc2f8 | Stavros Sachtouris | if cur_cmd_path != self.cmd_tree.name: |
90 | 834200da | Stavros Sachtouris | cur_cmd = self.cmd_tree.get_command(cur_cmd_path)
|
91 | 834200da | Stavros Sachtouris | self._context_stack.append(self._backup()) |
92 | 834200da | Stavros Sachtouris | self._prompt_stack.append(self.prompt) |
93 | 834200da | Stavros Sachtouris | new_context = self
|
94 | a6ad7781 | Stavros Sachtouris | self._roll_command(cur_cmd.path)
|
95 | 834200da | Stavros Sachtouris | new_context.set_prompt(self.cmd_tree.name)
|
96 | 834200da | Stavros Sachtouris | for grp_cmd in self.cmd_tree.get_subcommands(): |
97 | 834200da | Stavros Sachtouris | self._register_command(grp_cmd.path)
|
98 | 834200da | Stavros Sachtouris | return line[1:] |
99 | 42c739c0 | Stavros Sachtouris | return line
|
100 | 42c739c0 | Stavros Sachtouris | |
101 | fd5db045 | Stavros Sachtouris | def greet(self, version): |
102 | de73876b | Stavros Sachtouris | print('kamaki v%s - Interactive Shell\n' % version)
|
103 | a6aced18 | Stavros Sachtouris | print('\t/exit \tterminate kamaki')
|
104 | de73876b | Stavros Sachtouris | print('\texit or ^D\texit context')
|
105 | de73876b | Stavros Sachtouris | print('\t? or help \tavailable commands')
|
106 | de73876b | Stavros Sachtouris | print('\t?command \thelp on command')
|
107 | de73876b | Stavros Sachtouris | print('\t!<command>\texecute OS shell command')
|
108 | de73876b | Stavros Sachtouris | print('')
|
109 | fd5db045 | Stavros Sachtouris | |
110 | fd5db045 | Stavros Sachtouris | def set_prompt(self, new_prompt): |
111 | 53254b46 | Stavros Sachtouris | self.prompt = '%s%s%s' % (self._prefix, new_prompt, self._suffix) |
112 | fd5db045 | Stavros Sachtouris | |
113 | af569ab9 | Stavros Sachtouris | def cmdloop(self): |
114 | af569ab9 | Stavros Sachtouris | while True: |
115 | af569ab9 | Stavros Sachtouris | try:
|
116 | af569ab9 | Stavros Sachtouris | Cmd.cmdloop(self)
|
117 | af569ab9 | Stavros Sachtouris | except KeyboardInterrupt: |
118 | af569ab9 | Stavros Sachtouris | print(' - interrupted')
|
119 | af569ab9 | Stavros Sachtouris | continue
|
120 | af569ab9 | Stavros Sachtouris | break
|
121 | af569ab9 | Stavros Sachtouris | |
122 | fd5db045 | Stavros Sachtouris | def do_exit(self, line): |
123 | fd5db045 | Stavros Sachtouris | print('')
|
124 | de73876b | Stavros Sachtouris | start, end = len(self._prefix), -len(self._suffix) |
125 | de73876b | Stavros Sachtouris | if self.prompt[start:end] == self.cmd_tree.name: |
126 | a6ad7781 | Stavros Sachtouris | exit(0) |
127 | fd5db045 | Stavros Sachtouris | return True |
128 | fd5db045 | Stavros Sachtouris | |
129 | fd5db045 | Stavros Sachtouris | def do_shell(self, line): |
130 | fd5db045 | Stavros Sachtouris | output = popen(line).read() |
131 | fd5db045 | Stavros Sachtouris | print(output) |
132 | fd5db045 | Stavros Sachtouris | |
133 | fd5db045 | Stavros Sachtouris | @property
|
134 | fd5db045 | Stavros Sachtouris | def path(self): |
135 | fd5db045 | Stavros Sachtouris | if self._cmd: |
136 | 3dabe5d2 | Stavros Sachtouris | return self._cmd.path |
137 | fd5db045 | Stavros Sachtouris | return '' |
138 | fd5db045 | Stavros Sachtouris | |
139 | fd5db045 | Stavros Sachtouris | @classmethod
|
140 | fd5db045 | Stavros Sachtouris | def _register_method(self, method, name): |
141 | fd5db045 | Stavros Sachtouris | self.__dict__[name] = method
|
142 | fd5db045 | Stavros Sachtouris | |
143 | fd5db045 | Stavros Sachtouris | @classmethod
|
144 | fd5db045 | Stavros Sachtouris | def _unregister_method(self, name): |
145 | fd5db045 | Stavros Sachtouris | try:
|
146 | fd5db045 | Stavros Sachtouris | self.__dict__.pop(name)
|
147 | fd5db045 | Stavros Sachtouris | except KeyError: |
148 | fd5db045 | Stavros Sachtouris | pass
|
149 | fd5db045 | Stavros Sachtouris | |
150 | 77e7bef7 | Stavros Sachtouris | def _roll_command(self, cmd_path=None): |
151 | fd5db045 | Stavros Sachtouris | for subname in self.cmd_tree.get_subnames(cmd_path): |
152 | fd5db045 | Stavros Sachtouris | self._unregister_method('do_%s' % subname) |
153 | fd5db045 | Stavros Sachtouris | self._unregister_method('complete_%s' % subname) |
154 | fd5db045 | Stavros Sachtouris | self._unregister_method('help_%s' % subname) |
155 | fd5db045 | Stavros Sachtouris | |
156 | fd5db045 | Stavros Sachtouris | @classmethod
|
157 | fd5db045 | Stavros Sachtouris | def _backup(self): |
158 | fd5db045 | Stavros Sachtouris | return dict(self.__dict__) |
159 | fd5db045 | Stavros Sachtouris | |
160 | fd5db045 | Stavros Sachtouris | @classmethod
|
161 | fd5db045 | Stavros Sachtouris | def _restore(self, oldcontext): |
162 | fd5db045 | Stavros Sachtouris | self.__dict__ = oldcontext
|
163 | fd5db045 | Stavros Sachtouris | |
164 | e3c2c890 | Stavros Sachtouris | @staticmethod
|
165 | 030c0d3a | Stavros Sachtouris | def _create_help_method(cmd_name, args, descr, syntax): |
166 | e3c2c890 | Stavros Sachtouris | tmp_args = dict(args)
|
167 | e3c2c890 | Stavros Sachtouris | tmp_args.pop('options', None) |
168 | 8cec3671 | Stavros Sachtouris | tmp_args.pop('cloud', None) |
169 | e3c2c890 | Stavros Sachtouris | tmp_args.pop('debug', None) |
170 | e3c2c890 | Stavros Sachtouris | tmp_args.pop('verbose', None) |
171 | e3c2c890 | Stavros Sachtouris | tmp_args.pop('include', None) |
172 | e3c2c890 | Stavros Sachtouris | tmp_args.pop('silent', None) |
173 | e3c2c890 | Stavros Sachtouris | tmp_args.pop('config', None) |
174 | e3c2c890 | Stavros Sachtouris | help_parser = ArgumentParseManager(cmd_name, tmp_args) |
175 | e3c2c890 | Stavros Sachtouris | help_parser.parser.description = descr |
176 | 030c0d3a | Stavros Sachtouris | help_parser.syntax = syntax |
177 | e3c2c890 | Stavros Sachtouris | return help_parser.parser.print_help
|
178 | e3c2c890 | Stavros Sachtouris | |
179 | d53062bd | Stavros Sachtouris | def _register_command(self, cmd_path): |
180 | fd5db045 | Stavros Sachtouris | cmd = self.cmd_tree.get_command(cmd_path)
|
181 | 074f5027 | Stavros Sachtouris | arguments = self._parser.arguments
|
182 | fd5db045 | Stavros Sachtouris | |
183 | 834200da | Stavros Sachtouris | def do_method(new_context, line): |
184 | fd5db045 | Stavros Sachtouris | """ Template for all cmd.Cmd methods of the form do_<cmd name>
|
185 | fd5db045 | Stavros Sachtouris | Parse cmd + args and decide to execute or change context
|
186 | fd5db045 | Stavros Sachtouris | <cmd> <term> <term> <args> is always parsed to most specific
|
187 | fd5db045 | Stavros Sachtouris | even if cmd_term_term is not a terminal path
|
188 | fd5db045 | Stavros Sachtouris | """
|
189 | efbcdc41 | Stavros Sachtouris | subcmd, cmd_args = cmd.parse_out(split_input(line)) |
190 | 074f5027 | Stavros Sachtouris | self._history.add(' '.join([cmd.path.replace('_', ' '), line])) |
191 | e3c2c890 | Stavros Sachtouris | cmd_parser = ArgumentParseManager( |
192 | e3c2c890 | Stavros Sachtouris | cmd.name, dict(self._parser.arguments)) |
193 | 074f5027 | Stavros Sachtouris | cmd_parser.parser.description = subcmd.help |
194 | fd5db045 | Stavros Sachtouris | |
195 | fd5db045 | Stavros Sachtouris | # exec command or change context
|
196 | fd5db045 | Stavros Sachtouris | if subcmd.is_command: # exec command |
197 | db950b10 | Stavros Sachtouris | try:
|
198 | c8e17a67 | Stavros Sachtouris | cls = subcmd.get_class() |
199 | c8e17a67 | Stavros Sachtouris | ldescr = getattr(cls, 'long_description', '') |
200 | c8e17a67 | Stavros Sachtouris | if subcmd.path == 'history_run': |
201 | 53e1f8d5 | Stavros Sachtouris | instance = cls( |
202 | 0ec19fd3 | Stavros Sachtouris | dict(cmd_parser.arguments), self.auth_base, |
203 | f724cd35 | Stavros Sachtouris | cmd_tree=self.cmd_tree)
|
204 | c8e17a67 | Stavros Sachtouris | else:
|
205 | f724cd35 | Stavros Sachtouris | instance = cls( |
206 | 99085b30 | Stavros Sachtouris | dict(cmd_parser.arguments),
|
207 | 0ec19fd3 | Stavros Sachtouris | self.auth_base, self.cloud) |
208 | c8e17a67 | Stavros Sachtouris | cmd_parser.update_arguments(instance.arguments) |
209 | c8e17a67 | Stavros Sachtouris | cmd_parser.arguments = instance.arguments |
210 | c8e17a67 | Stavros Sachtouris | cmd_parser.syntax = '%s %s' % (
|
211 | c8e17a67 | Stavros Sachtouris | subcmd.path.replace('_', ' '), cls.syntax) |
212 | e3c2c890 | Stavros Sachtouris | help_method = self._create_help_method(
|
213 | 030c0d3a | Stavros Sachtouris | cmd.name, cmd_parser.arguments, |
214 | 030c0d3a | Stavros Sachtouris | subcmd.help, cmd_parser.syntax) |
215 | c8e17a67 | Stavros Sachtouris | if '-h' in cmd_args or '--help' in cmd_args: |
216 | e3c2c890 | Stavros Sachtouris | help_method() |
217 | c8e17a67 | Stavros Sachtouris | if ldescr.strip():
|
218 | c8e17a67 | Stavros Sachtouris | print('\nDetails:')
|
219 | c8e17a67 | Stavros Sachtouris | print('%s' % ldescr)
|
220 | c8e17a67 | Stavros Sachtouris | return
|
221 | c8e17a67 | Stavros Sachtouris | cmd_parser.parse(cmd_args) |
222 | c8e17a67 | Stavros Sachtouris | |
223 | c8e17a67 | Stavros Sachtouris | for name, arg in instance.arguments.items(): |
224 | de73876b | Stavros Sachtouris | arg.value = getattr(
|
225 | 0ec19fd3 | Stavros Sachtouris | cmd_parser.parsed, name, arg.default) |
226 | c8e17a67 | Stavros Sachtouris | |
227 | e3c2c890 | Stavros Sachtouris | exec_cmd(instance, cmd_parser.unparsed, help_method) |
228 | 53e1f8d5 | Stavros Sachtouris | #[term for term in cmd_parser.unparsed\
|
229 | 53e1f8d5 | Stavros Sachtouris | # if not term.startswith('-')],
|
230 | fce93ff6 | Stavros Sachtouris | except (ClientError, CLIError) as err: |
231 | b6a99832 | Stavros Sachtouris | print_error_message(err) |
232 | de73876b | Stavros Sachtouris | elif ('-h' in cmd_args or '--help' in cmd_args) or len(cmd_args): |
233 | de73876b | Stavros Sachtouris | # print options
|
234 | a71bb904 | Stavros Sachtouris | print('%s' % cmd.help)
|
235 | b6a99832 | Stavros Sachtouris | print_subcommands_help(cmd) |
236 | fd5db045 | Stavros Sachtouris | else: # change context |
237 | 834200da | Stavros Sachtouris | #new_context = this
|
238 | fd5db045 | Stavros Sachtouris | backup_context = self._backup()
|
239 | fd5db045 | Stavros Sachtouris | old_prompt = self.prompt
|
240 | fd5db045 | Stavros Sachtouris | new_context._roll_command(cmd.parent_path) |
241 | fd5db045 | Stavros Sachtouris | new_context.set_prompt(subcmd.path.replace('_', ' ')) |
242 | fd5db045 | Stavros Sachtouris | newcmds = [subcmd for subcmd in subcmd.get_subcommands()] |
243 | fd5db045 | Stavros Sachtouris | for subcmd in newcmds: |
244 | d53062bd | Stavros Sachtouris | new_context._register_command(subcmd.path) |
245 | fd5db045 | Stavros Sachtouris | new_context.cmdloop() |
246 | fd5db045 | Stavros Sachtouris | self.prompt = old_prompt
|
247 | fd5db045 | Stavros Sachtouris | #when new context is over, roll back to the old one
|
248 | fd5db045 | Stavros Sachtouris | self._restore(backup_context)
|
249 | fd5db045 | Stavros Sachtouris | self._register_method(do_method, 'do_%s' % cmd.name) |
250 | fd5db045 | Stavros Sachtouris | |
251 | fd5db045 | Stavros Sachtouris | def help_method(self): |
252 | fd5db045 | Stavros Sachtouris | print('%s (%s -h for more options)' % (cmd.help, cmd.name))
|
253 | 54d800e8 | Stavros Sachtouris | if cmd.is_command:
|
254 | 54d800e8 | Stavros Sachtouris | cls = cmd.get_class() |
255 | 2fbca093 | Stavros Sachtouris | ldescr = getattr(cls, 'long_description', '') |
256 | 54d800e8 | Stavros Sachtouris | #_construct_command_syntax(cls)
|
257 | 54d800e8 | Stavros Sachtouris | plist = self.prompt[len(self._prefix):-len(self._suffix)] |
258 | 54d800e8 | Stavros Sachtouris | plist = plist.split(' ')
|
259 | 54d800e8 | Stavros Sachtouris | clist = cmd.path.split('_')
|
260 | 54d800e8 | Stavros Sachtouris | upto = 0
|
261 | 2fbca093 | Stavros Sachtouris | if ldescr:
|
262 | 2fbca093 | Stavros Sachtouris | print('%s' % ldescr)
|
263 | 54d800e8 | Stavros Sachtouris | for i, term in enumerate(plist): |
264 | 54d800e8 | Stavros Sachtouris | try:
|
265 | 54d800e8 | Stavros Sachtouris | if clist[i] == term:
|
266 | 54d800e8 | Stavros Sachtouris | upto += 1
|
267 | 54d800e8 | Stavros Sachtouris | except IndexError: |
268 | 54d800e8 | Stavros Sachtouris | break
|
269 | 54d800e8 | Stavros Sachtouris | print('Syntax: %s %s' % (' '.join(clist[upto:]), cls.syntax)) |
270 | 8741c407 | Stavros Sachtouris | if cmd.subcommands:
|
271 | b6a99832 | Stavros Sachtouris | print_subcommands_help(cmd) |
272 | 54d800e8 | Stavros Sachtouris | |
273 | fd5db045 | Stavros Sachtouris | self._register_method(help_method, 'help_%s' % cmd.name) |
274 | fd5db045 | Stavros Sachtouris | |
275 | fd5db045 | Stavros Sachtouris | def complete_method(self, text, line, begidx, endidx): |
276 | efbcdc41 | Stavros Sachtouris | subcmd, cmd_args = cmd.parse_out(split_input(line)[1:])
|
277 | fd5db045 | Stavros Sachtouris | if subcmd.is_command:
|
278 | fd5db045 | Stavros Sachtouris | cls = subcmd.get_class() |
279 | 834200da | Stavros Sachtouris | instance = cls(dict(arguments))
|
280 | fd5db045 | Stavros Sachtouris | empty, sep, subname = subcmd.path.partition(cmd.path) |
281 | fd5db045 | Stavros Sachtouris | cmd_name = '%s %s' % (cmd.name, subname.replace('_', ' ')) |
282 | de73876b | Stavros Sachtouris | print('\n%s\nSyntax:\t%s %s' % (
|
283 | 0ec19fd3 | Stavros Sachtouris | cls.description, cmd_name, cls.syntax)) |
284 | fd5db045 | Stavros Sachtouris | cmd_args = {} |
285 | fd5db045 | Stavros Sachtouris | for arg in instance.arguments.values(): |
286 | fd5db045 | Stavros Sachtouris | cmd_args[','.join(arg.parsed_name)] = arg.help
|
287 | f55d3a15 | Stavros Sachtouris | print_dict(cmd_args, indent=2)
|
288 | fd5db045 | Stavros Sachtouris | stdout.write('%s %s' % (self.prompt, line)) |
289 | fd5db045 | Stavros Sachtouris | return subcmd.get_subnames()
|
290 | fd5db045 | Stavros Sachtouris | self._register_method(complete_method, 'complete_%s' % cmd.name) |
291 | fd5db045 | Stavros Sachtouris | |
292 | fd5db045 | Stavros Sachtouris | @property
|
293 | fd5db045 | Stavros Sachtouris | def doc_header(self): |
294 | fd5db045 | Stavros Sachtouris | tmp_partition = self.prompt.partition(self._prefix) |
295 | fd5db045 | Stavros Sachtouris | tmp_partition = tmp_partition[2].partition(self._suffix) |
296 | fd5db045 | Stavros Sachtouris | hdr = tmp_partition[0].strip()
|
297 | fd5db045 | Stavros Sachtouris | return '%s commands:' % hdr |
298 | fd5db045 | Stavros Sachtouris | |
299 | 844a6bdb | Stavros Sachtouris | def run(self, auth_base, cloud, parser, path=''): |
300 | f724cd35 | Stavros Sachtouris | self.auth_base = auth_base
|
301 | 844a6bdb | Stavros Sachtouris | self.cloud = cloud
|
302 | 074f5027 | Stavros Sachtouris | self._parser = parser
|
303 | 074f5027 | Stavros Sachtouris | self._history = History(
|
304 | 362adf50 | Stavros Sachtouris | parser.arguments['config'].get_global('history_file')) |
305 | db950b10 | Stavros Sachtouris | if path:
|
306 | fd5db045 | Stavros Sachtouris | cmd = self.cmd_tree.get_command(path)
|
307 | fd5db045 | Stavros Sachtouris | intro = cmd.path.replace('_', ' ') |
308 | fd5db045 | Stavros Sachtouris | else:
|
309 | fd5db045 | Stavros Sachtouris | intro = self.cmd_tree.name
|
310 | fd5db045 | Stavros Sachtouris | |
311 | fd5db045 | Stavros Sachtouris | for subcmd in self.cmd_tree.get_subcommands(path): |
312 | d53062bd | Stavros Sachtouris | self._register_command(subcmd.path)
|
313 | fd5db045 | Stavros Sachtouris | |
314 | fd5db045 | Stavros Sachtouris | self.set_prompt(intro)
|
315 | db950b10 | Stavros Sachtouris | |
316 | f9af2848 | Stavros Sachtouris | try:
|
317 | f9af2848 | Stavros Sachtouris | self.cmdloop()
|
318 | af569ab9 | Stavros Sachtouris | except Exception as e: |
319 | af569ab9 | Stavros Sachtouris | print('(%s)' % e)
|
320 | f9af2848 | Stavros Sachtouris | from traceback import print_stack |
321 | f9af2848 | Stavros Sachtouris | print_stack() |