Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / __init__.py @ e7e7dbbd

History | View | Annotate | Download (12.4 kB)

1 d486baec Stavros Sachtouris
# Copyright 2012-2013 GRNET S.A. All rights reserved.
2 7493ccb6 Stavros Sachtouris
#
3 7493ccb6 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 7493ccb6 Stavros Sachtouris
# without modification, are permitted provided that the following
5 7493ccb6 Stavros Sachtouris
# conditions are met:
6 7493ccb6 Stavros Sachtouris
#
7 7493ccb6 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 7493ccb6 Stavros Sachtouris
#
11 7493ccb6 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 7493ccb6 Stavros Sachtouris
#
16 7493ccb6 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 7493ccb6 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 7493ccb6 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 7493ccb6 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 7493ccb6 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 7493ccb6 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 7493ccb6 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 7493ccb6 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 7493ccb6 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 7493ccb6 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 7493ccb6 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 7493ccb6 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 7493ccb6 Stavros Sachtouris
#
29 7493ccb6 Stavros Sachtouris
# The views and conclusions contained in the software and
30 7493ccb6 Stavros Sachtouris
# documentation are those of the authors and should not be
31 7493ccb6 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 d486baec Stavros Sachtouris
# or implied, of GRNET S.A.command
33 7493ccb6 Stavros Sachtouris
34 7493ccb6 Stavros Sachtouris
import logging
35 d486baec Stavros Sachtouris
from sys import argv, exit, stdout
36 f3e94e06 Stavros Sachtouris
from os.path import basename
37 d486baec Stavros Sachtouris
from inspect import getargspec
38 3dabe5d2 Stavros Sachtouris
39 ee4c47d7 Stavros Sachtouris
from kamaki.cli.argument import ArgumentParseManager
40 fd5db045 Stavros Sachtouris
from kamaki.cli.history import History
41 af569ab9 Stavros Sachtouris
from kamaki.cli.utils import print_dict, red, magenta, yellow
42 d486baec Stavros Sachtouris
from kamaki.cli.errors import CLIError
43 7493ccb6 Stavros Sachtouris
44 d486baec Stavros Sachtouris
_help = False
45 d486baec Stavros Sachtouris
_debug = False
46 1a3c18fd Stavros Sachtouris
_include = False
47 d486baec Stavros Sachtouris
_verbose = False
48 d486baec Stavros Sachtouris
_colors = False
49 aa5c0458 Stavros Sachtouris
kloger = None
50 fd5db045 Stavros Sachtouris
51 b6a99832 Stavros Sachtouris
#  command auxiliary methods
52 b6a99832 Stavros Sachtouris
53 b6a99832 Stavros Sachtouris
_best_match = []
54 b6a99832 Stavros Sachtouris
55 fd5db045 Stavros Sachtouris
56 24ff0a35 Stavros Sachtouris
def _arg2syntax(arg):
57 24ff0a35 Stavros Sachtouris
    return arg.replace(
58 24ff0a35 Stavros Sachtouris
        '____', '[:').replace(
59 2005b18e Stavros Sachtouris
            '___', ':').replace(
60 2005b18e Stavros Sachtouris
                '__', ']').replace(
61 2005b18e Stavros Sachtouris
                    '_', ' ')
62 24ff0a35 Stavros Sachtouris
63 24ff0a35 Stavros Sachtouris
64 d486baec Stavros Sachtouris
def _construct_command_syntax(cls):
65 fd5db045 Stavros Sachtouris
        spec = getargspec(cls.main.im_func)
66 fd5db045 Stavros Sachtouris
        args = spec.args[1:]
67 fd5db045 Stavros Sachtouris
        n = len(args) - len(spec.defaults or ())
68 24ff0a35 Stavros Sachtouris
        required = ' '.join(['<%s>' % _arg2syntax(x) for x in args[:n]])
69 24ff0a35 Stavros Sachtouris
        optional = ' '.join(['[%s]' % _arg2syntax(x) for x in args[n:]])
70 fd5db045 Stavros Sachtouris
        cls.syntax = ' '.join(x for x in [required, optional] if x)
71 fd5db045 Stavros Sachtouris
        if spec.varargs:
72 fd5db045 Stavros Sachtouris
            cls.syntax += ' <%s ...>' % spec.varargs
73 fd5db045 Stavros Sachtouris
74 fd5db045 Stavros Sachtouris
75 d486baec Stavros Sachtouris
def _num_of_matching_terms(basic_list, attack_list):
76 d486baec Stavros Sachtouris
    if not attack_list:
77 75c3fc42 Stavros Sachtouris
        return len(basic_list)
78 fd5db045 Stavros Sachtouris
79 d486baec Stavros Sachtouris
    matching_terms = 0
80 d486baec Stavros Sachtouris
    for i, term in enumerate(basic_list):
81 d486baec Stavros Sachtouris
        try:
82 d486baec Stavros Sachtouris
            if term != attack_list[i]:
83 d486baec Stavros Sachtouris
                break
84 d486baec Stavros Sachtouris
        except IndexError:
85 d486baec Stavros Sachtouris
            break
86 d486baec Stavros Sachtouris
        matching_terms += 1
87 d486baec Stavros Sachtouris
    return matching_terms
88 dfee2caf Stavros Sachtouris
89 fd5db045 Stavros Sachtouris
90 d486baec Stavros Sachtouris
def _update_best_match(name_terms, prefix=[]):
91 d486baec Stavros Sachtouris
    if prefix:
92 d486baec Stavros Sachtouris
        pref_list = prefix if isinstance(prefix, list) else prefix.split('_')
93 d486baec Stavros Sachtouris
    else:
94 d486baec Stavros Sachtouris
        pref_list = []
95 dfee2caf Stavros Sachtouris
96 d486baec Stavros Sachtouris
    num_of_matching_terms = _num_of_matching_terms(name_terms, pref_list)
97 d486baec Stavros Sachtouris
    global _best_match
98 e9533b0c Stavros Sachtouris
    if not prefix:
99 e9533b0c Stavros Sachtouris
        _best_match = []
100 fd5db045 Stavros Sachtouris
101 d486baec Stavros Sachtouris
    if num_of_matching_terms and len(_best_match) <= num_of_matching_terms:
102 d486baec Stavros Sachtouris
        if len(_best_match) < num_of_matching_terms:
103 d486baec Stavros Sachtouris
            _best_match = name_terms[:num_of_matching_terms]
104 d486baec Stavros Sachtouris
        return True
105 d486baec Stavros Sachtouris
    return False
106 d486baec Stavros Sachtouris
107 d486baec Stavros Sachtouris
108 d486baec Stavros Sachtouris
def command(cmd_tree, prefix='', descedants_depth=1):
109 d486baec Stavros Sachtouris
    """Load a class as a command
110 451a7992 Stavros Sachtouris
        e.g. spec_cmd0_cmd1 will be command spec cmd0
111 451a7992 Stavros Sachtouris

112 451a7992 Stavros Sachtouris
        :param cmd_tree: is initialized in cmd_spec file and is the structure
113 d486baec Stavros Sachtouris
            where commands are loaded. Var name should be _commands
114 451a7992 Stavros Sachtouris
        :param prefix: if given, load only commands prefixed with prefix,
115 451a7992 Stavros Sachtouris
        :param descedants_depth: is the depth of the tree descedants of the
116 d486baec Stavros Sachtouris
            prefix command. It is used ONLY if prefix and if prefix is not
117 d486baec Stavros Sachtouris
            a terminal command
118 451a7992 Stavros Sachtouris

119 451a7992 Stavros Sachtouris
        :returns: the specified class object
120 d486baec Stavros Sachtouris
    """
121 d486baec Stavros Sachtouris
122 d486baec Stavros Sachtouris
    def wrap(cls):
123 451a7992 Stavros Sachtouris
        global kloger
124 d486baec Stavros Sachtouris
        cls_name = cls.__name__
125 d486baec Stavros Sachtouris
126 d486baec Stavros Sachtouris
        if not cmd_tree:
127 d486baec Stavros Sachtouris
            if _debug:
128 451a7992 Stavros Sachtouris
                kloger.warning('command %s found but not loaded' % cls_name)
129 d486baec Stavros Sachtouris
            return cls
130 0b368c8c Stavros Sachtouris
131 d486baec Stavros Sachtouris
        name_terms = cls_name.split('_')
132 d486baec Stavros Sachtouris
        if not _update_best_match(name_terms, prefix):
133 e9533b0c Stavros Sachtouris
            if _debug:
134 451a7992 Stavros Sachtouris
                kloger.warning('%s failed to update_best_match' % cls_name)
135 d486baec Stavros Sachtouris
            return None
136 fd5db045 Stavros Sachtouris
137 d486baec Stavros Sachtouris
        global _best_match
138 d486baec Stavros Sachtouris
        max_len = len(_best_match) + descedants_depth
139 d486baec Stavros Sachtouris
        if len(name_terms) > max_len:
140 d486baec Stavros Sachtouris
            partial = '_'.join(name_terms[:max_len])
141 d486baec Stavros Sachtouris
            if not cmd_tree.has_command(partial):  # add partial path
142 d486baec Stavros Sachtouris
                cmd_tree.add_command(partial)
143 e9533b0c Stavros Sachtouris
            if _debug:
144 451a7992 Stavros Sachtouris
                kloger.warning('%s failed max_len test' % cls_name)
145 d486baec Stavros Sachtouris
            return None
146 fd5db045 Stavros Sachtouris
147 de73876b Stavros Sachtouris
        (
148 de73876b Stavros Sachtouris
            cls.description, sep, cls.long_description
149 de73876b Stavros Sachtouris
        ) = cls.__doc__.partition('\n')
150 d486baec Stavros Sachtouris
        _construct_command_syntax(cls)
151 0b368c8c Stavros Sachtouris
152 d486baec Stavros Sachtouris
        cmd_tree.add_command(cls_name, cls.description, cls)
153 d486baec Stavros Sachtouris
        return cls
154 d486baec Stavros Sachtouris
    return wrap
155 fd5db045 Stavros Sachtouris
156 0b368c8c Stavros Sachtouris
157 d486baec Stavros Sachtouris
cmd_spec_locations = [
158 d486baec Stavros Sachtouris
    'kamaki.cli.commands',
159 d486baec Stavros Sachtouris
    'kamaki.commands',
160 d486baec Stavros Sachtouris
    'kamaki.cli',
161 d486baec Stavros Sachtouris
    'kamaki',
162 d486baec Stavros Sachtouris
    '']
163 fd5db045 Stavros Sachtouris
164 0b368c8c Stavros Sachtouris
165 b6a99832 Stavros Sachtouris
#  Generic init auxiliary functions
166 b6a99832 Stavros Sachtouris
167 b6a99832 Stavros Sachtouris
168 d486baec Stavros Sachtouris
def _setup_logging(silent=False, debug=False, verbose=False, include=False):
169 fd5db045 Stavros Sachtouris
    """handle logging for clients package"""
170 fd5db045 Stavros Sachtouris
171 fd5db045 Stavros Sachtouris
    def add_handler(name, level, prefix=''):
172 fd5db045 Stavros Sachtouris
        h = logging.StreamHandler()
173 fd5db045 Stavros Sachtouris
        fmt = logging.Formatter(prefix + '%(message)s')
174 fd5db045 Stavros Sachtouris
        h.setFormatter(fmt)
175 fd5db045 Stavros Sachtouris
        logger = logging.getLogger(name)
176 fd5db045 Stavros Sachtouris
        logger.addHandler(h)
177 fd5db045 Stavros Sachtouris
        logger.setLevel(level)
178 fd5db045 Stavros Sachtouris
179 fd5db045 Stavros Sachtouris
    if silent:
180 fd5db045 Stavros Sachtouris
        add_handler('', logging.CRITICAL)
181 db8d1766 Stavros Sachtouris
        return
182 db8d1766 Stavros Sachtouris
183 db8d1766 Stavros Sachtouris
    if debug:
184 fd5db045 Stavros Sachtouris
        add_handler('requests', logging.INFO, prefix='* ')
185 fd5db045 Stavros Sachtouris
        add_handler('clients.send', logging.DEBUG, prefix='> ')
186 fd5db045 Stavros Sachtouris
        add_handler('clients.recv', logging.DEBUG, prefix='< ')
187 b6a99832 Stavros Sachtouris
        add_handler('kamaki', logging.DEBUG, prefix='(debug): ')
188 fd5db045 Stavros Sachtouris
    elif verbose:
189 fd5db045 Stavros Sachtouris
        add_handler('requests', logging.INFO, prefix='* ')
190 fd5db045 Stavros Sachtouris
        add_handler('clients.send', logging.INFO, prefix='> ')
191 fd5db045 Stavros Sachtouris
        add_handler('clients.recv', logging.INFO, prefix='< ')
192 b6a99832 Stavros Sachtouris
        add_handler('kamaki', logging.INFO, prefix='(i): ')
193 1a3c18fd Stavros Sachtouris
    if include:
194 1a3c18fd Stavros Sachtouris
        add_handler('data.send', logging.INFO, prefix='>[data]: ')
195 1a3c18fd Stavros Sachtouris
        add_handler('data.recv', logging.INFO, prefix='<[data]: ')
196 b6a99832 Stavros Sachtouris
    add_handler('kamaki', logging.WARNING, prefix='(warning): ')
197 aa5c0458 Stavros Sachtouris
    global kloger
198 b6a99832 Stavros Sachtouris
    kloger = logging.getLogger('kamaki')
199 fd5db045 Stavros Sachtouris
200 ce48608f Stavros Sachtouris
201 d486baec Stavros Sachtouris
def _init_session(arguments):
202 d486baec Stavros Sachtouris
    global _help
203 d486baec Stavros Sachtouris
    _help = arguments['help'].value
204 d486baec Stavros Sachtouris
    global _debug
205 d486baec Stavros Sachtouris
    _debug = arguments['debug'].value
206 1a3c18fd Stavros Sachtouris
    global _include
207 1a3c18fd Stavros Sachtouris
    _include = arguments['include'].value
208 d486baec Stavros Sachtouris
    global _verbose
209 d486baec Stavros Sachtouris
    _verbose = arguments['verbose'].value
210 d486baec Stavros Sachtouris
    global _colors
211 d486baec Stavros Sachtouris
    _colors = arguments['config'].get('global', 'colors')
212 87565d2c Stavros Sachtouris
    if not (stdout.isatty() and _colors == 'on'):
213 4f6a21f6 Stavros Sachtouris
        from kamaki.cli.utils import remove_colors
214 4f6a21f6 Stavros Sachtouris
        remove_colors()
215 d486baec Stavros Sachtouris
    _silent = arguments['silent'].value
216 d486baec Stavros Sachtouris
    _setup_logging(_silent, _debug, _verbose, _include)
217 d486baec Stavros Sachtouris
218 d486baec Stavros Sachtouris
219 d486baec Stavros Sachtouris
def _load_spec_module(spec, arguments, module):
220 d486baec Stavros Sachtouris
    spec_name = arguments['config'].get(spec, 'cli')
221 d486baec Stavros Sachtouris
    if spec_name is None:
222 d486baec Stavros Sachtouris
        return None
223 d486baec Stavros Sachtouris
    pkg = None
224 d486baec Stavros Sachtouris
    for location in cmd_spec_locations:
225 d486baec Stavros Sachtouris
        location += spec_name if location == '' else '.%s' % spec_name
226 d486baec Stavros Sachtouris
        try:
227 d486baec Stavros Sachtouris
            pkg = __import__(location, fromlist=[module])
228 d486baec Stavros Sachtouris
            return pkg
229 d486baec Stavros Sachtouris
        except ImportError:
230 d486baec Stavros Sachtouris
            continue
231 d486baec Stavros Sachtouris
    return pkg
232 d486baec Stavros Sachtouris
233 d486baec Stavros Sachtouris
234 d486baec Stavros Sachtouris
def _groups_help(arguments):
235 d486baec Stavros Sachtouris
    global _debug
236 aa5c0458 Stavros Sachtouris
    global kloger
237 d486baec Stavros Sachtouris
    descriptions = {}
238 d486baec Stavros Sachtouris
    for spec in arguments['config'].get_groups():
239 d486baec Stavros Sachtouris
        pkg = _load_spec_module(spec, arguments, '_commands')
240 d486baec Stavros Sachtouris
        if pkg:
241 d486baec Stavros Sachtouris
            cmds = None
242 d486baec Stavros Sachtouris
            try:
243 24ff0a35 Stavros Sachtouris
                _cnf = arguments['config']
244 24ff0a35 Stavros Sachtouris
                cmds = [cmd for cmd in getattr(pkg, '_commands') if _cnf.get(
245 24ff0a35 Stavros Sachtouris
                    cmd.name, 'cli')]
246 d486baec Stavros Sachtouris
            except AttributeError:
247 d486baec Stavros Sachtouris
                if _debug:
248 aa5c0458 Stavros Sachtouris
                    kloger.warning('No description for %s' % spec)
249 d486baec Stavros Sachtouris
            try:
250 d486baec Stavros Sachtouris
                for cmd in cmds:
251 d486baec Stavros Sachtouris
                    descriptions[cmd.name] = cmd.description
252 d486baec Stavros Sachtouris
            except TypeError:
253 d486baec Stavros Sachtouris
                if _debug:
254 aa5c0458 Stavros Sachtouris
                    kloger.warning('no cmd specs in module %s' % spec)
255 d486baec Stavros Sachtouris
        elif _debug:
256 aa5c0458 Stavros Sachtouris
            kloger.warning('Loading of %s cmd spec failed' % spec)
257 d486baec Stavros Sachtouris
    print('\nOptions:\n - - - -')
258 d486baec Stavros Sachtouris
    print_dict(descriptions)
259 d486baec Stavros Sachtouris
260 d486baec Stavros Sachtouris
261 b6a99832 Stavros Sachtouris
def _load_all_commands(cmd_tree, arguments):
262 24ff0a35 Stavros Sachtouris
    _cnf = arguments['config']
263 24ff0a35 Stavros Sachtouris
    specs = [spec for spec in _cnf.get_groups() if _cnf.get(spec, 'cli')]
264 24ff0a35 Stavros Sachtouris
    for spec in specs:
265 b6a99832 Stavros Sachtouris
        try:
266 b6a99832 Stavros Sachtouris
            spec_module = _load_spec_module(spec, arguments, '_commands')
267 b6a99832 Stavros Sachtouris
            spec_commands = getattr(spec_module, '_commands')
268 b6a99832 Stavros Sachtouris
        except AttributeError:
269 b6a99832 Stavros Sachtouris
            if _debug:
270 b6a99832 Stavros Sachtouris
                global kloger
271 b6a99832 Stavros Sachtouris
                kloger.warning('No valid description for %s' % spec)
272 b6a99832 Stavros Sachtouris
            continue
273 b6a99832 Stavros Sachtouris
        for spec_tree in spec_commands:
274 b6a99832 Stavros Sachtouris
            if spec_tree.name == spec:
275 b6a99832 Stavros Sachtouris
                cmd_tree.add_tree(spec_tree)
276 b6a99832 Stavros Sachtouris
                break
277 b6a99832 Stavros Sachtouris
278 b6a99832 Stavros Sachtouris
279 b6a99832 Stavros Sachtouris
#  Methods to be used by CLI implementations
280 b6a99832 Stavros Sachtouris
281 b6a99832 Stavros Sachtouris
282 b6a99832 Stavros Sachtouris
def print_subcommands_help(cmd):
283 d486baec Stavros Sachtouris
    printout = {}
284 d486baec Stavros Sachtouris
    for subcmd in cmd.get_subcommands():
285 4f6a21f6 Stavros Sachtouris
        spec, sep, print_path = subcmd.path.partition('_')
286 4f6a21f6 Stavros Sachtouris
        printout[print_path.replace('_', ' ')] = subcmd.description
287 d486baec Stavros Sachtouris
    if printout:
288 d486baec Stavros Sachtouris
        print('\nOptions:\n - - - -')
289 d486baec Stavros Sachtouris
        print_dict(printout)
290 d486baec Stavros Sachtouris
291 d486baec Stavros Sachtouris
292 b6a99832 Stavros Sachtouris
def update_parser_help(parser, cmd):
293 d486baec Stavros Sachtouris
    global _best_match
294 7c2247a0 Stavros Sachtouris
    parser.syntax = parser.syntax.split('<')[0]
295 7c2247a0 Stavros Sachtouris
    parser.syntax += ' '.join(_best_match)
296 d486baec Stavros Sachtouris
297 a71bb904 Stavros Sachtouris
    description = ''
298 d486baec Stavros Sachtouris
    if cmd.is_command:
299 d486baec Stavros Sachtouris
        cls = cmd.get_class()
300 7c2247a0 Stavros Sachtouris
        parser.syntax += ' ' + cls.syntax
301 7c2247a0 Stavros Sachtouris
        parser.update_arguments(cls().arguments)
302 a71bb904 Stavros Sachtouris
        description = getattr(cls, 'long_description', '')
303 a71bb904 Stavros Sachtouris
        description = description.strip()
304 d486baec Stavros Sachtouris
    else:
305 7c2247a0 Stavros Sachtouris
        parser.syntax += ' <...>'
306 d486baec Stavros Sachtouris
    if cmd.has_description:
307 de73876b Stavros Sachtouris
        parser.parser.description = cmd.help + (
308 de73876b Stavros Sachtouris
            ('\n%s' % description) if description else '')
309 2fbca093 Stavros Sachtouris
    else:
310 2fbca093 Stavros Sachtouris
        parser.parser.description = description
311 d486baec Stavros Sachtouris
312 d486baec Stavros Sachtouris
313 b6a99832 Stavros Sachtouris
def print_error_message(cli_err):
314 d486baec Stavros Sachtouris
    errmsg = '%s' % cli_err
315 d486baec Stavros Sachtouris
    if cli_err.importance == 1:
316 d486baec Stavros Sachtouris
        errmsg = magenta(errmsg)
317 d486baec Stavros Sachtouris
    elif cli_err.importance == 2:
318 d486baec Stavros Sachtouris
        errmsg = yellow(errmsg)
319 d486baec Stavros Sachtouris
    elif cli_err.importance > 2:
320 d486baec Stavros Sachtouris
        errmsg = red(errmsg)
321 d486baec Stavros Sachtouris
    stdout.write(errmsg)
322 66f1ff99 Stavros Sachtouris
    for errmsg in cli_err.details:
323 66f1ff99 Stavros Sachtouris
        print('| %s' % errmsg)
324 d486baec Stavros Sachtouris
325 d486baec Stavros Sachtouris
326 b6a99832 Stavros Sachtouris
def exec_cmd(instance, cmd_args, help_method):
327 fd5db045 Stavros Sachtouris
    try:
328 fd5db045 Stavros Sachtouris
        return instance.main(*cmd_args)
329 fd5db045 Stavros Sachtouris
    except TypeError as err:
330 fd5db045 Stavros Sachtouris
        if err.args and err.args[0].startswith('main()'):
331 fd5db045 Stavros Sachtouris
            print(magenta('Syntax error'))
332 d486baec Stavros Sachtouris
            if _debug:
333 d486baec Stavros Sachtouris
                raise err
334 d486baec Stavros Sachtouris
            if _verbose:
335 fd5db045 Stavros Sachtouris
                print(unicode(err))
336 fd5db045 Stavros Sachtouris
            help_method()
337 fd5db045 Stavros Sachtouris
        else:
338 fd5db045 Stavros Sachtouris
            raise
339 fd5db045 Stavros Sachtouris
    return 1
340 fd5db045 Stavros Sachtouris
341 f247bcb4 Stavros Sachtouris
342 b6a99832 Stavros Sachtouris
def get_command_group(unparsed, arguments):
343 b6a99832 Stavros Sachtouris
    groups = arguments['config'].get_groups()
344 b6a99832 Stavros Sachtouris
    for term in unparsed:
345 b6a99832 Stavros Sachtouris
        if term.startswith('-'):
346 b6a99832 Stavros Sachtouris
            continue
347 b6a99832 Stavros Sachtouris
        if term in groups:
348 b6a99832 Stavros Sachtouris
            unparsed.remove(term)
349 b6a99832 Stavros Sachtouris
            return term
350 b6a99832 Stavros Sachtouris
        return None
351 b6a99832 Stavros Sachtouris
    return None
352 b6a99832 Stavros Sachtouris
353 b6a99832 Stavros Sachtouris
354 7c2247a0 Stavros Sachtouris
def set_command_params(parameters):
355 7c2247a0 Stavros Sachtouris
    """Add a parameters list to a command
356 7c2247a0 Stavros Sachtouris

357 7c2247a0 Stavros Sachtouris
    :param paramters: (list of str) a list of parameters
358 7c2247a0 Stavros Sachtouris
    """
359 d486baec Stavros Sachtouris
    global command
360 d486baec Stavros Sachtouris
    def_params = list(command.func_defaults)
361 7c2247a0 Stavros Sachtouris
    def_params[0] = parameters
362 d486baec Stavros Sachtouris
    command.func_defaults = tuple(def_params)
363 d486baec Stavros Sachtouris
364 d486baec Stavros Sachtouris
365 b6a99832 Stavros Sachtouris
#  CLI Choice:
366 d486baec Stavros Sachtouris
367 b6a99832 Stavros Sachtouris
def run_one_cmd(exe_string, parser):
368 b6a99832 Stavros Sachtouris
    global _history
369 b6a99832 Stavros Sachtouris
    _history = History(
370 b6a99832 Stavros Sachtouris
        parser.arguments['config'].get('history', 'file'))
371 b6a99832 Stavros Sachtouris
    _history.add(' '.join([exe_string] + argv[1:]))
372 b6a99832 Stavros Sachtouris
    from kamaki.cli import one_command
373 b6a99832 Stavros Sachtouris
    one_command.run(parser, _help)
374 d53062bd Stavros Sachtouris
375 d53062bd Stavros Sachtouris
376 074f5027 Stavros Sachtouris
def run_shell(exe_string, parser):
377 d53062bd Stavros Sachtouris
    from command_shell import _init_shell
378 074f5027 Stavros Sachtouris
    shell = _init_shell(exe_string, parser)
379 074f5027 Stavros Sachtouris
    _load_all_commands(shell.cmd_tree, parser.arguments)
380 074f5027 Stavros Sachtouris
    shell.run(parser)
381 fd5db045 Stavros Sachtouris
382 1c1fd2fa Stavros Sachtouris
383 1c1fd2fa Stavros Sachtouris
def main():
384 71882bca Stavros Sachtouris
    try:
385 71882bca Stavros Sachtouris
        exe = basename(argv[0])
386 e0da0f90 Stavros Sachtouris
        parser = ArgumentParseManager(exe)
387 7c2247a0 Stavros Sachtouris
388 074f5027 Stavros Sachtouris
        if parser.arguments['version'].value:
389 71882bca Stavros Sachtouris
            exit(0)
390 71882bca Stavros Sachtouris
391 074f5027 Stavros Sachtouris
        _init_session(parser.arguments)
392 71882bca Stavros Sachtouris
393 b3dd8f4b Stavros Sachtouris
        if parser.unparsed:
394 b6a99832 Stavros Sachtouris
            run_one_cmd(exe, parser)
395 71882bca Stavros Sachtouris
        elif _help:
396 e0da0f90 Stavros Sachtouris
            parser.parser.print_help()
397 074f5027 Stavros Sachtouris
            _groups_help(parser.arguments)
398 71882bca Stavros Sachtouris
        else:
399 074f5027 Stavros Sachtouris
            run_shell(exe, parser)
400 71882bca Stavros Sachtouris
    except CLIError as err:
401 b6a99832 Stavros Sachtouris
        print_error_message(err)
402 71882bca Stavros Sachtouris
        if _debug:
403 71882bca Stavros Sachtouris
            raise err
404 71882bca Stavros Sachtouris
        exit(1)
405 6069b53b Stavros Sachtouris
    except Exception as er:
406 6069b53b Stavros Sachtouris
        print('Unknown Error: %s' % er)
407 71882bca Stavros Sachtouris
        if _debug:
408 6069b53b Stavros Sachtouris
            raise
409 6069b53b Stavros Sachtouris
        exit(1)