ronin-support 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +11 -0
- data/ChangeLog.md +42 -1
- data/README.md +4 -1
- data/gemspec.yml +2 -1
- data/lib/ronin/extensions.rb +2 -0
- data/lib/ronin/extensions/enumerable.rb +54 -0
- data/lib/ronin/extensions/file.rb +70 -2
- data/lib/ronin/extensions/ip_addr.rb +45 -45
- data/lib/ronin/extensions/regexp.rb +45 -0
- data/lib/ronin/extensions/resolv.rb +80 -0
- data/lib/ronin/extensions/string.rb +35 -32
- data/lib/ronin/formatting/extensions/binary/integer.rb +12 -5
- data/lib/ronin/formatting/extensions/binary/string.rb +44 -16
- data/lib/ronin/formatting/extensions/html/integer.rb +51 -31
- data/lib/ronin/formatting/extensions/html/string.rb +50 -31
- data/lib/ronin/formatting/extensions/http/integer.rb +10 -2
- data/lib/ronin/formatting/extensions/sql.rb +20 -0
- data/lib/ronin/formatting/extensions/sql/string.rb +98 -0
- data/lib/ronin/formatting/extensions/text/array.rb +11 -9
- data/lib/ronin/formatting/extensions/text/string.rb +213 -29
- data/lib/ronin/formatting/sql.rb +20 -0
- data/lib/ronin/network/extensions/http.rb +1 -0
- data/lib/ronin/network/extensions/http/net.rb +2 -2
- data/lib/ronin/network/extensions/http/uri/http.rb +226 -0
- data/lib/ronin/network/extensions/imap/net.rb +1 -1
- data/lib/ronin/network/extensions/ssl/net.rb +7 -1
- data/lib/ronin/network/http/proxy.rb +20 -21
- data/lib/ronin/network/mixins.rb +27 -0
- data/lib/ronin/network/mixins/esmtp.rb +165 -0
- data/lib/ronin/network/mixins/http.rb +723 -0
- data/lib/ronin/network/mixins/imap.rb +151 -0
- data/lib/ronin/network/mixins/pop3.rb +141 -0
- data/lib/ronin/network/mixins/smtp.rb +159 -0
- data/lib/ronin/network/mixins/tcp.rb +331 -0
- data/lib/ronin/network/mixins/telnet.rb +199 -0
- data/lib/ronin/network/mixins/udp.rb +227 -0
- data/lib/ronin/network/ssl.rb +17 -11
- data/lib/ronin/path.rb +3 -3
- data/lib/ronin/spec/ui/output.rb +28 -0
- data/lib/ronin/support.rb +3 -0
- data/lib/ronin/support/version.rb +1 -1
- data/lib/ronin/ui/output.rb +21 -0
- data/lib/ronin/ui/output/helpers.rb +248 -0
- data/lib/ronin/ui/output/output.rb +146 -0
- data/lib/ronin/ui/output/terminal.rb +21 -0
- data/lib/ronin/ui/output/terminal/color.rb +118 -0
- data/lib/ronin/ui/output/terminal/raw.rb +103 -0
- data/lib/ronin/ui/shell.rb +219 -0
- data/ronin-support.gemspec +1 -1
- data/spec/extensions/enumerable_spec.rb +24 -0
- data/spec/extensions/file_spec.rb +39 -0
- data/spec/extensions/ip_addr_spec.rb +6 -0
- data/spec/extensions/resolv_spec.rb +18 -0
- data/spec/formatting/html/integer_spec.rb +2 -2
- data/spec/formatting/html/string_spec.rb +1 -1
- data/spec/formatting/sql/string_spec.rb +55 -0
- data/spec/formatting/text/string_spec.rb +110 -0
- data/spec/network/ssl_spec.rb +10 -4
- data/spec/ui/classes/test_shell.rb +22 -0
- data/spec/ui/output_spec.rb +32 -0
- data/spec/ui/shell_spec.rb +79 -0
- metadata +132 -90
@@ -0,0 +1,146 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
|
3
|
+
#
|
4
|
+
# This file is part of Ronin Support.
|
5
|
+
#
|
6
|
+
# Ronin Support is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Lesser General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Ronin Support is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public License
|
17
|
+
# along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#
|
19
|
+
|
20
|
+
require 'ronin/ui/output/terminal/raw'
|
21
|
+
require 'ronin/ui/output/terminal/color'
|
22
|
+
|
23
|
+
module Ronin
|
24
|
+
module UI
|
25
|
+
#
|
26
|
+
# Controls {Output} from Ronin.
|
27
|
+
#
|
28
|
+
module Output
|
29
|
+
@mode = if ($VERBOSE || $DEBUG || ENV['VERBOSE'])
|
30
|
+
:verbose
|
31
|
+
else
|
32
|
+
:quiet
|
33
|
+
end
|
34
|
+
|
35
|
+
@handler = if STDOUT.tty?
|
36
|
+
Terminal::Color
|
37
|
+
else
|
38
|
+
Terminal::Raw
|
39
|
+
end
|
40
|
+
|
41
|
+
#
|
42
|
+
# @return [Boolean]
|
43
|
+
# Specifies whether verbose output is enabled.
|
44
|
+
#
|
45
|
+
# @since 0.3.0
|
46
|
+
#
|
47
|
+
# @api semipublic
|
48
|
+
#
|
49
|
+
def Output.verbose?
|
50
|
+
@mode == :verbose
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# @return [Boolean]
|
55
|
+
# Specifies whether quiet output is enabled.
|
56
|
+
#
|
57
|
+
# @since 0.3.0
|
58
|
+
#
|
59
|
+
# @api semipublic
|
60
|
+
#
|
61
|
+
def Output.quiet?
|
62
|
+
@mode == :quiet
|
63
|
+
end
|
64
|
+
|
65
|
+
#
|
66
|
+
# @return [Boolean]
|
67
|
+
# Specifies whether silent output is enabled.
|
68
|
+
#
|
69
|
+
# @since 0.3.0
|
70
|
+
#
|
71
|
+
# @api semipublic
|
72
|
+
#
|
73
|
+
def Output.silent?
|
74
|
+
@mode == :silent
|
75
|
+
end
|
76
|
+
|
77
|
+
#
|
78
|
+
# Enables verbose output.
|
79
|
+
#
|
80
|
+
# @return [Output]
|
81
|
+
#
|
82
|
+
# @since 1.0.0
|
83
|
+
#
|
84
|
+
# @api semipublic
|
85
|
+
#
|
86
|
+
def Output.verbose!
|
87
|
+
@mode = :verbose
|
88
|
+
return self
|
89
|
+
end
|
90
|
+
|
91
|
+
#
|
92
|
+
# Disables verbose output.
|
93
|
+
#
|
94
|
+
# @return [Output]
|
95
|
+
#
|
96
|
+
# @since 1.0.0
|
97
|
+
#
|
98
|
+
# @api semipublic
|
99
|
+
#
|
100
|
+
def Output.quiet!
|
101
|
+
@mode = :quiet
|
102
|
+
return self
|
103
|
+
end
|
104
|
+
|
105
|
+
#
|
106
|
+
# Disables all output.
|
107
|
+
#
|
108
|
+
# @return [Output]
|
109
|
+
#
|
110
|
+
# @since 1.0.0
|
111
|
+
#
|
112
|
+
def Output.silent!
|
113
|
+
@mode = :silent
|
114
|
+
return self
|
115
|
+
end
|
116
|
+
|
117
|
+
#
|
118
|
+
# @return [Ronin::UI::Output::Handler]
|
119
|
+
# The current Output handler.
|
120
|
+
#
|
121
|
+
# @since 0.3.0
|
122
|
+
#
|
123
|
+
# @api semipublic
|
124
|
+
#
|
125
|
+
def Output.handler
|
126
|
+
@handler
|
127
|
+
end
|
128
|
+
|
129
|
+
#
|
130
|
+
# Sets the current Output handler.
|
131
|
+
#
|
132
|
+
# @param [Handler] new_handler
|
133
|
+
# The new output handler to use. Must provide the `puts`,
|
134
|
+
# `print_info`, `print_debug`, `print_warning` and `print_error`
|
135
|
+
# class methods.
|
136
|
+
#
|
137
|
+
# @since 0.3.0
|
138
|
+
#
|
139
|
+
# @api semipublic
|
140
|
+
#
|
141
|
+
def Output.handler=(new_handler)
|
142
|
+
@handler = new_handler
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
|
3
|
+
#
|
4
|
+
# This file is part of Ronin Support.
|
5
|
+
#
|
6
|
+
# Ronin Support is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Lesser General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Ronin Support is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public License
|
17
|
+
# along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#
|
19
|
+
|
20
|
+
require 'ronin/ui/output/terminal/raw'
|
21
|
+
require 'ronin/ui/output/terminal/color'
|
@@ -0,0 +1,118 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
|
3
|
+
#
|
4
|
+
# This file is part of Ronin Support.
|
5
|
+
#
|
6
|
+
# Ronin Support is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Lesser General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Ronin Support is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public License
|
17
|
+
# along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#
|
19
|
+
|
20
|
+
module Ronin
|
21
|
+
module UI
|
22
|
+
module Output
|
23
|
+
module Terminal
|
24
|
+
#
|
25
|
+
# The handler for color output to the terminal.
|
26
|
+
#
|
27
|
+
class Color
|
28
|
+
|
29
|
+
# ANSI Green code
|
30
|
+
GREEN = "\e[32m"
|
31
|
+
|
32
|
+
# ANSI Cyan code
|
33
|
+
CYAN = "\e[36m"
|
34
|
+
|
35
|
+
# ANSI Yellow code
|
36
|
+
YELLOW = "\e[33m"
|
37
|
+
|
38
|
+
# ANSI Red code
|
39
|
+
RED = "\e[31m"
|
40
|
+
|
41
|
+
# ANSI Clear code
|
42
|
+
CLEAR = "\e[0m"
|
43
|
+
|
44
|
+
#
|
45
|
+
# Writes data to `STDOUT`.
|
46
|
+
#
|
47
|
+
# @param [String] data
|
48
|
+
# The data to write.
|
49
|
+
#
|
50
|
+
# @since 1.0.0
|
51
|
+
#
|
52
|
+
# @api private
|
53
|
+
#
|
54
|
+
def self.write(data)
|
55
|
+
STDOUT.write(data)
|
56
|
+
end
|
57
|
+
|
58
|
+
#
|
59
|
+
# Prints an `info` message.
|
60
|
+
#
|
61
|
+
# @param [String] message
|
62
|
+
# The message to print.
|
63
|
+
#
|
64
|
+
# @since 1.0.0
|
65
|
+
#
|
66
|
+
# @api private
|
67
|
+
#
|
68
|
+
def self.print_info(message)
|
69
|
+
puts "#{GREEN}[-] #{message}#{CLEAR}"
|
70
|
+
end
|
71
|
+
|
72
|
+
#
|
73
|
+
# Prints a `debug` message.
|
74
|
+
#
|
75
|
+
# @param [String] message
|
76
|
+
# The message to print.
|
77
|
+
#
|
78
|
+
# @since 1.0.0
|
79
|
+
#
|
80
|
+
# @api private
|
81
|
+
#
|
82
|
+
def self.print_debug(message)
|
83
|
+
puts "#{CYAN}[=] #{message}#{CLEAR}"
|
84
|
+
end
|
85
|
+
|
86
|
+
#
|
87
|
+
# Prints a `warning` message.
|
88
|
+
#
|
89
|
+
# @param [String] message
|
90
|
+
# The message to print.
|
91
|
+
#
|
92
|
+
# @since 1.0.0
|
93
|
+
#
|
94
|
+
# @api private
|
95
|
+
#
|
96
|
+
def self.print_warning(message)
|
97
|
+
puts "#{YELLOW}[*] #{message}#{CLEAR}"
|
98
|
+
end
|
99
|
+
|
100
|
+
#
|
101
|
+
# Prints an `error` message.
|
102
|
+
#
|
103
|
+
# @param [String] message
|
104
|
+
# The message to print.
|
105
|
+
#
|
106
|
+
# @since 1.0.0
|
107
|
+
#
|
108
|
+
# @api private
|
109
|
+
#
|
110
|
+
def self.print_error(message)
|
111
|
+
puts "#{RED}[!] #{message}#{CLEAR}"
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
|
3
|
+
#
|
4
|
+
# This file is part of Ronin Support.
|
5
|
+
#
|
6
|
+
# Ronin Support is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Lesser General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Ronin Support is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public License
|
17
|
+
# along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#
|
19
|
+
|
20
|
+
module Ronin
|
21
|
+
module UI
|
22
|
+
module Output
|
23
|
+
module Terminal
|
24
|
+
#
|
25
|
+
# The handler for raw output to the terminal.
|
26
|
+
#
|
27
|
+
class Raw
|
28
|
+
|
29
|
+
#
|
30
|
+
# Writes data to `STDOUT`.
|
31
|
+
#
|
32
|
+
# @param [String] data
|
33
|
+
# The data to write.
|
34
|
+
#
|
35
|
+
# @since 1.0.0
|
36
|
+
#
|
37
|
+
# @api private
|
38
|
+
#
|
39
|
+
def self.write(data)
|
40
|
+
STDOUT.write(data)
|
41
|
+
end
|
42
|
+
|
43
|
+
#
|
44
|
+
# Prints an `info` message.
|
45
|
+
#
|
46
|
+
# @param [String] message
|
47
|
+
# The message to print.
|
48
|
+
#
|
49
|
+
# @since 1.0.0
|
50
|
+
#
|
51
|
+
# @api private
|
52
|
+
#
|
53
|
+
def self.print_info(message)
|
54
|
+
puts "[-] #{message}"
|
55
|
+
end
|
56
|
+
|
57
|
+
#
|
58
|
+
# Prints a `debug` message.
|
59
|
+
#
|
60
|
+
# @param [String] message
|
61
|
+
# The message to print.
|
62
|
+
#
|
63
|
+
# @since 1.0.0
|
64
|
+
#
|
65
|
+
# @api private
|
66
|
+
#
|
67
|
+
def self.print_debug(message)
|
68
|
+
puts "[=] #{message}"
|
69
|
+
end
|
70
|
+
|
71
|
+
#
|
72
|
+
# Prints a `warning` message.
|
73
|
+
#
|
74
|
+
# @param [String] message
|
75
|
+
# The message to print.
|
76
|
+
#
|
77
|
+
# @since 1.0.0
|
78
|
+
#
|
79
|
+
# @api private
|
80
|
+
#
|
81
|
+
def self.print_warning(message)
|
82
|
+
puts "[*] #{message}"
|
83
|
+
end
|
84
|
+
|
85
|
+
#
|
86
|
+
# Prints an `error` messages.
|
87
|
+
#
|
88
|
+
# @param [String] message
|
89
|
+
# The message to print.
|
90
|
+
#
|
91
|
+
# @since 1.0.0
|
92
|
+
#
|
93
|
+
# @api private
|
94
|
+
#
|
95
|
+
def self.print_error(message)
|
96
|
+
puts "[!] #{message}"
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,219 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
|
3
|
+
#
|
4
|
+
# This file is part of Ronin Support.
|
5
|
+
#
|
6
|
+
# Ronin Support is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Lesser General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Ronin Support is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public License
|
17
|
+
# along with Ronin Support. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#
|
19
|
+
|
20
|
+
require 'ronin/ui/output/helpers'
|
21
|
+
|
22
|
+
require 'set'
|
23
|
+
|
24
|
+
module Ronin
|
25
|
+
module UI
|
26
|
+
#
|
27
|
+
# Spawns a ReadLine powered interactive Shell.
|
28
|
+
#
|
29
|
+
# @api semipublic
|
30
|
+
#
|
31
|
+
class Shell
|
32
|
+
|
33
|
+
include Output::Helpers
|
34
|
+
|
35
|
+
# Default shell prompt
|
36
|
+
DEFAULT_PROMPT = '>'
|
37
|
+
|
38
|
+
# The shell name
|
39
|
+
attr_accessor :name
|
40
|
+
|
41
|
+
# The shell prompt
|
42
|
+
attr_accessor :prompt
|
43
|
+
|
44
|
+
# The commands available for the shell
|
45
|
+
attr_reader :commands
|
46
|
+
|
47
|
+
#
|
48
|
+
# Creates a new shell.
|
49
|
+
#
|
50
|
+
# @param [Hash] options
|
51
|
+
# Additional options.
|
52
|
+
#
|
53
|
+
# @option options [String] :name ('')
|
54
|
+
# The shell-name to use before the prompt.
|
55
|
+
#
|
56
|
+
# @option options [String] :prompt (DEFAULT_PROMPT)
|
57
|
+
# The prompt to use for the shell.
|
58
|
+
#
|
59
|
+
# @yield [shell, line]
|
60
|
+
# The block that will be passed every command entered.
|
61
|
+
#
|
62
|
+
# @yieldparam [Shell] shell
|
63
|
+
# The shell to use for output.
|
64
|
+
#
|
65
|
+
# @yieldparam [String] line
|
66
|
+
# The command entered into the shell.
|
67
|
+
#
|
68
|
+
# @api semipublic
|
69
|
+
#
|
70
|
+
# @since 0.3.0
|
71
|
+
#
|
72
|
+
def initialize(options={},&block)
|
73
|
+
@name = options.fetch(:name,'')
|
74
|
+
@prompt = options.fetch(:prompt,DEFAULT_PROMPT)
|
75
|
+
|
76
|
+
@commands = Set[:help, :exit]
|
77
|
+
@commands += protected_methods.map { |name| name.to_sym }
|
78
|
+
|
79
|
+
@input_handler = block
|
80
|
+
end
|
81
|
+
|
82
|
+
#
|
83
|
+
# Creates a new Shell object and starts it.
|
84
|
+
#
|
85
|
+
# @param [Array] arguments
|
86
|
+
# Arguments for {#initialize}.
|
87
|
+
#
|
88
|
+
# @yield [shell, line]
|
89
|
+
# The block that will be passed every command entered.
|
90
|
+
#
|
91
|
+
# @yieldparam [Shell] shell
|
92
|
+
# The shell to use for output.
|
93
|
+
#
|
94
|
+
# @yieldparam [String] line
|
95
|
+
# The command entered into the shell.
|
96
|
+
#
|
97
|
+
# @return [nil]
|
98
|
+
#
|
99
|
+
# @example
|
100
|
+
# Shell.start(:prompt => '$') { |shell,line| system(line) }
|
101
|
+
#
|
102
|
+
def self.start(*arguments,&block)
|
103
|
+
new(*arguments,&block).start
|
104
|
+
end
|
105
|
+
|
106
|
+
#
|
107
|
+
# Starts the shell.
|
108
|
+
#
|
109
|
+
# @since 0.3.0
|
110
|
+
#
|
111
|
+
def start
|
112
|
+
history_rollback = 0
|
113
|
+
|
114
|
+
loop do
|
115
|
+
unless (raw_line = Readline.readline("#{name}#{prompt} "))
|
116
|
+
break # user exited the shell
|
117
|
+
end
|
118
|
+
|
119
|
+
line = raw_line.strip
|
120
|
+
|
121
|
+
if (line == 'exit' || line == 'quit')
|
122
|
+
exit
|
123
|
+
break
|
124
|
+
elsif !(line.empty?)
|
125
|
+
Readline::HISTORY << raw_line
|
126
|
+
history_rollback += 1
|
127
|
+
|
128
|
+
begin
|
129
|
+
handler(line)
|
130
|
+
rescue => e
|
131
|
+
print_error "#{e.class.name}: #{e.message}"
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
history_rollback.times { Readline::HISTORY.pop }
|
137
|
+
return nil
|
138
|
+
end
|
139
|
+
|
140
|
+
#
|
141
|
+
# Handles input for the shell.
|
142
|
+
#
|
143
|
+
# @param [String] line
|
144
|
+
# A line of input received by the shell.
|
145
|
+
#
|
146
|
+
# @since 0.3.0
|
147
|
+
#
|
148
|
+
def call(line)
|
149
|
+
if @input_handler
|
150
|
+
@input_handler.call(self,line)
|
151
|
+
else
|
152
|
+
arguments = line.split(/\s+/)
|
153
|
+
command = arguments.shift
|
154
|
+
|
155
|
+
# ignore empty lines
|
156
|
+
return false unless command
|
157
|
+
|
158
|
+
command = command.to_sym
|
159
|
+
|
160
|
+
# no explicitly calling handler
|
161
|
+
return false if command == :handler
|
162
|
+
|
163
|
+
unless @commands.include?(command)
|
164
|
+
print_error "Invalid command: #{command}"
|
165
|
+
return false
|
166
|
+
end
|
167
|
+
|
168
|
+
return send(command,*arguments)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
protected
|
173
|
+
|
174
|
+
#
|
175
|
+
# Method which is called before exiting the shell.
|
176
|
+
#
|
177
|
+
# @since 0.3.0
|
178
|
+
#
|
179
|
+
def exit
|
180
|
+
end
|
181
|
+
|
182
|
+
#
|
183
|
+
# @see #exit
|
184
|
+
#
|
185
|
+
# @since 0.3.0
|
186
|
+
#
|
187
|
+
def quit
|
188
|
+
exit
|
189
|
+
end
|
190
|
+
|
191
|
+
#
|
192
|
+
# Prints the available commands and their arguments.
|
193
|
+
#
|
194
|
+
# @since 0.3.0
|
195
|
+
#
|
196
|
+
def help
|
197
|
+
puts "Available commands:"
|
198
|
+
puts
|
199
|
+
|
200
|
+
@commands.sort.each do |name|
|
201
|
+
command_method = method(name)
|
202
|
+
arguments = command_method.parameters.map do |param|
|
203
|
+
case param[0]
|
204
|
+
when :opt
|
205
|
+
"[#{param[1]}]"
|
206
|
+
when :rest
|
207
|
+
"[#{param[1]} ...]"
|
208
|
+
else
|
209
|
+
param[1]
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
puts " #{name} #{arguments.join(' ')}"
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|