forked from codegram/rack-webconsole
/
shell.rb
53 lines (45 loc) · 1.23 KB
/
shell.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
require 'ripl'
class Rack::Webconsole
module Shell
def self.eval_query(query)
Ripl.shell.input = query
Ripl.shell.loop_once
Ripl.shell.return_result
end
def get_input
history << @input
@input
end
def loop_eval(query)
# Force conversion to symbols due to issues with lovely 1.8.7
boilerplate = local_variables.map(&:to_sym) + [:ls]
$sandbox.instance_eval """
result = (#{query})
ls = (local_variables.map(&:to_sym) - [#{boilerplate.map(&:inspect).join(', ')}])
@locals ||= {}
@locals.update(ls.inject({}) do |hash, value|
hash.update({value => eval(value.to_s)})
end)
result
"""
end
def print_eval_error(err)
@result = "Error: " + err.message
end
def return_result
@error_raised ? result : result.inspect
end
# Disable unused callbacks
def print_result(result) end
def before_loop() end
end
end
# Disable readline's #get_input
Ripl.config[:readline] = false
# Let ripl users detect web shells
Ripl.config[:web] = true
Ripl::Shell.include Rack::Webconsole::Shell
# must come after Webconsole plugin
require 'ripl/multi_line'
# Initialize ripl plugins
Ripl.shell.before_loop