diff options
Diffstat (limited to 'qpid/cpp/src/tests/qpid-ctrl')
-rwxr-xr-x | qpid/cpp/src/tests/qpid-ctrl | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/qpid/cpp/src/tests/qpid-ctrl b/qpid/cpp/src/tests/qpid-ctrl new file mode 100755 index 0000000000..4246c57898 --- /dev/null +++ b/qpid/cpp/src/tests/qpid-ctrl @@ -0,0 +1,120 @@ +#!/usr/bin/env python +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +import optparse +from qpid.messaging import * +from qpid.util import URL +from qpid.log import enable, DEBUG, WARN + +def nameval(st): + idx = st.find("=") + if idx >= 0: + name = st[0:idx] + value = st[idx+1:] + else: + name = st + value = None + return name, value + +def list_map_entries(m): + r = "" + for t in m: + r += "%s=%s " % (t, m[t]) + return r + +def get_qmfv2_result(m): + if m.properties['x-amqp-0-10.app-id'] == 'qmf2': + if m.properties['qmf.opcode'] == '_method_response': + return m.content['_arguments'] + elif m.properties['qmf.opcode'] == '_exception': + raise Exception("Error: %s" % list_map_entries(m.content['_values'])) + else: raise Exception("Invalid response received, unexpected opcode: %s" % m) + else: raise Exception("Invalid response received, not a qmfv2 method: %s" % m) + + +parser = optparse.OptionParser(usage="usage: %prog [options] COMMAND ...", + description="Invoke the specified command.") +parser.add_option("-b", "--broker", default="localhost", + help="connect to specified BROKER (default %default)") +parser.add_option("-c", "--class", dest="qmfclass", default="broker", + help="class of object on which command is being invoked (default %default)") +parser.add_option("-p", "--package", default="org.apache.qpid.broker", + help="package of object on which command is being invoked (default %default)") +parser.add_option("-i", "--id", default="amqp-broker", + help="identifier of object on which command is being invoked (default %default)") +parser.add_option("-a", "--address", default="qmf.default.direct/broker", + help="address to send commands to (default %default)") +parser.add_option("-t", "--timeout", type="float", default=5, + help="timeout in seconds to wait for response before exiting (default %default)") +parser.add_option("-v", dest="verbose", action="store_true", + help="enable logging") + +opts, args = parser.parse_args() + +if opts.verbose: + enable("qpid", DEBUG) +else: + enable("qpid", WARN) + +if args: + command = args.pop(0) +else: + parser.error("command is required") + + +conn = Connection(opts.broker) +try: + conn.open() + ssn = conn.session() + snd = ssn.sender(opts.address) + reply_to = "qmf.default.direct/%s; {node: {type: topic}}" % str(uuid4()) + rcv = ssn.receiver(reply_to) + + object_name = "%s:%s:%s" % (opts.package, opts.qmfclass, opts.id) + method_name = command + arguments = {} + for a in args: + name, val = nameval(a) + if val[0] == '{' or val[0] == '[': + arguments[name] = eval(val) + else: + arguments[name] = val + content = { + "_object_id": {"_object_name": object_name}, + "_method_name": method_name, + "_arguments": arguments + } + msg = Message(reply_to=reply_to, content=content) + msg.properties["x-amqp-0-10.app-id"] = "qmf2" + msg.properties["qmf.opcode"] = "_method_request" + snd.send(msg) + + try: + print list_map_entries(get_qmfv2_result(rcv.fetch(timeout=opts.timeout))) + except Empty: + print "No response received!" + except Exception, e: + print e +except ReceiverError, e: + print e +except KeyboardInterrupt: + pass + +conn.close() |