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,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