bayserver-core 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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