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,529 @@
1
+ require 'singleton'
2
+ require 'socket'
3
+
4
+ require 'baykit/bayserver/bay_log'
5
+ require 'baykit/bayserver/bay_message'
6
+ require 'baykit/bayserver/bay_dockers'
7
+ require 'baykit/bayserver/version'
8
+ require 'baykit/bayserver/mem_usage'
9
+ require 'baykit/bayserver/sink'
10
+
11
+ require 'baykit/bayserver/agent/signal/signal_agent'
12
+ require 'baykit/bayserver/agent/signal/signal_sender'
13
+ require 'baykit/bayserver/agent/signal/signal_sender'
14
+ require 'baykit/bayserver/agent/grand_agent'
15
+
16
+ require 'baykit/bayserver/bcf/package'
17
+
18
+ require 'baykit/bayserver/train/train_runner'
19
+ require 'baykit/bayserver/taxi/taxi_runner'
20
+
21
+
22
+
23
+
24
+ require 'baykit/bayserver/protocol/protocol_handler_store'
25
+
26
+ require 'baykit/bayserver/docker/package'
27
+ require 'baykit/bayserver/docker/base/inbound_ship_store'
28
+ require 'baykit/bayserver/docker/warp/warp_ship_store'
29
+
30
+ require 'baykit/bayserver/util/locale'
31
+ require 'baykit/bayserver/util/md5_password'
32
+ require 'baykit/bayserver/util/string_util'
33
+ require 'baykit/bayserver/util/mimes'
34
+ require 'baykit/bayserver/util/reusable'
35
+ require 'baykit/bayserver/util/http_status'
36
+ require 'baykit/bayserver/util/cities'
37
+ require 'baykit/bayserver/util/selector'
38
+
39
+ module Baykit
40
+ module BayServer
41
+
42
+ class BayServer
43
+ include Baykit::BayServer::Bcf
44
+ include Baykit::BayServer::Util
45
+ include Baykit::BayServer::Agent
46
+ include Baykit::BayServer::Train
47
+ include Baykit::BayServer::Taxi
48
+ include Baykit::BayServer::Agent::Signal
49
+ include Baykit::BayServer::Protocol
50
+ include Baykit::BayServer::WaterCraft
51
+ include Baykit::BayServer::Tours
52
+ include Baykit::BayServer::Docker
53
+ include Baykit::BayServer::Docker::Base
54
+ include Baykit::BayServer::Docker::Warp
55
+
56
+ ENV_BSERV_HOME = "BSERV_HOME"
57
+ ENV_BSERV_LIB = "BSERV_LIB"
58
+ ENV_BSERV_PLAN = "BSERV_PLAN"
59
+ ENV_BSERV_LOGLEVEL = "BSERV_LOGLEVEL"
60
+
61
+ # define class instance accessor
62
+ class << self
63
+ attr :script_name
64
+ attr :commandline_args
65
+ attr :bserv_home
66
+ attr :bserv_plan
67
+ attr :bserv_lib
68
+ attr :my_host_name
69
+ attr :my_host_addr
70
+ attr :dockers
71
+ attr :ports
72
+ attr :harbor
73
+ attr :bay_agent
74
+ attr :cities
75
+ attr :ractor_local_map
76
+ attr :software_name
77
+ attr :rack_app
78
+ attr :derived_port_nos
79
+ attr :monitor_port
80
+ end
81
+
82
+ # Initialize class variables
83
+ @plan_str = nil
84
+ @my_host_name = nil
85
+ @my_host_addr = nil
86
+ @dockers = []
87
+ @ports = []
88
+ @harbor = nil
89
+ @any_city = nil
90
+ @cities = Cities.new()
91
+ @ractor_local_map = {}
92
+ @rack_app = nil
93
+
94
+ def self.get_version
95
+ return Version::VERSION
96
+ end
97
+
98
+ def self.main(args)
99
+ @commandline_args = args
100
+ cmd = nil
101
+ home = ENV[ENV_BSERV_HOME]
102
+ plan = ENV[ENV_BSERV_PLAN]
103
+ mkpass = nil
104
+ log_level = nil
105
+ agt_id = -1
106
+ init = false
107
+
108
+ args.each do |arg|
109
+ if arg.casecmp? "-start"
110
+ cmd = nil
111
+ elsif arg.casecmp? "-stop" or arg.casecmp? "-shutdown"
112
+ cmd = SignalAgent::COMMAND_SHUTDOWN
113
+ elsif arg.casecmp? "-restartAgents"
114
+ cmd = SignalAgent::COMMAND_RESTART_AGENTS
115
+ elsif arg.casecmp? "-reloadCert"
116
+ cmd = SignalAgent::COMMAND_RELOAD_CERT
117
+ elsif arg.casecmp? "-memUsage"
118
+ cmd = SignalAgent::COMMAND_MEM_USAGE
119
+ elsif arg.casecmp? "-abort"
120
+ cmd = SignalAgent::COMMAND_ABORT
121
+ elsif arg.casecmp? "-init"
122
+ init = true
123
+ elsif arg.start_with? "-home="
124
+ home = arg[6 .. nil]
125
+ elsif arg.start_with? "-plan="
126
+ plan = arg[6 .. nil]
127
+ elsif arg.start_with? "-mkpass="
128
+ mkpass = arg[8 .. nil]
129
+ elsif arg.start_with? "-loglevel="
130
+ log_level = arg[10 .. nil]
131
+ elsif arg.start_with? "-agentid="
132
+ agt_id = arg[9 .. nil].to_i
133
+ elsif arg.start_with? "-ports="
134
+ @derived_port_nos = arg[7 .. nil].split(",")
135
+ elsif arg.start_with? "-monitor_port="
136
+ @monitor_port = arg[14 .. nil].to_i
137
+ end
138
+ end
139
+
140
+ if mkpass
141
+ puts MD5Passwprd.encode(mkpass)
142
+ exit 0
143
+ end
144
+
145
+ self.get_home(home)
146
+ self.get_lib()
147
+
148
+ if StringUtil.set?(log_level)
149
+ BayLog.set_log_level(log_level)
150
+ end
151
+
152
+ if(init)
153
+ self.init()
154
+ else
155
+ self.get_plan(plan)
156
+
157
+ if cmd == nil
158
+ BayServer.start(agt_id)
159
+ else
160
+ SignalSender.new().send_command(cmd)
161
+ end
162
+ end
163
+
164
+ end
165
+
166
+ # Get BayServer Home
167
+ def self.get_home(home)
168
+ if home != nil
169
+ @bserv_home = home
170
+ elsif StringUtil.set? ENV[ENV_BSERV_HOME]
171
+ @bserv_home = ENV[ENV_BSERV_HOME]
172
+ else
173
+ @bserv_home = '.' if StringUtil.empty?(@bserv_home)
174
+ end
175
+
176
+ BayLog.debug "BayServer Home: #{@bserv_home}"
177
+ end
178
+
179
+ def self.get_plan(plan)
180
+
181
+ if plan != nil
182
+ @bserv_plan = plan
183
+ elsif StringUtil.set? ENV[ENV_BSERV_PLAN]
184
+ @bserv_plan = ENV[ENV_BSERV_PLAN]
185
+ else
186
+ @bserv_plan = @bserv_home + '/plan/bayserver.plan' if StringUtil.empty?(@bserv_plan)
187
+ end
188
+ BayLog.debug "BayServer Plan: #{@bserv_plan}"
189
+
190
+ end
191
+
192
+ def self.get_lib()
193
+ @bserv_lib = ENV[ENV_BSERV_LIB]
194
+ if !File.directory? @bserv_lib
195
+ raise BayException.new("Library directory is not a directory: %s", @bserv_lib)
196
+ end
197
+ BayLog.debug "BayServer Lib: #{@bserv_lib}"
198
+ end
199
+
200
+ def self.init()
201
+ init_dir = @bserv_lib + "/init"
202
+ BayLog.debug("init directory: %s", init_dir)
203
+ file_list = Dir.entries(init_dir) - ['.', '..']
204
+ file_list.each do |file|
205
+ FileUtils.cp_r(File.join(init_dir, file), @bserv_home)
206
+ end
207
+ end
208
+
209
+
210
+ #
211
+ # Start the system
212
+ #
213
+ def self.start(agt_id)
214
+ begin
215
+ BayMessage.init(@bserv_lib + "/conf/messages", Locale.new('ja', 'JP'))
216
+
217
+ @dockers = BayDockers.new
218
+ @dockers.init(@bserv_lib + "/conf/dockers.bcf")
219
+
220
+ Mimes.init(@bserv_lib + "/conf/mimes.bcf")
221
+ HttpStatus.init(@bserv_lib + "/conf/httpstatus.bcf")
222
+
223
+ if @bserv_plan != nil
224
+ load_plan(@bserv_plan)
225
+ end
226
+
227
+ if @ports.empty?
228
+ raise BayException.new BayMessage.get(:CFG_NO_PORT_DOCKER)
229
+ end
230
+
231
+ redirect_file = @harbor.redirect_file
232
+ if redirect_file != nil
233
+ if !File.absolute_path? redirect_file
234
+ redirect_file = BayServer.bserv_home + "/" + redirect_file
235
+ end
236
+
237
+ f = File.open(redirect_file, "a")
238
+ $stdout = f
239
+ $stderr = f
240
+ end
241
+ $stdout.sync = true
242
+ $stderr.sync = true
243
+
244
+ # Init stores, memory usage managers
245
+ PacketStore.init()
246
+ InboundShipStore.init()
247
+ ProtocolHandlerStore.init()
248
+ TourStore.init(TourStore::MAX_TOURS)
249
+ MemUsage.init()
250
+
251
+ if SysUtil.run_on_rubymine()
252
+ ::Signal.trap(:INT) do
253
+ p "Trap! Interrupted"
254
+ GrandAgent.shutdown_all()
255
+ exit(0)
256
+ end
257
+ end
258
+
259
+ BayLog.debug("Command line: %s", @commandline_args.join(" "))
260
+
261
+ if agt_id == -1
262
+ print_version()
263
+ @my_host_name = Socket.gethostname
264
+ BayLog.info("Host name : %s", @my_host_name)
265
+ parent_start()
266
+ else
267
+ child_start(agt_id)
268
+ end
269
+
270
+ while not GrandAgentMonitor.monitors.empty?
271
+ sel = Selector.new()
272
+ pip_to_mon_map = {}
273
+ GrandAgentMonitor.monitors.values.each do |mon|
274
+ BayLog.debug("Monitoring pipe of %s", mon)
275
+ sel.register(mon.communication_channel, Selector::OP_READ)
276
+ pip_to_mon_map[mon.communication_channel] = mon
277
+ end
278
+ server_skt = nil
279
+ if SignalAgent.signal_agent
280
+ server_skt = SignalAgent.signal_agent.server_skt
281
+ sel.register(server_skt, Selector::OP_READ)
282
+ end
283
+
284
+ selected_map = sel.select(nil)
285
+ selected_map.keys().each do |ch|
286
+ if ch == server_skt
287
+ SignalAgent.signal_agent.on_socket_readable()
288
+ else
289
+ mon = pip_to_mon_map[ch]
290
+ mon.on_readable()
291
+ end
292
+ end
293
+ end
294
+
295
+ SignalAgent.term()
296
+
297
+ rescue => err
298
+ BayLog.fatal_e(err, "%s", err.message)
299
+ end
300
+ end
301
+
302
+ def self.open_ports(anchored_port_map, unanchored_port_map)
303
+ @ports.each do |dkr|
304
+ # open port
305
+ adr = dkr.address()
306
+
307
+ if dkr.anchored
308
+ # Open TCP port
309
+ BayLog.debug(BayMessage.get(:MSG_OPENING_TCP_PORT, dkr.host, dkr.port, dkr.protocol))
310
+
311
+ if adr.instance_of? String
312
+ adr = Socket.sockaddr_un(adr)
313
+ skt = Socket.new(Socket::AF_UNIX, Socket::SOCK_STREAM, 0)
314
+ else
315
+ adr = Socket.sockaddr_in(adr[0], adr[1])
316
+ skt = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
317
+ end
318
+ #if not SysUtil.run_on_windows()
319
+ skt.setsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR, true)
320
+ #end
321
+
322
+ begin
323
+ skt.bind(adr)
324
+ rescue SystemCallError => e
325
+ BayLog.error_e(e, BayMessage.get(:INT_CANNOT_OPEN_PORT, dkr.host, dkr.port, e))
326
+ raise e
327
+ end
328
+
329
+ skt.listen(0)
330
+
331
+ #skt = port_dkr.new_server_socket skt
332
+ anchored_port_map[skt] = dkr
333
+ else
334
+ # Open UDP port
335
+ BayLog.info(BayMessage.get(:MSG_OPENING_UDP_PORT, dkr.host, dkr.port, dkr.protocol()))
336
+
337
+ skt = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM)
338
+ if not SysUtil.run_on_windows()
339
+ skt.setsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR, true)
340
+ end
341
+ begin
342
+ skt.bind(adr)
343
+ rescue SystemCallError => e
344
+ BayLog.error_e(e, BayMessage.get(:INT_CANNOT_OPEN_PORT, dkr.host, dkr.port, e))
345
+ raise e
346
+ end
347
+ unanchored_port_map[skt] = dkr
348
+
349
+ end
350
+ end
351
+ end
352
+
353
+ def self.parent_start()
354
+ anchored_port_map = {}
355
+ unanchored_port_map = {}
356
+
357
+
358
+ if @harbor.multi_core
359
+ if !SysUtil.run_on_windows()
360
+ open_ports(anchored_port_map, unanchored_port_map)
361
+ end
362
+ else
363
+ open_ports(anchored_port_map, unanchored_port_map)
364
+
365
+ # Thread mode
366
+ GrandAgent.init(
367
+ (1..@harbor.grand_agents).to_a,
368
+ anchored_port_map,
369
+ unanchored_port_map,
370
+ @harbor.max_ships,
371
+ @harbor.multi_core)
372
+
373
+ invoke_runners()
374
+ end
375
+
376
+ SignalAgent.init(@harbor.control_port)
377
+ GrandAgentMonitor.init(@harbor.grand_agents, anchored_port_map)
378
+ create_pid_file(Process.pid)
379
+ end
380
+
381
+ def self.child_start(agt_id)
382
+
383
+ invoke_runners()
384
+
385
+ anchored_port_map = {}
386
+ unanchored_port_map = {}
387
+
388
+ if(SysUtil.run_on_windows())
389
+ open_ports(anchored_port_map, unanchored_port_map)
390
+ else
391
+ @derived_port_nos.each do |no|
392
+ # Rebuild server socket
393
+ skt = Socket.for_fd(no.to_i)
394
+ portDkr = nil
395
+
396
+ @ports.each do |p|
397
+ port = skt.local_address.ip_port
398
+ if p.port == port
399
+ portDkr = p
400
+ break
401
+ end
402
+ end
403
+
404
+ if portDkr == nil
405
+ BayLog.fatal("Cannot find port docker: %d", port)
406
+ exit(1)
407
+ end
408
+
409
+ anchored_port_map[skt] = portDkr
410
+ end
411
+ end
412
+
413
+ skt= TCPSocket.new("localhost", @monitor_port)
414
+
415
+ GrandAgent.init(
416
+ [agt_id],
417
+ anchored_port_map,
418
+ nil,
419
+ @harbor.max_ships,
420
+ @harbor.multi_core
421
+ )
422
+ agt = GrandAgent.get(agt_id)
423
+
424
+ agt.run_command_receiver(skt)
425
+
426
+ agt.run()
427
+ end
428
+
429
+ def self.find_city(city_name)
430
+ return @cities.find_city(city_name)
431
+ end
432
+
433
+ def self.parse_path(val)
434
+ val = get_location(val)
435
+
436
+ if not ::File::exist?(val)
437
+ raise IOError.new("File not found: #{val}")
438
+ end
439
+
440
+ return val
441
+ end
442
+
443
+
444
+ def self.get_location(location)
445
+ if not File::absolute_path? location
446
+ return @bserv_home + File::SEPARATOR + location
447
+ else
448
+ return location
449
+ end
450
+ end
451
+
452
+
453
+ def self.get_software_name
454
+ if @software_name == nil
455
+ @software_name = "BayServer/" + get_version
456
+ end
457
+ @software_name
458
+ end
459
+
460
+ def self.shutdown
461
+ BayLog.warn "Shutdown..."
462
+ exit(0)
463
+ end
464
+
465
+ protected
466
+ #
467
+ # Print version information
468
+ #
469
+ def self.print_version
470
+
471
+ version = "Version " + get_version()
472
+ while version.length < 28 do
473
+ version = ' ' + version
474
+ end
475
+
476
+ puts(" ----------------------")
477
+ puts(" / BayServer \\")
478
+ puts("-----------------------------------------------------")
479
+ print(" \\")
480
+ (47 - version.length()).times.each { |i|
481
+ print(" ")
482
+ }
483
+ puts(version + " /")
484
+ puts(" \\ Copyright (C) 2021 Yokohama Baykit /")
485
+ puts(" \\ http://baykit.yokohama /")
486
+ puts(" ---------------------------------------------")
487
+ end
488
+
489
+
490
+ def self.load_plan(bserv_plan)
491
+ p = BcfParser.new
492
+ doc = p.parse(bserv_plan);
493
+
494
+ doc.content_list.each do |obj|
495
+ if obj.instance_of?(BcfElement)
496
+ dkr = @dockers.create_docker(obj, nil)
497
+ if dkr.kind_of?(Port)
498
+ @ports << dkr
499
+ elsif dkr.kind_of?(Harbor)
500
+ @harbor = dkr
501
+ elsif dkr.kind_of?(City)
502
+ @cities.add(dkr)
503
+ end
504
+ end
505
+ end
506
+ end
507
+
508
+
509
+ def BayServer.create_pid_file(pid)
510
+ File.open(BayServer.get_location(@harbor.pid_file), "w") do |f|
511
+ f.write(pid.to_s())
512
+ end
513
+ end
514
+
515
+ #
516
+ # Run train runners and taxi runners inner process
517
+ # ALl the train runners and taxi runners run in each process (not thread)
518
+ #
519
+ def self.invoke_runners()
520
+ n = @harbor.train_runners
521
+ TrainRunner.init(n)
522
+
523
+ n = @harbor.taxi_runners
524
+ TaxiRunner.init(n)
525
+
526
+ end
527
+ end
528
+ end
529
+ end
@@ -0,0 +1,44 @@
1
+ require 'baykit/bayserver/bcf/package'
2
+
3
+ module Baykit
4
+ module BayServer
5
+ module Bcf
6
+
7
+ class BcfDocument
8
+ attr :content_list
9
+
10
+ def initialize
11
+ @content_list = []
12
+ end
13
+
14
+ def print_document
15
+ print_content_list(@content_list, 0)
16
+ end
17
+
18
+ def print_content_list(list, indent)
19
+ list.each do |o|
20
+ print_indent(indent)
21
+ if o.instance_of?(BcfElement)
22
+ puts "Element(#{o.name}, #{o.arg}){"
23
+ print_content_list(o.content_list, indent + 1)
24
+ print_indent(indent)
25
+ p
26
+ else
27
+ puts "KeyVal(#{o.key}, #{o.value})"
28
+ p
29
+ end
30
+ end
31
+ end
32
+ private :print_content_list
33
+
34
+ def print_indent(indent)
35
+ indent.times do
36
+ print " "
37
+ end
38
+ end
39
+ private :print_indent
40
+
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,30 @@
1
+ require 'baykit/bayserver/bcf/package'
2
+
3
+ module Baykit
4
+ module BayServer
5
+ module Bcf
6
+
7
+ class BcfElement < BcfObject
8
+ attr :name
9
+ attr :arg
10
+ attr :content_list
11
+
12
+ def initialize(name, arg, file_name, line_no)
13
+ super file_name, line_no
14
+ @name = name
15
+ @arg = arg
16
+ @content_list = []
17
+ end
18
+
19
+ def get_value(key)
20
+ content_list.each do |o|
21
+ if o.instance_of?(BcfKeyVal) && o.key.casecmp?(key)
22
+ return o.value
23
+ end
24
+ end
25
+ nil
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,19 @@
1
+ require 'baykit/bayserver/bcf/package'
2
+
3
+ module Baykit
4
+ module BayServer
5
+ module Bcf
6
+
7
+ class BcfKeyVal < BcfObject
8
+ attr :key
9
+ attr :value
10
+
11
+ def initialize(key, val, file_name, line_no)
12
+ super file_name, line_no
13
+ @key = key
14
+ @value = val
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Bcf
4
+ class BcfObject
5
+ attr :file_name
6
+ attr :line_no
7
+
8
+ def initialize(file_name, line_no)
9
+ @file_name = file_name
10
+ @line_no = line_no
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end