#!/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()