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/util/string_util'
2
+
3
+ module Baykit
4
+ module BayServer
5
+ module Util
6
+ class CgiUtil
7
+
8
+ REQUEST_METHOD = "REQUEST_METHOD"
9
+ REQUEST_URI = "REQUEST_URI"
10
+ SERVER_PROTOCOL = "SERVER_PROTOCOL"
11
+ GATEWAY_INTERFACE = "GATEWAY_INTERFACE"
12
+ SERVER_NAME = "SERVER_NAME"
13
+ SERVER_PORT = "SERVER_PORT"
14
+ QUERY_STRING = "QUERY_STRING"
15
+ SCRIPT_NAME = "SCRIPT_NAME"
16
+ SCRIPT_FILENAME = "SCRIPT_FILENAME"
17
+ PATH_TRANSLATED = "PATH_TRANSLATED"
18
+ PATH_INFO = "PATH_INFO"
19
+ CONTENT_TYPE = "CONTENT_TYPE"
20
+ CONTENT_LENGTH = "CONTENT_LENGTH"
21
+ REMOTE_ADDR = "REMOTE_ADDR"
22
+ REMOTE_PORT = "REMOTE_PORT"
23
+ REMOTE_USER = "REMOTE_USER"
24
+ HTTP_ACCEPT = "HTTP_ACCEPT"
25
+ HTTP_COOKIE = "HTTP_COOKIE"
26
+ HTTP_HOST = "HTTP_HOST"
27
+ HTTP_USER_AGENT = "HTTP_USER_AGENT"
28
+ HTTP_ACCEPT_ENCODING = "HTTP_ACCEPT_ENCODING"
29
+ HTTP_ACCEPT_LANGUAGE = "HTTP_ACCEPT_LANGUAGE"
30
+ HTTP_CONNECTION = "HTTP_CONNECTION"
31
+ HTTP_UPGRADE_INSECURE_REQUESTS = "HTTP_UPGRADE_INSECURE_REQUESTS"
32
+ HTTPS = "HTTPS"
33
+ PATH = "PATH"
34
+ SERVER_SIGNATURE = "SERVER_SIGNATURE"
35
+ SERVER_SOFTWARE = "SERVER_SOFTWARE"
36
+ SERVER_ADDR = "SERVER_ADDR"
37
+ DOCUMENT_ROOT = "DOCUMENT_ROOT"
38
+ REQUEST_SCHEME = "REQUEST_SCHEME"
39
+ CONTEXT_PREFIX = "CONTEXT_PREFIX"
40
+ CONTEXT_DOCUMENT_ROOT = "CONTEXT_DOCUMENT_ROOT"
41
+ SERVER_ADMIN = "SERVER_ADMIN"
42
+ REQUEST_TIME_FLOAT = "REQUEST_TIME_FLOAT"
43
+ REQUEST_TIME = "REQUEST_TIME"
44
+ UNIQUE_ID = "UNIQUE_ID"
45
+ X_FORWARDED_HOST = "X_FORWARDED_HOST"
46
+ X_FORWARDED_FOR = "X_FORWARDED_FOR"
47
+ X_FORWARDED_PROTO = "X_FORWARDED_PROTO"
48
+ X_FORWARDED_PORT = "X_FORWARDED_PORT"
49
+
50
+ def self.get_env_hash(path, doc_root, script_base, tur)
51
+ map = {}
52
+ get_env(path, doc_root, script_base, tur) do |name, value|
53
+ map[name] = value
54
+ end
55
+ map
56
+ end
57
+
58
+
59
+ def self.get_env(path, doc_root, script_base, tur, &block)
60
+
61
+ req_headers = tur.req.headers
62
+
63
+ ctype = req_headers.content_type
64
+ if StringUtil.set? ctype
65
+ pos = ctype.index("charset=")
66
+ if pos != nil && pos >= 0
67
+ tur.req.charset = ctype[pos+8 .. -1].strip
68
+ end
69
+ end
70
+
71
+ add_env(REQUEST_METHOD, tur.req.method, &block)
72
+ add_env(REQUEST_URI, tur.req.uri, &block)
73
+ add_env(SERVER_PROTOCOL, tur.req.protocol, &block)
74
+ add_env(GATEWAY_INTERFACE, "CGI/1.1", &block)
75
+
76
+ add_env(SERVER_NAME, tur.req.req_host, &block)
77
+ add_env(SERVER_ADDR, tur.req.server_address, &block)
78
+ if tur.req.req_port >= 0
79
+ add_env(SERVER_PORT, tur.req.req_port, &block)
80
+ end
81
+
82
+ add_env(SERVER_SOFTWARE, BayServer.get_software_name, &block)
83
+ add_env(CONTEXT_DOCUMENT_ROOT, doc_root, &block)
84
+
85
+ tur.req.headers.names.each do |name|
86
+ newval = nil
87
+ tur.req.headers.values(name).each do |value|
88
+ if newval == nil
89
+ newval = value
90
+ else
91
+ newval = newval + "; " + value
92
+ end
93
+ end
94
+
95
+ name = name.upcase.tr('-', '_')
96
+ if name.start_with?("X_FORWARDED_")
97
+ add_env(name, newval, &block)
98
+ else
99
+ case name
100
+ when CONTENT_TYPE, CONTENT_LENGTH
101
+ add_env(name, newval, &block)
102
+ else
103
+ add_env("HTTP_" + name, newval, &block)
104
+ end
105
+ end
106
+ end
107
+
108
+ add_env(REMOTE_ADDR, tur.req.remote_address, &block)
109
+ add_env(REMOTE_PORT, tur.req.remote_port, &block)
110
+ #add_env(REMOTE_USER, "unknown")
111
+
112
+ add_env(REQUEST_SCHEME, tur.is_secure ? "https": "http", &block)
113
+ tmp_secure = tur.is_secure
114
+ fproto = tur.req.headers.get(Headers::X_FORWARDED_PROTO)
115
+ if fproto != nil
116
+ tmp_secure = fproto.casecmp?("https")
117
+ end
118
+ if tmp_secure
119
+ add_env(HTTPS, "on", &block)
120
+ end
121
+
122
+ add_env(QUERY_STRING, tur.req.query_string, &block)
123
+ add_env(SCRIPT_NAME, tur.req.script_name, &block)
124
+ add_env(UNIQUE_ID, DateTime.now.to_s, &block)
125
+
126
+ if tur.req.path_info == nil
127
+ add_env(PATH_INFO, "", &block)
128
+ else
129
+ add_env(PATH_INFO, tur.req.path_info, &block)
130
+
131
+ locpath = doc_root
132
+ if locpath.end_with? "/"
133
+ locpath = locpath[0 .. -2]
134
+ end
135
+
136
+ path_translated = locpath + tur.req.path_info
137
+ add_env(PATH_TRANSLATED, path_translated, &block)
138
+ end
139
+
140
+ if !script_base.end_with?("/")
141
+ script_base = script_base + "/"
142
+ end
143
+
144
+ add_env(SCRIPT_FILENAME, "#{script_base}#{tur.req.script_name[path.length .. -1]}", &block)
145
+ add_env(PATH, ENV["PATH"], &block)
146
+ end
147
+
148
+ private
149
+ def self.add_env(key, value)
150
+ if value == nil
151
+ value = ""
152
+ end
153
+
154
+ # Handles null terminated string
155
+ value = value.to_s.split("\0")[0]
156
+ if value == nil
157
+ value = ""
158
+ end
159
+
160
+ yield(key, value.to_s)
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,22 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Util
4
+ class CharUtil
5
+
6
+ CR = "\r"
7
+ LF = "\n"
8
+ CRLF = "\r\n"
9
+
10
+ CR_BYTE = CR.codepoints[0]
11
+ LF_BYTE = LF.codepoints[0]
12
+
13
+
14
+ def CharUtil.is_ascii(c)
15
+ cp = c.codepoints[0]
16
+ cp >= 32 && cp <= 126
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+
@@ -0,0 +1,45 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Util
4
+ class Cities
5
+
6
+ attr :any_city
7
+ attr :cities
8
+
9
+ def initialize
10
+ @any_city = nil
11
+ @cities = []
12
+ end
13
+
14
+ def add(c)
15
+ if c.name == "*"
16
+ @any_city = c
17
+ else
18
+ @cities << c
19
+ end
20
+ end
21
+
22
+
23
+ def find_city(name)
24
+ # Check exact match
25
+ @cities.each do |city|
26
+ if city.name == name
27
+ return city
28
+ end
29
+ end
30
+ return @any_city
31
+ end
32
+
33
+ def cities()
34
+ ret = @cities.dup
35
+ if @any_city != nil
36
+ ret << @any_city
37
+ end
38
+ return ret
39
+ end
40
+
41
+ end
42
+ end
43
+ end
44
+ end
45
+
@@ -0,0 +1,17 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Util
4
+ class ClassUtil
5
+ def self.get_local_name(cls)
6
+ name = cls.name
7
+ p = name.rindex(':')
8
+ if(p != nil)
9
+ name = name[p + 1 .. -1]
10
+ end
11
+ return name
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+
@@ -0,0 +1,23 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Util
4
+ class Counter
5
+ attr :counter
6
+ attr :mutex
7
+
8
+ def initialize(init=1)
9
+ @counter = init
10
+ @mutex = Mutex.new
11
+ end
12
+
13
+ def next
14
+ @mutex.synchronize do
15
+ c = @counter
16
+ @counter += 1
17
+ c
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Util
4
+ class DataConsumeListener
5
+ #
6
+ # interface
7
+ #
8
+ # done()
9
+ #
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,81 @@
1
+
2
+ #
3
+ # ExecutorService
4
+ # Implementation of thread pool
5
+ #
6
+ module Baykit
7
+ module BayServer
8
+ module Util
9
+ class ExecutorService
10
+
11
+ class Executor
12
+
13
+ attr :que
14
+ attr :id
15
+ attr :name
16
+
17
+ def initialize(que, id, name)
18
+ @que = que
19
+ @id = id
20
+ @name = name
21
+ end
22
+
23
+ def run
24
+ while true
25
+ tsk = @que.deq
26
+ #BayLog.debug("%s Start task on: %s", tsk, @name)
27
+ tsk.run
28
+ #BayLog.debug("%s End task on: %s", tsk, @name)
29
+ end
30
+ end
31
+
32
+ def to_s
33
+ @name
34
+ end
35
+ end
36
+
37
+ MAX_LEN_PER_EXECUTOR = 32
38
+
39
+ attr :que
40
+ attr :count
41
+ attr :max_queue_len
42
+ attr :name
43
+
44
+ def initialize(name, count)
45
+ @que = Thread::Queue.new
46
+ @count = count
47
+ @max_queue_len = MAX_LEN_PER_EXECUTOR * count
48
+ @name = name
49
+
50
+ count.times do |i|
51
+ started = false
52
+ Thread.new do
53
+ started = true
54
+ id = i + 1
55
+ th_name = "Executor[#{name}]##{id}"
56
+ Thread.current.name = th_name
57
+ e = Executor.new @que, id, th_name
58
+ e.run
59
+ end
60
+ while !started
61
+ sleep(0.01)
62
+ end
63
+ end
64
+ end
65
+
66
+ def to_s()
67
+ return "ExecutorService[#{@name}]"
68
+ end
69
+
70
+ # post task
71
+ def submit(tsk)
72
+ BayLog.debug("%s Submit: task=%s (qlen=%d/%d)", self, tsk, @que.length, @max_queue_len)
73
+ if @que.length > @max_queue_len
74
+ raise IOError("Task queue is full (>_<)")
75
+ end
76
+ @que.enq(tsk)
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,110 @@
1
+ require 'baykit/bayserver/util/md5_password'
2
+ require 'baykit/bayserver/bcf/package'
3
+
4
+ module Baykit
5
+ module BayServer
6
+ module Util
7
+ class Groups
8
+ include Baykit::BayServer::Bcf
9
+
10
+ class Member
11
+ attr :name
12
+ attr :digest
13
+
14
+ def initialize(name, digest)
15
+ @name = name
16
+ @digest = digest
17
+ end
18
+
19
+ def validate(password)
20
+ if password == nil
21
+ return false
22
+ end
23
+
24
+ dig = MD5Password.encode(password)
25
+ return dig == @digest
26
+ end
27
+ end
28
+
29
+ class Group
30
+ attr :name
31
+ attr :members
32
+ attr :groups
33
+
34
+ def initialize(groups, name)
35
+ @name = name
36
+ @groups = groups
37
+ @members = []
38
+ end
39
+
40
+ def add(mem)
41
+ @members << mem
42
+ end
43
+
44
+ def validate(mem_name, pass)
45
+ if !@members.include?(mem_name)
46
+ return false
47
+ end
48
+
49
+ m = @groups.all_members[mem_name]
50
+ if m == nil
51
+ return false
52
+ end
53
+
54
+ return m.validate(pass)
55
+ end
56
+ end
57
+
58
+ attr :all_groups
59
+ attr :all_members
60
+
61
+ def initialize
62
+ @all_groups = {}
63
+ @all_members = {}
64
+ end
65
+
66
+ def init(bcf)
67
+ p = BcfParser.new
68
+ doc = p.parse(bcf)
69
+
70
+ doc.content_list.each do |obj|
71
+ if obj.instance_of? BcfElement
72
+ if obj.name.casecmp?("group")
73
+ init_groups(obj)
74
+ elsif obj.name.casecmp?("member")
75
+ init_members(obj)
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+
82
+ def get_group(name)
83
+ return @all_groups[name]
84
+ end
85
+
86
+
87
+ private
88
+ def init_groups(elm)
89
+ elm.content_list.each do |obj|
90
+ if obj.instance_of? BcfKeyVal
91
+ g = Group.new(self, obj.key)
92
+ @all_groups[obj.key] = g
93
+
94
+ obj.value.split(" ").each do |mem_name|
95
+ g.add(mem_name)
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+ def init_members(elm)
102
+ elm.content_list.each do |obj|
103
+ m = Member.new(obj.key, obj.value)
104
+ @all_members[m.name] = m
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,55 @@
1
+ require 'zlib'
2
+
3
+ module Baykit
4
+ module BayServer
5
+ module Util
6
+ class GzipCompressor
7
+
8
+ class CompressListener
9
+ # interface
10
+ # def on_compressed(*str)
11
+ end
12
+
13
+ class CallbackWriter
14
+
15
+ attr :gzip_comp
16
+ attr_accessor :done_listener
17
+
18
+ def initialize(gzip_comp)
19
+ @gzip_comp = gzip_comp
20
+ @done_listener = nil
21
+ end
22
+
23
+ def write(*str)
24
+ # proc
25
+ str.each do |item|
26
+ @gzip_comp.listener.call(item, 0, item.length, &@done_listener)
27
+ end
28
+ end
29
+ end
30
+
31
+ attr :listener
32
+ attr :gout
33
+ attr :cb_writer
34
+
35
+ def initialize(comp_lis)
36
+ @listener = comp_lis
37
+ @cb_writer = CallbackWriter.new(self)
38
+ @gout = Zlib::GzipWriter.new(@cb_writer)
39
+ end
40
+
41
+ def compress(buf, ofs, len, &lis)
42
+ @cb_writer.done_listener = lis
43
+ @gout.write(buf[ofs .. ofs + len - 1])
44
+ @gout.flush()
45
+ end
46
+
47
+ def finish()
48
+ #@gout.finish()
49
+ @gout.close()
50
+ end
51
+
52
+ end
53
+ end
54
+ end
55
+ end