Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / commands / history_cli.py @ f2e2663e

History | View | Annotate | Download (4.9 kB)

1
#!/usr/bin/env python
2

    
3
# Copyright 2012 GRNET S.A. All rights reserved.
4
#
5
# Redistribution and use in source and binary forms, with or
6
# without modification, are permitted provided that the following
7
# conditions are met:
8
#
9
#   1. Redistributions of source code must retain the above
10
#      copyright notice, this list of conditions and the following
11
#      disclaimer.
12
#
13
#   2. Redistributions in binary form must reproduce the above
14
#      copyright notice, this list of conditions and the following
15
#      disclaimer in the documentation and/or other materials
16
#      provided with the distribution.
17
#
18
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
19
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
22
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
25
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
# POSSIBILITY OF SUCH DAMAGE.
30
#
31
# The views and conclusions contained in the software and
32
# documentation are those of the authors and should not be
33
# interpreted as representing official policies, either expressed
34
# or implied, of GRNET S.A.
35

    
36
from kamaki.cli.command_tree import CommandTree
37
from kamaki.cli.argument import IntArgument, ValueArgument
38
from kamaki.cli.argument import ArgumentParseManager
39
from kamaki.cli.history import History
40
from kamaki.cli import command
41
from kamaki.cli.commands import _command_init
42
from kamaki.cli import _exec_cmd, _print_error_message
43
from kamaki.cli.errors import CLIError, raiseCLIError
44
from kamaki.cli.utils import split_input
45
from kamaki.clients import ClientError
46

    
47

    
48
history_cmds = CommandTree('history', 'Command history')
49
_commands = [history_cmds]
50

    
51

    
52
class _init_history(_command_init):
53
    def main(self):
54
        self.history = History(self.config.get('history', 'file'))
55

    
56

    
57
@command(history_cmds)
58
class history_show(_init_history):
59
    """Show history [containing terms...]"""
60

    
61
    def __init__(self, arguments={}):
62
        super(self.__class__, self).__init__(arguments)
63
        self.arguments['limit'] =\
64
            IntArgument('number of lines to show', '-n', default=0)
65
        self.arguments['match'] =\
66
            ValueArgument('show lines that match all given terms', '--match')
67

    
68
    def main(self):
69
        super(self.__class__, self).main()
70
        ret = self.history.get(match_terms=self.get_argument('match'),
71
            limit=self.get_argument('limit'))
72
        print(''.join(ret))
73

    
74

    
75
@command(history_cmds)
76
class history_clean(_init_history):
77
    """Clean up history"""
78

    
79
    def main(self):
80
        super(self.__class__, self).main()
81
        self.history.clean()
82

    
83

    
84
@command(history_cmds)
85
class history_load(_init_history):
86
    """Re-call a previously called command"""
87

    
88
    _cmd_tree = None
89

    
90
    def __init__(self, arguments={}, cmd_tree=None):
91
        super(self.__class__, self).__init__(arguments)
92
        self._cmd_tree = cmd_tree
93

    
94
    def _run_from_line(self, line):
95
        terms = split_input(line)
96
        cmd, args = self._cmd_tree.find_best_match(terms)
97
        if not cmd.is_command:
98
            return
99
        try:
100
            instance = cmd.get_class()(self.arguments)
101
            instance.config = self.config
102
            prs = ArgumentParseManager(cmd.path.split(),
103
                dict(instance.arguments))
104
            prs.syntax = '%s %s' % (cmd.path.replace('_', ' '),
105
                cmd.get_class().syntax)
106
            prs.parse(args)
107
            _exec_cmd(instance, prs.unparsed, prs.parser.print_help)
108
        except (CLIError, ClientError) as err:
109
            _print_error_message(err)
110
        except Exception as e:
111
            print('Execution of [ %s ] failed' % line)
112
            print('\t%s' % e)
113

    
114
    def _get_cmd_ids(self, cmd_ids):
115
        cmd_id_list = []
116
        for cmd_str in cmd_ids:
117
            num1, sep, num2 = cmd_str.partition('-')
118
            try:
119
                if sep:
120
                    for i in range(int(num1), int(num2) + 1):
121
                        cmd_id_list.append(i)
122
                else:
123
                    cmd_id_list.append(int(cmd_str))
124
            except ValueError:
125
                raiseCLIError('Invalid history id %s' % cmd_str)
126
        return cmd_id_list
127

    
128
    def main(self, *command_ids):
129
        super(self.__class__, self).main()
130
        cmd_list = self._get_cmd_ids(command_ids)
131
        for cmd_id in cmd_list:
132
            r = self.history.retrieve(cmd_id)
133
            print(r[:-1])
134
            if self._cmd_tree:
135
                r = r[len('kamaki '):-1] if r.startswith('kamaki ') else r[:-1]
136
                self._run_from_line(r)