amqpcat 0.0.1 → 0.0.2
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.
- data/bin/amqpcat +16 -12
- data/lib/amqpcat.rb +53 -37
- data/lib/amqpcat/version.rb +1 -1
- metadata +18 -17
- data/bin/amqpcat.bak +0 -115
- data/examples/client_cert.pem +0 -18
- data/examples/client_key.pem +0 -27
data/bin/amqpcat
CHANGED
@@ -16,13 +16,13 @@ Usage: #{$0} [options] amqp-url
|
|
16
16
|
'user:pass' : optional. Default: guest:guest
|
17
17
|
'host' : required.
|
18
18
|
'port' : optional. Default: 5672 (amqp), 5671 (amqps)
|
19
|
-
'vhost
|
19
|
+
'vhost' : optional. Default: /
|
20
20
|
|
21
21
|
Options:
|
22
22
|
EOS
|
23
23
|
|
24
24
|
opts.on('-h', '--help', 'Display usage') { puts opts; exit 0 }
|
25
|
-
|
25
|
+
|
26
26
|
options[:mode] = nil
|
27
27
|
opts.on('-c', '--consumer', 'Read data from the queue specified by -n and write to STDOUT') do
|
28
28
|
options[:mode] = :consumer
|
@@ -39,42 +39,46 @@ EOS
|
|
39
39
|
opts.on('-r', '--ssl-cert FILE', 'Use SSL cert in FILE.') do |f|
|
40
40
|
options[:ssl_cert] = f
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
options[:verify_ssl] = true
|
44
44
|
opts.on('y', '--[no-]verify-ssl', 'Verify server SSL certficiate. (Default: true)') do |y|
|
45
45
|
options[:verify_ssl] = y
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
options[:prefix] = ''
|
49
49
|
opts.on('-s', '--string STRING', "prefix output with STRING") do |s|
|
50
50
|
options[:prefix] = s
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
options[:once] = false
|
54
54
|
opts.on('-o', '--once', "Read/Write one message then exit. (Default: false)") do
|
55
55
|
options[:once] = true
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
options[:name] = 'amqpcat.default'
|
59
59
|
opts.on('-n', '--name NAME', "Queue and Exchange NAME to use. (Default: amqpcat.default)") do |name|
|
60
60
|
options[:name] = name
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
options[:type] = 'direct'
|
64
64
|
opts.on('-t', '--type TYPE', "Exchange type: direct, fanout. (Default: direct)") do |type|
|
65
65
|
options[:type] = type
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
options[:durable] = true
|
69
69
|
opts.on('--[no-]durable', "Enable/Disable durable messages. (Default: durable=true)") do |d|
|
70
70
|
options[:durable] = d
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
options[:auto_delete] = false
|
74
74
|
opts.on('--[no-]auto_delete', "Enable/Disable auto_delete. (Default: auto_delete=false)") do |d|
|
75
75
|
options[:auto_delete] = d
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
|
+
opts.on('--routing-key KEY', "Bind or publish to the exchange with a routing key.") do |k|
|
79
|
+
options[:routing_key] = k
|
80
|
+
end
|
81
|
+
|
78
82
|
end
|
79
83
|
optparse.parse!
|
80
84
|
|
@@ -84,7 +88,7 @@ if ARGV.size < 1
|
|
84
88
|
end
|
85
89
|
|
86
90
|
if options[:mode].nil?
|
87
|
-
puts "Must specify --consumer or --
|
91
|
+
puts "Must specify --consumer or --publisher. --help for help"
|
88
92
|
exit 1
|
89
93
|
end
|
90
94
|
|
@@ -111,4 +115,4 @@ case options[:mode]
|
|
111
115
|
end
|
112
116
|
end
|
113
117
|
|
114
|
-
amqpcat.finish
|
118
|
+
amqpcat.finish
|
data/lib/amqpcat.rb
CHANGED
@@ -6,58 +6,49 @@ class Amqpcat
|
|
6
6
|
|
7
7
|
def initialize(url, options={})
|
8
8
|
parse_amqp_url(url)
|
9
|
-
|
10
|
-
@@opts = {:type => 'direct',
|
11
|
-
:name => DEFAULT_QUEUE,
|
12
|
-
:durable => true,
|
13
|
-
:auto_delete => false,
|
14
|
-
:ssl_key => nil,
|
15
|
-
:ssl_cert => nil,
|
16
|
-
:verify_ssl => true,
|
17
|
-
}.merge(options)
|
18
|
-
|
19
|
-
@@amqp_settings.merge!(@@opts)
|
20
|
-
@@amqp = Bunny.new(@@amqp_settings)
|
21
|
-
@@amqp.start
|
22
9
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
10
|
+
@opts = {
|
11
|
+
:type => 'direct',
|
12
|
+
:name => DEFAULT_QUEUE,
|
13
|
+
:durable => true,
|
14
|
+
:auto_delete => false,
|
15
|
+
:persistent => true,
|
16
|
+
:ssl_key => nil,
|
17
|
+
:ssl_cert => nil,
|
18
|
+
:verify_ssl => true,
|
19
|
+
}.merge(options)
|
20
|
+
|
21
|
+
@amqp_settings.merge!(@opts)
|
22
|
+
@amqp = Bunny.new(@amqp_settings)
|
23
|
+
@amqp.start
|
35
24
|
end
|
36
|
-
|
25
|
+
|
37
26
|
def publish(msg)
|
38
|
-
|
27
|
+
exchange.publish(msg, :persistent => @opts[:persistent], :key => @opts[:routing_key])
|
39
28
|
end
|
40
|
-
|
29
|
+
|
41
30
|
def message_count
|
42
|
-
|
31
|
+
queue.message_count
|
43
32
|
end
|
44
|
-
|
33
|
+
|
45
34
|
def fetch
|
46
|
-
|
35
|
+
queue.pop[:payload]
|
47
36
|
end
|
48
|
-
|
37
|
+
|
49
38
|
def subscribe(&block)
|
50
|
-
|
39
|
+
queue.subscribe(&block)
|
51
40
|
end
|
52
|
-
|
41
|
+
|
53
42
|
def finish
|
54
|
-
|
43
|
+
@amqp.stop
|
55
44
|
end
|
56
|
-
|
45
|
+
|
46
|
+
private
|
47
|
+
|
57
48
|
def parse_amqp_url(str)
|
58
49
|
url = URI.parse(str)
|
59
50
|
use_ssl = url.scheme.downcase == 'amqps'
|
60
|
-
|
51
|
+
@amqp_settings = {
|
61
52
|
:host => url.host,
|
62
53
|
:port => url.port || (use_ssl ? 5671 : 5672),
|
63
54
|
:user => url.user || 'guest',
|
@@ -67,4 +58,29 @@ class Amqpcat
|
|
67
58
|
}
|
68
59
|
end
|
69
60
|
|
61
|
+
def exchange
|
62
|
+
return @exchange if @exchange
|
63
|
+
options = {
|
64
|
+
:type => @opts[:type],
|
65
|
+
:durable => @opts[:durable],
|
66
|
+
:auto_delete => @opts[:auto_delete]
|
67
|
+
}
|
68
|
+
@exchange = @amqp.exchange(@opts[:name], options)
|
69
|
+
end
|
70
|
+
|
71
|
+
def queue
|
72
|
+
return @queue if @queue
|
73
|
+
options = {
|
74
|
+
:durable => @opts[:durable],
|
75
|
+
:auto_delete => @opts[:auto_delete]
|
76
|
+
}
|
77
|
+
@queue = case @opts[:type]
|
78
|
+
when 'fanout'
|
79
|
+
@amqp.queue(options)
|
80
|
+
else
|
81
|
+
@amqp.queue(@opts[:name], options)
|
82
|
+
end
|
83
|
+
@queue.bind(exchange, :routing_key => @opts[:routing_key])
|
84
|
+
@queue
|
85
|
+
end
|
70
86
|
end
|
data/lib/amqpcat/version.rb
CHANGED
metadata
CHANGED
@@ -1,27 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: amqpcat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.1
|
5
4
|
prerelease:
|
5
|
+
version: 0.0.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Joe Miller
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-02-05 00:00:00.
|
12
|
+
date: 2012-02-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
|
16
|
-
requirement:
|
15
|
+
type: :runtime
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- - =
|
19
|
+
- - '='
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: 0.7.8
|
22
|
-
type: :runtime
|
23
22
|
prerelease: false
|
24
|
-
version_requirements:
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - '='
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: 0.7.8
|
29
|
+
name: bunny
|
25
30
|
description: ! 'A netcat inspired command line tool for reading and writing simple
|
26
31
|
|
27
32
|
messages to AMQP based message brokers such as RabbitMQ.
|
@@ -30,22 +35,18 @@ description: ! 'A netcat inspired command line tool for reading and writing simp
|
|
30
35
|
email: joeym@joeym.net
|
31
36
|
executables:
|
32
37
|
- amqpcat
|
33
|
-
- amqpcat.bak
|
34
38
|
extensions: []
|
35
39
|
extra_rdoc_files: []
|
36
40
|
files:
|
37
|
-
- amqpcat.gemspec
|
38
|
-
- bin/amqpcat
|
39
|
-
- bin/amqpcat.bak
|
40
|
-
- examples/client_cert.pem
|
41
|
-
- examples/client_key.pem
|
42
|
-
- examples/test_direct.sh
|
43
|
-
- examples/test_fanout.sh
|
44
|
-
- examples/test_ssl.sh
|
45
41
|
- Gemfile
|
46
42
|
- Gemfile.lock
|
43
|
+
- bin/amqpcat
|
47
44
|
- lib/amqpcat/version.rb
|
48
45
|
- lib/amqpcat.rb
|
46
|
+
- examples/test_ssl.sh
|
47
|
+
- examples/test_direct.sh
|
48
|
+
- examples/test_fanout.sh
|
49
|
+
- amqpcat.gemspec
|
49
50
|
- README.md
|
50
51
|
homepage: https://github.com/joemiller/amqpcat
|
51
52
|
licenses: []
|
@@ -67,7 +68,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
67
68
|
version: '0'
|
68
69
|
requirements: []
|
69
70
|
rubyforge_project:
|
70
|
-
rubygems_version: 1.8.
|
71
|
+
rubygems_version: 1.8.24
|
71
72
|
signing_key:
|
72
73
|
specification_version: 3
|
73
74
|
summary: Netcat-like tool for reading and writing messages to AMQP message brokers
|
data/bin/amqpcat.bak
DELETED
@@ -1,115 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
4
|
-
|
5
|
-
require 'optparse'
|
6
|
-
require 'amqpcat'
|
7
|
-
|
8
|
-
options = {}
|
9
|
-
optparse = OptionParser.new do |opts|
|
10
|
-
opts.banner = <<-EOS
|
11
|
-
Usage: #{$0} [options] amqp-url
|
12
|
-
|
13
|
-
amqp-url format: 'amqp://user:pass@host:port/vhost'
|
14
|
-
|
15
|
-
'amqp' : required. Either amqp or amqps (SSL)
|
16
|
-
'user:pass' : optional. Default: guest:guest
|
17
|
-
'host' : required.
|
18
|
-
'port' : optional. Default: 5672 (amqp), 5671 (amqps)
|
19
|
-
'vhost : optional. Default: /
|
20
|
-
|
21
|
-
Options:
|
22
|
-
EOS
|
23
|
-
|
24
|
-
opts.on('-h', '--help', 'Display usage') { puts opts; exit 0 }
|
25
|
-
|
26
|
-
options[:mode] = nil
|
27
|
-
opts.on('-c', '--consumer', 'Read data from the queue specified by -n and write to STDOUT') do
|
28
|
-
options[:mode] = :consumer
|
29
|
-
end
|
30
|
-
|
31
|
-
opts.on('-p', '--publisher', 'Read data from STDIN and publish to the exchange specified by -n') do
|
32
|
-
options[:mode] = :publisher
|
33
|
-
end
|
34
|
-
|
35
|
-
|
36
|
-
opts.on('-k', '--ssl-key FILE', 'Use SSL key in FILE.') do |f|
|
37
|
-
options[:ssl_key] = f
|
38
|
-
end
|
39
|
-
|
40
|
-
opts.on('-r', '--ssl-cert FILE', 'Use SSL cert in FILE.') do |f|
|
41
|
-
options[:ssl_cert] = f
|
42
|
-
end
|
43
|
-
|
44
|
-
options[:ssl_verify] = true
|
45
|
-
opts.on('y', '--[no-]ssl-verify', 'Verify server SSL certficiate. (Default: true)') do |y|
|
46
|
-
options[:ssl_verify] = y
|
47
|
-
end
|
48
|
-
|
49
|
-
options[:prefix] = ''
|
50
|
-
opts.on('-s', '--string STRING', "prefix output with STRING") do |s|
|
51
|
-
options[:prefix] = s
|
52
|
-
end
|
53
|
-
|
54
|
-
options[:once] = false
|
55
|
-
opts.on('-o', '--once', "Read/Write one message then exit. (Default: false)") do
|
56
|
-
options[:once] = true
|
57
|
-
end
|
58
|
-
|
59
|
-
options[:name] = 'amqpcat.default'
|
60
|
-
opts.on('-n', '--name NAME', "Queue and Exchange NAME to use. (Default: amqpcat.default)") do |name|
|
61
|
-
options[:name] = name
|
62
|
-
end
|
63
|
-
|
64
|
-
options[:type] = 'direct'
|
65
|
-
opts.on('-t', '--type TYPE', "Exchange type: direct, fanout. (Default: direct)") do |type|
|
66
|
-
options[:type] = type
|
67
|
-
end
|
68
|
-
|
69
|
-
options[:durable] = true
|
70
|
-
opts.on('--[no-]durable', "Enable/Disable durable messages. (Default: durable=true)") do |d|
|
71
|
-
options[:durable] = d
|
72
|
-
end
|
73
|
-
|
74
|
-
options[:auto_delete] = false
|
75
|
-
opts.on('--[no-]auto_delete', "Enable/Disable auto_delete. (Default: auto_delete=false)") do |d|
|
76
|
-
options[:auto_delete] = d
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
80
|
-
optparse.parse!
|
81
|
-
|
82
|
-
if ARGV.size < 1
|
83
|
-
puts "Must specify amqp-url. --help for help"
|
84
|
-
exit 1
|
85
|
-
end
|
86
|
-
|
87
|
-
if options[:mode].nil?
|
88
|
-
puts "Must specify --consumer or --producer. --help for help"
|
89
|
-
exit 1
|
90
|
-
end
|
91
|
-
|
92
|
-
amqp_url = ARGV[0]
|
93
|
-
amqpcat = Amqpcat.new(amqp_url, options)
|
94
|
-
|
95
|
-
trap 'SIGINT', proc { amqpcat.finish; exit 0 }
|
96
|
-
|
97
|
-
# case options[:mode]
|
98
|
-
# when :consumer
|
99
|
-
amqpcat.subscribe do |msg|
|
100
|
-
$stdout.write options[:prefix] + msg[:payload]
|
101
|
-
$stdout.flush
|
102
|
-
if options[:once]
|
103
|
-
amqpcat.finish
|
104
|
-
exit
|
105
|
-
end
|
106
|
-
end
|
107
|
-
# when :publisher
|
108
|
-
if options[:once]
|
109
|
-
amqpcat.publish $stdin.read
|
110
|
-
else
|
111
|
-
$stdin.each_line { |l| amqpcat.publish(l) }
|
112
|
-
end
|
113
|
-
# end
|
114
|
-
|
115
|
-
amqpcat.finish
|
data/examples/client_cert.pem
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
-----BEGIN CERTIFICATE-----
|
2
|
-
MIIC4zCCAcugAwIBAgIBAjANBgkqhkiG9w0BAQUFADARMQ8wDQYDVQQDEwZUZXN0
|
3
|
-
Q0EwHhcNMTIwMTE1MDAwMjE1WhcNMTMwMTE0MDAwMjE1WjAoMRUwEwYDVQQDEwxz
|
4
|
-
ZW5zdS1zZXJ2ZXIxDzANBgNVBAoTBmNsaWVudDCCASIwDQYJKoZIhvcNAQEBBQAD
|
5
|
-
ggEPADCCAQoCggEBAM3Ib3MoKvu4CsEzGcQDN0u7Vo+7Pt7c6imcIg8Mktastbzl
|
6
|
-
BhWjZt9nBdQZ9tL6Cj/HMnhw3FsfQ4kmNgcoFDmoaFqi0oHVAD0xXauu2LF3G1aq
|
7
|
-
Qr2e02hqnrvc2BKDnoW4n9h+AfmNiAQ3bb572jJv49NDHRscuxD+4/ZJCH+uN5lp
|
8
|
-
uuME/HvhNjR9yo3kc8mK1iUNpYa25qmoE/3Ao26FUrAgSbLG6RP3uXuXZlWrfnAt
|
9
|
-
pyz+r0PPDYTttwIc1bPPBIbACiHtqYfz0nudikF2VOUiCiSl/Ld61ZHS1Bnudz0p
|
10
|
-
Ah6ZjIYrw/QUS3d78F4G3xf9u5LF3wSwmlrW2gUCAwEAAaMvMC0wCQYDVR0TBAIw
|
11
|
-
ADALBgNVHQ8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQEF
|
12
|
-
BQADggEBAMKB03m8K5Ub+mII/WbRyjVrEIL2cbOs9TQvvRfHCQ3P38+3NcYIzDOB
|
13
|
-
dX3/HoEyFjjSSA0rzLIaT6rHF2faZL6JPyovyhAewOOOgI5DFOurSP/10P8m5GSk
|
14
|
-
0WuYMqs5VZbDuaVxthflPmvLgYOPurwIdg5G5egAxYNSEy4Kprk7n8x6wlJTrL3q
|
15
|
-
36DQDOAt5lZqFd6/5ulvLUHDPgqN5HOUbkLTVDN2GiktdOHBOgXH44en14YqCsMs
|
16
|
-
qahqsTokTLMY4ofl8EMly10eDEUBkfqCpEDczWe1f7oGBC0VvhiXXl7VgYzHx4en
|
17
|
-
WAbyHQ9diSqsPaEO9WW54NLwpZI4obc=
|
18
|
-
-----END CERTIFICATE-----
|
data/examples/client_key.pem
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
-----BEGIN RSA PRIVATE KEY-----
|
2
|
-
MIIEpAIBAAKCAQEAzchvcygq+7gKwTMZxAM3S7tWj7s+3tzqKZwiDwyS1qy1vOUG
|
3
|
-
FaNm32cF1Bn20voKP8cyeHDcWx9DiSY2BygUOahoWqLSgdUAPTFdq67YsXcbVqpC
|
4
|
-
vZ7TaGqeu9zYEoOehbif2H4B+Y2IBDdtvnvaMm/j00MdGxy7EP7j9kkIf643mWm6
|
5
|
-
4wT8e+E2NH3KjeRzyYrWJQ2lhrbmqagT/cCjboVSsCBJssbpE/e5e5dmVat+cC2n
|
6
|
-
LP6vQ88NhO23AhzVs88EhsAKIe2ph/PSe52KQXZU5SIKJKX8t3rVkdLUGe53PSkC
|
7
|
-
HpmMhivD9BRLd3vwXgbfF/27ksXfBLCaWtbaBQIDAQABAoIBAHZZDtfAwy+vgefo
|
8
|
-
9qmHW/bfEAJrotXTYYx6sg/LoGt8Oq0fXid1qUVUX8LDB/QAP4K8kic4aVKyoUmw
|
9
|
-
QyRMhY0/cHyn5b8rfA61ZHTHgvJVWNC37NhXDqifoRjUAyRqs/Gd47hDh+k433/l
|
10
|
-
TOVfH3cgaHtovsWH+YHlxb8v84ZR6CY4/YrIhvPGqA9zkVwd361DeR3+MK1a+5/v
|
11
|
-
LWGEHe2Oxko6KcHh8iLd44PmcHlcw3SxB+Y25/+8yDehw9LjivJa/IZBdd8cXRcd
|
12
|
-
kOOOhVg7xftywwFXBIczB1hObHPu3qUNXJgFZSTfuO0SKqz8mR9kr5a0W0ci8B/9
|
13
|
-
PLVkbyUCgYEA9ZKvhbV7vgQS2s4sSLnove55sizJHydseRvmp4KnoMTY1sha1jLL
|
14
|
-
38mJsnzPSAtM6CjXnNQ0L10oTNskIh06sqNdOBGmnEB4CcBMkVwVysUctpqO3jyC
|
15
|
-
dc4phMeAdhPkEcUCwPTtu9wwmwFyp5fTDnFb+HpUfRGgIVlB8048tOMCgYEA1oU+
|
16
|
-
Cx92ZBnOdAbppOCWdlzNIry9Z9hOsYlA9pDV8wJfmwbQlV8mVeuQk3TsXzJnyqD8
|
17
|
-
9xU2Ei1u3GY02IE1CsiEVcVm8II9ZCYnXc4lFkbJd/1DMRhh+WWoBP0PYq/0qGYh
|
18
|
-
SP+L+sJpv/UTb6zxAb0VaE7ONqm/vFv54qG90fcCgYEA9BAbHfpmx0zpKElsPcN3
|
19
|
-
Cv0uOeTE5o+aASu3q5fw3ZmGIMDzdpr5gKqejaP5ppKElt+wmo9UZhZh7TCG0tjV
|
20
|
-
86DlDsqMGhMAukBCWN16UxJgHSOzBjCBQG/rV6mnhLL0Iqz4tak3dVO7gvKHbwU3
|
21
|
-
n80OKP/7ZGnWCg7ZuuRw9R0CgYAGsZ+u/ytVkkyT6EdQIsXvKZQpGlSasfA6r/q7
|
22
|
-
9ucGLzPGhZ7qmk567d/UChj6G3uLohxipWHLjWlhLTtG6jk6felLN96vcJDz2BDw
|
23
|
-
Z2dW25ybxuZa2NTt0FM+3JqnTLBItO8i9P5sM7bTC5WwrWfT0w+g8pySrhdSjFgu
|
24
|
-
zzc6HwKBgQCtyYw6gqqo0a7iYulVYXXHLJ/TYcw3qNdLz5bRTu7yFlMlLQXJ3XFk
|
25
|
-
svUKHnx9AMIFQ+Dz02WFVckeVqarJ7T2ENPmHem64TAP2yblfThfc0XZYbHQRMwj
|
26
|
-
qc5KkG+5BxWBpLqYxYPz68M6l5P1OX5pudC5XfFSFz2KkLyQFq8lYw==
|
27
|
-
-----END RSA PRIVATE KEY-----
|