Class: Rex::Post::Meterpreter::PacketResponseWaiter

Inherits:
Object
  • Object
show all
Defined in:
lib/rex/post/meterpreter/packet_response_waiter.rb

Overview

This class handles waiting for a response to a given request and the subsequent response association.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(rid, completion_routine = nil, completion_param = nil) ⇒ PacketResponseWaiter

Initializes a response waiter instance for the supplied request identifier.



22
23
24
25
26
27
28
29
30
31
32
# File 'lib/rex/post/meterpreter/packet_response_waiter.rb', line 22

def initialize(rid, completion_routine = nil, completion_param = nil)
	self.rid      = rid.dup
	self.response = nil

	if (completion_routine)
		self.completion_routine = completion_routine
		self.completion_param   = completion_param
	else
		self.done  = false
	end
end

Instance Attribute Details

#completion_paramObject

:nodoc:



79
80
81
# File 'lib/rex/post/meterpreter/packet_response_waiter.rb', line 79

def completion_param
  @completion_param
end

#completion_routineObject

:nodoc:



79
80
81
# File 'lib/rex/post/meterpreter/packet_response_waiter.rb', line 79

def completion_routine
  @completion_routine
end

#doneObject

:nodoc:



78
79
80
# File 'lib/rex/post/meterpreter/packet_response_waiter.rb', line 78

def done
  @done
end

#responseObject

:nodoc:



78
79
80
# File 'lib/rex/post/meterpreter/packet_response_waiter.rb', line 78

def response
  @response
end

#ridObject

:nodoc:



78
79
80
# File 'lib/rex/post/meterpreter/packet_response_waiter.rb', line 78

def rid
  @rid
end

Instance Method Details

#notify(response) ⇒ Object

Notifies the waiter that the supplied response packet has arrived.



45
46
47
48
49
50
51
52
53
# File 'lib/rex/post/meterpreter/packet_response_waiter.rb', line 45

def notify(response)
	self.response = response

	if (self.completion_routine)
		self.completion_routine.call(response, self.completion_param)
	else
		self.done = true
	end
end

#wait(interval) ⇒ Object

Waits for a given time interval for the response packet to arrive. If the interval is -1 we can wait forever.



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/rex/post/meterpreter/packet_response_waiter.rb', line 59

def wait(interval)
	if( interval and interval == -1 )
		while(not self.done)
			::IO.select(nil, nil, nil, 0.1)
		end
	else
		begin
			Timeout.timeout(interval) {
				while(not self.done)
					::IO.select(nil, nil, nil, 0.1)
				end
			}
		rescue Timeout::Error
			self.response = nil
		end
	end
	return self.response
end

#waiting_for?(packet) ⇒ Boolean

Checks to see if this waiter instance is waiting for the supplied packet based on its request identifier.

Returns:

  • (Boolean)


38
39
40
# File 'lib/rex/post/meterpreter/packet_response_waiter.rb', line 38

def waiting_for?(packet)
	return (packet.rid == rid)
end