redis 4.0.1 → 4.8.1

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 (148) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +220 -0
  3. data/README.md +152 -28
  4. data/lib/redis/client.rb +171 -107
  5. data/lib/redis/cluster/command.rb +79 -0
  6. data/lib/redis/cluster/command_loader.rb +33 -0
  7. data/lib/redis/cluster/key_slot_converter.rb +72 -0
  8. data/lib/redis/cluster/node.rb +120 -0
  9. data/lib/redis/cluster/node_key.rb +31 -0
  10. data/lib/redis/cluster/node_loader.rb +34 -0
  11. data/lib/redis/cluster/option.rb +100 -0
  12. data/lib/redis/cluster/slot.rb +86 -0
  13. data/lib/redis/cluster/slot_loader.rb +46 -0
  14. data/lib/redis/cluster.rb +315 -0
  15. data/lib/redis/commands/bitmaps.rb +63 -0
  16. data/lib/redis/commands/cluster.rb +45 -0
  17. data/lib/redis/commands/connection.rb +58 -0
  18. data/lib/redis/commands/geo.rb +84 -0
  19. data/lib/redis/commands/hashes.rb +251 -0
  20. data/lib/redis/commands/hyper_log_log.rb +37 -0
  21. data/lib/redis/commands/keys.rb +455 -0
  22. data/lib/redis/commands/lists.rb +290 -0
  23. data/lib/redis/commands/pubsub.rb +72 -0
  24. data/lib/redis/commands/scripting.rb +114 -0
  25. data/lib/redis/commands/server.rb +188 -0
  26. data/lib/redis/commands/sets.rb +223 -0
  27. data/lib/redis/commands/sorted_sets.rb +812 -0
  28. data/lib/redis/commands/streams.rb +382 -0
  29. data/lib/redis/commands/strings.rb +313 -0
  30. data/lib/redis/commands/transactions.rb +139 -0
  31. data/lib/redis/commands.rb +240 -0
  32. data/lib/redis/connection/command_helper.rb +5 -2
  33. data/lib/redis/connection/hiredis.rb +7 -5
  34. data/lib/redis/connection/registry.rb +2 -1
  35. data/lib/redis/connection/ruby.rb +139 -111
  36. data/lib/redis/connection/synchrony.rb +17 -10
  37. data/lib/redis/connection.rb +3 -1
  38. data/lib/redis/distributed.rb +244 -87
  39. data/lib/redis/errors.rb +57 -0
  40. data/lib/redis/hash_ring.rb +15 -14
  41. data/lib/redis/pipeline.rb +181 -10
  42. data/lib/redis/subscribe.rb +11 -12
  43. data/lib/redis/version.rb +3 -1
  44. data/lib/redis.rb +180 -2716
  45. metadata +45 -195
  46. data/.gitignore +0 -16
  47. data/.travis/Gemfile +0 -13
  48. data/.travis.yml +0 -73
  49. data/.yardopts +0 -3
  50. data/Gemfile +0 -3
  51. data/benchmarking/logging.rb +0 -71
  52. data/benchmarking/pipeline.rb +0 -51
  53. data/benchmarking/speed.rb +0 -21
  54. data/benchmarking/suite.rb +0 -24
  55. data/benchmarking/worker.rb +0 -71
  56. data/bors.toml +0 -14
  57. data/examples/basic.rb +0 -15
  58. data/examples/consistency.rb +0 -114
  59. data/examples/dist_redis.rb +0 -43
  60. data/examples/incr-decr.rb +0 -17
  61. data/examples/list.rb +0 -26
  62. data/examples/pubsub.rb +0 -37
  63. data/examples/sentinel/sentinel.conf +0 -9
  64. data/examples/sentinel/start +0 -49
  65. data/examples/sentinel.rb +0 -41
  66. data/examples/sets.rb +0 -36
  67. data/examples/unicorn/config.ru +0 -3
  68. data/examples/unicorn/unicorn.rb +0 -20
  69. data/makefile +0 -42
  70. data/redis.gemspec +0 -42
  71. data/test/bitpos_test.rb +0 -63
  72. data/test/blocking_commands_test.rb +0 -40
  73. data/test/client_test.rb +0 -59
  74. data/test/command_map_test.rb +0 -28
  75. data/test/commands_on_hashes_test.rb +0 -19
  76. data/test/commands_on_hyper_log_log_test.rb +0 -19
  77. data/test/commands_on_lists_test.rb +0 -18
  78. data/test/commands_on_sets_test.rb +0 -75
  79. data/test/commands_on_sorted_sets_test.rb +0 -150
  80. data/test/commands_on_strings_test.rb +0 -99
  81. data/test/commands_on_value_types_test.rb +0 -171
  82. data/test/connection_handling_test.rb +0 -275
  83. data/test/connection_test.rb +0 -57
  84. data/test/db/.gitkeep +0 -0
  85. data/test/distributed_blocking_commands_test.rb +0 -44
  86. data/test/distributed_commands_on_hashes_test.rb +0 -8
  87. data/test/distributed_commands_on_hyper_log_log_test.rb +0 -31
  88. data/test/distributed_commands_on_lists_test.rb +0 -20
  89. data/test/distributed_commands_on_sets_test.rb +0 -106
  90. data/test/distributed_commands_on_sorted_sets_test.rb +0 -16
  91. data/test/distributed_commands_on_strings_test.rb +0 -69
  92. data/test/distributed_commands_on_value_types_test.rb +0 -93
  93. data/test/distributed_commands_requiring_clustering_test.rb +0 -162
  94. data/test/distributed_connection_handling_test.rb +0 -21
  95. data/test/distributed_internals_test.rb +0 -68
  96. data/test/distributed_key_tags_test.rb +0 -50
  97. data/test/distributed_persistence_control_commands_test.rb +0 -24
  98. data/test/distributed_publish_subscribe_test.rb +0 -90
  99. data/test/distributed_remote_server_control_commands_test.rb +0 -64
  100. data/test/distributed_scripting_test.rb +0 -100
  101. data/test/distributed_sorting_test.rb +0 -18
  102. data/test/distributed_test.rb +0 -56
  103. data/test/distributed_transactions_test.rb +0 -30
  104. data/test/encoding_test.rb +0 -14
  105. data/test/error_replies_test.rb +0 -57
  106. data/test/fork_safety_test.rb +0 -60
  107. data/test/helper.rb +0 -201
  108. data/test/helper_test.rb +0 -22
  109. data/test/internals_test.rb +0 -389
  110. data/test/lint/blocking_commands.rb +0 -150
  111. data/test/lint/hashes.rb +0 -162
  112. data/test/lint/hyper_log_log.rb +0 -60
  113. data/test/lint/lists.rb +0 -143
  114. data/test/lint/sets.rb +0 -140
  115. data/test/lint/sorted_sets.rb +0 -316
  116. data/test/lint/strings.rb +0 -246
  117. data/test/lint/value_types.rb +0 -130
  118. data/test/persistence_control_commands_test.rb +0 -24
  119. data/test/pipelining_commands_test.rb +0 -238
  120. data/test/publish_subscribe_test.rb +0 -280
  121. data/test/remote_server_control_commands_test.rb +0 -175
  122. data/test/scanning_test.rb +0 -407
  123. data/test/scripting_test.rb +0 -76
  124. data/test/sentinel_command_test.rb +0 -78
  125. data/test/sentinel_test.rb +0 -253
  126. data/test/sorting_test.rb +0 -57
  127. data/test/ssl_test.rb +0 -69
  128. data/test/support/connection/hiredis.rb +0 -1
  129. data/test/support/connection/ruby.rb +0 -1
  130. data/test/support/connection/synchrony.rb +0 -17
  131. data/test/support/redis_mock.rb +0 -130
  132. data/test/support/ssl/gen_certs.sh +0 -31
  133. data/test/support/ssl/trusted-ca.crt +0 -25
  134. data/test/support/ssl/trusted-ca.key +0 -27
  135. data/test/support/ssl/trusted-cert.crt +0 -81
  136. data/test/support/ssl/trusted-cert.key +0 -28
  137. data/test/support/ssl/untrusted-ca.crt +0 -26
  138. data/test/support/ssl/untrusted-ca.key +0 -27
  139. data/test/support/ssl/untrusted-cert.crt +0 -82
  140. data/test/support/ssl/untrusted-cert.key +0 -28
  141. data/test/support/wire/synchrony.rb +0 -24
  142. data/test/support/wire/thread.rb +0 -5
  143. data/test/synchrony_driver.rb +0 -85
  144. data/test/test.conf.erb +0 -9
  145. data/test/thread_safety_test.rb +0 -60
  146. data/test/transactions_test.rb +0 -262
  147. data/test/unknown_commands_test.rb +0 -12
  148. data/test/url_param_test.rb +0 -136
@@ -1,253 +0,0 @@
1
- require_relative "helper"
2
-
3
- class SentinelTest < Test::Unit::TestCase
4
-
5
- include Helper::Client
6
-
7
- def test_sentinel_connection
8
- sentinels = [{:host => "127.0.0.1", :port => 26381},
9
- {:host => "127.0.0.1", :port => 26382}]
10
-
11
- commands = {
12
- :s1 => [],
13
- :s2 => [],
14
- }
15
-
16
- handler = lambda do |id|
17
- {
18
- :sentinel => lambda do |command, *args|
19
- commands[id] << [command, *args]
20
- ["127.0.0.1", "6381"]
21
- end
22
- }
23
- end
24
-
25
- RedisMock.start(handler.call(:s1)) do |s1_port|
26
- RedisMock.start(handler.call(:s2)) do |s2_port|
27
- sentinels[0][:port] = s1_port
28
- sentinels[1][:port] = s2_port
29
- redis = Redis.new(:url => "redis://master1", :sentinels => sentinels, :role => :master)
30
-
31
- assert redis.ping
32
- end
33
- end
34
-
35
- assert_equal commands[:s1], [%w[get-master-addr-by-name master1]]
36
- assert_equal commands[:s2], []
37
- end
38
-
39
- def test_sentinel_failover
40
- sentinels = [{:host => "127.0.0.1", :port => 26381},
41
- {:host => "127.0.0.1", :port => 26382}]
42
-
43
- commands = {
44
- :s1 => [],
45
- :s2 => [],
46
- }
47
-
48
- s1 = {
49
- :sentinel => lambda do |command, *args|
50
- commands[:s1] << [command, *args]
51
- "$-1" # Nil
52
- end
53
- }
54
-
55
- s2 = {
56
- :sentinel => lambda do |command, *args|
57
- commands[:s2] << [command, *args]
58
- ["127.0.0.1", "6381"]
59
- end
60
- }
61
-
62
- RedisMock.start(s1) do |s1_port|
63
- RedisMock.start(s2) do |s2_port|
64
- sentinels[0][:port] = s1_port
65
- sentinels[1][:port] = s2_port
66
- redis = Redis.new(:url => "redis://master1", :sentinels => sentinels, :role => :master)
67
-
68
- assert redis.ping
69
- end
70
- end
71
-
72
- assert_equal commands[:s1], [%w[get-master-addr-by-name master1]]
73
- assert_equal commands[:s2], [%w[get-master-addr-by-name master1]]
74
- end
75
-
76
- def test_sentinel_failover_prioritize_healthy_sentinel
77
- sentinels = [{:host => "127.0.0.1", :port => 26381},
78
- {:host => "127.0.0.1", :port => 26382}]
79
-
80
- commands = {
81
- :s1 => [],
82
- :s2 => [],
83
- }
84
-
85
- s1 = {
86
- :sentinel => lambda do |command, *args|
87
- commands[:s1] << [command, *args]
88
- "$-1" # Nil
89
- end
90
- }
91
-
92
- s2 = {
93
- :sentinel => lambda do |command, *args|
94
- commands[:s2] << [command, *args]
95
- ["127.0.0.1", "6381"]
96
- end
97
- }
98
-
99
- RedisMock.start(s1) do |s1_port|
100
- RedisMock.start(s2) do |s2_port|
101
- sentinels[0][:port] = s1_port
102
- sentinels[1][:port] = s2_port
103
- redis = Redis.new(:url => "redis://master1", :sentinels => sentinels, :role => :master)
104
-
105
- assert redis.ping
106
-
107
- redis.quit
108
-
109
- assert redis.ping
110
- end
111
- end
112
-
113
- assert_equal commands[:s1], [%w[get-master-addr-by-name master1]]
114
- assert_equal commands[:s2], [%w[get-master-addr-by-name master1], %w[get-master-addr-by-name master1]]
115
- end
116
-
117
- def test_sentinel_with_non_sentinel_options
118
- sentinels = [{:host => "127.0.0.1", :port => 26381}]
119
-
120
- commands = {
121
- :s1 => [],
122
- :m1 => []
123
- }
124
-
125
- sentinel = lambda do |port|
126
- {
127
- :auth => lambda do |pass|
128
- commands[:s1] << ["auth", pass]
129
- "-ERR unknown command 'auth'"
130
- end,
131
- :select => lambda do |db|
132
- commands[:s1] << ["select", db]
133
- "-ERR unknown command 'select'"
134
- end,
135
- :sentinel => lambda do |command, *args|
136
- commands[:s1] << [command, *args]
137
- ["127.0.0.1", port.to_s]
138
- end
139
- }
140
- end
141
-
142
- master = {
143
- :auth => lambda do |pass|
144
- commands[:m1] << ["auth", pass]
145
- "+OK"
146
- end,
147
- :role => lambda do
148
- commands[:m1] << ["role"]
149
- ["master"]
150
- end
151
- }
152
-
153
- RedisMock.start(master) do |master_port|
154
- RedisMock.start(sentinel.call(master_port)) do |sen_port|
155
- sentinels[0][:port] = sen_port
156
- redis = Redis.new(:url => "redis://:foo@master1/15", :sentinels => sentinels, :role => :master)
157
-
158
- assert redis.ping
159
- end
160
- end
161
-
162
- assert_equal [%w[get-master-addr-by-name master1]], commands[:s1]
163
- assert_equal [%w[auth foo], %w[role]], commands[:m1]
164
- end
165
-
166
- def test_sentinel_role_mismatch
167
- sentinels = [{:host => "127.0.0.1", :port => 26381}]
168
-
169
- sentinel = lambda do |port|
170
- {
171
- :sentinel => lambda do |command, *args|
172
- ["127.0.0.1", port.to_s]
173
- end
174
- }
175
- end
176
-
177
- master = {
178
- :role => lambda do
179
- ["slave"]
180
- end
181
- }
182
-
183
- ex = assert_raise(Redis::ConnectionError) do
184
- RedisMock.start(master) do |master_port|
185
- RedisMock.start(sentinel.call(master_port)) do |sen_port|
186
- sentinels[0][:port] = sen_port
187
- redis = Redis.new(:url => "redis://master1", :sentinels => sentinels, :role => :master)
188
-
189
- assert redis.ping
190
- end
191
- end
192
- end
193
-
194
- assert_match(/Instance role mismatch/, ex.message)
195
- end
196
-
197
- def test_sentinel_retries
198
- sentinels = [{:host => "127.0.0.1", :port => 26381},
199
- {:host => "127.0.0.1", :port => 26382}]
200
-
201
- connections = []
202
-
203
- handler = lambda do |id, port|
204
- {
205
- :sentinel => lambda do |command, *args|
206
- connections << id
207
-
208
- if connections.count(id) < 2
209
- :close
210
- else
211
- ["127.0.0.1", port.to_s]
212
- end
213
- end
214
- }
215
- end
216
-
217
- master = {
218
- :role => lambda do
219
- ["master"]
220
- end
221
- }
222
-
223
- RedisMock.start(master) do |master_port|
224
- RedisMock.start(handler.call(:s1, master_port)) do |s1_port|
225
- RedisMock.start(handler.call(:s2, master_port)) do |s2_port|
226
- sentinels[0][:port] = s1_port
227
- sentinels[1][:port] = s2_port
228
- redis = Redis.new(:url => "redis://master1", :sentinels => sentinels, :role => :master, :reconnect_attempts => 1)
229
-
230
- assert redis.ping
231
- end
232
- end
233
- end
234
-
235
- assert_equal [:s1, :s2, :s1], connections
236
-
237
- connections.clear
238
-
239
- ex = assert_raise(Redis::CannotConnectError) do
240
- RedisMock.start(master) do |master_port|
241
- RedisMock.start(handler.call(:s1, master_port)) do |s1_port|
242
- RedisMock.start(handler.call(:s2, master_port)) do |s2_port|
243
- redis = Redis.new(:url => "redis://master1", :sentinels => sentinels, :role => :master, :reconnect_attempts => 0)
244
-
245
- assert redis.ping
246
- end
247
- end
248
- end
249
- end
250
-
251
- assert_match(/No sentinels available/, ex.message)
252
- end
253
- end
data/test/sorting_test.rb DELETED
@@ -1,57 +0,0 @@
1
- require_relative "helper"
2
-
3
- class TestSorting < Test::Unit::TestCase
4
-
5
- include Helper::Client
6
-
7
- def test_sort
8
- r.set("foo:1", "s1")
9
- r.set("foo:2", "s2")
10
-
11
- r.rpush("bar", "1")
12
- r.rpush("bar", "2")
13
-
14
- assert_equal ["s1"], r.sort("bar", :get => "foo:*", :limit => [0, 1])
15
- assert_equal ["s2"], r.sort("bar", :get => "foo:*", :limit => [0, 1], :order => "desc alpha")
16
- end
17
-
18
- def test_sort_with_an_array_of_gets
19
- r.set("foo:1:a", "s1a")
20
- r.set("foo:1:b", "s1b")
21
-
22
- r.set("foo:2:a", "s2a")
23
- r.set("foo:2:b", "s2b")
24
-
25
- r.rpush("bar", "1")
26
- r.rpush("bar", "2")
27
-
28
- assert_equal [["s1a", "s1b"]], r.sort("bar", :get => ["foo:*:a", "foo:*:b"], :limit => [0, 1])
29
- assert_equal [["s2a", "s2b"]], r.sort("bar", :get => ["foo:*:a", "foo:*:b"], :limit => [0, 1], :order => "desc alpha")
30
- assert_equal [["s1a", "s1b"], ["s2a", "s2b"]], r.sort("bar", :get => ["foo:*:a", "foo:*:b"])
31
- end
32
-
33
- def test_sort_with_store
34
- r.set("foo:1", "s1")
35
- r.set("foo:2", "s2")
36
-
37
- r.rpush("bar", "1")
38
- r.rpush("bar", "2")
39
-
40
- r.sort("bar", :get => "foo:*", :store => "baz")
41
- assert_equal ["s1", "s2"], r.lrange("baz", 0, -1)
42
- end
43
-
44
- def test_sort_with_an_array_of_gets_and_with_store
45
- r.set("foo:1:a", "s1a")
46
- r.set("foo:1:b", "s1b")
47
-
48
- r.set("foo:2:a", "s2a")
49
- r.set("foo:2:b", "s2b")
50
-
51
- r.rpush("bar", "1")
52
- r.rpush("bar", "2")
53
-
54
- r.sort("bar", :get => ["foo:*:a", "foo:*:b"], :store => 'baz')
55
- assert_equal ["s1a", "s1b", "s2a", "s2b"], r.lrange("baz", 0, -1)
56
- end
57
- end
data/test/ssl_test.rb DELETED
@@ -1,69 +0,0 @@
1
- require_relative "helper"
2
-
3
- class SslTest < Test::Unit::TestCase
4
-
5
- include Helper::Client
6
-
7
- driver(:ruby) do
8
-
9
- def test_verified_ssl_connection
10
- RedisMock.start({ :ping => proc { "+PONG" } }, ssl_server_opts("trusted")) do |port|
11
- redis = Redis.new(:port => port, :ssl => true, :ssl_params => { :ca_file => ssl_ca_file })
12
- assert_equal redis.ping, "PONG"
13
- end
14
- end
15
-
16
- def test_unverified_ssl_connection
17
- assert_raise(OpenSSL::SSL::SSLError) do
18
- RedisMock.start({ :ping => proc { "+PONG" } }, ssl_server_opts("untrusted")) do |port|
19
- redis = Redis.new(:port => port, :ssl => true, :ssl_params => { :ca_file => ssl_ca_file })
20
- redis.ping
21
- end
22
- end
23
- end
24
-
25
- def test_ssl_blocking
26
- RedisMock.start({}, ssl_server_opts("trusted")) do |port|
27
- redis = Redis.new(:port => port, :ssl => true, :ssl_params => { :ca_file => ssl_ca_file })
28
- assert_equal redis.set("boom", "a" * 10_000_000), "OK"
29
- end
30
- end
31
-
32
- end
33
-
34
- driver(:hiredis, :synchrony) do
35
-
36
- def test_ssl_not_implemented_exception
37
- assert_raise(NotImplementedError) do
38
- RedisMock.start({ :ping => proc { "+PONG" } }, ssl_server_opts("trusted")) do |port|
39
- redis = Redis.new(:port => port, :ssl => true, :ssl_params => { :ca_file => ssl_ca_file })
40
- redis.ping
41
- end
42
- end
43
- end
44
-
45
- end
46
-
47
- private
48
-
49
- def ssl_server_opts(prefix)
50
- ssl_cert = File.join(cert_path, "#{prefix}-cert.crt")
51
- ssl_key = File.join(cert_path, "#{prefix}-cert.key")
52
-
53
- {
54
- :ssl => true,
55
- :ssl_params => {
56
- :cert => OpenSSL::X509::Certificate.new(File.read(ssl_cert)),
57
- :key => OpenSSL::PKey::RSA.new(File.read(ssl_key))
58
- }
59
- }
60
- end
61
-
62
- def ssl_ca_file
63
- File.join(cert_path, "trusted-ca.crt")
64
- end
65
-
66
- def cert_path
67
- File.expand_path("../support/ssl/", __FILE__)
68
- end
69
- end
@@ -1 +0,0 @@
1
- require_relative "../wire/thread"
@@ -1 +0,0 @@
1
- require_relative "../wire/thread"
@@ -1,17 +0,0 @@
1
- require_relative "../wire/synchrony"
2
-
3
- module Helper
4
- def around
5
- rv = nil
6
-
7
- EM.synchrony do
8
- begin
9
- rv = yield
10
- ensure
11
- EM.stop
12
- end
13
- end
14
-
15
- rv
16
- end
17
- end
@@ -1,130 +0,0 @@
1
- require "socket"
2
-
3
- module RedisMock
4
- class Server
5
- def initialize(options = {}, &block)
6
- tcp_server = TCPServer.new(options[:host] || "127.0.0.1", 0)
7
- tcp_server.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true)
8
-
9
- if options[:ssl]
10
- ctx = OpenSSL::SSL::SSLContext.new
11
-
12
- ssl_params = options.fetch(:ssl_params, {})
13
- ctx.set_params(ssl_params) unless ssl_params.empty?
14
-
15
- @server = OpenSSL::SSL::SSLServer.new(tcp_server, ctx)
16
- else
17
- @server = tcp_server
18
- end
19
- end
20
-
21
- def port
22
- @server.addr[1]
23
- end
24
-
25
- def start(&block)
26
- @thread = Thread.new { run(&block) }
27
- end
28
-
29
- def shutdown
30
- @thread.kill
31
- end
32
-
33
- def run
34
- begin
35
- loop do
36
- session = @server.accept
37
-
38
- begin
39
- return if yield(session) == :exit
40
- ensure
41
- session.close
42
- end
43
- end
44
- rescue => ex
45
- $stderr.puts "Error running mock server: #{ex.message}"
46
- $stderr.puts ex.backtrace
47
- retry
48
- ensure
49
- @server.close
50
- end
51
- end
52
- end
53
-
54
- # Starts a mock Redis server in a thread.
55
- #
56
- # The server will use the lambda handler passed as argument to handle
57
- # connections. For example:
58
- #
59
- # handler = lambda { |session| session.close }
60
- # RedisMock.start_with_handler(handler) do
61
- # # Every connection will be closed immediately
62
- # end
63
- #
64
- def self.start_with_handler(blk, options = {})
65
- server = Server.new(options)
66
- port = server.port
67
-
68
- begin
69
- server.start(&blk)
70
- yield(port)
71
- ensure
72
- server.shutdown
73
- end
74
- end
75
-
76
- # Starts a mock Redis server in a thread.
77
- #
78
- # The server will reply with a `+OK` to all commands, but you can
79
- # customize it by providing a hash. For example:
80
- #
81
- # RedisMock.start(:ping => lambda { "+PONG" }) do |port|
82
- # assert_equal "PONG", Redis.new(:port => port).ping
83
- # end
84
- #
85
- def self.start(commands, options = {}, &blk)
86
- handler = lambda do |session|
87
- while line = session.gets
88
- argv = Array.new(line[1..-3].to_i) do
89
- bytes = session.gets[1..-3].to_i
90
- arg = session.read(bytes)
91
- session.read(2) # Discard \r\n
92
- arg
93
- end
94
-
95
- command = argv.shift
96
- blk = commands[command.to_sym]
97
- blk ||= lambda { |*_| "+OK" }
98
-
99
- response = blk.call(*argv)
100
-
101
- # Convert a nil response to :close
102
- response ||= :close
103
-
104
- if response == :exit
105
- break :exit
106
- elsif response == :close
107
- break :close
108
- elsif response.is_a?(Array)
109
- session.write("*%d\r\n" % response.size)
110
-
111
- response.each do |resp|
112
- if resp.is_a?(Array)
113
- session.write("*%d\r\n" % resp.size)
114
- resp.each do |r|
115
- session.write("$%d\r\n%s\r\n" % [r.length, r])
116
- end
117
- else
118
- session.write("$%d\r\n%s\r\n" % [resp.length, resp])
119
- end
120
- end
121
- else
122
- session.write(response)
123
- session.write("\r\n") unless response.end_with?("\r\n")
124
- end
125
- end
126
- end
127
-
128
- start_with_handler(handler, options, &blk)
129
- end
130
- end
@@ -1,31 +0,0 @@
1
- #!/bin/sh
2
-
3
- get_subject() {
4
- if [ "$1" = "trusted" ]
5
- then
6
- echo "/C=IT/ST=Sicily/L=Catania/O=Redis/OU=Security/CN=127.0.0.1"
7
- else
8
- echo "/C=XX/ST=Untrusted/L=Evilville/O=Evil Hacker/OU=Attack Department/CN=127.0.0.1"
9
- fi
10
- }
11
-
12
- # Generate two CAs: one to be considered trusted, and one that's untrusted
13
- for type in trusted untrusted; do
14
- rm -rf ./demoCA
15
- mkdir -p ./demoCA
16
- mkdir -p ./demoCA/certs
17
- mkdir -p ./demoCA/crl
18
- mkdir -p ./demoCA/newcerts
19
- mkdir -p ./demoCA/private
20
- touch ./demoCA/index.txt
21
-
22
- openssl genrsa -out ${type}-ca.key 2048
23
- openssl req -new -x509 -days 12500 -key ${type}-ca.key -out ${type}-ca.crt -subj "$(get_subject $type)"
24
- openssl x509 -in ${type}-ca.crt -noout -next_serial -out ./demoCA/serial
25
-
26
- openssl req -newkey rsa:2048 -keyout ${type}-cert.key -nodes -out ${type}-cert.req -subj "$(get_subject $type)"
27
- openssl ca -days 12500 -cert ${type}-ca.crt -keyfile ${type}-ca.key -out ${type}-cert.crt -infiles ${type}-cert.req
28
- rm ${type}-cert.req
29
- done
30
-
31
- rm -rf ./demoCA
@@ -1,25 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIEIDCCAwigAwIBAgIJAM7kyjC89Qj/MA0GCSqGSIb3DQEBCwUAMGcxCzAJBgNV
3
- BAYTAklUMQ8wDQYDVQQIEwZTaWNpbHkxEDAOBgNVBAcTB0NhdGFuaWExDjAMBgNV
4
- BAoTBVJlZGlzMREwDwYDVQQLEwhTZWN1cml0eTESMBAGA1UEAxMJMTI3LjAuMC4x
5
- MCAXDTE2MDQwMjAzMzQ0MVoYDzIwNTAwNjIzMDMzNDQxWjBnMQswCQYDVQQGEwJJ
6
- VDEPMA0GA1UECBMGU2ljaWx5MRAwDgYDVQQHEwdDYXRhbmlhMQ4wDAYDVQQKEwVS
7
- ZWRpczERMA8GA1UECxMIU2VjdXJpdHkxEjAQBgNVBAMTCTEyNy4wLjAuMTCCASIw
8
- DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMeibFqEG38mtN9DSXy6NZdd7AjH
9
- 4/D+VdDzlbJlI5IBACCV9p6P2j5PFlFvkHFE6vr6biMaLXNAmUHYfDzeT95LODHH
10
- t+8HlR51cNYrnt9B3eiVwEnJ7+axuDHg6nUgLXeKeog+vEqreZwLnFibxt2qpFze
11
- xzyKJ37Pm+iAey5glCc/v7ECYQ4sWVVV+ciC+sAwmZDfZXCBQtRRokJ6ikqQDwWV
12
- DugGcV46feTpu79OmkLLM8PI3E7ow2F/3iv67gmdlO5m9wX1ahWzJKUapBTxgf4X
13
- QG0s60WbC9iJIvgXRGW7wWSsqSVJkfLYllDTPgfpLyl1+FR3A4awrsPiMVUCAwEA
14
- AaOBzDCByTAdBgNVHQ4EFgQU+YG9kJR3Vy31d7QVyxRAYyKTK18wgZkGA1UdIwSB
15
- kTCBjoAU+YG9kJR3Vy31d7QVyxRAYyKTK1+ha6RpMGcxCzAJBgNVBAYTAklUMQ8w
16
- DQYDVQQIEwZTaWNpbHkxEDAOBgNVBAcTB0NhdGFuaWExDjAMBgNVBAoTBVJlZGlz
17
- MREwDwYDVQQLEwhTZWN1cml0eTESMBAGA1UEAxMJMTI3LjAuMC4xggkAzuTKMLz1
18
- CP8wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAeFKB7DUixmxbdvNw
19
- n/mNoHK+OOZXmfxZDCo0v2gcQ4WXUiCqL6MagrImCvkEz5RL6Fk2ZflEV2iGQ5Ds
20
- CmF2n47ISpqG29bfI5R1rcbfqK/5tazUIhQu12ThNmkEh7hCuW/0LqJrnmxpuRLy
21
- le9e3svCC96lwjFczzU/utWurKt7S7Di3C4P+AXAJJuszDMLMCBLaB/3j24cNpOx
22
- zzeZo02x4rpsD2+MMfRDWMWezVEyk63KnI0kt3JGnepsKCFc48ZOk09LwFk3Rfaq
23
- zuKSgEJJw1mfsdBfysM0HQw20yyjSdoTEfQq3bXctTNi+pEOgW6x7TMsnngYYLXV
24
- 9XTrpg==
25
- -----END CERTIFICATE-----
@@ -1,27 +0,0 @@
1
- -----BEGIN RSA PRIVATE KEY-----
2
- MIIEpQIBAAKCAQEAx6JsWoQbfya030NJfLo1l13sCMfj8P5V0POVsmUjkgEAIJX2
3
- no/aPk8WUW+QcUTq+vpuIxotc0CZQdh8PN5P3ks4Mce37weVHnVw1iue30Hd6JXA
4
- Scnv5rG4MeDqdSAtd4p6iD68Sqt5nAucWJvG3aqkXN7HPIonfs+b6IB7LmCUJz+/
5
- sQJhDixZVVX5yIL6wDCZkN9lcIFC1FGiQnqKSpAPBZUO6AZxXjp95Om7v06aQssz
6
- w8jcTujDYX/eK/ruCZ2U7mb3BfVqFbMkpRqkFPGB/hdAbSzrRZsL2Iki+BdEZbvB
7
- ZKypJUmR8tiWUNM+B+kvKXX4VHcDhrCuw+IxVQIDAQABAoIBAQCzbGHiQJXOA+XQ
8
- O9OSjHGaJ8n6Yl2VvaE3eZXzjj8X/Fo271GGVVgbZE10x8aUZxKim+3dEqwCx+52
9
- ZbHTqyMxcX2CEDRaWwBFLdxKQU467iIZ5m26ZAp/1v7rpXBT8KWsqQNT7L6ihdd4
10
- zl6orOlhVPsAlSGQYcL5kHJZ1w/fL0phEbwdISd3PYhGHXMNmqfXorzJYHDQA4R+
11
- yR7WpP1dmnUeEKrHc9FFcBZ75BGlWjdCPZMFKc7IndZumarhBpWH9yZMUxrUIo4V
12
- SCweRUFdD5H1lMZ0YiIAE25wKNEQ2iGd3Jfr8Vj1KFSHC9I2FJA3aFRRUgTwxx/W
13
- h0mJy1ZJAoGBAPYsSSlwQdxZjnyZiVkNSD4MoLdof//nRxeKGejq6AiXDvcsLyJy
14
- 0MKk4YBFw2249TWm/KBbMAFiBE7d8uPtP5pPfjNVPX6VltH3AhSZ7Ugbpo6C3NFA
15
- GpzFVtNaWgCVDloDVdmsY7ssDFuAIih0paklPAqnLY+Ua9m1BiEPrB+bAoGBAM+a
16
- i+0NMR4AyKpuo1exdd+7BIHw5HNPwGmR1ggdGWduH0zsOhEawQKKFv1X9xKAcXxW
17
- PyeD56/Tmn7fkWvuE8dOu9E6em0vgmxhYyn4nyLAFYF5uKXYo78MpIEThdpl1ldT
18
- iHwG/25vunaBUHhwbHPUD+F989tmRuCjoFkuA5nPAoGAaqPIlcDhZvkMtoE0dHVC
19
- hE6oGIuWV17y9wmGK9YG6iG2A/EKAhxGvur6HL0b6Z4j6zgJW9Xkt9SkFR4kqAQQ
20
- d2JUQxx75SgcC5y7M/1yQrhnsHiT+7mPTbZW5HvRXUs0yl2DhSYeleiA+epJ4ciW
21
- Mu3EUsEVBYvAJLE8lHnbkF0CgYEAhyxpz3+3a4G3JsHDOWYjCfoLhVAEb9CNyC9c
22
- 3QuVbvMVDlEBvgFdivm+3lZYWYOoYP0HQgNw59svzUxks5Hg7vUk9abN8CnvEgKX
23
- PszTUR0g450NzW6xr8PbmO/NR9bnKRUK2Tb1OkMldePdMY6CDykU7g3EqiZ+H+Zq
24
- kaaUUaECgYEAmk5W+S94q5jLemnfAChC5lva/0/aHdhtaoH4Lo+j0haMsdiy8/ZE
25
- sh+3gQ8pqwaCAwnKxAcppt/FNZ7tHRsH3oyY6biypn3WppQj+BA41nuzbspOKJhR
26
- ZDXKFCItbzUjyi23Dx4P4DgMivkpV+e88RMIuBnv4yjl5iOLq+vf4Rg=
27
- -----END RSA PRIVATE KEY-----