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