root / kamaki / cli / command_shell.py @ 1e1d6f27
History | View | Annotate | Download (12.4 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 | 6a2a28bd | Stavros Sachtouris | def _init_shell(exe_string, parser, username='', userid=''): |
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 | 6a2a28bd | Stavros Sachtouris | shell.greet(version, username, userid) |
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 | 6a2a28bd | Stavros Sachtouris | def greet(self, version, username='', userid=''): |
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 | 6a2a28bd | Stavros Sachtouris | if username or userid: |
110 | 6a2a28bd | Stavros Sachtouris | print('Session user is %s (uuid: %s)' % (username, userid))
|
111 | fd5db045 | Stavros Sachtouris | |
112 | fd5db045 | Stavros Sachtouris | def set_prompt(self, new_prompt): |
113 | 53254b46 | Stavros Sachtouris | self.prompt = '%s%s%s' % (self._prefix, new_prompt, self._suffix) |
114 | fd5db045 | Stavros Sachtouris | |
115 | af569ab9 | Stavros Sachtouris | def cmdloop(self): |
116 | af569ab9 | Stavros Sachtouris | while True: |
117 | af569ab9 | Stavros Sachtouris | try:
|
118 | af569ab9 | Stavros Sachtouris | Cmd.cmdloop(self)
|
119 | af569ab9 | Stavros Sachtouris | except KeyboardInterrupt: |
120 | af569ab9 | Stavros Sachtouris | print(' - interrupted')
|
121 | af569ab9 | Stavros Sachtouris | continue
|
122 | af569ab9 | Stavros Sachtouris | break
|
123 | af569ab9 | Stavros Sachtouris | |
124 | fd5db045 | Stavros Sachtouris | def do_exit(self, line): |
125 | fd5db045 | Stavros Sachtouris | print('')
|
126 | de73876b | Stavros Sachtouris | start, end = len(self._prefix), -len(self._suffix) |
127 | de73876b | Stavros Sachtouris | if self.prompt[start:end] == self.cmd_tree.name: |
128 | a6ad7781 | Stavros Sachtouris | exit(0) |
129 | fd5db045 | Stavros Sachtouris | return True |
130 | fd5db045 | Stavros Sachtouris | |
131 | fd5db045 | Stavros Sachtouris | def do_shell(self, line): |
132 | fd5db045 | Stavros Sachtouris | output = popen(line).read() |
133 | fd5db045 | Stavros Sachtouris | print(output) |
134 | fd5db045 | Stavros Sachtouris | |
135 | fd5db045 | Stavros Sachtouris | @property
|
136 | fd5db045 | Stavros Sachtouris | def path(self): |
137 | fd5db045 | Stavros Sachtouris | if self._cmd: |
138 | 3dabe5d2 | Stavros Sachtouris | return self._cmd.path |
139 | fd5db045 | Stavros Sachtouris | return '' |
140 | fd5db045 | Stavros Sachtouris | |
141 | fd5db045 | Stavros Sachtouris | @classmethod
|
142 | fd5db045 | Stavros Sachtouris | def _register_method(self, method, name): |
143 | fd5db045 | Stavros Sachtouris | self.__dict__[name] = method
|
144 | fd5db045 | Stavros Sachtouris | |
145 | fd5db045 | Stavros Sachtouris | @classmethod
|
146 | fd5db045 | Stavros Sachtouris | def _unregister_method(self, name): |
147 | fd5db045 | Stavros Sachtouris | try:
|
148 | fd5db045 | Stavros Sachtouris | self.__dict__.pop(name)
|
149 | fd5db045 | Stavros Sachtouris | except KeyError: |
150 | fd5db045 | Stavros Sachtouris | pass
|
151 | fd5db045 | Stavros Sachtouris | |
152 | 77e7bef7 | Stavros Sachtouris | def _roll_command(self, cmd_path=None): |
153 | d252a7a8 | Stavros Sachtouris | for subname in self.cmd_tree.subnames(cmd_path): |
154 | fd5db045 | Stavros Sachtouris | self._unregister_method('do_%s' % subname) |
155 | fd5db045 | Stavros Sachtouris | self._unregister_method('complete_%s' % subname) |
156 | fd5db045 | Stavros Sachtouris | self._unregister_method('help_%s' % subname) |
157 | fd5db045 | Stavros Sachtouris | |
158 | fd5db045 | Stavros Sachtouris | @classmethod
|
159 | fd5db045 | Stavros Sachtouris | def _backup(self): |
160 | fd5db045 | Stavros Sachtouris | return dict(self.__dict__) |
161 | fd5db045 | Stavros Sachtouris | |
162 | fd5db045 | Stavros Sachtouris | @classmethod
|
163 | fd5db045 | Stavros Sachtouris | def _restore(self, oldcontext): |
164 | fd5db045 | Stavros Sachtouris | self.__dict__ = oldcontext
|
165 | fd5db045 | Stavros Sachtouris | |
166 | e3c2c890 | Stavros Sachtouris | @staticmethod
|
167 | 030c0d3a | Stavros Sachtouris | def _create_help_method(cmd_name, args, descr, syntax): |
168 | e3c2c890 | Stavros Sachtouris | tmp_args = dict(args)
|
169 | e3c2c890 | Stavros Sachtouris | tmp_args.pop('options', None) |
170 | 8cec3671 | Stavros Sachtouris | tmp_args.pop('cloud', None) |
171 | e3c2c890 | Stavros Sachtouris | tmp_args.pop('debug', None) |
172 | e3c2c890 | Stavros Sachtouris | tmp_args.pop('verbose', None) |
173 | e3c2c890 | Stavros Sachtouris | tmp_args.pop('include', None) |
174 | e3c2c890 | Stavros Sachtouris | tmp_args.pop('silent', None) |
175 | e3c2c890 | Stavros Sachtouris | tmp_args.pop('config', None) |
176 | e3c2c890 | Stavros Sachtouris | help_parser = ArgumentParseManager(cmd_name, tmp_args) |
177 | e3c2c890 | Stavros Sachtouris | help_parser.parser.description = descr |
178 | 030c0d3a | Stavros Sachtouris | help_parser.syntax = syntax |
179 | e3c2c890 | Stavros Sachtouris | return help_parser.parser.print_help
|
180 | e3c2c890 | Stavros Sachtouris | |
181 | d53062bd | Stavros Sachtouris | def _register_command(self, cmd_path): |
182 | fd5db045 | Stavros Sachtouris | cmd = self.cmd_tree.get_command(cmd_path)
|
183 | 074f5027 | Stavros Sachtouris | arguments = self._parser.arguments
|
184 | fd5db045 | Stavros Sachtouris | |
185 | 834200da | Stavros Sachtouris | def do_method(new_context, line): |
186 | fd5db045 | Stavros Sachtouris | """ Template for all cmd.Cmd methods of the form do_<cmd name>
|
187 | fd5db045 | Stavros Sachtouris | Parse cmd + args and decide to execute or change context
|
188 | fd5db045 | Stavros Sachtouris | <cmd> <term> <term> <args> is always parsed to most specific
|
189 | fd5db045 | Stavros Sachtouris | even if cmd_term_term is not a terminal path
|
190 | fd5db045 | Stavros Sachtouris | """
|
191 | efbcdc41 | Stavros Sachtouris | subcmd, cmd_args = cmd.parse_out(split_input(line)) |
192 | 074f5027 | Stavros Sachtouris | self._history.add(' '.join([cmd.path.replace('_', ' '), line])) |
193 | e3c2c890 | Stavros Sachtouris | cmd_parser = ArgumentParseManager( |
194 | e3c2c890 | Stavros Sachtouris | cmd.name, dict(self._parser.arguments)) |
195 | 074f5027 | Stavros Sachtouris | cmd_parser.parser.description = subcmd.help |
196 | fd5db045 | Stavros Sachtouris | |
197 | fd5db045 | Stavros Sachtouris | # exec command or change context
|
198 | fd5db045 | Stavros Sachtouris | if subcmd.is_command: # exec command |
199 | db950b10 | Stavros Sachtouris | try:
|
200 | eb46e9a1 | Stavros Sachtouris | cls = subcmd.cmd_class |
201 | c8e17a67 | Stavros Sachtouris | ldescr = getattr(cls, 'long_description', '') |
202 | c8e17a67 | Stavros Sachtouris | if subcmd.path == 'history_run': |
203 | 53e1f8d5 | Stavros Sachtouris | instance = cls( |
204 | 0ec19fd3 | Stavros Sachtouris | dict(cmd_parser.arguments), self.auth_base, |
205 | f724cd35 | Stavros Sachtouris | cmd_tree=self.cmd_tree)
|
206 | c8e17a67 | Stavros Sachtouris | else:
|
207 | f724cd35 | Stavros Sachtouris | instance = cls( |
208 | 99085b30 | Stavros Sachtouris | dict(cmd_parser.arguments),
|
209 | 0ec19fd3 | Stavros Sachtouris | self.auth_base, self.cloud) |
210 | c8e17a67 | Stavros Sachtouris | cmd_parser.update_arguments(instance.arguments) |
211 | c8e17a67 | Stavros Sachtouris | cmd_parser.arguments = instance.arguments |
212 | c8e17a67 | Stavros Sachtouris | cmd_parser.syntax = '%s %s' % (
|
213 | c8e17a67 | Stavros Sachtouris | subcmd.path.replace('_', ' '), cls.syntax) |
214 | e3c2c890 | Stavros Sachtouris | help_method = self._create_help_method(
|
215 | 030c0d3a | Stavros Sachtouris | cmd.name, cmd_parser.arguments, |
216 | 030c0d3a | Stavros Sachtouris | subcmd.help, cmd_parser.syntax) |
217 | c8e17a67 | Stavros Sachtouris | if '-h' in cmd_args or '--help' in cmd_args: |
218 | e3c2c890 | Stavros Sachtouris | help_method() |
219 | c8e17a67 | Stavros Sachtouris | if ldescr.strip():
|
220 | c8e17a67 | Stavros Sachtouris | print('\nDetails:')
|
221 | c8e17a67 | Stavros Sachtouris | print('%s' % ldescr)
|
222 | c8e17a67 | Stavros Sachtouris | return
|
223 | c8e17a67 | Stavros Sachtouris | cmd_parser.parse(cmd_args) |
224 | c8e17a67 | Stavros Sachtouris | |
225 | c8e17a67 | Stavros Sachtouris | for name, arg in instance.arguments.items(): |
226 | de73876b | Stavros Sachtouris | arg.value = getattr(
|
227 | 0ec19fd3 | Stavros Sachtouris | cmd_parser.parsed, name, arg.default) |
228 | c8e17a67 | Stavros Sachtouris | |
229 | e3c2c890 | Stavros Sachtouris | exec_cmd(instance, cmd_parser.unparsed, help_method) |
230 | 53e1f8d5 | Stavros Sachtouris | #[term for term in cmd_parser.unparsed\
|
231 | 53e1f8d5 | Stavros Sachtouris | # if not term.startswith('-')],
|
232 | fce93ff6 | Stavros Sachtouris | except (ClientError, CLIError) as err: |
233 | b6a99832 | Stavros Sachtouris | print_error_message(err) |
234 | de73876b | Stavros Sachtouris | elif ('-h' in cmd_args or '--help' in cmd_args) or len(cmd_args): |
235 | de73876b | Stavros Sachtouris | # print options
|
236 | a71bb904 | Stavros Sachtouris | print('%s' % cmd.help)
|
237 | b6a99832 | Stavros Sachtouris | print_subcommands_help(cmd) |
238 | fd5db045 | Stavros Sachtouris | else: # change context |
239 | 834200da | Stavros Sachtouris | #new_context = this
|
240 | fd5db045 | Stavros Sachtouris | backup_context = self._backup()
|
241 | fd5db045 | Stavros Sachtouris | old_prompt = self.prompt
|
242 | fd5db045 | Stavros Sachtouris | new_context._roll_command(cmd.parent_path) |
243 | fd5db045 | Stavros Sachtouris | new_context.set_prompt(subcmd.path.replace('_', ' ')) |
244 | eb46e9a1 | Stavros Sachtouris | newcmds = [subcmd for subcmd in subcmd.subcommands.values()] |
245 | fd5db045 | Stavros Sachtouris | for subcmd in newcmds: |
246 | d53062bd | Stavros Sachtouris | new_context._register_command(subcmd.path) |
247 | fd5db045 | Stavros Sachtouris | new_context.cmdloop() |
248 | fd5db045 | Stavros Sachtouris | self.prompt = old_prompt
|
249 | fd5db045 | Stavros Sachtouris | #when new context is over, roll back to the old one
|
250 | fd5db045 | Stavros Sachtouris | self._restore(backup_context)
|
251 | fd5db045 | Stavros Sachtouris | self._register_method(do_method, 'do_%s' % cmd.name) |
252 | fd5db045 | Stavros Sachtouris | |
253 | fd5db045 | Stavros Sachtouris | def help_method(self): |
254 | fd5db045 | Stavros Sachtouris | print('%s (%s -h for more options)' % (cmd.help, cmd.name))
|
255 | 54d800e8 | Stavros Sachtouris | if cmd.is_command:
|
256 | eb46e9a1 | Stavros Sachtouris | cls = cmd.cmd_class |
257 | 2fbca093 | Stavros Sachtouris | ldescr = getattr(cls, 'long_description', '') |
258 | 54d800e8 | Stavros Sachtouris | #_construct_command_syntax(cls)
|
259 | 54d800e8 | Stavros Sachtouris | plist = self.prompt[len(self._prefix):-len(self._suffix)] |
260 | 54d800e8 | Stavros Sachtouris | plist = plist.split(' ')
|
261 | 54d800e8 | Stavros Sachtouris | clist = cmd.path.split('_')
|
262 | 54d800e8 | Stavros Sachtouris | upto = 0
|
263 | 2fbca093 | Stavros Sachtouris | if ldescr:
|
264 | 2fbca093 | Stavros Sachtouris | print('%s' % ldescr)
|
265 | 54d800e8 | Stavros Sachtouris | for i, term in enumerate(plist): |
266 | 54d800e8 | Stavros Sachtouris | try:
|
267 | 54d800e8 | Stavros Sachtouris | if clist[i] == term:
|
268 | 54d800e8 | Stavros Sachtouris | upto += 1
|
269 | 54d800e8 | Stavros Sachtouris | except IndexError: |
270 | 54d800e8 | Stavros Sachtouris | break
|
271 | 54d800e8 | Stavros Sachtouris | print('Syntax: %s %s' % (' '.join(clist[upto:]), cls.syntax)) |
272 | 8741c407 | Stavros Sachtouris | if cmd.subcommands:
|
273 | b6a99832 | Stavros Sachtouris | print_subcommands_help(cmd) |
274 | 54d800e8 | Stavros Sachtouris | |
275 | fd5db045 | Stavros Sachtouris | self._register_method(help_method, 'help_%s' % cmd.name) |
276 | fd5db045 | Stavros Sachtouris | |
277 | fd5db045 | Stavros Sachtouris | def complete_method(self, text, line, begidx, endidx): |
278 | efbcdc41 | Stavros Sachtouris | subcmd, cmd_args = cmd.parse_out(split_input(line)[1:])
|
279 | fd5db045 | Stavros Sachtouris | if subcmd.is_command:
|
280 | eb46e9a1 | Stavros Sachtouris | cls = subcmd.cmd_class |
281 | 834200da | Stavros Sachtouris | instance = cls(dict(arguments))
|
282 | fd5db045 | Stavros Sachtouris | empty, sep, subname = subcmd.path.partition(cmd.path) |
283 | fd5db045 | Stavros Sachtouris | cmd_name = '%s %s' % (cmd.name, subname.replace('_', ' ')) |
284 | de73876b | Stavros Sachtouris | print('\n%s\nSyntax:\t%s %s' % (
|
285 | eb46e9a1 | Stavros Sachtouris | cls.help, cmd_name, cls.syntax)) |
286 | fd5db045 | Stavros Sachtouris | cmd_args = {} |
287 | fd5db045 | Stavros Sachtouris | for arg in instance.arguments.values(): |
288 | fd5db045 | Stavros Sachtouris | cmd_args[','.join(arg.parsed_name)] = arg.help
|
289 | f55d3a15 | Stavros Sachtouris | print_dict(cmd_args, indent=2)
|
290 | fd5db045 | Stavros Sachtouris | stdout.write('%s %s' % (self.prompt, line)) |
291 | d252a7a8 | Stavros Sachtouris | return subcmd.subnames()
|
292 | fd5db045 | Stavros Sachtouris | self._register_method(complete_method, 'complete_%s' % cmd.name) |
293 | fd5db045 | Stavros Sachtouris | |
294 | fd5db045 | Stavros Sachtouris | @property
|
295 | fd5db045 | Stavros Sachtouris | def doc_header(self): |
296 | fd5db045 | Stavros Sachtouris | tmp_partition = self.prompt.partition(self._prefix) |
297 | fd5db045 | Stavros Sachtouris | tmp_partition = tmp_partition[2].partition(self._suffix) |
298 | fd5db045 | Stavros Sachtouris | hdr = tmp_partition[0].strip()
|
299 | fd5db045 | Stavros Sachtouris | return '%s commands:' % hdr |
300 | fd5db045 | Stavros Sachtouris | |
301 | 844a6bdb | Stavros Sachtouris | def run(self, auth_base, cloud, parser, path=''): |
302 | f724cd35 | Stavros Sachtouris | self.auth_base = auth_base
|
303 | 844a6bdb | Stavros Sachtouris | self.cloud = cloud
|
304 | 074f5027 | Stavros Sachtouris | self._parser = parser
|
305 | 074f5027 | Stavros Sachtouris | self._history = History(
|
306 | 362adf50 | Stavros Sachtouris | parser.arguments['config'].get_global('history_file')) |
307 | db950b10 | Stavros Sachtouris | if path:
|
308 | fd5db045 | Stavros Sachtouris | cmd = self.cmd_tree.get_command(path)
|
309 | fd5db045 | Stavros Sachtouris | intro = cmd.path.replace('_', ' ') |
310 | fd5db045 | Stavros Sachtouris | else:
|
311 | fd5db045 | Stavros Sachtouris | intro = self.cmd_tree.name
|
312 | fd5db045 | Stavros Sachtouris | |
313 | a7aacf12 | Stavros Sachtouris | acceptable = parser.arguments['config'].groups
|
314 | d252a7a8 | Stavros Sachtouris | total = self.cmd_tree.groups.keys()
|
315 | 320aac17 | Stavros Sachtouris | self.cmd_tree.exclude(set(total).difference(acceptable)) |
316 | 320aac17 | Stavros Sachtouris | |
317 | fd5db045 | Stavros Sachtouris | for subcmd in self.cmd_tree.get_subcommands(path): |
318 | d53062bd | Stavros Sachtouris | self._register_command(subcmd.path)
|
319 | fd5db045 | Stavros Sachtouris | |
320 | fd5db045 | Stavros Sachtouris | self.set_prompt(intro)
|
321 | db950b10 | Stavros Sachtouris | |
322 | f9af2848 | Stavros Sachtouris | try:
|
323 | f9af2848 | Stavros Sachtouris | self.cmdloop()
|
324 | af569ab9 | Stavros Sachtouris | except Exception as e: |
325 | af569ab9 | Stavros Sachtouris | print('(%s)' % e)
|
326 | f9af2848 | Stavros Sachtouris | from traceback import print_stack |
327 | f9af2848 | Stavros Sachtouris | print_stack() |