bayserver-core 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
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