Class: Rex::IO::BidirectionalPipe

Inherits:
Ui::Text::Input show all
Defined in:
lib/rex/io/bidirectional_pipe.rb

Constant Summary

Constants included from Ui::Text::Color

Ui::Text::Color::AnsiAttributes

Instance Attribute Summary collapse

Attributes inherited from Ui::Text::Input

#config, #eof, #prompt_char

Instance Method Summary collapse

Methods inherited from Ui::Text::Input

#auto_color, #disable_color, #enable_color, #reset_color, #reset_tab_completion, #update_prompt

Methods included from Ui::Text::Color

#ansi, #colorize, #do_colorize, #reset_color, #substitute_colors

Constructor Details

#initializeBidirectionalPipe

Returns a new instance of BidirectionalPipe.



10
11
12
13
14
15
16
17
18
19
# File 'lib/rex/io/bidirectional_pipe.rb', line 10

def initialize
	@subscribers_out = {}
	@subscribers_ref = {}
	@subscribers_idx = 0
	@pipe_input = Rex::Ui::Text::Input::Buffer.new

	# We are the shell, the input, and the output
	self.output = self
	self.input  = self
end

Instance Attribute Details

#inputObject

Wrappers for shell methods



132
133
134
# File 'lib/rex/io/bidirectional_pipe.rb', line 132

def input
  @input
end

#outputObject

Wrappers for shell methods



132
133
134
# File 'lib/rex/io/bidirectional_pipe.rb', line 132

def output
  @output
end

#promptObject

Wrappers for shell methods



132
133
134
# File 'lib/rex/io/bidirectional_pipe.rb', line 132

def prompt
  @prompt
end

Instance Method Details

#closeObject

Wrappers for the pipe_input methods



104
105
106
# File 'lib/rex/io/bidirectional_pipe.rb', line 104

def close
	@pipe_input.close
end

#create_subscriber(id = nil) ⇒ Object



33
34
35
36
37
# File 'lib/rex/io/bidirectional_pipe.rb', line 33

def create_subscriber(id=nil)
	id ||= (@subscribers_idx += 1).to_s
	@subscribers_out[id] = Rex::Ui::Text::Output::Buffer.new
	return id
end

#create_subscriber_proc(id = nil, &block) ⇒ Object



39
40
41
42
# File 'lib/rex/io/bidirectional_pipe.rb', line 39

def create_subscriber_proc(id=nil, &block)
	id = create_subscriber(id)
	@subscribers_ref[id] = block
end

#eof?Boolean

Returns:

  • (Boolean)


120
121
122
# File 'lib/rex/io/bidirectional_pipe.rb', line 120

def eof?
	@pipe_input.eof?
end

#fdObject



124
125
126
# File 'lib/rex/io/bidirectional_pipe.rb', line 124

def fd
	@pipe_input.fd
end

#flushObject



93
94
# File 'lib/rex/io/bidirectional_pipe.rb', line 93

def flush
end

#getsObject



116
117
118
# File 'lib/rex/io/bidirectional_pipe.rb', line 116

def gets
	@pipe_input.gets
end

#has_subscriber?(id) ⇒ Boolean

Returns:

  • (Boolean)


29
30
31
# File 'lib/rex/io/bidirectional_pipe.rb', line 29

def has_subscriber?(id)
	@subscribers_out.has_key?(id)
end

#intrinsic_shell?Boolean

Returns:

  • (Boolean)


134
135
136
# File 'lib/rex/io/bidirectional_pipe.rb', line 134

def intrinsic_shell?
	true
end

#pgetsObject



146
147
148
# File 'lib/rex/io/bidirectional_pipe.rb', line 146

def pgets
	gets
end

#pipe_inputObject



21
22
23
# File 'lib/rex/io/bidirectional_pipe.rb', line 21

def pipe_input
	@pipe_input
end


65
66
67
68
69
70
71
72
73
74
75
# File 'lib/rex/io/bidirectional_pipe.rb', line 65

def print(msg='')
	@subscribers_out.each_pair { |id, buf|
		begin
			@subscribers_ref[id] ? @subscribers_ref[id].call(msg) : buf.print(msg)
		rescue ::Exception => e
			# $stderr.puts "Error handling subscriber #{id}: #{e} #{e.backtrace.inspect}"
			raise e
		end
	}
	msg
end


89
90
91
# File 'lib/rex/io/bidirectional_pipe.rb', line 89

def print_debug(msg='')
	print_line('[!] ' + msg)
end


77
78
79
# File 'lib/rex/io/bidirectional_pipe.rb', line 77

def print_error(msg='')
	print_line('[-] ' + msg)
end


85
86
87
# File 'lib/rex/io/bidirectional_pipe.rb', line 85

def print_good(msg='')
	print_line('[+] ' + msg)
end


81
82
83
# File 'lib/rex/io/bidirectional_pipe.rb', line 81

def print_line(msg='')
	print(msg + "\n")
end


96
97
98
# File 'lib/rex/io/bidirectional_pipe.rb', line 96

def print_status(msg='')
	print_line('[*] ' + msg)
end

#put(msg) ⇒ Object



112
113
114
# File 'lib/rex/io/bidirectional_pipe.rb', line 112

def put(msg)
	@pipe_input.put(msg)
end

#read_subscriber(id) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
# File 'lib/rex/io/bidirectional_pipe.rb', line 53

def read_subscriber(id)
	output = @subscribers_out[id]

	return '' if output.nil?

	buf = output.buf

	output.reset

	buf
end

#remove_subscriber(id) ⇒ Object



44
45
46
47
# File 'lib/rex/io/bidirectional_pipe.rb', line 44

def remove_subscriber(id)
	@subscribers_out.delete(id)
	@subscribers_ref.delete(id)
end

#supports_color?Boolean

Returns:

  • (Boolean)


142
143
144
# File 'lib/rex/io/bidirectional_pipe.rb', line 142

def supports_color?
	false
end

#supports_readlineObject



138
139
140
# File 'lib/rex/io/bidirectional_pipe.rb', line 138

def supports_readline
	false
end

#sysread(len = 1) ⇒ Object



108
109
110
# File 'lib/rex/io/bidirectional_pipe.rb', line 108

def sysread(len = 1)
	@pipe_input.sysread(len)
end

#write_input(buf) ⇒ Object



49
50
51
# File 'lib/rex/io/bidirectional_pipe.rb', line 49

def write_input(buf)
	@pipe_input.put(buf)
end