X-Git-Url: https://review.fuel-infra.org/gitweb?a=blobdiff_plain;f=ext%2Fstompclient;fp=ext%2Fstompclient;h=1b1b3b5a73c6f8c41d1c8b3cb2affc0d972ac19f;hb=b87d2f4e68281062df1913440ca5753ae63314a9;hp=0000000000000000000000000000000000000000;hpb=ab0ea530b8ac956091f17b104ab2311336cfc250;p=packages%2Fprecise%2Fmcollective.git diff --git a/ext/stompclient b/ext/stompclient new file mode 100755 index 0000000..1b1b3b5 --- /dev/null +++ b/ext/stompclient @@ -0,0 +1,156 @@ +#!/usr/bin/env ruby +# == Synopsis +# +# stompclient: Generic client to consume and produce STOMP queues and topics, tested against +# Apache Active MQ +# +# == Description +# A simple client that can connect to an STOMP server, subscribe to topics and queues and also +# send to topics and queues. +# +# == Usage +# stompclient [OPTIONS] +# +# --help, -h: +# Show Help +# +# --server, -s +# The server to connect to, can also be set in STOMP_SERVER environment variable +# +# --port, -p +# The port to connect to, default to 6163 +# +# --user, -u +# The user to connect as, can also be set in STOMP_USER environment variable +# +# --password, -P +# The password to use, can also be set in STOMP_PASSWORD environment variable +# +# When connected to a server, use the 'help' command to see further information about +# using the client, common commands that can be issued are: +# +# - subscribe /topic/foo: Subscribes to topic 'foo' +# - /topic/foo bar: Sends 'bar' to the topic 'foo' +# - details: Toggle the display or timestamp and topic or queue information for each message +# +# +# == Changelog +# - 20 December 2009 Include into MCollective +# - 17 March 2009 Initial release +# +# R.I.Pienaar more information at www.devco.net +# +# Licensed under the Apache License, Version 2.0 + +require 'rubygems' +require 'stomp' +require 'readline' +require 'thread' +require 'getoptlong' + +opts = GetoptLong.new( + [ '--server', '-s', GetoptLong::REQUIRED_ARGUMENT], + [ '--port', '-p', GetoptLong::REQUIRED_ARGUMENT], + [ '--user', '-u', GetoptLong::REQUIRED_ARGUMENT], + [ '--password', '-P', GetoptLong::REQUIRED_ARGUMENT], + [ '--help', '-h', GetoptLong::NO_ARGUMENT] +) + +@user = ENV["STOMP_USER"]; +@password = ENV["STOMP_PASSWORD"] +@server = ENV["STOMP_SERVER"] +@port = ENV["STOMP_PORT"] || 6163 + +opts.each { |opt, arg| + case opt + when '--help' + begin + require 'rdoc/ri/ri_paths' + require 'rdoc/usage' + RDoc::usage + exit + rescue Exception => e + puts("Install RDoc::usage or view the comments in the top of the script to get detailed help") if e.to_str != "exit" + end + + exit + when '--server' + @server = arg + when '--port' + @port = arg + when '--user' + @user = arg + when '--password' + @password = arg + end +} + +@conn = Stomp::Connection.open(@user, @password, @server, @port, true) + +STDOUT.sync = true + +def showhelp + puts("List of commands:") + puts("\n\t- subscribe /(topic|queue)/foo subscribes to topic of queue 'foo'") + puts("\t- /(topic|queue|/foo bar sends msg 'bar' to topic of queue 'foo'") + puts("\t- quit|exit|q|^d exit") + puts("\t- detail show/dont show time and topic a msg was received on") + puts("\t- help show this help") +end + +@showdetails = true + +Thread.new(@conn) do |amq| + while true + msg = amq.receive + dest = msg.headers["destination"] + time = Time.now.strftime('%H:%M:%S') + + if @showdetails + msg = "\r#{time}:#{dest} > #{msg.body.chomp}\n" + else + msg = "\r#{msg.body.chomp}\n" + end + + puts (msg) + end +end + +loop do + line = Readline::readline('AMQ> ') + if line + Readline::HISTORY.push(line) if line != "" + else + exit + end + + if (line =~ /^(\/(topic|queue)\/\S+)\s+(.+)$/) + puts("Sending '#{$3}' to #{$1}") + + if @conn.respond_to?("publish") + @conn.publish($1, $3) + else + @conn.send($1, $3) + end + + elsif (line =~ /^sub\S* (\/(topic|queue)\/\S+)$/) + puts("Subscribing to #{$1}") + + @conn.subscribe($1) + elsif (line =~ /^det(ail)*$/) + if @showdetails + @showdetails = false + puts("No longer showing details") + else + @showdetails = true + puts("Showing time and topic for each msg") + end + elsif (line =~ /^(quit|exit|q)$/) + exit + elsif (line =~ /^(help|h|\?)$/) + showhelp + elsif (line =~ /^$/) + else + puts("ERROR: unrecognised input: #{line}") + end +end