bayserver-core 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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,33 @@
|
|
1
|
+
require 'baykit/bayserver/bay_exception'
|
2
|
+
require 'baykit/bayserver/util/http_status'
|
3
|
+
|
4
|
+
module Baykit
|
5
|
+
module BayServer
|
6
|
+
|
7
|
+
class HttpException < BayException
|
8
|
+
include Baykit::BayServer::Util
|
9
|
+
|
10
|
+
attr :status # Http status
|
11
|
+
attr_accessor :location # for 302
|
12
|
+
|
13
|
+
def initialize(status, fmt=nil, *args)
|
14
|
+
super(fmt, *args)
|
15
|
+
@status = status
|
16
|
+
if @status < 300 || @status >= 600
|
17
|
+
raise RuntimeError.new "IllegalArgument"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def message
|
22
|
+
"HTTP #{@status} #{super}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.moved_temp(location)
|
26
|
+
e = HttpException.new(HttpStatus::MOVED_TEMPORARILY, location)
|
27
|
+
e.location = location
|
28
|
+
return e
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'baykit/bayserver/bayserver'
|
2
|
+
require 'baykit/bayserver/agent/grand_agent'
|
3
|
+
require 'baykit/bayserver/protocol/protocol_handler_store'
|
4
|
+
require 'baykit/bayserver/protocol/packet_store'
|
5
|
+
require 'baykit/bayserver/tours/tour_store'
|
6
|
+
require 'baykit/bayserver/docker/base/inbound_ship_store'
|
7
|
+
require 'baykit/bayserver/docker/warp/warp_docker'
|
8
|
+
|
9
|
+
require 'baykit/bayserver/util/string_util'
|
10
|
+
|
11
|
+
module Baykit
|
12
|
+
module BayServer
|
13
|
+
class MemUsage
|
14
|
+
include Baykit::BayServer
|
15
|
+
include Baykit::BayServer::Agent
|
16
|
+
include Baykit::BayServer::Protocol
|
17
|
+
include Baykit::BayServer::Tours
|
18
|
+
include Baykit::BayServer::Docker::Warp
|
19
|
+
include Baykit::BayServer::Docker::Base
|
20
|
+
include Baykit::BayServer::Util
|
21
|
+
|
22
|
+
class AgentListener
|
23
|
+
include Baykit::BayServer::Agent::GrandAgent::GrandAgentLifecycleListener
|
24
|
+
|
25
|
+
def add(agt)
|
26
|
+
MemUsage.mem_usages[agt.agent_id] = MemUsage.new(agt.agent_id);
|
27
|
+
end
|
28
|
+
|
29
|
+
def remove(agt)
|
30
|
+
MemUsage.mem_usages.delete(agt.agent_id)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class << self
|
35
|
+
attr :mem_usages
|
36
|
+
end
|
37
|
+
# Agent ID => MemUsage
|
38
|
+
@mem_usages = {}
|
39
|
+
|
40
|
+
attr :agent_id
|
41
|
+
|
42
|
+
def initialize(agt_id)
|
43
|
+
@agent_id = agt_id
|
44
|
+
end
|
45
|
+
|
46
|
+
def print_usage(indent)
|
47
|
+
InboundShipStore.get_store(@agent_id).print_usage(indent+1)
|
48
|
+
ProtocolHandlerStore.get_stores(@agent_id).each do |store|
|
49
|
+
store.print_usage(indent+1)
|
50
|
+
end
|
51
|
+
PacketStore.get_stores(@agent_id).each do |store|
|
52
|
+
store.print_usage(indent+1)
|
53
|
+
end
|
54
|
+
TourStore.get_store(@agent_id).print_usage(indent+1);
|
55
|
+
BayServer.cities.cities.each do |city|
|
56
|
+
print_city_usage(nil, city, indent)
|
57
|
+
end
|
58
|
+
|
59
|
+
BayServer.ports.each do |port|
|
60
|
+
port.cities.cities().each do |city|
|
61
|
+
print_city_usage(port, city, indent)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
def print_city_usage(port, city, indent)
|
68
|
+
if port == nil
|
69
|
+
pname = ""
|
70
|
+
else
|
71
|
+
pname = "@#{port}"
|
72
|
+
end
|
73
|
+
|
74
|
+
city.clubs().each do |club|
|
75
|
+
if club.kind_of?(WarpDocker)
|
76
|
+
BayLog.info("%sClub(%s%s) Usage:", StringUtil.indent(indent), club, pname);
|
77
|
+
club.get_ship_store(@agent_id).print_usage(indent+1)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
city.towns().each do |town|
|
81
|
+
town.clubs().each do |club|
|
82
|
+
if club.kind_of?(WarpDocker)
|
83
|
+
BayLog.info("%sClub(%s%s) Usage:", StringUtil.indent(indent), club, pname);
|
84
|
+
club.get_ship_store(@agent_id).print_usage(indent+1)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
######################################################
|
92
|
+
# Class methods
|
93
|
+
######################################################
|
94
|
+
def self.init()
|
95
|
+
GrandAgent.add_lifecycle_listener(AgentListener.new());
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.get(agent_id)
|
99
|
+
return @mem_usages[agent_id]
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Baykit
|
2
|
+
module BayServer
|
3
|
+
module Protocol
|
4
|
+
class Command
|
5
|
+
|
6
|
+
# abstract methods
|
7
|
+
#
|
8
|
+
# unpack(P packet)
|
9
|
+
# pack(P packet)
|
10
|
+
# handle(H handler)
|
11
|
+
|
12
|
+
attr :type
|
13
|
+
|
14
|
+
def initialize(type)
|
15
|
+
@type = type
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'baykit/bayserver/util/data_consume_listener'
|
2
|
+
|
3
|
+
module Baykit
|
4
|
+
module BayServer
|
5
|
+
module Protocol
|
6
|
+
class CommandPacker
|
7
|
+
include Baykit::BayServer::Util::Reusable # implements
|
8
|
+
|
9
|
+
include Baykit::BayServer::Util
|
10
|
+
|
11
|
+
attr :pkt_packer
|
12
|
+
attr :pkt_store
|
13
|
+
|
14
|
+
def initialize(pkt_packer, store)
|
15
|
+
@pkt_packer = pkt_packer
|
16
|
+
@pkt_store = store
|
17
|
+
end
|
18
|
+
|
19
|
+
def reset()
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
def post(sip, cmd, &lisnr)
|
24
|
+
pkt = @pkt_store.rent(cmd.type)
|
25
|
+
begin
|
26
|
+
cmd.pack(pkt)
|
27
|
+
@pkt_packer.post(sip.postman, pkt) do
|
28
|
+
@pkt_store.Return(pkt)
|
29
|
+
if lisnr != nil
|
30
|
+
lisnr.call()
|
31
|
+
end
|
32
|
+
end
|
33
|
+
rescue IOError => e
|
34
|
+
@pkt_store.Return(pkt)
|
35
|
+
raise e
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def flush(sip)
|
40
|
+
@pkt_packer.flush(sip.postman)
|
41
|
+
end
|
42
|
+
|
43
|
+
def end(sip)
|
44
|
+
@pkt_packer.end(sip.postman)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'baykit/bayserver/protocol/packet'
|
2
|
+
require 'baykit/bayserver/protocol/packet_part_accessor'
|
3
|
+
require 'baykit/bayserver/protocol/packet_packer'
|
4
|
+
require 'baykit/bayserver/protocol/packet_unpacker'
|
5
|
+
require 'baykit/bayserver/protocol/packet_store'
|
6
|
+
require 'baykit/bayserver/protocol/packet_factory'
|
7
|
+
require 'baykit/bayserver/protocol/command'
|
8
|
+
require 'baykit/bayserver/protocol/command_packer'
|
9
|
+
require 'baykit/bayserver/protocol/command_unpacker'
|
10
|
+
require 'baykit/bayserver/protocol/command_handler'
|
11
|
+
require 'baykit/bayserver/protocol/protocol_exception'
|
12
|
+
require 'baykit/bayserver/protocol/protocol_handler'
|
13
|
+
require 'baykit/bayserver/protocol/protocol_handler_factory'
|
14
|
+
require 'baykit/bayserver/protocol/protocol_handler_store'
|
15
|
+
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'baykit/bayserver/util/string_util'
|
2
|
+
require 'baykit/bayserver/util/class_util'
|
3
|
+
|
4
|
+
#
|
5
|
+
# Packet format
|
6
|
+
# +---------------------------+
|
7
|
+
# + Header(type, length etc) +
|
8
|
+
# +---------------------------+
|
9
|
+
# + Data(payload data) +
|
10
|
+
# +---------------------------+
|
11
|
+
#
|
12
|
+
module Baykit
|
13
|
+
module BayServer
|
14
|
+
module Protocol
|
15
|
+
class Packet
|
16
|
+
include Baykit::BayServer::Util
|
17
|
+
include Baykit::BayServer::Util::Reusable # implements
|
18
|
+
|
19
|
+
INITIAL_BUF_SIZE = 8192 * 4
|
20
|
+
|
21
|
+
attr :type
|
22
|
+
attr :buf
|
23
|
+
attr_accessor :buf_len
|
24
|
+
attr :header_len
|
25
|
+
attr :max_data_len
|
26
|
+
|
27
|
+
def initialize(type, header_len, max_data_len)
|
28
|
+
@type = type
|
29
|
+
@header_len = header_len
|
30
|
+
@max_data_len = max_data_len
|
31
|
+
@buf = StringUtil.alloc(INITIAL_BUF_SIZE)
|
32
|
+
reset
|
33
|
+
end
|
34
|
+
|
35
|
+
def reset
|
36
|
+
@buf.clear()
|
37
|
+
header_len.times do |i| @buf << 0 end
|
38
|
+
@buf_len = header_len
|
39
|
+
end
|
40
|
+
|
41
|
+
def data_len()
|
42
|
+
return @buf_len - @header_len
|
43
|
+
end
|
44
|
+
|
45
|
+
def expand
|
46
|
+
@buf = StringUtil.realloc(@buf, @buf.length * 2)
|
47
|
+
end
|
48
|
+
|
49
|
+
def new_header_accessor()
|
50
|
+
return PacketPartAccessor.new(self, 0, @header_len)
|
51
|
+
end
|
52
|
+
|
53
|
+
def new_data_accessor()
|
54
|
+
return PacketPartAccessor.new(self, @header_len, -1)
|
55
|
+
end
|
56
|
+
|
57
|
+
def to_s
|
58
|
+
return "pkt[#{ClassUtil.get_local_name(self.class)}(#{@type})]"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Baykit
|
2
|
+
module BayServer
|
3
|
+
module Protocol
|
4
|
+
class PacketPacker
|
5
|
+
include Baykit::BayServer::Util::Reusable # implements
|
6
|
+
|
7
|
+
def reset()
|
8
|
+
end
|
9
|
+
|
10
|
+
def post(postman, pkt, &lisnr)
|
11
|
+
if postman == nil || pkt == nil || lisnr == nil
|
12
|
+
raise Sink.new()
|
13
|
+
end
|
14
|
+
postman.post(pkt.buf[0, pkt.buf_len], nil, pkt) do
|
15
|
+
lisnr.call()
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def flush(postman)
|
20
|
+
postman.flush()
|
21
|
+
end
|
22
|
+
|
23
|
+
def end(postman)
|
24
|
+
postman.post_end()
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'baykit/bayserver/sink'
|
2
|
+
require 'baykit/bayserver/util/string_util'
|
3
|
+
|
4
|
+
module Baykit
|
5
|
+
module BayServer
|
6
|
+
module Protocol
|
7
|
+
class PacketPartAccessor
|
8
|
+
include Baykit::BayServer
|
9
|
+
include Baykit::BayServer::Util
|
10
|
+
|
11
|
+
attr :packet
|
12
|
+
attr :start
|
13
|
+
attr :max_len
|
14
|
+
attr :pos
|
15
|
+
|
16
|
+
def initialize(pkt, start, max_len)
|
17
|
+
@packet = pkt
|
18
|
+
@start = start
|
19
|
+
@max_len = max_len
|
20
|
+
@pos = 0
|
21
|
+
end
|
22
|
+
|
23
|
+
def put_byte(b)
|
24
|
+
buf = StringUtil.alloc(1)
|
25
|
+
buf << b
|
26
|
+
put_bytes(buf, 0, 1)
|
27
|
+
end
|
28
|
+
|
29
|
+
def put_bytes(buf, ofs=0, len=buf.length)
|
30
|
+
if len > 0
|
31
|
+
check_write(len)
|
32
|
+
#while(@start + @pos + len > @packet.buf.length)
|
33
|
+
# packet.expand()
|
34
|
+
#end
|
35
|
+
begin
|
36
|
+
@packet.buf[@start + @pos, len] = buf[ofs, len]
|
37
|
+
rescue IndexError => e
|
38
|
+
raise IndexError.new("data exceeds packet size: len=#{len} pktlen=#{buf.length - @start}")
|
39
|
+
end
|
40
|
+
|
41
|
+
forward(len)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def put_short(val)
|
46
|
+
h = val >> 8 & 0xFF
|
47
|
+
l = val & 0xFF
|
48
|
+
buf = StringUtil.alloc(2)
|
49
|
+
buf << h << l
|
50
|
+
put_bytes(buf)
|
51
|
+
end
|
52
|
+
|
53
|
+
def put_int(val)
|
54
|
+
b1 = val >> 24 & 0xFF
|
55
|
+
b2 = val >> 16 & 0xFF
|
56
|
+
b3 = val >> 8 & 0xFF
|
57
|
+
b4 = val & 0xFF
|
58
|
+
buf = StringUtil.alloc(4)
|
59
|
+
buf << b1 << b2 << b3 << b4
|
60
|
+
put_bytes(buf)
|
61
|
+
end
|
62
|
+
|
63
|
+
def put_string(str)
|
64
|
+
if str == nil
|
65
|
+
raise Sink.new("nil")
|
66
|
+
end
|
67
|
+
put_bytes(StringUtil.to_bytes(str))
|
68
|
+
end
|
69
|
+
|
70
|
+
def get_byte
|
71
|
+
buf = StringUtil.alloc(1)
|
72
|
+
get_bytes(buf, 0, 1)
|
73
|
+
buf[0].codepoints[0]
|
74
|
+
end
|
75
|
+
|
76
|
+
def get_bytes(buf, ofs=0, len=buf.length)
|
77
|
+
if buf == nil
|
78
|
+
raise Sink.new("nil")
|
79
|
+
end
|
80
|
+
|
81
|
+
check_read(len)
|
82
|
+
buf[ofs, len] = @packet.buf[@start + @pos, len]
|
83
|
+
@pos += len
|
84
|
+
end
|
85
|
+
|
86
|
+
def get_short
|
87
|
+
h = get_byte
|
88
|
+
l = get_byte
|
89
|
+
h << 8 | l
|
90
|
+
end
|
91
|
+
|
92
|
+
def get_int
|
93
|
+
b1 = get_byte
|
94
|
+
b2 = get_byte
|
95
|
+
b3 = get_byte
|
96
|
+
b4 = get_byte
|
97
|
+
b1 << 24 | b2 << 16 | b3 << 8 | b4
|
98
|
+
end
|
99
|
+
|
100
|
+
def check_read(len)
|
101
|
+
max_len = (@max_len >= 0) ? @max_len : (@packet.buf_len - @start)
|
102
|
+
if @pos + len > max_len
|
103
|
+
raise Sink.new("Invalid array index")
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def check_write(len)
|
108
|
+
if @max_len > 0 && @pos + len > @max_len
|
109
|
+
raise Sink.new("Buffer overflow")
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def forward(len)
|
114
|
+
@pos += len
|
115
|
+
if @start + @pos > @packet.buf_len
|
116
|
+
@packet.buf_len = @start + @pos
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
require 'baykit/bayserver/agent/grand_agent'
|
2
|
+
require 'baykit/bayserver/util/object_store'
|
3
|
+
require 'baykit/bayserver/protocol/packet_factory'
|
4
|
+
|
5
|
+
module Baykit
|
6
|
+
module BayServer
|
7
|
+
module Protocol
|
8
|
+
class PacketStore
|
9
|
+
include Baykit::BayServer::Util::Reusable # implements
|
10
|
+
|
11
|
+
include Baykit::BayServer::Agent
|
12
|
+
include Baykit::BayServer::Util
|
13
|
+
|
14
|
+
class AgentListener
|
15
|
+
include Baykit::BayServer::Agent::GrandAgent::GrandAgentLifecycleListener # implements
|
16
|
+
|
17
|
+
def add(agt)
|
18
|
+
PacketStore.proto_map.values().each do |ifo|
|
19
|
+
ifo.add_agent(agt.agent_id);
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def remove(agt)
|
24
|
+
PacketStore.proto_map.values().each do |ifo|
|
25
|
+
ifo.remove_agent(agt.agent_id);
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
class ProtocolInfo
|
32
|
+
attr :protocol
|
33
|
+
attr :packet_factory
|
34
|
+
|
35
|
+
# Agent ID => PacketStore
|
36
|
+
attr :stores
|
37
|
+
|
38
|
+
def initialize(proto, pkt_factory)
|
39
|
+
@protocol = proto
|
40
|
+
@packet_factory = pkt_factory
|
41
|
+
@stores = {}
|
42
|
+
end
|
43
|
+
|
44
|
+
def add_agent(agt_id)
|
45
|
+
store = PacketStore.new(@protocol, @packet_factory);
|
46
|
+
@stores[agt_id] = store;
|
47
|
+
end
|
48
|
+
|
49
|
+
def remove_agent(agt_id)
|
50
|
+
@stores.delete(agt_id);
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
class << self
|
56
|
+
attr :proto_map
|
57
|
+
end
|
58
|
+
@proto_map = {}
|
59
|
+
|
60
|
+
attr :protocol
|
61
|
+
attr :store_map
|
62
|
+
attr :factory
|
63
|
+
|
64
|
+
def initialize(proto, factory)
|
65
|
+
@protocol = proto
|
66
|
+
@factory = factory
|
67
|
+
@store_map = {}
|
68
|
+
end
|
69
|
+
|
70
|
+
def reset
|
71
|
+
@store_map.values.each do |store|
|
72
|
+
store.reset
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def rent(type)
|
77
|
+
if type == nil
|
78
|
+
raise RuntimeError.new("Nil argument")
|
79
|
+
end
|
80
|
+
|
81
|
+
store = @store_map[type]
|
82
|
+
if store == nil
|
83
|
+
store = ObjectStore.new(lambda do
|
84
|
+
if @factory.kind_of?(PacketFactory)
|
85
|
+
return @factory.create_packet(type)
|
86
|
+
else
|
87
|
+
# lambda
|
88
|
+
return @factory.call(type)
|
89
|
+
end
|
90
|
+
end)
|
91
|
+
@store_map[type] = store
|
92
|
+
end
|
93
|
+
return store.rent
|
94
|
+
end
|
95
|
+
|
96
|
+
def Return(pkt)
|
97
|
+
store = @store_map[pkt.type]
|
98
|
+
#puts "Return packet #{pkt}"
|
99
|
+
store.Return(pkt)
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
def print_usage(indent)
|
104
|
+
BayLog.info("%sPacketStore(%s) usage nTypes=%d", StringUtil.indent(indent), @protocol, @store_map.keys().size)
|
105
|
+
@store_map.keys.each do |type|
|
106
|
+
BayLog.info("%sType: %s", StringUtil.indent(indent+1), type)
|
107
|
+
@store_map[type].print_usage(indent+2)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
######################################################
|
112
|
+
# class methods
|
113
|
+
######################################################
|
114
|
+
def self.init()
|
115
|
+
GrandAgent.add_lifecycle_listener(AgentListener.new())
|
116
|
+
end
|
117
|
+
|
118
|
+
def self.get_store(protocol, agent_id)
|
119
|
+
return @proto_map[protocol].stores[agent_id]
|
120
|
+
end
|
121
|
+
|
122
|
+
def self.register_protocol(protocol, factory)
|
123
|
+
if !@proto_map.include?(protocol)
|
124
|
+
@proto_map[protocol] = PacketStore::ProtocolInfo.new(protocol, factory)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def self.get_stores(agent_id)
|
129
|
+
store_list = []
|
130
|
+
@proto_map.values.each do |ifo|
|
131
|
+
store_list.append(ifo.stores[agent_id])
|
132
|
+
end
|
133
|
+
return store_list
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'baykit/bayserver/util/reusable'
|
2
|
+
|
3
|
+
module Baykit
|
4
|
+
module BayServer
|
5
|
+
module Protocol
|
6
|
+
class PacketUnPacker
|
7
|
+
include Baykit::BayServer::Util::Reusable # implements
|
8
|
+
|
9
|
+
#
|
10
|
+
# interface
|
11
|
+
#
|
12
|
+
# bytes_received(bytes)
|
13
|
+
#
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Baykit
|
2
|
+
module BayServer
|
3
|
+
module Protocol
|
4
|
+
class ProtocolException < StandardError
|
5
|
+
def initialize(fmt = nil, *args)
|
6
|
+
super(if fmt == nil
|
7
|
+
nil
|
8
|
+
elsif args == nil
|
9
|
+
sprintf("%s", fmt)
|
10
|
+
else
|
11
|
+
sprintf(fmt, *args)
|
12
|
+
end)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|