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,302 @@
1
+ require 'baykit/bayserver/agent/grand_agent'
2
+ require 'baykit/bayserver/agent/transporter/plain_transporter'
3
+ require 'baykit/bayserver/agent/transporter/spin_write_transporter'
4
+ require 'baykit/bayserver/docker/built_in/write_file_taxi'
5
+ require 'baykit/bayserver/docker/log'
6
+ require 'baykit/bayserver/docker/built_in/log_items'
7
+ require 'baykit/bayserver/docker/built_in/log_boat'
8
+ require 'baykit/bayserver/util/string_util'
9
+
10
+ module Baykit
11
+ module BayServer
12
+ module Docker
13
+ module BuiltIn
14
+ class BuiltInLogDocker < Baykit::BayServer::Docker::Base::DockerBase
15
+ include Baykit::BayServer::Docker::Log # implements
16
+ include Baykit::BayServer::Agent::Transporter
17
+ include Baykit::BayServer::Agent
18
+ include Baykit::BayServer::Util
19
+
20
+ include Baykit::BayServer::Bcf
21
+
22
+ class AgentListener
23
+ include Baykit::BayServer::Agent::GrandAgent::GrandAgentLifecycleListener # implements
24
+ include Baykit::BayServer::Agent::Transporter
25
+
26
+ attr :log_docker
27
+
28
+ def initialize(dkr)
29
+ @log_docker = dkr
30
+ end
31
+
32
+ def add(agt)
33
+ file_name = "#{@log_docker.file_prefix}_#{agt.agent_id}.#{@log_docker.file_ext}";
34
+
35
+ boat = LogBoat.new()
36
+
37
+ case @log_docker.log_write_method
38
+ when LOG_WRITE_METHOD_SELECT
39
+ tp = PlainTransporter.new(false, 0, true) # write only
40
+ tp.init(agt.non_blocking_handler, File.open(file_name, "a"), boat)
41
+
42
+ when LOG_WRITE_METHOD_SPIN
43
+ tp = SpinWriteTransporter.new()
44
+ tp.init(agt.spin_handler, File.open(file_name, "a"), boat)
45
+
46
+ when LOG_WRITE_METHOD_TAXI
47
+ tp = WriteFileTaxi.new()
48
+ tp.init(File.open(file_name, "a"), boat)
49
+
50
+ end
51
+
52
+ begin
53
+ boat.init(file_name, tp)
54
+ rescue IOError => e
55
+ BayLog.fatal(BayMessage.get(:INT_CANNOT_OPEN_LOG_FILE, file_name));
56
+ BayLog.fatal_e(e);
57
+ end
58
+
59
+ @log_docker.loggers[agt.agent_id] = boat
60
+ end
61
+
62
+
63
+ def remove(agt)
64
+ @log_docker.loggers.delete(agt.agent_id);
65
+ end
66
+ end
67
+
68
+
69
+ LOG_WRITE_METHOD_SELECT = 1
70
+ LOG_WRITE_METHOD_SPIN = 2
71
+ LOG_WRITE_METHOD_TAXI = 3
72
+ DEFAULT_LOG_WRITE_METHOD = LOG_WRITE_METHOD_TAXI
73
+
74
+ class << self
75
+ # Mapping table for format
76
+ attr :log_item_map
77
+ end
78
+
79
+ # Log send_file name parts
80
+ attr :file_prefix
81
+ attr :file_ext
82
+
83
+ # Logger for each agent.
84
+ # Map of Agent ID => LogBoat
85
+ attr :loggers
86
+
87
+ # Log format
88
+ attr :format
89
+
90
+ # Log items
91
+ attr :log_items
92
+
93
+ # Log write method
94
+ attr :log_write_method
95
+
96
+ def initialize
97
+ @loggers = {}
98
+ @format = nil
99
+ @log_items = []
100
+ @log_write_method = DEFAULT_LOG_WRITE_METHOD
101
+ end
102
+
103
+ def init(elm, parent)
104
+ super
105
+ p = elm.arg.rindex('.')
106
+ if p == nil
107
+ @file_prefix = elm.arg
108
+ @file_ext = ""
109
+ else
110
+ @file_prefix = elm.arg[0, p]
111
+ @file_ext = elm.arg[p+1 .. -1]
112
+ end
113
+
114
+ if @format == nil
115
+ raise ConfigException.new(elm.file_name, elm.line_no, BayMessage.get(:CFG_INVALID_LOG_FORMAT, ""))
116
+ end
117
+
118
+ if !File.absolute_path?(@file_prefix)
119
+ @file_prefix = BayServer.get_location @file_prefix
120
+ end
121
+
122
+ @loggers = Array.new(BayServer.harbor.grand_agents)
123
+
124
+ log_dir = File.dirname(@file_prefix)
125
+ if !File.directory?(log_dir)
126
+ Dir.mkdir(log_dir)
127
+ end
128
+
129
+ # Parse format
130
+ compile(@format, @log_items, elm.file_name, elm.line_no)
131
+
132
+ # Check log write method
133
+ if @log_write_method == LOG_WRITE_METHOD_SELECT and !SysUtil.support_select_file()
134
+ BayLog.warn(BayMessage.get(:CFG_LOG_WRITE_METHOD_SELECT_NOT_SUPPORTED))
135
+ @log_write_method = LOG_WRITE_METHOD_TAXI
136
+ end
137
+
138
+ if @log_write_method == LOG_WRITE_METHOD_SPIN and !SysUtil.support_nonblock_file_write()
139
+ BayLog.warn(BayMessage.get(:CFG_LOG_WRITE_METHOD_SPIN_NOT_SUPPORTED))
140
+ @log_write_method = LOG_WRITE_METHOD_TAXI
141
+ end
142
+
143
+ GrandAgent.add_lifecycle_listener(AgentListener.new(self));
144
+ end
145
+
146
+ def init_key_val(kv)
147
+ case kv.key.downcase
148
+ when "format"
149
+ @format = kv.value
150
+ when "logwritemethod"
151
+ case kv.value.downcase()
152
+ when "select"
153
+ @log_write_method = LOG_WRITE_METHOD_SELECT
154
+ when "spin"
155
+ @log_write_method = LOG_WRITE_METHOD_SPIN
156
+ when "taxi"
157
+ @log_write_method = LOG_WRITE_METHOD_TAXI
158
+ else
159
+ raise ConfigException.new(kv.file_name, kv.line_no, BayMessage.get(:CFG_INVALID_PARAMETER_VALUE, kv.value))
160
+ end
161
+ else
162
+ return false
163
+ end
164
+ true
165
+ end
166
+
167
+ def log(tour)
168
+ sb = StringUtil.alloc(0)
169
+ @log_items.each do |item|
170
+ item = item.get_item(tour).to_s
171
+ if item == nil
172
+ sb << "-"
173
+ else
174
+ sb << item
175
+ end
176
+ end
177
+
178
+ # If threre are message to write, write it
179
+ if sb.length > 0
180
+ get_logger(tour.ship.agent).log(sb)
181
+ end
182
+ end
183
+
184
+ private
185
+
186
+ def get_logger(agt)
187
+ return @loggers[agt.agent_id]
188
+ end
189
+
190
+
191
+
192
+ #
193
+ # Compile format pattern
194
+ #
195
+ def compile(str, items, file_name, line_no)
196
+ # Find control code
197
+ pos = str.index('%')
198
+ if pos != nil
199
+ text = str[0, pos]
200
+ items.append(LogItems::TextItem.new(text))
201
+ compile_ctl(str[pos + 1 .. -1], items, file_name, line_no)
202
+ else
203
+ items.append(LogItems::TextItem.new(str))
204
+ end
205
+ end
206
+
207
+ #
208
+ # Compile format pattern(Control code)
209
+ #
210
+ def compile_ctl(str, items, file_name, line_no)
211
+ param = nil
212
+
213
+ # if exists param
214
+ if str[0] == '{'
215
+ # find close bracket
216
+ pos = str.index '}'
217
+ if pos == nil
218
+ raise ConfigException.new(file_name, line_no, BayMessage.get(:CFG_INVALID_LOG_FORMAT, @format))
219
+ end
220
+
221
+ param = str[1, pos-1]
222
+ str = str[pos + 1 .. -1]
223
+ end
224
+
225
+ ctl_char = ""
226
+ error = false
227
+
228
+ if str.length == 0
229
+ error = true
230
+ end
231
+
232
+ if !error
233
+ # get control char
234
+ ctl_char = str[0, 1]
235
+ str = str[1 .. -1]
236
+
237
+ if ctl_char == ">"
238
+ if str.length == 0
239
+ error = true
240
+ else
241
+ ctl_char = str[0, 1]
242
+ str = str[1 .. -1]
243
+ end
244
+ end
245
+ end
246
+
247
+ fct = nil
248
+ if !error
249
+ fct = BuiltInLogDocker.log_item_map[ctl_char]
250
+ if fct == nil
251
+ error = true
252
+ end
253
+ end
254
+
255
+ if error
256
+ ConfigException.new(file_name, line_no,
257
+ BayMessage.get(:CFG_INVALID_LOG_FORMAT,
258
+ @format + " (unknown control code: '%" + ctl_char + "')"))
259
+ end
260
+
261
+ item = fct.new
262
+ item.init(param)
263
+ @log_items.append(item)
264
+ compile(str, items, file_name, line_no)
265
+ end
266
+
267
+ def self.make_map
268
+ @log_item_map = {}
269
+ @log_item_map["a"] = LogItems::RemoteIpItem
270
+ @log_item_map["A"] = LogItems::ServerIpItem
271
+ @log_item_map["b"] = LogItems::RequestBytesItem2
272
+ @log_item_map["B"] = LogItems::RequestBytesItem1
273
+ @log_item_map["c"] = LogItems::ConnectionStatusItem
274
+ @log_item_map["e"] = LogItems::NullItem
275
+ @log_item_map["h"] = LogItems::RemoteHostItem
276
+ @log_item_map["H"] = LogItems::ProtocolItem
277
+ @log_item_map["i"] = LogItems::RequestHeaderItem
278
+ @log_item_map["l"] = LogItems::RemoteLogItem
279
+ @log_item_map["m"] = LogItems::MethodItem
280
+ @log_item_map["n"] = LogItems::NullItem
281
+ @log_item_map["o"] = LogItems::ResponseHeaderItem
282
+ @log_item_map["p"] = LogItems::PortItem
283
+ @log_item_map["P"] = LogItems::NullItem
284
+ @log_item_map["q"] = LogItems::QueryStringItem
285
+ @log_item_map["r"] = LogItems::StartLineItem
286
+ @log_item_map["s"] = LogItems::StatusItem
287
+ @log_item_map[">s"] = LogItems::StatusItem
288
+ @log_item_map["t"] = LogItems::TimeItem
289
+ @log_item_map["T"] = LogItems::IntervalItem
290
+ @log_item_map["u"] = LogItems::RemoteUserItem
291
+ @log_item_map["U"] = LogItems::RequestUrlItem
292
+ @log_item_map["v"] = LogItems::ServerNameItem
293
+ @log_item_map["V"] = LogItems::NullItem
294
+ end
295
+
296
+ make_map()
297
+
298
+ end
299
+ end
300
+ end
301
+ end
302
+ end
@@ -0,0 +1,242 @@
1
+ require 'ipaddr'
2
+
3
+ require 'baykit/bayserver/http_exception'
4
+ require 'baykit/bayserver/bcf/package'
5
+ require 'baykit/bayserver/docker/permission'
6
+ require 'baykit/bayserver/util/groups'
7
+ require 'baykit/bayserver/util/headers'
8
+ require 'baykit/bayserver/util/http_status'
9
+ require 'baykit/bayserver/util/host_matcher'
10
+ require 'baykit/bayserver/util/ip_matcher'
11
+
12
+
13
+ module Baykit
14
+ module BayServer
15
+ module Docker
16
+ module BuiltIn
17
+ class BuiltInPermissionDocker < Baykit::BayServer::Docker::Base::DockerBase
18
+ include Permission # import
19
+
20
+ include Baykit::BayServer
21
+ include Baykit::BayServer::Bcf
22
+ include Baykit::BayServer::Util
23
+
24
+ class CheckItem
25
+ attr :matcher
26
+ attr :admit
27
+
28
+ def initialize(matcher, admit)
29
+ @matcher = matcher
30
+ @admit = admit
31
+ end
32
+
33
+ def socket_admitted(skt)
34
+ matcher.match_socket(skt) == @admit
35
+ end
36
+
37
+ def tour_admitted(tur)
38
+ matcher.match_tour(tur) == @admit
39
+ end
40
+ end
41
+
42
+ module PermissionMatcher # interface
43
+
44
+ def match_socket(skt)
45
+ raise NotImplementedError()
46
+ end
47
+
48
+ def match_tour(tur)
49
+ raise NotImplementedError()
50
+ end
51
+ end
52
+
53
+
54
+ class HostPermissionMatcher
55
+ include Baykit::BayServer::Util
56
+ include PermissionMatcher # implements
57
+
58
+ attr :mch
59
+
60
+ def initialize(hostPtn)
61
+ @mch = HostMatcher.new(hostPtn)
62
+ end
63
+
64
+ def match_socket(skt)
65
+ return @mch.match(skt.remote_address.getnameinfo[0])
66
+ end
67
+
68
+ def match_tour(tur)
69
+ return @mch.match(tur.req.remote_host())
70
+ end
71
+ end
72
+
73
+ class IpPermissionMatcher
74
+ include Baykit::BayServer::Util
75
+ include PermissionMatcher # implements
76
+
77
+ attr :mch
78
+
79
+ def initialize(ip_desc)
80
+ @mch = IpMatcher.new(ip_desc)
81
+ end
82
+
83
+ def match_socket(skt)
84
+ return @mch.match(@mch.get_ip_addr(skt.remote_address.ip_address))
85
+ end
86
+
87
+ def match_tour(tur)
88
+ begin
89
+ return @mch.match(IPAddr.new(tur.req.remote_address))
90
+ rescue => e
91
+ BayLog.error_e(e)
92
+ false
93
+ end
94
+ end
95
+
96
+ end
97
+
98
+ attr :check_list
99
+ attr :groups
100
+
101
+ def initialize
102
+ @check_list = []
103
+ @groups = []
104
+ end
105
+
106
+ def init(elm, parent)
107
+ super
108
+ end
109
+
110
+ def init_key_val(kv)
111
+ case kv.key.downcase
112
+ when "admit", "allow"
113
+ parse_value(kv).each do |permission_matcher|
114
+ @check_list.append(CheckItem.new(permission_matcher, true))
115
+ end
116
+
117
+ when "refuse", "deny"
118
+ parse_value(kv).each do |permission_matcher|
119
+ @check_list.append(CheckItem.new(permission_matcher, false))
120
+ end
121
+
122
+ when "group"
123
+ kv.value.split(" ").each do |group_name|
124
+ g = BayServer.harbor.groups.get_group(group_name)
125
+ if g == nil
126
+ raise ConfigException.new(kv.file_name, kv.line_no, BayMessage.get(:CFG_GROUP_NOT_FOUND, group_name))
127
+ end
128
+ @groups.append(g)
129
+ end
130
+
131
+ else
132
+ raise ConfigException.new(kv.file_name, kv.line_no, BayMessage.get(:CFG_INVALID_PERMISSION_DESCRIPTION, kv.value))
133
+
134
+ end
135
+
136
+ return true
137
+ end
138
+
139
+ def socket_admitted(skt)
140
+ # Check remote host
141
+ isOk = true
142
+ @check_list.each do |chk|
143
+ if chk.admit
144
+ if chk.socket_admitted(skt)
145
+ isOk = true
146
+ break
147
+ end
148
+ else
149
+ if !chk.socket_admitted(skt)
150
+ isOk = false
151
+ break
152
+ end
153
+ end
154
+ end
155
+
156
+ if !isOk
157
+ BayLog.error("Permission error: socket not admitted: %s", skt)
158
+ raise HttpException.new HttpStatus::FORBIDDEN
159
+ end
160
+ end
161
+
162
+
163
+ def tour_admitted(tur)
164
+ # Check remote host
165
+ is_ok = true
166
+ @check_list.each do |chk|
167
+ if chk.admit
168
+ if chk.tour_admitted(tur)
169
+ is_ok = true
170
+ break
171
+ end
172
+ else
173
+ if !chk.tour_admitted(tur)
174
+ is_ok = false
175
+ break
176
+ end
177
+ end
178
+ end
179
+
180
+ if !is_ok
181
+ raise HttpException.new(HttpStatus::FORBIDDEN, tur.req.uri)
182
+ end
183
+
184
+ if @groups.empty?
185
+ return
186
+ end
187
+
188
+ # Check member
189
+ is_ok = false
190
+ if tur.req.remote_user != nil
191
+ @groups.each do |grp|
192
+ if grp.validate(tur.req.remote_user, tur.req.remote_pass)
193
+ is_ok = true
194
+ break
195
+ end
196
+ end
197
+ end
198
+
199
+ if !is_ok
200
+ tur.res.headers.set(Headers::WWW_AUTHENTICATE, "Basic realm=\"Auth\"")
201
+ raise HttpException.new(HttpStatus::UNAUTHORIZED)
202
+ end
203
+ end
204
+
205
+
206
+ private
207
+ def parse_value(kv)
208
+ items = kv.value.split(" ")
209
+ type = nil
210
+ match_str = []
211
+ items.length.times do |i|
212
+ if i == 0
213
+ type = items[i]
214
+ else
215
+ match_str.append(items[i])
216
+ end
217
+ end
218
+
219
+ if match_str.empty?
220
+ raise ConfigException.new(kv.file_name, kv.line_no, BayMessage.get(:CFG_INVALID_PERMISSION_DESCRIPTION, kv.value))
221
+ end
222
+
223
+ permission_manager_list = []
224
+ if type.casecmp?("host")
225
+ match_str.each do |m|
226
+ permission_manager_list.append(HostPermissionMatcher.new(m))
227
+ end
228
+ elsif type.casecmp?("ip")
229
+ match_str.each do |m|
230
+ permission_manager_list.append(IpPermissionMatcher.new(m))
231
+ end
232
+ else
233
+ raise ConfigException.new(kv.file_name, kv.line_no, BayMessage.get(:CFG_INVALID_PERMISSION_DESCRIPTION, kv.value))
234
+ end
235
+ return permission_manager_list
236
+ end
237
+ end
238
+ end
239
+ end
240
+ end
241
+ end
242
+
@@ -0,0 +1,157 @@
1
+ require 'openssl'
2
+
3
+ require 'baykit/bayserver/bcf/package'
4
+ require 'baykit/bayserver/agent/transporter/secure_transporter'
5
+
6
+ require 'baykit/bayserver/docker/secure'
7
+ require 'baykit/bayserver/util/string_util'
8
+
9
+ module Baykit
10
+ module BayServer
11
+ module Docker
12
+ module BuiltIn
13
+ class BuiltInSecureDocker < Baykit::BayServer::Docker::Base::DockerBase
14
+ include Baykit::BayServer::Docker::Secure # implements
15
+
16
+ include Baykit::BayServer::Bcf
17
+ include Baykit::BayServer::Agent::Transporter
18
+ include Baykit::BayServer::Util
19
+ include OpenSSL
20
+
21
+ DEFAULT_CLIENT_AUTH = false
22
+ DEFAULT_SSL_PROTOCOL = "TLS"
23
+
24
+ # SSL setting
25
+ attr :key_store
26
+ attr :key_store_pass
27
+ attr :client_auth
28
+ attr :ssl_protocol
29
+ attr :key_file
30
+ attr :cert_file
31
+ attr :certs
32
+ attr :certs_pass
33
+ attr :trace_ssl
34
+ attr :sslctx
35
+ attr :app_protocols
36
+
37
+ def initialize
38
+ @client_auth = DEFAULT_CLIENT_AUTH
39
+ @ssl_protocol = DEFAULT_SSL_PROTOCOL
40
+ @app_protocols = []
41
+ end
42
+
43
+ ######################################################
44
+ # Implements Docker
45
+ ######################################################
46
+
47
+ def init(elm, parent)
48
+ super
49
+
50
+ if (@key_store == nil) && ((@key_file == nil) || (@cert_file == nil))
51
+ raise ConfigException.new(elm.file_name, elm.line_no, "Key file or cert file is not specified")
52
+ end
53
+
54
+ begin
55
+ init_ssl()
56
+ rescue ConfigException => e
57
+ raise e
58
+ rescue => e
59
+ BayLog.error_e(e)
60
+ raise ConfigException.new(elm.file_name, elm.line_no, BayMessage.get(:CFG_SSL_INIT_ERROR, e.message))
61
+ end
62
+ end
63
+
64
+ ######################################################
65
+ # Implements DockerBase
66
+ ######################################################
67
+
68
+ def init_key_val(kv)
69
+ case kv.key.downcase
70
+ when "key"
71
+ @key_file = get_file_path(kv.value)
72
+ when "cert"
73
+ @cert_file = get_file_path(kv.value)
74
+ when "keystore"
75
+ @key_store = get_file_path(kv.value)
76
+ when "keystorepass"
77
+ @key_store_pass = kv.value
78
+ when "clientauth"
79
+ @client_auth = StringUtil.parse_bool(kv.value)
80
+ when "sslprotocol"
81
+ @ssl_protocol = kv.value
82
+ when "trustcerts"
83
+ @certs = get_file_path(kv.value)
84
+ when "certspass"
85
+ @certs_pass = kv.value
86
+ when "tracessl"
87
+ @trace_ssl = StringUtil.parse_bool(kv.value)
88
+ else
89
+ return false
90
+ end
91
+ return true
92
+ end
93
+
94
+
95
+ ######################################################
96
+ # Implements Secure
97
+ ######################################################
98
+
99
+ def set_app_protocols(protocols)
100
+ @app_protocols = protocols
101
+ @sslctx.alpn_select_cb = lambda do |protocols|
102
+ if protocols.include?("h2")
103
+ return "h2"
104
+ elsif protocols.include?("http/1.1")
105
+ return "http/1.1"
106
+ else
107
+ return protocols.first
108
+ end
109
+ end
110
+ end
111
+
112
+ def create_transporter(buf_size)
113
+ SecureTransporter.new(@sslctx, true, buf_size, @trace_ssl)
114
+ end
115
+
116
+ def reload_cert()
117
+ init_ssl()
118
+ end
119
+
120
+ def init_ssl()
121
+ BayLog.debug("%s init ssl", self)
122
+ @sslctx = SSL::SSLContext.new
123
+
124
+ if @key_store == nil
125
+ if @cert_file != nil
126
+ @sslctx.cert = X509::Certificate.new(File.read(@cert_file))
127
+ end
128
+ if @key_file != nil
129
+ @sslctx.key = PKey::RSA.new(File.read(@key_file))
130
+ end
131
+ else
132
+ p12 = OpenSSL::PKCS12.new(File.read(@key_store), @key_store_pass)
133
+ @sslctx.cert = p12.certificate
134
+ @sslctx.key = p12.key
135
+ end
136
+ end
137
+
138
+
139
+ private
140
+
141
+ def get_file_path(file)
142
+ if !File.absolute_path?(file)
143
+ file = BayServer.bserv_home + "/" + file
144
+ end
145
+
146
+ if !File.file?(file)
147
+ raise RuntimeError.new("File not found: #{file}")
148
+ end
149
+
150
+ file
151
+ end
152
+
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end