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,165 @@
1
+ require 'baykit/bayserver/mem_usage'
2
+ require 'baykit/bayserver/bcf/package'
3
+
4
+ require 'baykit/bayserver/agent/grand_agent_monitor'
5
+ require 'baykit/bayserver/agent/signal/signal_proxy'
6
+ require 'baykit/bayserver/util/sys_util'
7
+
8
+ module Baykit
9
+ module BayServer
10
+ module Agent
11
+ module Signal
12
+ class SignalAgent
13
+ include Baykit::BayServer
14
+ include Baykit::BayServer::Bcf
15
+ include Baykit::BayServer::Util
16
+ include Baykit::BayServer::Agent
17
+ include Baykit::BayServer::Agent::Signal
18
+
19
+ COMMAND_RELOAD_CERT = "reloadcert"
20
+ COMMAND_MEM_USAGE = "memusage"
21
+ COMMAND_RESTART_AGENTS = "restartagents"
22
+ COMMAND_SHUTDOWN = "shutdown"
23
+ COMMAND_ABORT = "abort"
24
+
25
+ class << self
26
+ attr :commands
27
+ attr :signal_map
28
+ attr :signal_agent
29
+ end
30
+
31
+ @commands = [
32
+ COMMAND_RELOAD_CERT,
33
+ COMMAND_MEM_USAGE,
34
+ COMMAND_RESTART_AGENTS,
35
+ COMMAND_SHUTDOWN,
36
+ COMMAND_ABORT
37
+ ]
38
+ @signal_map = {}
39
+ @signal_agent = nil
40
+
41
+ attr :port
42
+ attr :server_skt
43
+
44
+ def initialize(port)
45
+ @port = port
46
+ @server_skt = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
47
+ @server_skt.setsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR, true)
48
+ adr = Socket.sockaddr_in(@port, "127.0.0.1")
49
+ @server_skt.bind(adr)
50
+ @server_skt.listen(0)
51
+ BayLog.info( BayMessage.get(:MSG_OPEN_CTL_PORT, @port))
52
+ end
53
+
54
+ def on_socket_readable()
55
+
56
+ begin
57
+ skt, = @server_skt.accept
58
+ skt.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, [5, 0].pack("l_2"))
59
+
60
+ line = skt.readline.strip()
61
+ BayLog.info(BayMessage.get(:MSG_COMMAND_RECEIVED, line))
62
+ SignalAgent.handle_command(line)
63
+ skt.write("OK\n")
64
+ skt.flush
65
+
66
+ rescue => e
67
+ BayLog.error_e(e)
68
+
69
+ ensure
70
+ if skt
71
+ skt.close()
72
+ end
73
+ end
74
+
75
+ end
76
+
77
+ def close
78
+ @server_skt.close
79
+ end
80
+
81
+
82
+ ######################################################
83
+ # class methods
84
+ ######################################################
85
+
86
+ def SignalAgent.init(bay_port)
87
+ @commands.each do |cmd|
88
+ SignalProxy.register(get_signal_from_command(cmd)) do
89
+ handle_command(cmd)
90
+ end
91
+ end
92
+
93
+ if bay_port > 0
94
+ @signal_agent = SignalAgent.new(bay_port)
95
+ end
96
+ end
97
+
98
+ def SignalAgent.handle_command(cmd)
99
+ BayLog.debug("handle command: %s", cmd)
100
+ case (cmd.downcase)
101
+ when COMMAND_RELOAD_CERT
102
+ GrandAgentMonitor::reload_cert_all()
103
+ when COMMAND_MEM_USAGE
104
+ GrandAgentMonitor::print_usage_all()
105
+ when COMMAND_RESTART_AGENTS
106
+ GrandAgentMonitor::restart_all()
107
+ when COMMAND_SHUTDOWN
108
+ GrandAgentMonitor::shutdown_all()
109
+ when COMMAND_ABORT
110
+ GrandAgentMonitor::abort_all()
111
+ else
112
+ BayLog.error("Unknown command: %s", cmd)
113
+ end
114
+ end
115
+
116
+
117
+ def SignalAgent.get_signal_from_command(command)
118
+ init_signal_map()
119
+ @signal_map.keys().each do |sig|
120
+ if(@signal_map[sig].casecmp?(command))
121
+ return sig;
122
+ end
123
+ end
124
+ return nil
125
+ end
126
+
127
+ def SignalAgent.init_signal_map()
128
+ if !@signal_map.empty?
129
+ return;
130
+ end
131
+
132
+ if SysUtil.run_on_windows()
133
+ # Available signals on Windows
134
+ # SIGABRT
135
+ # SIGFPE
136
+ # SIGILL
137
+ # SIGINT
138
+ # SIGSEGV
139
+ # SIGTERM
140
+ @signal_map["SEGV"] = COMMAND_RELOAD_CERT
141
+ @signal_map["ILL"] = COMMAND_MEM_USAGE
142
+ @signal_map["INT"] = COMMAND_SHUTDOWN
143
+ @signal_map["TERM"] = COMMAND_RESTART_AGENTS
144
+ @signal_map["ABRT"] = COMMAND_ABORT
145
+
146
+ else
147
+ @signal_map["ALRM"] = COMMAND_RELOAD_CERT
148
+ @signal_map["TRAP"] = COMMAND_MEM_USAGE
149
+ @signal_map["HUP"] = COMMAND_RESTART_AGENTS
150
+ @signal_map["TERM"] = COMMAND_SHUTDOWN
151
+ @signal_map["ABRT"] = COMMAND_ABORT
152
+ end
153
+ end
154
+
155
+ def SignalAgent.term()
156
+ if @signal_agent
157
+ @signal_agent.close()
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
165
+
@@ -0,0 +1,18 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Agent
4
+ module Signal
5
+ class SignalProxy
6
+
7
+ def SignalProxy.register(sig, &handler)
8
+ begin
9
+ ::Signal.trap(sig, proc {handler.call()})
10
+ rescue ArgumentError => e
11
+ BayLog.warn(BayMessage.get(:INT_CANNOT_SET_SIG_HANDLER, e.message, sig))
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,99 @@
1
+ require 'baykit/bayserver/bcf/bcf_parser'
2
+ require 'baykit/bayserver/bay_log'
3
+ require 'baykit/bayserver/docker/built_in/built_in_harbor_docker'
4
+ require 'baykit/bayserver/util/sys_util'
5
+
6
+ module Baykit
7
+ module BayServer
8
+ module Agent
9
+ module Signal
10
+ class SignalSender
11
+ include Baykit::BayServer::Bcf
12
+ include Baykit::BayServer::Docker::BuiltIn
13
+ include Baykit::BayServer::Util
14
+
15
+
16
+ attr :control_port
17
+ attr :pid_file
18
+
19
+ def initialize
20
+ @bay_port = BuiltInHarborDocker::DEFAULT_CONTROL_PORT
21
+ @pid_file = BuiltInHarborDocker::DEFAULT_PID_FILE
22
+ end
23
+
24
+
25
+ #
26
+ # Send running BayServer a command
27
+ #
28
+ def send_command(cmd)
29
+ parse_bay_port(BayServer.bserv_plan)
30
+
31
+ if @bay_port < 0
32
+ pid = read_pid_file()
33
+ sig = SignalAgent.get_signal_from_command(cmd)
34
+ if sig == nil
35
+ raise StandardError("Invalid command: " + cmd)
36
+ else
37
+ kill(pid, sig)
38
+ end
39
+ else
40
+ BayLog.info(BayMessage.get(:MSG_SENDING_COMMAND, cmd))
41
+ send("127.0.0.1", @bay_port, cmd)
42
+ end
43
+ end
44
+
45
+ #
46
+ # Parse plan file and get port number of SignalAgent
47
+ #
48
+ def parse_bay_port(plan)
49
+ p = BcfParser.new()
50
+ doc = p.parse(plan)
51
+ doc.content_list.each do |elm|
52
+ if elm.kind_of?(BcfElement)
53
+ if elm.name.casecmp?("harbor")
54
+ elm.content_list.each do |kv|
55
+ if kv.key.casecmp?("controlPort")
56
+ @bay_port = kv.value.to_i()
57
+ elsif kv.key.casecmp?("pidFile")
58
+ @pid_file = kv.value
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+
67
+ def send(host, port, cmd)
68
+ begin
69
+ a = Addrinfo.tcp(host, port)
70
+ s = Socket.new(a.ipv4? ? Socket::AF_INET : Socket::AF_INET6, Socket::SOCK_STREAM)
71
+ s.connect(a)
72
+ s.write(cmd + "\n")
73
+ s.flush();
74
+ line = s.readline()
75
+ ensure
76
+ s.close()
77
+ end
78
+ end
79
+
80
+ def kill(pid, sig)
81
+ BayLog.info("Send signal pid=#{pid} sig=#{sig}")
82
+ if SysUtil.run_on_windows()
83
+ system("taskkill /PID #{pid} /F")
84
+ else
85
+ Process.kill(sig, pid)
86
+ end
87
+ end
88
+
89
+ def read_pid_file()
90
+ File.open(BayServer.get_location(@pid_file), "r") do |f|
91
+ return f.readline().to_i()
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+
@@ -0,0 +1,140 @@
1
+
2
+ module Baykit
3
+ module BayServer
4
+ module Agent
5
+ class SpinHandler
6
+
7
+ module SpinListener
8
+ #
9
+ # interface
10
+ #
11
+ # NextSocketAction lap(boolean spun[]);
12
+ # boolean checkTimeout(int durationSec);
13
+ # void close();
14
+ #
15
+ end
16
+
17
+ class ListenerInfo
18
+ attr :listener
19
+ attr :last_access
20
+
21
+ def initialize(lis, last_access)
22
+ @listener = lis
23
+ @last_access = last_access
24
+ end
25
+ end
26
+
27
+
28
+ attr :listeners
29
+ attr :lock
30
+ attr :agent
31
+ attr :spin_count
32
+
33
+ def initialize(agt)
34
+ @listeners = []
35
+ @lock = Mutex.new
36
+ @agent = agt
37
+ @spin_count = 0
38
+ end
39
+
40
+ def to_s()
41
+ return @agent.to_s()
42
+ end
43
+
44
+ def process_data()
45
+ if @listeners.empty?
46
+ return false
47
+ end
48
+
49
+ all_spun = true
50
+ remove_list = []
51
+ @listeners.length.downto(1) do |i|
52
+ lis = listeners[i-1].listener
53
+ act, spun = lis.lap()
54
+
55
+ case act
56
+ when NextSocketAction::SUSPEND
57
+ remove_list.append(i-1)
58
+ when NextSocketAction::CLOSE
59
+ remove_list.append(i-1)
60
+ when NextSocketAction::CONTINUE
61
+ next
62
+ else
63
+ raise Sink.new()
64
+ end
65
+
66
+ @listeners[i].last_access = Time.now.tv_sec()
67
+ all_spun = all_spun & spun
68
+ end
69
+
70
+ if all_spun
71
+ @spin_count += 1
72
+ if @spin_count > 10
73
+ sleep(0.01)
74
+ else
75
+ @spin_count = 0
76
+ end
77
+ end
78
+
79
+ remove_list.each do |i|
80
+ @lock.synchronize do
81
+ @listeners.delete_at(i)
82
+ end
83
+ end
84
+
85
+ return true
86
+ end
87
+
88
+ def ask_to_callback(lis)
89
+ BayLog.debug("%s Ask to callback: %s", self, lis)
90
+
91
+ found = false
92
+ for ifo in @listeners do
93
+ if ifo.listener == lis
94
+ found = true
95
+ break
96
+ end
97
+ end
98
+
99
+ if found
100
+ BayLog.error("Already registered")
101
+ else
102
+ @lock.synchronize do
103
+ @listeners.append(ListenerInfo.new(lis, Time.now.tv_sec))
104
+ end
105
+ end
106
+ end
107
+
108
+ def empty?()
109
+ return @listeners.empty?
110
+ end
111
+
112
+
113
+ def stop_timeout_spins()
114
+ if !@listeners.empty?
115
+ return
116
+ end
117
+
118
+ remove_list = []
119
+ @lock.synchronize do
120
+ now = Time.now.tv_sec
121
+ @listeners.length.downto(1) do |i|
122
+ ifo = @listeners[i-1]
123
+ if ifo.listener.check_timeout(int(now - ifo.last_access))
124
+ ifo.listener.close()
125
+ remove_list.append(i)
126
+ end
127
+ end
128
+ end
129
+
130
+ remove_list.each do |i|
131
+ @lock.synchronize do
132
+ self.listeners.pop(i)
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+
@@ -0,0 +1,38 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Agent
4
+ module Transporter
5
+ module DataListener # interface
6
+
7
+ def notify_connect()
8
+ raise NotImplementedError()
9
+ end
10
+
11
+ def notify_handshake_done(protocol)
12
+ raise NotImplementedError()
13
+ end
14
+
15
+ def notify_read(buf)
16
+ raise NotImplementedError()
17
+ end
18
+
19
+ def notify_eof()
20
+ raise NotImplementedError()
21
+ end
22
+
23
+ def notify_protocol_error(err)
24
+ raise NotImplementedError()
25
+ end
26
+
27
+ def notify_close()
28
+ raise NotImplementedError()
29
+ end
30
+
31
+ def check_timeout(duration_sec)
32
+ raise NotImplementedError()
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,3 @@
1
+ require 'baykit/bayserver/agent/transporter/plain_transporter'
2
+ require 'baykit/bayserver/agent/transporter/secure_transporter'
3
+ require 'baykit/bayserver/agent/transporter/transporter'
@@ -0,0 +1,55 @@
1
+ require 'baykit/bayserver/agent/transporter/transporter'
2
+ require 'baykit/bayserver/protocol/protocol_exception'
3
+ require 'baykit/bayserver/agent/next_socket_action'
4
+
5
+ module Baykit
6
+ module BayServer
7
+ module Agent
8
+ module Transporter
9
+ class PlainTransporter < Baykit::BayServer::Agent::Transporter::Transporter
10
+ include Baykit::BayServer::Agent
11
+ include Baykit::BayServer::Protocol
12
+ include Baykit::BayServer::Util
13
+
14
+ def initialize(server_mode, bufsiz, write_only = false)
15
+ super(server_mode, bufsiz, false, write_only)
16
+ end
17
+
18
+ def init(nb_hnd, ch, lis)
19
+ super
20
+ @handshaked = true # plain socket doesn't need to handshake
21
+ end
22
+
23
+ def to_s
24
+ return "tp[#{@data_listener}]"
25
+ end
26
+
27
+ ######################################################
28
+ # Implements Transporter
29
+ ######################################################
30
+
31
+ def secure()
32
+ return false
33
+ end
34
+
35
+ def handshake_nonblock
36
+ raise Sink.new("needless to handshake")
37
+ end
38
+
39
+ def read_nonblock()
40
+ #@ch.sysread(@capacity, @read_buf)
41
+ @ch.read_nonblock(@capacity, @read_buf)
42
+ return nil # client address (for UDP)
43
+ end
44
+
45
+ def write_nonblock(buf, adr)
46
+ #return @ch.syswrite(buf)
47
+ return @ch.write_nonblock(buf)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+
@@ -0,0 +1,81 @@
1
+ require 'openssl'
2
+
3
+ require 'baykit/bayserver/agent/transporter/transporter'
4
+ require 'baykit/bayserver/agent/next_socket_action'
5
+
6
+ module Baykit
7
+ module BayServer
8
+ module Agent
9
+ module Transporter
10
+ class SecureTransporter < Transporter
11
+ include OpenSSL
12
+ include Baykit::BayServer::Protocol
13
+
14
+ attr :sslctx
15
+ attr :ssl_socket
16
+
17
+ def initialize(sslctx, server_mode, bufsize, trace_ssl)
18
+ super(server_mode, bufsize, trace_ssl)
19
+ @sslctx = sslctx
20
+ end
21
+
22
+
23
+ def init(nb_hnd, sip, lis)
24
+ super
25
+ @ssl_socket = SSL::SSLSocket.new(@ch, @sslctx)
26
+ @handshaked = false
27
+ end
28
+
29
+ def reset()
30
+ super
31
+ @ssl_socket = nil
32
+ end
33
+
34
+ def to_s()
35
+ "stp[#{@data_listener}]"
36
+ end
37
+
38
+ ######################################################
39
+ # Implements Transporter
40
+ ######################################################
41
+
42
+ def secure()
43
+ return true
44
+ end
45
+
46
+ def handshake_nonblock()
47
+ if @server_mode
48
+ @ssl_socket.accept_nonblock()
49
+ else
50
+ @ssl_socket.connect_nonblock()
51
+ end
52
+
53
+
54
+ BayLog.debug("%s Handshake done", self)
55
+ app_protocols = @ssl_socket.context.alpn_protocols
56
+
57
+ # HELP ME
58
+ # This code does not work!
59
+ # We cannot get application protocol name
60
+ proto = nil
61
+ if app_protocols != nil && app_protocols.length > 0
62
+ proto = app_protocols[0]
63
+ end
64
+ @data_listener.notify_handshake_done(proto)
65
+ end
66
+
67
+ def read_nonblock
68
+ @ssl_socket.read_nonblock(@capacity, @read_buf)
69
+ return nil # client address (for UDP)
70
+ end
71
+
72
+ def write_nonblock(buf, adr)
73
+ @ssl_socket.write(buf)
74
+ end
75
+
76
+ end
77
+ end
78
+
79
+ end
80
+ end
81
+ end