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,56 @@
1
+ require 'baykit/bayserver/util/string_util'
2
+ require 'baykit/bayserver/bcf/package'
3
+ require 'baykit/bayserver/bay_log'
4
+
5
+ module Baykit
6
+ module BayServer
7
+
8
+ module Util
9
+ class Message
10
+ include Bcf
11
+
12
+ attr_reader :messages
13
+
14
+ def initialize
15
+ @messages = {}
16
+ end
17
+
18
+ def init(file_prefix, locale)
19
+ lang = locale.language
20
+ file = file_prefix + ".bcf"
21
+ if(StringUtil.set?(lang) && lang != "en")
22
+ file = file_prefix + "_" + lang + ".bcf"
23
+ end
24
+
25
+ if(!File.exist?(file))
26
+ BayLog.warn("Cannot find message send_file: %s", file)
27
+ return
28
+ end
29
+
30
+ p = BcfParser.new()
31
+ doc = p.parse(file)
32
+
33
+ doc.content_list.each do |o|
34
+ if(o.instance_of? BcfKeyVal)
35
+ messages[o.key.to_sym] = o.value
36
+ end
37
+ end
38
+ end
39
+
40
+ #
41
+ # key : symbol
42
+ #
43
+ def get(key, *args)
44
+ if !key.instance_of? Symbol
45
+ raise RuntimeError "Key must be symbol"
46
+ end
47
+ msg = messages[key]
48
+ if msg == nil
49
+ msg = key.to_s
50
+ end
51
+ sprintf(msg, *args)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,27 @@
1
+ require 'baykit/bayserver/bcf/package'
2
+
3
+ module Baykit
4
+ module BayServer
5
+ module Util
6
+ class Mimes
7
+ include Baykit::BayServer::Bcf
8
+
9
+ @@mime_map = {}
10
+
11
+ def self.init(bcf_file)
12
+ p = BcfParser.new()
13
+ doc = p.parse(bcf_file)
14
+ doc.content_list.each do |kv|
15
+ if kv.instance_of? BcfKeyVal
16
+ @@mime_map[kv.key] = kv.value
17
+ end
18
+ end
19
+ end
20
+
21
+ def self.type(ext)
22
+ @@mime_map[ext.downcase]
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,13 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Util
4
+ module ObjectFactory
5
+ #
6
+ # interface
7
+ #
8
+ # create_object()
9
+ #
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,74 @@
1
+ require 'baykit/bayserver/util/reusable'
2
+ module Baykit
3
+ module BayServer
4
+ module Util
5
+ class ObjectStore
6
+ include Baykit::BayServer::Util::Reusable # implements
7
+
8
+ attr :free_list
9
+ attr :active_list
10
+ attr :factory
11
+
12
+ def initialize(factory=nil)
13
+ @free_list = []
14
+ @active_list = []
15
+ @factory = factory
16
+ end
17
+
18
+ def reset()
19
+ if @active_list.length > 0
20
+ BayLog.error("BUG?: There are %d active objects: %s", @active_list.length, @active_list)
21
+
22
+ # for security
23
+ @free_list.clear()
24
+ @active_list.clear()
25
+ end
26
+ end
27
+
28
+ def rent()
29
+ if @free_list.empty?
30
+ if @factory.instance_of? ObjectFactory
31
+ obj = @factory.create_object()
32
+ else
33
+ # lambda
34
+ obj = @factory.call()
35
+ end
36
+ else
37
+ obj = @free_list.delete_at(@free_list.length - 1)
38
+ end
39
+ if obj == nil
40
+ raise Sink.new()
41
+ end
42
+ @active_list.append(obj)
43
+ return obj
44
+ end
45
+
46
+ def Return(obj, reuse=true)
47
+ if @free_list.include?(obj)
48
+ raise Sink.new("This object already returned: " + obj.to_s)
49
+ end
50
+
51
+ if !@active_list.include?(obj)
52
+ raise Sink.new("This object is not active: " + obj)
53
+ end
54
+
55
+ @active_list.delete(obj)
56
+ if reuse
57
+ @free_list.append(obj)
58
+ obj.reset()
59
+ end
60
+ end
61
+
62
+ def print_usage(indent)
63
+ BayLog.info("%sfree list: %d", StringUtil.indent(indent), @free_list.length)
64
+ BayLog.info("%sactive list: %d", StringUtil.indent(indent), @active_list.length)
65
+ if BayLog.debug_mode?
66
+ @active_list.each do |obj|
67
+ BayLog.debug("%s%s", StringUtil.indent(indent+1), obj)
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,35 @@
1
+
2
+ module Baykit
3
+ module BayServer
4
+ module Util
5
+ module Postman # interface
6
+
7
+ def post(buf, adr, tag, lis)
8
+ raise NotImplementedError.new()
9
+ end
10
+
11
+ def flush()
12
+ raise NotImplementedError.new()
13
+ end
14
+
15
+ def post_end()
16
+ raise NotImplementedError.new()
17
+ end
18
+
19
+ def is_zombie()
20
+ raise NotImplementedError.new()
21
+ end
22
+
23
+ def abort()
24
+ raise NotImplementedError.new()
25
+ end
26
+
27
+ def open_valve()
28
+ raise NotImplementedError.new()
29
+ end
30
+
31
+ end
32
+ end
33
+ end
34
+ end
35
+
@@ -0,0 +1,13 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Util
4
+ module Reusable
5
+ #
6
+ # interface
7
+ #
8
+ # reset()
9
+ #
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,141 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Util
4
+
5
+ #
6
+ # Like Selector class of Python
7
+ #
8
+ class Selector
9
+ OP_READ = 1
10
+ OP_WRITE = 2
11
+
12
+ attr :channels
13
+ attr :lock
14
+
15
+ def initialize
16
+ @channels = {}
17
+ @lock = Mutex.new()
18
+ end
19
+
20
+ def register(ch, op)
21
+ if op & OP_READ != 0
22
+ register_read(ch, @channels)
23
+ end
24
+ if op & OP_WRITE != 0
25
+ register_write(ch, @channels)
26
+ end
27
+ end
28
+
29
+ def unregister(ch)
30
+ unregister_read(ch, @channels)
31
+ unregister_write(ch, @channels)
32
+ end
33
+
34
+ def modify(ch, op)
35
+ if op & OP_READ != 0
36
+ register_read(ch, @channels)
37
+ else
38
+ unregister_read(ch, @channels)
39
+ end
40
+
41
+ if op & OP_WRITE != 0
42
+ register_write(ch, @channels)
43
+ else
44
+ unregister_write(ch, @channels)
45
+ end
46
+ end
47
+
48
+ def get_op(ch)
49
+ return @channels[ch]
50
+ end
51
+
52
+ def select(timeout = 0)
53
+ except_list = []
54
+
55
+ read_list = []
56
+ write_list = []
57
+ @lock.synchronize do
58
+ @channels.keys().each do |ch|
59
+ if (@channels[ch] & OP_READ) != 0
60
+ read_list << ch
61
+ end
62
+ if (@channels[ch] & OP_WRITE) != 0
63
+ write_list << ch
64
+ end
65
+ end
66
+ end
67
+ selected_read_list, selected_write_list = Kernel.select(read_list, write_list, except_list, timeout)
68
+
69
+ result = {}
70
+ if selected_read_list
71
+ selected_read_list.each do |ch|
72
+ register_read(ch, result)
73
+ end
74
+ end
75
+
76
+ if selected_write_list
77
+ selected_write_list.each do |ch|
78
+ register_write(ch, result)
79
+ end
80
+ end
81
+
82
+ return result
83
+ end
84
+
85
+ def count()
86
+ @lock.synchronize do
87
+ return @channels.length
88
+ end
89
+ end
90
+
91
+ private
92
+
93
+ def register_read(ch, ch_list)
94
+ @lock.synchronize do
95
+ if ch_list.include?(ch)
96
+ ch_list[ch] = (ch_list[ch] | OP_READ)
97
+ else
98
+ ch_list[ch] = OP_READ
99
+ end
100
+ end
101
+ end
102
+
103
+ def register_write(ch, ch_list)
104
+ @lock.synchronize do
105
+ if ch_list.include?(ch)
106
+ ch_list[ch] = (ch_list[ch] | OP_WRITE)
107
+ else
108
+ ch_list[ch] = OP_WRITE
109
+ end
110
+ end
111
+ end
112
+
113
+ def unregister_read(ch, ch_list)
114
+ @lock.synchronize do
115
+ if ch_list.include?(ch)
116
+ if ch_list[ch] == OP_READ
117
+ ch_list.delete(ch)
118
+ else
119
+ ch_list[ch] = OP_WRITE
120
+ end
121
+ end
122
+ end
123
+ end
124
+
125
+
126
+ def unregister_write(ch, ch_list)
127
+ @lock.synchronize do
128
+ if ch_list.include?(ch)
129
+ if ch_list[ch] == OP_WRITE
130
+ ch_list.delete(ch)
131
+ else
132
+ ch_list[ch] = OP_READ
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
141
+
@@ -0,0 +1,53 @@
1
+ require 'baykit/bayserver/util/string_util'
2
+ require 'baykit/bayserver/util/reusable'
3
+
4
+ module Baykit
5
+ module BayServer
6
+ module Util
7
+ class SimpleBuffer
8
+ include Baykit::BayServer::Util::Reusable # implements
9
+ INITIAL_BUFFER_SIZE = 32768
10
+
11
+ attr :buf
12
+ attr :length
13
+ attr :capacity
14
+
15
+ def initialize(init=INITIAL_BUFFER_SIZE)
16
+ @capacity = init
17
+ @buf = StringUtil.alloc(@capacity)
18
+ @length = 0
19
+ end
20
+
21
+ def bytes()
22
+ return buf
23
+ end
24
+
25
+ def reset()
26
+ # clear for security reason
27
+ @buf.clear()
28
+ @length = 0
29
+ end
30
+
31
+ def put_byte(b)
32
+ put([b], 0, 1);
33
+ end
34
+
35
+ def put(bytes, pos=0, len=bytes.length)
36
+ while @length + len > capacity
37
+ extend_buf
38
+ end
39
+
40
+ len.times do |i|
41
+ @buf[@length + i] = bytes[pos + i]
42
+ end
43
+ @length += len
44
+ end
45
+
46
+ def extend_buf()
47
+ @capacity *= 2
48
+ @buf = StringUtil.realloc(@buf, @capacity)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,12 @@
1
+
2
+ module Baykit
3
+ module BayServer
4
+ module Util
5
+ module SimpleInspect
6
+ def inspect
7
+ self.class.to_s + "::" + object_id
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,73 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Util
4
+ class StringUtil
5
+ class << self
6
+ attr :falses
7
+ attr :trues
8
+ end
9
+
10
+ @falses = ["no", "false", "0", "off"]
11
+ @trues = ["yes", "true", "1", "on"]
12
+
13
+ def StringUtil.set?(str)
14
+ str != nil && str.length > 0
15
+ end
16
+
17
+ def StringUtil.empty?(str)
18
+ !set?(str)
19
+ end
20
+
21
+ def StringUtil.alloc(len)
22
+ String.new("", encoding: Encoding::ASCII_8BIT, capacity: len)
23
+ end
24
+
25
+ def StringUtil.realloc(buf, len)
26
+ String.new(buf, encoding: Encoding::ASCII_8BIT, capacity: len)
27
+ end
28
+
29
+ def StringUtil.to_bytes(buf)
30
+ buf.encode(encoding: Encoding::ASCII_8BIT)
31
+ end
32
+
33
+ def StringUtil.repeat(str, times)
34
+ return Array.new(times, str).join("")
35
+ end
36
+
37
+ def StringUtil.indent(count)
38
+ return repeat(" ", count);
39
+ end
40
+
41
+ def StringUtil.parse_bool(val)
42
+ val = val.downcase()
43
+ if @trues.include?(val)
44
+ return true
45
+ elsif @falses.include?(val)
46
+ return false
47
+ else
48
+ BayLog.warn("Invalid boolean value: %s", val)
49
+ return false
50
+ end
51
+ end
52
+
53
+ def StringUtil.parse_size(val)
54
+ val = val.downcase
55
+ rate = 1
56
+ if val.end_with?("b")
57
+ val = val[0, val.length - 1]
58
+ end
59
+
60
+ if val.end_with?("k")
61
+ val = val[0, val.length - 1]
62
+ rate = 1024
63
+ elsif val.end_with?("m")
64
+ val = val[0, val.length - 1]
65
+ rate = 1024 * 1024
66
+ end
67
+
68
+ Integer(val) * rate
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,138 @@
1
+ require 'etc'
2
+ require 'pathname'
3
+ require 'tmpdir'
4
+
5
+ require 'baykit/bayserver/bay_log'
6
+ require 'baykit/bayserver/bayserver'
7
+
8
+ module Baykit
9
+ module BayServer
10
+ module Util
11
+ class SysUtil
12
+
13
+ def SysUtil.run_on_windows()
14
+ return RUBY_PLATFORM.downcase =~ /mswin(?!ce)|mingw|cygwin|bccwin/
15
+ end
16
+
17
+ #
18
+ # We set environment variable "RUBYMINE" to 1 for debugging
19
+ #
20
+ def SysUtil.run_on_rubymine()
21
+ return ENV["RUBYMINE"] == "1"
22
+ end
23
+
24
+ def SysUtil.support_fork()
25
+ begin
26
+ pid = fork()
27
+ if pid == nil
28
+ exit(0)
29
+ end
30
+ Process.waitpid(pid)
31
+ return true
32
+ rescue NotImplementedError => e
33
+ if BayLog.debug_mode?
34
+ BayLog.warn("fork() failed: %s ", e)
35
+ #BayLog.warn_e(e)
36
+ end
37
+ return false
38
+ end
39
+ end
40
+
41
+
42
+ def SysUtil.support_select_file()
43
+ File.open(BayServer.bserv_plan) do |f|
44
+ begin
45
+ n = select([f], [], [], 10)
46
+ return true
47
+ rescue IOError => e
48
+ if BayLog.debug_mode?
49
+ BayLog.warn("select() failed: %s", e)
50
+ #BayLog.warn_e(e)
51
+ end
52
+ return false
53
+ end
54
+ end
55
+ end
56
+
57
+
58
+ def SysUtil.support_nonblock_file_read()
59
+ File.open(BayServer.bserv_plan) do |f|
60
+ begin
61
+ f.read_nonblock(1)
62
+ return true
63
+ rescue SystemCallError => e
64
+ if BayLog.debug_mode?
65
+ BayLog.warn("read_nonblock() failed: %s", e)
66
+ #BayLog.warn_e(e)
67
+ end
68
+ return false
69
+ end
70
+ end
71
+ end
72
+
73
+ def SysUtil.support_nonblock_file_write()
74
+ Dir.mktmpdir() do |dir|
75
+ File.open(Pathname(dir) + "test_file", "wb") do |f|
76
+ begin
77
+ f.write_nonblock(1)
78
+ return true
79
+ rescue SystemCallError => e
80
+ if BayLog.debug_mode?
81
+ BayLog.warn("write_nonblock() failed: %s", e)
82
+ #BayLog.warn_e(e)
83
+ end
84
+ return false
85
+ end
86
+ end
87
+ end
88
+ end
89
+
90
+
91
+ def SysUtil.support_select_pipe()
92
+ IO.pipe() do |r, w|
93
+ begin
94
+ n = select([r], [w], [], 10)
95
+ return true
96
+ rescue IOError => e
97
+ if BayLog.debug_mode?
98
+ BayLog.warn("select() failed: %s", e)
99
+ #BayLog.warn_e(e)
100
+ end
101
+ return false
102
+ end
103
+ end
104
+ end
105
+
106
+
107
+ def SysUtil.support_nonblock_pipe_read()
108
+ IO.pipe() do |r, w|
109
+ w.write("abcd")
110
+ begin
111
+ r.read_nonblock(1)
112
+ return true
113
+ rescue SystemCallError => e
114
+ if BayLog.debug_mode?
115
+ BayLog.warn("read_nonblock() failed: %s", e)
116
+ #BayLog.warn_e(e)
117
+ end
118
+ return false
119
+ end
120
+ end
121
+ end
122
+
123
+ def SysUtil.pid()
124
+ return $$
125
+ end
126
+
127
+ def SysUtil.processor_count()
128
+ return Etc.nprocessors
129
+ end
130
+
131
+ def SysUtil.support_unix_domain_socket_address()
132
+ return !SysUtil.run_on_windows()
133
+ end
134
+
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,42 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Util
4
+ class URLDecoder
5
+
6
+ def self.decode(str, enc)
7
+ parse_special(str, enc)
8
+ end
9
+
10
+ def self.parse_special(str, enc)
11
+ arr = ByteArray.new
12
+ index = 0
13
+
14
+ while(index < str.length)
15
+ c = str[index]
16
+ case c
17
+ when '+'
18
+ arr.put_bytes(c)
19
+ index = index + 1
20
+
21
+ when '%'
22
+ hex_str = str[index + 1 .. index + 2]
23
+ ch = hex_str.hex
24
+ arr.put_bytes([ch])
25
+ index += 3
26
+
27
+ else
28
+ arr.put_bytes(c)
29
+ index += 1
30
+ end
31
+ end
32
+
33
+ if(StringUtil.empty?(enc))
34
+ return arr.buf
35
+ else
36
+ return arr.buf.encode(enc)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,19 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Util
4
+ class URLEncoder
5
+ def URLEncoder.encode_tilde(url)
6
+ buf = ""
7
+ url.each_char do |c|
8
+ if(c == "~")
9
+ buf.concat("%7E")
10
+ else
11
+ buf.concat(c)
12
+ end
13
+ end
14
+ return buf
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end