bayserver-core 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +7 -0
  2. data/lib/baykit/bayserver/agent/accept_handler.rb +97 -0
  3. data/lib/baykit/bayserver/agent/channel_listener.rb +35 -0
  4. data/lib/baykit/bayserver/agent/command_receiver.rb +75 -0
  5. data/lib/baykit/bayserver/agent/grand_agent.rb +319 -0
  6. data/lib/baykit/bayserver/agent/grand_agent_monitor.rb +217 -0
  7. data/lib/baykit/bayserver/agent/next_socket_action.rb +14 -0
  8. data/lib/baykit/bayserver/agent/non_blocking_handler.rb +433 -0
  9. data/lib/baykit/bayserver/agent/package.rb +3 -0
  10. data/lib/baykit/bayserver/agent/signal/signal_agent.rb +165 -0
  11. data/lib/baykit/bayserver/agent/signal/signal_proxy.rb +18 -0
  12. data/lib/baykit/bayserver/agent/signal/signal_sender.rb +99 -0
  13. data/lib/baykit/bayserver/agent/spin_handler.rb +140 -0
  14. data/lib/baykit/bayserver/agent/transporter/data_listener.rb +38 -0
  15. data/lib/baykit/bayserver/agent/transporter/package.rb +3 -0
  16. data/lib/baykit/bayserver/agent/transporter/plain_transporter.rb +55 -0
  17. data/lib/baykit/bayserver/agent/transporter/secure_transporter.rb +81 -0
  18. data/lib/baykit/bayserver/agent/transporter/spin_read_transporter.rb +111 -0
  19. data/lib/baykit/bayserver/agent/transporter/spin_write_transporter.rb +125 -0
  20. data/lib/baykit/bayserver/agent/transporter/transporter.rb +466 -0
  21. data/lib/baykit/bayserver/agent/upgrade_exception.rb +11 -0
  22. data/lib/baykit/bayserver/bay_dockers.rb +60 -0
  23. data/lib/baykit/bayserver/bay_exception.rb +12 -0
  24. data/lib/baykit/bayserver/bay_log.rb +148 -0
  25. data/lib/baykit/bayserver/bay_message.rb +20 -0
  26. data/lib/baykit/bayserver/bayserver.rb +529 -0
  27. data/lib/baykit/bayserver/bcf/bcf_document.rb +44 -0
  28. data/lib/baykit/bayserver/bcf/bcf_element.rb +30 -0
  29. data/lib/baykit/bayserver/bcf/bcf_key_val.rb +19 -0
  30. data/lib/baykit/bayserver/bcf/bcf_object.rb +15 -0
  31. data/lib/baykit/bayserver/bcf/bcf_parser.rb +180 -0
  32. data/lib/baykit/bayserver/bcf/package.rb +6 -0
  33. data/lib/baykit/bayserver/bcf/parse_exception.rb +15 -0
  34. data/lib/baykit/bayserver/config_exception.rb +25 -0
  35. data/lib/baykit/bayserver/constants.rb +8 -0
  36. data/lib/baykit/bayserver/docker/base/club_base.rb +117 -0
  37. data/lib/baykit/bayserver/docker/base/docker_base.rb +66 -0
  38. data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +89 -0
  39. data/lib/baykit/bayserver/docker/base/inbound_handler.rb +42 -0
  40. data/lib/baykit/bayserver/docker/base/inbound_ship.rb +341 -0
  41. data/lib/baykit/bayserver/docker/base/inbound_ship_store.rb +65 -0
  42. data/lib/baykit/bayserver/docker/base/port_base.rb +228 -0
  43. data/lib/baykit/bayserver/docker/base/reroute_base.rb +28 -0
  44. data/lib/baykit/bayserver/docker/built_in/built_in_city_docker.rb +303 -0
  45. data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +226 -0
  46. data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +302 -0
  47. data/lib/baykit/bayserver/docker/built_in/built_in_permission_docker.rb +242 -0
  48. data/lib/baykit/bayserver/docker/built_in/built_in_secure_docker.rb +157 -0
  49. data/lib/baykit/bayserver/docker/built_in/built_in_town_docker.rb +117 -0
  50. data/lib/baykit/bayserver/docker/built_in/built_in_trouble_docker.rb +57 -0
  51. data/lib/baykit/bayserver/docker/built_in/log_boat.rb +71 -0
  52. data/lib/baykit/bayserver/docker/built_in/log_item.rb +18 -0
  53. data/lib/baykit/bayserver/docker/built_in/log_item_factory.rb +18 -0
  54. data/lib/baykit/bayserver/docker/built_in/log_items.rb +287 -0
  55. data/lib/baykit/bayserver/docker/built_in/write_file_taxi.rb +101 -0
  56. data/lib/baykit/bayserver/docker/city.rb +22 -0
  57. data/lib/baykit/bayserver/docker/club.rb +45 -0
  58. data/lib/baykit/bayserver/docker/docker.rb +8 -0
  59. data/lib/baykit/bayserver/docker/harbor.rb +34 -0
  60. data/lib/baykit/bayserver/docker/log.rb +17 -0
  61. data/lib/baykit/bayserver/docker/package.rb +12 -0
  62. data/lib/baykit/bayserver/docker/permission.rb +18 -0
  63. data/lib/baykit/bayserver/docker/port.rb +39 -0
  64. data/lib/baykit/bayserver/docker/reroute.rb +17 -0
  65. data/lib/baykit/bayserver/docker/secure.rb +22 -0
  66. data/lib/baykit/bayserver/docker/send_file/directory_train.rb +123 -0
  67. data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +43 -0
  68. data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +71 -0
  69. data/lib/baykit/bayserver/docker/town.rb +30 -0
  70. data/lib/baykit/bayserver/docker/trouble.rb +17 -0
  71. data/lib/baykit/bayserver/docker/warp/package.rb +4 -0
  72. data/lib/baykit/bayserver/docker/warp/warp_data.rb +84 -0
  73. data/lib/baykit/bayserver/docker/warp/warp_data_listener.rb +112 -0
  74. data/lib/baykit/bayserver/docker/warp/warp_docker.rb +273 -0
  75. data/lib/baykit/bayserver/docker/warp/warp_handler.rb +38 -0
  76. data/lib/baykit/bayserver/docker/warp/warp_ship.rb +166 -0
  77. data/lib/baykit/bayserver/docker/warp/warp_ship_store.rb +111 -0
  78. data/lib/baykit/bayserver/http_exception.rb +33 -0
  79. data/lib/baykit/bayserver/mem_usage.rb +104 -0
  80. data/lib/baykit/bayserver/protocol/command.rb +21 -0
  81. data/lib/baykit/bayserver/protocol/command_handler.rb +9 -0
  82. data/lib/baykit/bayserver/protocol/command_packer.rb +49 -0
  83. data/lib/baykit/bayserver/protocol/command_unpacker.rb +13 -0
  84. data/lib/baykit/bayserver/protocol/package.rb +15 -0
  85. data/lib/baykit/bayserver/protocol/packet.rb +63 -0
  86. data/lib/baykit/bayserver/protocol/packet_factory.rb +13 -0
  87. data/lib/baykit/bayserver/protocol/packet_packer.rb +30 -0
  88. data/lib/baykit/bayserver/protocol/packet_part_accessor.rb +122 -0
  89. data/lib/baykit/bayserver/protocol/packet_store.rb +139 -0
  90. data/lib/baykit/bayserver/protocol/packet_unpacker.rb +17 -0
  91. data/lib/baykit/bayserver/protocol/protocol_exception.rb +17 -0
  92. data/lib/baykit/bayserver/protocol/protocol_handler.rb +64 -0
  93. data/lib/baykit/bayserver/protocol/protocol_handler_factory.rb +14 -0
  94. data/lib/baykit/bayserver/protocol/protocol_handler_store.rb +109 -0
  95. data/lib/baykit/bayserver/sink.rb +22 -0
  96. data/lib/baykit/bayserver/taxi/taxi.rb +38 -0
  97. data/lib/baykit/bayserver/taxi/taxi_runner.rb +31 -0
  98. data/lib/baykit/bayserver/tours/content_consume_listener.rb +20 -0
  99. data/lib/baykit/bayserver/tours/package.rb +4 -0
  100. data/lib/baykit/bayserver/tours/read_file_taxi.rb +102 -0
  101. data/lib/baykit/bayserver/tours/req_content_handler.rb +37 -0
  102. data/lib/baykit/bayserver/tours/send_file_train.rb +65 -0
  103. data/lib/baykit/bayserver/tours/send_file_yacht.rb +93 -0
  104. data/lib/baykit/bayserver/tours/tour.rb +195 -0
  105. data/lib/baykit/bayserver/tours/tour_req.rb +251 -0
  106. data/lib/baykit/bayserver/tours/tour_res.rb +400 -0
  107. data/lib/baykit/bayserver/tours/tour_store.rb +121 -0
  108. data/lib/baykit/bayserver/train/train.rb +54 -0
  109. data/lib/baykit/bayserver/train/train_runner.rb +32 -0
  110. data/lib/baykit/bayserver/util/byte_array.rb +54 -0
  111. data/lib/baykit/bayserver/util/byte_buffer.rb +13 -0
  112. data/lib/baykit/bayserver/util/cgi_util.rb +165 -0
  113. data/lib/baykit/bayserver/util/char_util.rb +22 -0
  114. data/lib/baykit/bayserver/util/cities.rb +45 -0
  115. data/lib/baykit/bayserver/util/class_util.rb +17 -0
  116. data/lib/baykit/bayserver/util/counter.rb +23 -0
  117. data/lib/baykit/bayserver/util/data_consume_listener.rb +13 -0
  118. data/lib/baykit/bayserver/util/executor_service.rb +81 -0
  119. data/lib/baykit/bayserver/util/groups.rb +110 -0
  120. data/lib/baykit/bayserver/util/gzip_compressor.rb +55 -0
  121. data/lib/baykit/bayserver/util/headers.rb +194 -0
  122. data/lib/baykit/bayserver/util/host_matcher.rb +48 -0
  123. data/lib/baykit/bayserver/util/http_status.rb +60 -0
  124. data/lib/baykit/bayserver/util/http_util.rb +157 -0
  125. data/lib/baykit/bayserver/util/io_util.rb +32 -0
  126. data/lib/baykit/bayserver/util/ip_matcher.rb +67 -0
  127. data/lib/baykit/bayserver/util/key_val.rb +15 -0
  128. data/lib/baykit/bayserver/util/key_val_list_parser.rb +53 -0
  129. data/lib/baykit/bayserver/util/locale.rb +30 -0
  130. data/lib/baykit/bayserver/util/md5_password.rb +24 -0
  131. data/lib/baykit/bayserver/util/message.rb +56 -0
  132. data/lib/baykit/bayserver/util/mimes.rb +27 -0
  133. data/lib/baykit/bayserver/util/object_factory.rb +13 -0
  134. data/lib/baykit/bayserver/util/object_store.rb +74 -0
  135. data/lib/baykit/bayserver/util/postman.rb +35 -0
  136. data/lib/baykit/bayserver/util/reusable.rb +13 -0
  137. data/lib/baykit/bayserver/util/selector.rb +141 -0
  138. data/lib/baykit/bayserver/util/simple_buffer.rb +53 -0
  139. data/lib/baykit/bayserver/util/simple_inspect.rb +12 -0
  140. data/lib/baykit/bayserver/util/string_util.rb +73 -0
  141. data/lib/baykit/bayserver/util/sys_util.rb +138 -0
  142. data/lib/baykit/bayserver/util/url_decoder.rb +42 -0
  143. data/lib/baykit/bayserver/util/url_encoder.rb +19 -0
  144. data/lib/baykit/bayserver/util/valve.rb +15 -0
  145. data/lib/baykit/bayserver/version.rb +7 -0
  146. data/lib/baykit/bayserver/watercraft/boat.rb +43 -0
  147. data/lib/baykit/bayserver/watercraft/ship.rb +104 -0
  148. data/lib/baykit/bayserver/watercraft/yacht.rb +42 -0
  149. metadata +189 -0
@@ -0,0 +1,341 @@
1
+ require 'baykit/bayserver/agent/next_socket_action'
2
+ require 'baykit/bayserver/watercraft/ship'
3
+ require 'baykit/bayserver/tours/package'
4
+
5
+ module Baykit
6
+ module BayServer
7
+ module Docker
8
+ module Base
9
+ class InboundShip < Baykit::BayServer::WaterCraft::Ship
10
+
11
+ include Baykit::BayServer::Agent
12
+ include Baykit::BayServer::Tours
13
+ include Baykit::BayServer::Util
14
+
15
+ # class variables
16
+ class << self
17
+ attr :err_counter
18
+ end
19
+ @err_counter = Counter.new()
20
+
21
+ MAX_TOURS = 128
22
+
23
+ attr :port_docker
24
+
25
+ attr :tour_store
26
+ attr_accessor :need_end
27
+ attr :socket_timeout_sec
28
+ attr :lock
29
+ attr :active_tours
30
+
31
+ def initialize()
32
+ super
33
+ @lock = Monitor.new()
34
+ @active_tours = []
35
+ end
36
+
37
+ def to_s
38
+ return "#{@agent} ship##{@ship_id}/#{@object_id}[#{protocol()}]"
39
+ end
40
+
41
+ def init_inbound(skt, agt, postman, port, proto_hnd)
42
+ self.init(skt, agt, postman)
43
+ @port_docker = port
44
+ @socket_timeout_sec = @port_docker.timeout_sec >= 0 ? @port_docker.timeout_sec : BayServer.harbor.socket_timeout_sec
45
+ @tour_store = TourStore.get_store(agt.agent_id)
46
+ set_protocol_handler(proto_hnd)
47
+ end
48
+
49
+ ######################################################
50
+ # Implements Reusable
51
+ ######################################################
52
+
53
+ def reset()
54
+ super
55
+ @lock.synchronize do
56
+ if !@active_tours.empty?
57
+ raise Sink.new("%s There are some running tours", self)
58
+ end
59
+ end
60
+ @need_end = false
61
+ end
62
+
63
+ ######################################################
64
+ # Other methods
65
+ ######################################################
66
+
67
+ def get_tour(tur_key)
68
+ tur = nil
69
+ store_key = InboundShip.uniq_key(@ship_id, tur_key)
70
+ @lock.synchronize do
71
+ tur = @tour_store.get(store_key)
72
+ if tur == nil
73
+ tur = @tour_store.rent(store_key, false)
74
+ if tur == nil
75
+ return nil
76
+ end
77
+ tur.init(tur_key, self)
78
+ @active_tours.append(tur)
79
+ end
80
+ end
81
+ return tur
82
+ end
83
+
84
+ def get_error_tour
85
+ tur_key = InboundShip.err_counter.next()
86
+ store_key = InboundShip.uniq_key(@ship_id, -tur_key)
87
+ tur = @tour_store.rent(store_key, true)
88
+ tur.init(-tur_key, self)
89
+ @active_tours.append(tur)
90
+ return tur
91
+ end
92
+
93
+ def send_headers(check_id, tur)
94
+ check_ship_id(check_id)
95
+
96
+ if tur.zombie? || tur.aborted?
97
+ # Don't send peer any data
98
+ return
99
+ end
100
+
101
+ handled = false
102
+ if !tur.error_handling && tur.res.headers.status >= 400
103
+ trouble = BayServer.harbor.trouble
104
+ if trouble != nil
105
+ cmd = trouble.find(tur.res.headers.status)
106
+ if cmd != nil
107
+ err_tour = get_error_tour
108
+ err_tour.req.uri = cmd.target
109
+ tur.req.headers.copy_to(err_tour.req.headers)
110
+ tur.res.headers.copy_to(err_tour.res.headers)
111
+ err_tour.req.remote_port = tur.req.remote_port
112
+ err_tour.req.remote_address = tur.req.remote_address
113
+ err_tour.req.server_address = tur.req.server_address
114
+ err_tour.req.server_port = tur.req.server_port
115
+ err_tour.req.server_name = tur.req.server_name
116
+ err_tour.res.header_sent = tur.res.header_sent
117
+ tur.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ZOMBIE)
118
+ case cmd.method
119
+ when :GUIDE
120
+ err_tour.go
121
+ when :TEXT
122
+ @protocol_handler.send_headers(err_tour)
123
+ data = cmd.target
124
+ err_tour.res.send_content(Tour::TOUR_ID_NOCHECK, data, 0, data.length)
125
+ err_tour.end_content(Tour::TOUR_ID_NOCHECK)
126
+ when :REROUTE
127
+ err_tour.res.send_http_exception(Tour::TOUR_ID_NOCHECK, HttpException.moved_temp(cmd.target))
128
+ end
129
+ handled = true
130
+ end
131
+ end
132
+ end
133
+ if !handled
134
+ @port_docker.additional_headers.each do |nv|
135
+ tur.res.headers.add(nv[0], nv[1])
136
+ end
137
+ begin
138
+ @protocol_handler.send_res_headers(tur)
139
+ rescue IOError => e
140
+ BayLog.debug_e(e, "%s abort: %s", tur, e)
141
+ tur.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ABORTED)
142
+ raise e
143
+ end
144
+ end
145
+ end
146
+
147
+ def send_redirect(check_id, tur, status, location)
148
+ check_ship_id(check_id)
149
+
150
+ hdr = tur.res.headers
151
+ hdr.status = status
152
+ hdr.set(Headers::LOCATION, location)
153
+
154
+ body = "<H2>Document Moved.</H2><BR>" + "<A HREF=\"" + location + "\">" + location + "</A>"
155
+
156
+ send_error_content(check_id, tur, body)
157
+ end
158
+
159
+ def send_res_content(check_id, tur, bytes, ofs, len, &callback)
160
+
161
+ BayLog.debug("%s send_res_content bytes: %d", self, len)
162
+
163
+ check_ship_id(check_id)
164
+
165
+ if tur.zombie? || tur.aborted?
166
+ # Don't send peer any data
167
+ BayLog::debug("%s Aborted or zombie tour. do nothing: %s state=%s", self, tur, tur.state)
168
+ tur.change_state(check_id, TourState::ENDED)
169
+ if callback != nil
170
+ callback.call()
171
+ end
172
+ return
173
+ end
174
+
175
+ max_len = @protocol_handler.max_res_packet_data_size();
176
+ if len > max_len
177
+ send_res_content(Tour::TOUR_ID_NOCHECK, tur, bytes, ofs, max_len)
178
+ send_res_content(Tour::TOUR_ID_NOCHECK, tur, bytes, ofs + max_len, len - max_len, &callback)
179
+ else
180
+ begin
181
+ @protocol_handler.send_res_content(tur, bytes, ofs, len, &callback)
182
+ rescue IOError => e
183
+ BayLog.debug_e(e, "%s abort: %s", tur, e)
184
+ tur.change_state(Tour::TOUR_ID_NOCHECK, Tour::TourState::ABORTED)
185
+ raise e
186
+ end
187
+ end
188
+ end
189
+
190
+ def send_end_tour(chk_ship_id, chk_tour_id, tur, &callback)
191
+ @lock.synchronize do
192
+ check_ship_id(chk_ship_id)
193
+ BayLog.debug("%s sendEndTour: %s state=%s", self, tur, tur.state)
194
+
195
+ if tur.zombie? || tur.aborted?
196
+ # Don't send peer any data. Do nothing
197
+ BayLog.debug("%s Aborted or zombie tour. do nothing: %s state=%s", self, tur, tur.state)
198
+ tur.change_state(chk_tour_id, Tour::TourState::ENDED)
199
+ callback.call()
200
+ else
201
+ if !tur.valid?
202
+ raise Sink.new("Tour is not valid")
203
+ end
204
+ keep_alive = false
205
+ if tur.req.headers.get_connection() == Headers::CONNECTION_KEEP_ALIVE
206
+ keep_alive = true
207
+ if keep_alive
208
+ res_conn = tur.res.headers.get_connection()
209
+ keep_alive = (res_conn == Headers::CONNECTION_KEEP_ALIVE) ||
210
+ (res_conn == Headers::CONNECTION_UNKOWN)
211
+ end
212
+ if keep_alive
213
+ if tur.res.headers.content_length() < 0
214
+ keep_alive = false
215
+ end
216
+ end
217
+ end
218
+
219
+ tur.change_state(chk_tour_id, Tour::TourState::ENDED)
220
+
221
+ @protocol_handler.send_end_tour(tur, keep_alive, &callback)
222
+ end
223
+ end
224
+ end
225
+
226
+ def send_error(chk_id, tour, status, message, e)
227
+
228
+ check_ship_id(chk_id)
229
+
230
+ BayLog.info("%s send error: status=%d, message=%s ex=%s", self, status, message, e == nil ? "" : e.message)
231
+
232
+ if e != nil
233
+ BayLog.debug_e(e)
234
+ end
235
+
236
+ # Create body
237
+ str = HttpStatus.description(status)
238
+
239
+ # print status
240
+ body = StringUtil.alloc(8192)
241
+
242
+ body << "<h1>" << status.to_s << " " << str << "</h1>\r\n"
243
+
244
+ # print message
245
+ #if message != nil && BayLog.debug_mode?
246
+ # body << message
247
+ #end
248
+
249
+ # print stack trace
250
+ #if e != nil && BayLog.debug_mode?
251
+ # body << "<P><HR><P>\r\n"
252
+ # body << "<pre>\r\n"
253
+ # e.backtrace.each do |item|
254
+ # body << item << "\r\n"
255
+ # end
256
+ # body << "</pre>"
257
+ #end
258
+
259
+ tour.res.headers.status = status
260
+ send_error_content(chk_id, tour, body)
261
+ end
262
+
263
+
264
+
265
+ def end_ship()
266
+ BayLog.debug("%s endShip", self)
267
+ @port_docker.return_protocol_handler(@agent, @protocol_handler)
268
+ @port_docker.return_ship(self)
269
+ end
270
+
271
+
272
+ def abort_tours()
273
+ return_list = []
274
+
275
+ # Abort tours
276
+ @active_tours.each do |tur|
277
+ if tur.valid?
278
+ BayLog.debug("%s is valid, abort it: stat=%s", tur, tur.state)
279
+ if tur.req.abort()
280
+ return_list << tur
281
+ end
282
+ end
283
+ end
284
+
285
+ return_list.each do |tur|
286
+ return_tour(tur)
287
+ end
288
+ end
289
+
290
+ protected
291
+ def send_error_content(chk_id, tour, content)
292
+
293
+ #Get charset
294
+ charset = tour.res.charset
295
+
296
+ # Set content type
297
+ if StringUtil.set? charset
298
+ tour.res.headers.set_content_type("text/html charset=" + charset)
299
+ else
300
+ tour.res.headers.set_content_type("text/html")
301
+ end
302
+
303
+ if StringUtil.set? content
304
+ tour.res.headers.set_content_length(content.length)
305
+ end
306
+ send_headers(chk_id, tour)
307
+
308
+ if StringUtil.set? content
309
+ send_res_content(chk_id, tour, content, 0, content.length)
310
+ end
311
+ end
312
+
313
+
314
+ private
315
+
316
+ def self.uniq_key(sip_id, tur_key)
317
+ return sip_id << 32 | (tur_key & 0xffffffff);
318
+ end
319
+
320
+ public
321
+ def return_tour(tur)
322
+ BayLog.debug("%s Return tour: %s", self, tur)
323
+ @lock.synchronize do
324
+ if !@active_tours.include?(tur)
325
+ raise Sink.new("Tour is not in acive list: %s", tur);
326
+ end
327
+
328
+ tour_store.Return(InboundShip.uniq_key(@ship_id, tur.req.key))
329
+ @active_tours.delete(tur)
330
+
331
+ if @need_end && @active_tours.empty?
332
+ end_ship()
333
+ end
334
+ end
335
+ end
336
+ end
337
+ end
338
+ end
339
+ end
340
+ end
341
+
@@ -0,0 +1,65 @@
1
+ require 'baykit/bayserver/agent/grand_agent'
2
+
3
+ require 'baykit/bayserver/docker/base/inbound_ship'
4
+ require 'baykit/bayserver/docker/base/inbound_ship_store'
5
+
6
+ require 'baykit/bayserver/util/object_store'
7
+ require 'baykit/bayserver/util/string_util'
8
+
9
+ module Baykit
10
+ module BayServer
11
+ module Docker
12
+ module Base
13
+ class InboundShipStore < Baykit::BayServer::Util::ObjectStore
14
+ include Baykit::BayServer::WaterCraft
15
+ include Baykit::BayServer::Util
16
+ include Baykit::BayServer::Agent
17
+
18
+ class AgentListener
19
+ include Baykit::BayServer::Agent::GrandAgent::GrandAgentLifecycleListener # implements
20
+
21
+ def add(agt)
22
+ InboundShipStore.stores[agt.agent_id] = InboundShipStore.new();
23
+ end
24
+
25
+ def remove(agt)
26
+ InboundShipStore.stores.delete(agt.agent_id);
27
+ end
28
+ end
29
+
30
+ class << self
31
+ # Agent id => InboundShipStore
32
+ attr :stores
33
+ end
34
+ @stores = {}
35
+
36
+ def initialize()
37
+ super
38
+ @factory = -> { InboundShip.new() }
39
+ end
40
+
41
+ #
42
+ # print memory usage
43
+ #
44
+ def print_usage(indent)
45
+ BayLog.info("%sInboundShipStore Usage:", StringUtil.indent(indent));
46
+ super(indent+1);
47
+ end
48
+
49
+
50
+ ######################################################
51
+ # class methods
52
+ ######################################################
53
+ def self.init()
54
+ GrandAgent.add_lifecycle_listener(AgentListener.new())
55
+ end
56
+
57
+ def self.get_store(agent_id)
58
+ return @stores[agent_id]
59
+ end
60
+
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,228 @@
1
+ require 'baykit/bayserver/protocol/protocol_handler_store'
2
+ require 'baykit/bayserver/bcf/package'
3
+ require 'baykit/bayserver/agent/transporter/plain_transporter'
4
+ require 'baykit/bayserver/util/object_store'
5
+ require 'baykit/bayserver/util/object_factory'
6
+
7
+ require 'baykit/bayserver/docker/port'
8
+ require 'baykit/bayserver/docker/base/docker_base'
9
+ require 'baykit/bayserver/docker/base/inbound_data_listener'
10
+ require 'baykit/bayserver/docker/base/inbound_ship_store'
11
+
12
+ module Baykit
13
+ module BayServer
14
+ module Docker
15
+ module Base
16
+ class PortBase < Baykit::BayServer::Docker::Base::DockerBase
17
+ include Baykit::BayServer::Docker::Port #implements
18
+
19
+ include Baykit::BayServer::Bcf
20
+ include Baykit::BayServer::Agent
21
+ include Baykit::BayServer::Agent::Transporter
22
+ include Baykit::BayServer::Docker
23
+ include Baykit::BayServer::Docker::Base
24
+ include Baykit::BayServer::WaterCraft
25
+ include Baykit::BayServer::Protocol
26
+ include Baykit::BayServer::Util
27
+
28
+ attr :permission_list
29
+ attr :host
30
+ attr :port
31
+ attr :anchored
32
+ attr :additional_headers
33
+ attr :socket_path
34
+ attr :timeout_sec
35
+ attr :secure_docker
36
+ attr :cities
37
+
38
+ def initialize()
39
+ @permission_list = []
40
+ @timeout_sec = -1
41
+ @host = nil
42
+ @port = -1
43
+ @anchored = true
44
+ @additional_headers = []
45
+ @socket_path = nil
46
+ @secure_docker = nil
47
+ @cities = Cities.new()
48
+ end
49
+
50
+ def to_s()
51
+ return super + "[" + @port + "]"
52
+ end
53
+
54
+ ######################################################
55
+ # Abstract methods
56
+ ######################################################
57
+ def support_anchored()
58
+ raise NotImplementedError()
59
+ end
60
+
61
+ def support_unanchored()
62
+ raise NotImplementedError()
63
+ end
64
+
65
+ ######################################################
66
+ # Implements Docker
67
+ ######################################################
68
+
69
+ def init(elm, parent)
70
+ if StringUtil.empty?(elm.arg)
71
+ raise ConfigException.new(elm.file_name, elm.line_no, BayMessage.get(:CFG_INVALID_PORT_NAME, elm.name))
72
+ end
73
+
74
+ super
75
+
76
+ port_name = elm.arg.downcase()
77
+ if port_name.start_with?(":unix:")
78
+ # unix domain sokcet
79
+ @port = -1
80
+ @socket_path = elm.arg[6 .. -1]
81
+ @host = elm.arg
82
+ else
83
+ # TCP or UDP port
84
+ if port_name.start_with?(":tcp:")
85
+ # tcp server socket
86
+ @anchored = true
87
+ host_port = elm.arg[5 .. -1]
88
+ elsif port_name.start_with?(":udp:")
89
+ # udp server socket
90
+ @anchored = false
91
+ host_port = elm.arg[5 .. -1]
92
+ else
93
+ # default: tcp server socket
94
+ @anchored = true
95
+ host_port = elm.arg
96
+ end
97
+
98
+ begin
99
+ idx = host_port.index(':')
100
+ if idx != nil
101
+ @host = host_port[0 .. idx]
102
+ @port = host_port[idx+1 .. -1].to_i
103
+ else
104
+ @host = nil
105
+ @port = host_port.to_i
106
+ end
107
+ rescue => e
108
+ raise ConfigException.new(elm.file_name, elm.line_no, BayMessage.get(:CFG_INVALID_PORT_NAME, elm.name))
109
+ end
110
+
111
+ if @anchored
112
+ if !support_anchored()
113
+ raise ConfigException.new(elm.file_name, elm.line_no, BayMessage.get(:CFG_TCP_NOT_SUPPORTED))
114
+ end
115
+ else
116
+ if !support_unanchored()
117
+ raise ConfigException.new(elm.file_name, elm.line_no, BayMessage.get(:CFG_UDP_NOT_SUPPORTED))
118
+ end
119
+ end
120
+
121
+ end
122
+
123
+ end
124
+
125
+ ######################################################
126
+ # Implements DockerBase
127
+ ######################################################
128
+
129
+ def init_docker(dkr)
130
+ if dkr.kind_of? Permission
131
+ @permission_list.append(dkr)
132
+ elsif dkr.kind_of? City
133
+ @cities.add(dkr)
134
+ elsif dkr.kind_of? Secure
135
+ @secure_docker = dkr
136
+ else
137
+ return super
138
+ end
139
+ return true
140
+ end
141
+
142
+ def init_key_val(kv)
143
+ case kv.key.downcase
144
+ when "timeout"
145
+ @timeout_sec = Integer(kv.value)
146
+
147
+ when "addheader"
148
+ idx = kv.value.index(':')
149
+ if idx == nil
150
+ raise ConfigException.new(kv.file_name, kv.line_no, BayMessage.get(:CFG_INVALID_PARAMETER_VALUE, kv.value))
151
+ end
152
+
153
+ name = kv.value[0 .. idx].strip()
154
+ value = kv.value[idx+1 .. -1].strip()
155
+ @additional_headers << [name, value]
156
+
157
+ else
158
+ return super
159
+ end
160
+ return true
161
+ end
162
+
163
+ ######################################################
164
+ # implements Port
165
+ ######################################################
166
+ def address()
167
+ if @socket_path
168
+ # Unix domain socket
169
+ return @socket_path
170
+ elsif @host == nil
171
+ return [@port, "0.0.0.0"]
172
+ else
173
+ return [@port, @host]
174
+ end
175
+ end
176
+
177
+ def secure()
178
+ return @secure_docker != nil
179
+ end
180
+
181
+ def check_admitted(skt)
182
+ @permission_list.each do |perm_dkr|
183
+ perm_dkr.socket_admitted(skt)
184
+ end
185
+ end
186
+
187
+ def find_city(name)
188
+ return @cities.find_city(name)
189
+ end
190
+
191
+ def new_transporter(agt, skt)
192
+ sip = PortBase.get_ship_store(agt).rent()
193
+ if secure()
194
+ tp = @secure_docker.create_transporter(IOUtil.get_sock_recv_buf_size(skt))
195
+ else
196
+ tp = PlainTransporter.new(true, IOUtil.get_sock_recv_buf_size(skt))
197
+ end
198
+
199
+ proto_hnd = PortBase.get_protocol_handler_store(protocol(), agt).rent()
200
+ sip.init_inbound(skt, agt, tp, self, proto_hnd)
201
+ tp.init(agt.non_blocking_handler, skt, InboundDataListener.new(sip))
202
+ return tp
203
+ end
204
+
205
+ def return_protocol_handler(agt, proto_hnd)
206
+ BayLog.debug("%s Return protocol handler: ", proto_hnd)
207
+ PortBase.get_protocol_handler_store(proto_hnd.protocol, agt).Return(proto_hnd)
208
+ end
209
+
210
+ def return_ship(sip)
211
+ BayLog.debug("%s end (return ship)", sip)
212
+ PortBase.get_ship_store(sip.agent).Return(sip)
213
+ end
214
+
215
+ def PortBase.get_ship_store(agt)
216
+ return InboundShipStore.get_store(agt.agent_id)
217
+ end
218
+
219
+ def PortBase.get_protocol_handler_store(proto, agt)
220
+ return ProtocolHandlerStore.get_store(proto, true, agt.agent_id)
221
+ end
222
+
223
+ end
224
+ end
225
+ end
226
+ end
227
+ end
228
+
@@ -0,0 +1,28 @@
1
+ require 'baykit/bayserver/docker/base/docker_base'
2
+
3
+ module Baykit
4
+ module BayServer
5
+ module Docker
6
+ module Base
7
+ class RerouteBase < Baykit::BayServer::Docker::Base::DockerBase
8
+ include Reroute # implements
9
+
10
+ include Baykit::BayServer::Bcf
11
+
12
+ def init(elm, parent)
13
+ name = elm.arg;
14
+ if name != "*"
15
+ raise ConfigException.new(elm.file_name, elm.line_no, "Invalid reroute name: %s", name)
16
+ end
17
+ super
18
+ end
19
+
20
+
21
+ def match(uri)
22
+ return true
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end