Class: ProxyMachine

Inherits:
Object
  • Object
show all
Defined in:
lib/proxymachine.rb,
lib/proxymachine/client_connection.rb,
lib/proxymachine/server_connection.rb,
lib/proxymachine/warning_server_connection.rb,
lib/proxymachine/callback_server_connection.rb

Defined Under Namespace

Classes: CallbackServerConnection, ClientConnection, ServerConnection, WarningServerConnection

Constant Summary collapse

VERSION =
'1.5.4'
MAX_FAST_SHUTDOWN_SECONDS =
10

Class Method Summary collapse

Class Method Details

.connect_error_callbackObject



84
85
86
# File 'lib/proxymachine.rb', line 84

def self.connect_error_callback
  @@connect_error_callback
end

.countObject



27
28
29
# File 'lib/proxymachine.rb', line 27

def self.count
  @@counter
end

.decr(client = nil) ⇒ Object



40
41
42
43
44
45
46
47
48
49
# File 'lib/proxymachine.rb', line 40

def self.decr(client = nil)
  @@decr_callback &&@@decr_callback.call(client)
  @@counter -= 1
  if $server.nil?
    $logger.info "Waiting for #{@@counter} connections to finish."
  end
  self.update_procline
  EM.stop if $server.nil? and @@counter == 0
  @@counter
end

.decr_callback(&block) ⇒ Object



108
109
110
# File 'lib/proxymachine.rb', line 108

def self.decr_callback(&block)
  @@decr_callback
end

.fast_shutdown(signal) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/proxymachine.rb', line 67

def self.fast_shutdown(signal)
  EM.stop_server($server) if $server
  $logger.info "Received #{signal} signal. No longer accepting new connections."
  $logger.info "Maximum time to wait for connections is #{MAX_FAST_SHUTDOWN_SECONDS} seconds."
  $logger.info "Waiting for #{ProxyMachine.count} connections to finish."
  $server = nil
  EM.stop if ProxyMachine.count == 0
  Thread.new do
    sleep MAX_FAST_SHUTDOWN_SECONDS
    exit!
  end
end

.graceful_shutdown(signal) ⇒ Object



59
60
61
62
63
64
65
# File 'lib/proxymachine.rb', line 59

def self.graceful_shutdown(signal)
  EM.stop_server($server) if $server
  $logger.info "Received #{signal} signal. No longer accepting new connections."
  $logger.info "Waiting for #{ProxyMachine.count} connections to finish."
  $server = nil
  EM.stop if ProxyMachine.count == 0
end

.inactivity_error_callbackObject



112
113
114
# File 'lib/proxymachine.rb', line 112

def self.inactivity_error_callback
  @@inactivity_error_callback
end

.inactivity_warning_callbackObject



116
117
118
# File 'lib/proxymachine.rb', line 116

def self.inactivity_warning_callback
  @@inactivity_warning_callback
end

.incr(client = nil) ⇒ Object



31
32
33
34
35
36
37
38
# File 'lib/proxymachine.rb', line 31

def self.incr(client = nil)
  @@incr_callback && @@incr_callback.call(client)
  @@totalcounter += 1
  @@counter += 1
  @@maxcounter = @@counter if @@counter > @@maxcounter
  self.update_procline
  @@counter
end

.incr_callback(&block) ⇒ Object



104
105
106
# File 'lib/proxymachine.rb', line 104

def self.incr_callback(&block)
  @@incr_callback
end

.routerObject



55
56
57
# File 'lib/proxymachine.rb', line 55

def self.router
  @@router
end

.run(name, host, port) ⇒ Object



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/proxymachine.rb', line 120

def self.run(name, host, port)
  @@totalcounter = 0
  @@maxcounter = 0
  @@counter = 0
  @@name = name
  @@listen = "#{host}:#{port}"
  @@connect_error_callback ||= proc { |remote| }
  @@inactivity_error_callback ||= proc { |remote| }
  @@inactivity_warning_callback ||= proc { |remote| }
  @@incr_callback ||= proc { |remote| }
  @@decr_callback ||= proc { |remote| }

  self.update_procline
  EM.epoll

  EM.run do
    ProxyMachine::ClientConnection.start(host, port)
    trap('QUIT') do
      self.graceful_shutdown('QUIT')
    end
    trap('TERM') do
      self.fast_shutdown('TERM')
    end
    trap('INT') do
      self.fast_shutdown('INT')
    end
  end
end

.set_connect_error_callback(&block) ⇒ Object



80
81
82
# File 'lib/proxymachine.rb', line 80

def self.set_connect_error_callback(&block)
  @@connect_error_callback = block
end

.set_decr_callback(&block) ⇒ Object



100
101
102
# File 'lib/proxymachine.rb', line 100

def self.set_decr_callback(&block)
  @@decr_callback = block
end

.set_inactivity_error_callback(&block) ⇒ Object



88
89
90
# File 'lib/proxymachine.rb', line 88

def self.set_inactivity_error_callback(&block)
  @@inactivity_error_callback = block
end

.set_inactivity_warning_callback(&block) ⇒ Object



92
93
94
# File 'lib/proxymachine.rb', line 92

def self.set_inactivity_warning_callback(&block)
  @@inactivity_warning_callback = block
end

.set_incr_callback(&block) ⇒ Object



96
97
98
# File 'lib/proxymachine.rb', line 96

def self.set_incr_callback(&block)
  @@incr_callback = block
end

.set_router(block) ⇒ Object



51
52
53
# File 'lib/proxymachine.rb', line 51

def self.set_router(block)
  @@router = block
end

.statsObject



23
24
25
# File 'lib/proxymachine.rb', line 23

def self.stats
  "#{@@counter}/#{@@maxcounter}/#{@@totalcounter}"
end

.update_proclineObject



19
20
21
# File 'lib/proxymachine.rb', line 19

def self.update_procline
  $0 = "proxymachine #{VERSION} - #{@@name} #{@@listen} - #{self.stats} cur/max/tot conns"
end