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