amqpcat 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+ # gem "bunny", "~> 0.7.0"
3
+ gem 'bunny', :git => 'git://github.com/ruby-amqp/bunny.git'
@@ -0,0 +1,15 @@
1
+ GIT
2
+ remote: git://github.com/ruby-amqp/bunny.git
3
+ revision: f2deea037057169014b0f7a67682baf6a9d70c30
4
+ specs:
5
+ bunny (0.8.0.pre1)
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+
11
+ PLATFORMS
12
+ ruby
13
+
14
+ DEPENDENCIES
15
+ bunny!
@@ -0,0 +1,106 @@
1
+ amqpcat - Netcat-like tool for AMQP queues
2
+ ==========================================
3
+
4
+ This was originally written as a "toy" to learn and experiment with
5
+ rabbitmq. It allows you to easily read/write from AMQP queues/exchanges
6
+ from the command line or from shell scripts. It is implemented with the
7
+ `bunny` Ruby gem.
8
+
9
+ Install
10
+ -------
11
+ Install from gem:
12
+
13
+ sudo gem install amqpcat
14
+
15
+ Install from github:
16
+
17
+ git clone https://github.com/joemiller/amqpcat
18
+ gem build amqpcat.gemspec
19
+ gem install amqpcat-0.0.1.gem
20
+
21
+ Example Usage
22
+ -------------
23
+
24
+ ### 1:1 Messaging
25
+
26
+ Start a consumer. This will block until a message is received.
27
+
28
+ amqpcat --consumer amqp://guest:guest@rabbitmq.server/
29
+
30
+ Publish a message:
31
+
32
+ echo "hello rabbit" | amqpcat --publisher amqp://guest:guest@rabbitmq.server/
33
+
34
+ The consumer should output the message and exit.
35
+
36
+ ### 1:N (fanout / pubsub)
37
+
38
+ See the `examples/test_fanout.sh` script for another example of fanout
39
+ messaging.
40
+
41
+ Start 2 consumers, using `-s` to prefix the output of each with an
42
+ identifying string:
43
+
44
+ amqpcat --consumer -n fanout.test -t fanout -s "Consumer 1: " amqp://guest:guest@rabbitmq.server/
45
+ amqpcat --consumer -n fanout.test -t fanout -s "Consumer 2: " amqp://guest:guest@rabbitmq.server/
46
+
47
+ Note: In fanout mode, consumers will create their own server-named queues and bind to an exchange
48
+ defined by the `-n` parameter.
49
+
50
+ Published a message to the exchange:
51
+
52
+ echo "hello rabbits" | amqpcat --publisher -n fanout.test -t fanout amqp://guest:guest@rabbitmq.server/
53
+
54
+ Both of the consumers should print out the message we published.
55
+
56
+ Options
57
+ -------
58
+ Run `amqpcat -h` to get detailed help output.
59
+
60
+ ### One-message -vs- Continuous message mode
61
+
62
+ By default, when publishing, `amqpcat` will use the newline character to
63
+ distinguish between messages to publish. However, you can send a single
64
+ message by using the `--once` option. This can be useful if you need
65
+ to send a single message that contains new lines.
66
+
67
+ SSL Support
68
+ -----------
69
+ SSL support has been written but is not tested nor is it fully working
70
+ at this time (v0.0.1).
71
+
72
+ Additionally, the --ssl-key and --ssl-cert options are only supported
73
+ under newer versions of the Bunny gem (0.8+) or if bunny is installed
74
+ from the master branch on github.
75
+
76
+ Contributing
77
+ ------------
78
+ 1. Fork it.
79
+ 2. Create a branch (`git checkout -b my_feature`)
80
+ 3. Commit your changes (`git commit -am "did some stuff"`)
81
+ 4. Push to the branch (`git push origin my_feature`)
82
+ 5. Create an with a link to your branch
83
+
84
+ Author
85
+ ------
86
+
87
+ Joe Miller - http://twitter.com/miller_joe || https://github.com/joemiller
88
+
89
+ License
90
+ -------
91
+
92
+ Author:: Joe Miller (<joeym@joeym.net>)
93
+ Copyright:: Copyright (c) 2012 Joe Miller
94
+ License:: Apache License, Version 2.0
95
+
96
+ Licensed under the Apache License, Version 2.0 (the "License");
97
+ you may not use this file except in compliance with the License.
98
+ You may obtain a copy of the License at
99
+
100
+ http://www.apache.org/licenses/LICENSE-2.0
101
+
102
+ Unless required by applicable law or agreed to in writing, software
103
+ distributed under the License is distributed on an "AS IS" BASIS,
104
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
105
+ See the License for the specific language governing permissions and
106
+ limitations under the License.
@@ -0,0 +1,32 @@
1
+
2
+ # -*- encoding: utf-8 -*-
3
+ $:.push('lib')
4
+ require "amqpcat/version"
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "amqpcat"
8
+ s.version = Amqpcat::VERSION.dup
9
+ s.date = "2012-02-05"
10
+ s.summary = "Netcat-like tool for reading and writing messages to AMQP message brokers"
11
+ s.email = "joeym@joeym.net"
12
+ s.homepage = "https://github.com/joemiller/amqpcat"
13
+ s.authors = ['Joe Miller']
14
+
15
+ s.description = <<-EOF
16
+ A netcat inspired command line tool for reading and writing simple
17
+ messages to AMQP based message brokers such as RabbitMQ.
18
+ EOF
19
+
20
+ s.files = Dir['**/*']
21
+ s.test_files = Dir['test/**/*'] + Dir['spec/**/*']
22
+ s.executables = Dir['bin/*'].map { |f| File.basename(f) }
23
+ s.require_paths = ["lib"]
24
+
25
+ ## Make sure you can build the gem on older versions of RubyGems too:
26
+ s.rubygems_version = "1.3.6"
27
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
28
+ s.specification_version = 3 if s.respond_to? :specification_version
29
+
30
+ s.add_dependency("bunny", "0.7.8")
31
+
32
+ end
@@ -0,0 +1,114 @@
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
+ opts.on('-k', '--ssl-key FILE', 'Use SSL key in FILE.') do |f|
36
+ options[:ssl_key] = f
37
+ end
38
+
39
+ opts.on('-r', '--ssl-cert FILE', 'Use SSL cert in FILE.') do |f|
40
+ options[:ssl_cert] = f
41
+ end
42
+
43
+ options[:verify_ssl] = true
44
+ opts.on('y', '--[no-]verify-ssl', 'Verify server SSL certficiate. (Default: true)') do |y|
45
+ options[:verify_ssl] = y
46
+ end
47
+
48
+ options[:prefix] = ''
49
+ opts.on('-s', '--string STRING', "prefix output with STRING") do |s|
50
+ options[:prefix] = s
51
+ end
52
+
53
+ options[:once] = false
54
+ opts.on('-o', '--once', "Read/Write one message then exit. (Default: false)") do
55
+ options[:once] = true
56
+ end
57
+
58
+ options[:name] = 'amqpcat.default'
59
+ opts.on('-n', '--name NAME', "Queue and Exchange NAME to use. (Default: amqpcat.default)") do |name|
60
+ options[:name] = name
61
+ end
62
+
63
+ options[:type] = 'direct'
64
+ opts.on('-t', '--type TYPE', "Exchange type: direct, fanout. (Default: direct)") do |type|
65
+ options[:type] = type
66
+ end
67
+
68
+ options[:durable] = true
69
+ opts.on('--[no-]durable', "Enable/Disable durable messages. (Default: durable=true)") do |d|
70
+ options[:durable] = d
71
+ end
72
+
73
+ options[:auto_delete] = false
74
+ opts.on('--[no-]auto_delete', "Enable/Disable auto_delete. (Default: auto_delete=false)") do |d|
75
+ options[:auto_delete] = d
76
+ end
77
+
78
+ end
79
+ optparse.parse!
80
+
81
+ if ARGV.size < 1
82
+ puts "Must specify amqp-url. --help for help"
83
+ exit 1
84
+ end
85
+
86
+ if options[:mode].nil?
87
+ puts "Must specify --consumer or --producer. --help for help"
88
+ exit 1
89
+ end
90
+
91
+ amqp_url = ARGV[0]
92
+ amqpcat = Amqpcat.new(amqp_url, options)
93
+
94
+ trap 'SIGINT', proc { amqpcat.finish; exit 0 }
95
+
96
+ case options[:mode]
97
+ when :consumer
98
+ amqpcat.subscribe do |msg|
99
+ $stdout.write options[:prefix] + msg[:payload]
100
+ $stdout.flush
101
+ if options[:once]
102
+ amqpcat.finish
103
+ exit
104
+ end
105
+ end
106
+ when :publisher
107
+ if options[:once]
108
+ amqpcat.publish $stdin.read
109
+ else
110
+ $stdin.each_line { |l| amqpcat.publish(l) }
111
+ end
112
+ end
113
+
114
+ amqpcat.finish
@@ -0,0 +1,115 @@
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
@@ -0,0 +1,18 @@
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-----
@@ -0,0 +1,27 @@
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-----
@@ -0,0 +1,20 @@
1
+ #!/bin/sh
2
+
3
+ amqpcat_bin="`dirname $0`/../bin/amqpcat"
4
+
5
+ url="amqp://guest:guest@rabbitmq/"
6
+ opts="--name=direct.test --type=direct"
7
+
8
+ ## start 2 consumers ##
9
+ $amqpcat_bin -s "Consumer 1: " --consumer $url $opts &
10
+ $amqpcat_bin -s "Consumer 2: " --consumer $url $opts &
11
+
12
+ ## send messages ##
13
+ echo "test direct queue: 1" | $amqpcat_bin --publisher $url $opts
14
+ echo "test direct queue: 2" | $amqpcat_bin --publisher $url $opts
15
+ echo "test direct queue: 3" | $amqpcat_bin --publisher $url $opts
16
+ echo "test direct queue: 4" | $amqpcat_bin --publisher $url $opts
17
+
18
+ ## kill the consumers we forked ##
19
+ sleep 1
20
+ kill %1 %2
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+
3
+ amqpcat_bin="`dirname $0`/../bin/amqpcat"
4
+
5
+ amqp_url="amqp://guest:guest@rabbitmq/"
6
+ amqp_opts="--name=fanout.test --type=fanout"
7
+
8
+ ## start 2 consumers ##
9
+ $amqpcat_bin -s "Consumer 1: " $amqp_url $amqp_opts &
10
+ $amqpcat_bin -s "Consumer 2: " $amqp_url $amqp_opts &
11
+ sleep 1
12
+
13
+ ## send messages ##
14
+ echo "test fanout queue: 1" | $amqpcat_bin $amqp_url $amqp_opts
15
+ echo "test fanout queue: 2" | $amqpcat_bin $amqp_url $amqp_opts
16
+ echo "test fanout queue: 3" | $amqpcat_bin $amqp_url $amqp_opts
17
+ echo "test fanout queue: 4" | $amqpcat_bin $amqp_url $amqp_opts
18
+
19
+ ## kill the consumers we forked ##
20
+ sleep 1
21
+ kill %1 %2
@@ -0,0 +1,24 @@
1
+ #!/bin/sh
2
+
3
+ whereami=$(dirname $0)
4
+ amqpcat_bin="$whereami/../bin/amqpcat"
5
+
6
+ url="amqps://guest:guest@rabbitmq/"
7
+ opts="--name=direct.test --type=direct \
8
+ --ssl-key=$whereami/client_key.pem \
9
+ --ssl-cert=$whereami/client_cert.pem\
10
+ --no-verify-ssl"
11
+
12
+ ## start 2 consumers ##
13
+ $amqpcat_bin -s "Consumer 1: " --consumer $url $opts &
14
+ $amqpcat_bin -s "Consumer 2: " --consumer $url $opts &
15
+
16
+ ## send messages ##
17
+ echo "test direct queue: 1" | $amqpcat_bin --publisher $url $opts
18
+ echo "test direct queue: 2" | $amqpcat_bin --publisher $url $opts
19
+ echo "test direct queue: 3" | $amqpcat_bin --publisher $url $opts
20
+ echo "test direct queue: 4" | $amqpcat_bin --publisher $url $opts
21
+
22
+ ## kill the consumers we forked ##
23
+ sleep 1
24
+ kill %1 %2
@@ -0,0 +1,70 @@
1
+ require 'uri'
2
+ require 'bunny'
3
+
4
+ class Amqpcat
5
+ DEFAULT_QUEUE = 'amqpcat.default'
6
+
7
+ def initialize(url, options={})
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
+
23
+ name = @@opts[:name]
24
+ type = @@opts[:type]
25
+ durable = @@opts[:durable]
26
+ auto_delete = @@opts[:auto_delete]
27
+
28
+ if type == 'fanout'
29
+ @@queue = @@amqp.queue(:durable => durable, :auto_delete => auto_delete)
30
+ else
31
+ @@queue = @@amqp.queue(name, :durable => durable, :auto_delete => auto_delete)
32
+ end
33
+ @@exch = @@amqp.exchange(name, :type => type, :durable => durable, :auto_delete => auto_delete)
34
+ @@queue.bind(@@exch)
35
+ end
36
+
37
+ def publish(msg)
38
+ @@exch.publish(msg)
39
+ end
40
+
41
+ def message_count
42
+ @@queue.message_count
43
+ end
44
+
45
+ def fetch
46
+ @@queue.pop[:payload]
47
+ end
48
+
49
+ def subscribe(&block)
50
+ @@queue.subscribe(&block)
51
+ end
52
+
53
+ def finish
54
+ @@amqp.stop
55
+ end
56
+
57
+ def parse_amqp_url(str)
58
+ url = URI.parse(str)
59
+ use_ssl = url.scheme.downcase == 'amqps'
60
+ @@amqp_settings = {
61
+ :host => url.host,
62
+ :port => url.port || (use_ssl ? 5671 : 5672),
63
+ :user => url.user || 'guest',
64
+ :pass => url.password || 'guest',
65
+ :vhost => url.path == "" ? '/' : url.path,
66
+ :ssl => use_ssl,
67
+ }
68
+ end
69
+
70
+ end
@@ -0,0 +1,3 @@
1
+ module Amqpcat
2
+ VERSION = '0.0.1'
3
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: amqpcat
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Joe Miller
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-05 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bunny
16
+ requirement: &70278690104680 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - =
20
+ - !ruby/object:Gem::Version
21
+ version: 0.7.8
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70278690104680
25
+ description: ! 'A netcat inspired command line tool for reading and writing simple
26
+
27
+ messages to AMQP based message brokers such as RabbitMQ.
28
+
29
+ '
30
+ email: joeym@joeym.net
31
+ executables:
32
+ - amqpcat
33
+ - amqpcat.bak
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ 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
+ - Gemfile
46
+ - Gemfile.lock
47
+ - lib/amqpcat/version.rb
48
+ - lib/amqpcat.rb
49
+ - README.md
50
+ homepage: https://github.com/joemiller/amqpcat
51
+ licenses: []
52
+ post_install_message:
53
+ rdoc_options: []
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ requirements: []
69
+ rubyforge_project:
70
+ rubygems_version: 1.8.10
71
+ signing_key:
72
+ specification_version: 3
73
+ summary: Netcat-like tool for reading and writing messages to AMQP message brokers
74
+ test_files: []