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.
- checksums.yaml +7 -0
- data/lib/baykit/bayserver/agent/accept_handler.rb +97 -0
- data/lib/baykit/bayserver/agent/channel_listener.rb +35 -0
- data/lib/baykit/bayserver/agent/command_receiver.rb +75 -0
- data/lib/baykit/bayserver/agent/grand_agent.rb +319 -0
- data/lib/baykit/bayserver/agent/grand_agent_monitor.rb +217 -0
- data/lib/baykit/bayserver/agent/next_socket_action.rb +14 -0
- data/lib/baykit/bayserver/agent/non_blocking_handler.rb +433 -0
- data/lib/baykit/bayserver/agent/package.rb +3 -0
- data/lib/baykit/bayserver/agent/signal/signal_agent.rb +165 -0
- data/lib/baykit/bayserver/agent/signal/signal_proxy.rb +18 -0
- data/lib/baykit/bayserver/agent/signal/signal_sender.rb +99 -0
- data/lib/baykit/bayserver/agent/spin_handler.rb +140 -0
- data/lib/baykit/bayserver/agent/transporter/data_listener.rb +38 -0
- data/lib/baykit/bayserver/agent/transporter/package.rb +3 -0
- data/lib/baykit/bayserver/agent/transporter/plain_transporter.rb +55 -0
- data/lib/baykit/bayserver/agent/transporter/secure_transporter.rb +81 -0
- data/lib/baykit/bayserver/agent/transporter/spin_read_transporter.rb +111 -0
- data/lib/baykit/bayserver/agent/transporter/spin_write_transporter.rb +125 -0
- data/lib/baykit/bayserver/agent/transporter/transporter.rb +466 -0
- data/lib/baykit/bayserver/agent/upgrade_exception.rb +11 -0
- data/lib/baykit/bayserver/bay_dockers.rb +60 -0
- data/lib/baykit/bayserver/bay_exception.rb +12 -0
- data/lib/baykit/bayserver/bay_log.rb +148 -0
- data/lib/baykit/bayserver/bay_message.rb +20 -0
- data/lib/baykit/bayserver/bayserver.rb +529 -0
- data/lib/baykit/bayserver/bcf/bcf_document.rb +44 -0
- data/lib/baykit/bayserver/bcf/bcf_element.rb +30 -0
- data/lib/baykit/bayserver/bcf/bcf_key_val.rb +19 -0
- data/lib/baykit/bayserver/bcf/bcf_object.rb +15 -0
- data/lib/baykit/bayserver/bcf/bcf_parser.rb +180 -0
- data/lib/baykit/bayserver/bcf/package.rb +6 -0
- data/lib/baykit/bayserver/bcf/parse_exception.rb +15 -0
- data/lib/baykit/bayserver/config_exception.rb +25 -0
- data/lib/baykit/bayserver/constants.rb +8 -0
- data/lib/baykit/bayserver/docker/base/club_base.rb +117 -0
- data/lib/baykit/bayserver/docker/base/docker_base.rb +66 -0
- data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +89 -0
- data/lib/baykit/bayserver/docker/base/inbound_handler.rb +42 -0
- data/lib/baykit/bayserver/docker/base/inbound_ship.rb +341 -0
- data/lib/baykit/bayserver/docker/base/inbound_ship_store.rb +65 -0
- data/lib/baykit/bayserver/docker/base/port_base.rb +228 -0
- data/lib/baykit/bayserver/docker/base/reroute_base.rb +28 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_city_docker.rb +303 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +226 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +302 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_permission_docker.rb +242 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_secure_docker.rb +157 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_town_docker.rb +117 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_trouble_docker.rb +57 -0
- data/lib/baykit/bayserver/docker/built_in/log_boat.rb +71 -0
- data/lib/baykit/bayserver/docker/built_in/log_item.rb +18 -0
- data/lib/baykit/bayserver/docker/built_in/log_item_factory.rb +18 -0
- data/lib/baykit/bayserver/docker/built_in/log_items.rb +287 -0
- data/lib/baykit/bayserver/docker/built_in/write_file_taxi.rb +101 -0
- data/lib/baykit/bayserver/docker/city.rb +22 -0
- data/lib/baykit/bayserver/docker/club.rb +45 -0
- data/lib/baykit/bayserver/docker/docker.rb +8 -0
- data/lib/baykit/bayserver/docker/harbor.rb +34 -0
- data/lib/baykit/bayserver/docker/log.rb +17 -0
- data/lib/baykit/bayserver/docker/package.rb +12 -0
- data/lib/baykit/bayserver/docker/permission.rb +18 -0
- data/lib/baykit/bayserver/docker/port.rb +39 -0
- data/lib/baykit/bayserver/docker/reroute.rb +17 -0
- data/lib/baykit/bayserver/docker/secure.rb +22 -0
- data/lib/baykit/bayserver/docker/send_file/directory_train.rb +123 -0
- data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +43 -0
- data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +71 -0
- data/lib/baykit/bayserver/docker/town.rb +30 -0
- data/lib/baykit/bayserver/docker/trouble.rb +17 -0
- data/lib/baykit/bayserver/docker/warp/package.rb +4 -0
- data/lib/baykit/bayserver/docker/warp/warp_data.rb +84 -0
- data/lib/baykit/bayserver/docker/warp/warp_data_listener.rb +112 -0
- data/lib/baykit/bayserver/docker/warp/warp_docker.rb +273 -0
- data/lib/baykit/bayserver/docker/warp/warp_handler.rb +38 -0
- data/lib/baykit/bayserver/docker/warp/warp_ship.rb +166 -0
- data/lib/baykit/bayserver/docker/warp/warp_ship_store.rb +111 -0
- data/lib/baykit/bayserver/http_exception.rb +33 -0
- data/lib/baykit/bayserver/mem_usage.rb +104 -0
- data/lib/baykit/bayserver/protocol/command.rb +21 -0
- data/lib/baykit/bayserver/protocol/command_handler.rb +9 -0
- data/lib/baykit/bayserver/protocol/command_packer.rb +49 -0
- data/lib/baykit/bayserver/protocol/command_unpacker.rb +13 -0
- data/lib/baykit/bayserver/protocol/package.rb +15 -0
- data/lib/baykit/bayserver/protocol/packet.rb +63 -0
- data/lib/baykit/bayserver/protocol/packet_factory.rb +13 -0
- data/lib/baykit/bayserver/protocol/packet_packer.rb +30 -0
- data/lib/baykit/bayserver/protocol/packet_part_accessor.rb +122 -0
- data/lib/baykit/bayserver/protocol/packet_store.rb +139 -0
- data/lib/baykit/bayserver/protocol/packet_unpacker.rb +17 -0
- data/lib/baykit/bayserver/protocol/protocol_exception.rb +17 -0
- data/lib/baykit/bayserver/protocol/protocol_handler.rb +64 -0
- data/lib/baykit/bayserver/protocol/protocol_handler_factory.rb +14 -0
- data/lib/baykit/bayserver/protocol/protocol_handler_store.rb +109 -0
- data/lib/baykit/bayserver/sink.rb +22 -0
- data/lib/baykit/bayserver/taxi/taxi.rb +38 -0
- data/lib/baykit/bayserver/taxi/taxi_runner.rb +31 -0
- data/lib/baykit/bayserver/tours/content_consume_listener.rb +20 -0
- data/lib/baykit/bayserver/tours/package.rb +4 -0
- data/lib/baykit/bayserver/tours/read_file_taxi.rb +102 -0
- data/lib/baykit/bayserver/tours/req_content_handler.rb +37 -0
- data/lib/baykit/bayserver/tours/send_file_train.rb +65 -0
- data/lib/baykit/bayserver/tours/send_file_yacht.rb +93 -0
- data/lib/baykit/bayserver/tours/tour.rb +195 -0
- data/lib/baykit/bayserver/tours/tour_req.rb +251 -0
- data/lib/baykit/bayserver/tours/tour_res.rb +400 -0
- data/lib/baykit/bayserver/tours/tour_store.rb +121 -0
- data/lib/baykit/bayserver/train/train.rb +54 -0
- data/lib/baykit/bayserver/train/train_runner.rb +32 -0
- data/lib/baykit/bayserver/util/byte_array.rb +54 -0
- data/lib/baykit/bayserver/util/byte_buffer.rb +13 -0
- data/lib/baykit/bayserver/util/cgi_util.rb +165 -0
- data/lib/baykit/bayserver/util/char_util.rb +22 -0
- data/lib/baykit/bayserver/util/cities.rb +45 -0
- data/lib/baykit/bayserver/util/class_util.rb +17 -0
- data/lib/baykit/bayserver/util/counter.rb +23 -0
- data/lib/baykit/bayserver/util/data_consume_listener.rb +13 -0
- data/lib/baykit/bayserver/util/executor_service.rb +81 -0
- data/lib/baykit/bayserver/util/groups.rb +110 -0
- data/lib/baykit/bayserver/util/gzip_compressor.rb +55 -0
- data/lib/baykit/bayserver/util/headers.rb +194 -0
- data/lib/baykit/bayserver/util/host_matcher.rb +48 -0
- data/lib/baykit/bayserver/util/http_status.rb +60 -0
- data/lib/baykit/bayserver/util/http_util.rb +157 -0
- data/lib/baykit/bayserver/util/io_util.rb +32 -0
- data/lib/baykit/bayserver/util/ip_matcher.rb +67 -0
- data/lib/baykit/bayserver/util/key_val.rb +15 -0
- data/lib/baykit/bayserver/util/key_val_list_parser.rb +53 -0
- data/lib/baykit/bayserver/util/locale.rb +30 -0
- data/lib/baykit/bayserver/util/md5_password.rb +24 -0
- data/lib/baykit/bayserver/util/message.rb +56 -0
- data/lib/baykit/bayserver/util/mimes.rb +27 -0
- data/lib/baykit/bayserver/util/object_factory.rb +13 -0
- data/lib/baykit/bayserver/util/object_store.rb +74 -0
- data/lib/baykit/bayserver/util/postman.rb +35 -0
- data/lib/baykit/bayserver/util/reusable.rb +13 -0
- data/lib/baykit/bayserver/util/selector.rb +141 -0
- data/lib/baykit/bayserver/util/simple_buffer.rb +53 -0
- data/lib/baykit/bayserver/util/simple_inspect.rb +12 -0
- data/lib/baykit/bayserver/util/string_util.rb +73 -0
- data/lib/baykit/bayserver/util/sys_util.rb +138 -0
- data/lib/baykit/bayserver/util/url_decoder.rb +42 -0
- data/lib/baykit/bayserver/util/url_encoder.rb +19 -0
- data/lib/baykit/bayserver/util/valve.rb +15 -0
- data/lib/baykit/bayserver/version.rb +7 -0
- data/lib/baykit/bayserver/watercraft/boat.rb +43 -0
- data/lib/baykit/bayserver/watercraft/ship.rb +104 -0
- data/lib/baykit/bayserver/watercraft/yacht.rb +42 -0
- 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,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
|