blob: bdf48f3358c7b4a53268ec84ddc6eab8fbf91f27 [file] [log] [blame]
#!/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 os
from optparse import OptionParser, OptionGroup
import sys
import locale
import socket
import re
from qpid.messaging import Connection
home = os.environ.get("QPID_TOOLS_HOME", os.path.normpath("/usr/share/qpid-tools"))
sys.path.append(os.path.join(home, "python"))
from qpidtoollibs import BrokerAgent
from qpidtoollibs import Display, Header, Sorter, YN, Commas, TimeLong
class Config:
def __init__(self):
self._host = "localhost"
self._connTimeout = 10
config = Config()
conn_options = {}
def OptionsAndArguments(argv):
""" Set global variables for options, return arguments """
global config
global conn_options
usage = "%prog [options]"
parser = OptionParser(usage=usage)
parser.add_option("-b", "--broker", action="store", type="string", default="localhost", metavar="<url>",
help="URL of the broker to query")
parser.add_option("-t", "--timeout", action="store", type="int", default=10, metavar="<secs>",
help="Maximum time to wait for broker connection (in seconds)")
parser.add_option("--sasl-mechanism", action="store", type="string", metavar="<mech>",
help="SASL mechanism for authentication (e.g. EXTERNAL, ANONYMOUS, PLAIN, CRAM-MD5, DIGEST-MD5, GSSAPI). SASL automatically picks the most secure available mechanism - use this option to override.")
parser.add_option("--ssl-certificate", action="store", type="string", metavar="<cert>", help="Client SSL certificate (PEM Format)")
parser.add_option("--ssl-key", action="store", type="string", metavar="<key>", help="Client SSL private key (PEM Format)")
parser.add_option("--ssl-trustfile", action="store", type="string", metavar="<CA>", help="List of trusted CAs (PEM Format)")
parser.add_option("--ssl-skip-hostname-check", action="store_true",
help="Do not validate hostname in peer certificate")
parser.add_option("--ha-admin", action="store_true", help="Allow connection to a HA backup broker.")
opts, args = parser.parse_args(args=argv)
config._host = opts.broker
config._connTimeout = opts.timeout
if opts.sasl_mechanism:
conn_options['sasl_mechanisms'] = opts.sasl_mechanism
if opts.ssl_certificate:
conn_options['ssl_certfile'] = opts.ssl_certificate
if opts.ssl_key:
conn_options['ssl_key'] = opts.ssl_key
if opts.ssl_trustfile:
conn_options['ssl_trustfile'] = opts.ssl_trustfile
if opts.ssl_skip_hostname_check:
conn_options['ssl_skip_hostname_check'] = True
if opts.ha_admin:
conn_options['client_properties'] = {'qpid.ha-admin' : 1}
return args
class BrokerManager:
def __init__(self):
self.brokerName = None
self.connection = None
self.broker = None
self.cluster = None
def SetBroker(self, brokerUrl):
self.url = brokerUrl
self.connection = Connection.establish(self.url, **conn_options)
self.broker = BrokerAgent(self.connection)
def Disconnect(self):
""" Release any allocated brokers. Ignore any failures as the tool is
shutting down.
"""
try:
connection.close()
except:
pass
def Ping(self, args):
for sequence in range(10):
result = self.broker.echo(sequence, "ECHO BODY")
if result['sequence'] != sequence:
raise Exception("Invalid Sequence")
def main(argv=None):
args = OptionsAndArguments(argv)
bm = BrokerManager()
try:
bm.SetBroker(config._host)
bm.Ping(args)
bm.Disconnect()
return 0
except KeyboardInterrupt:
print
except Exception,e:
print "Failed: %s - %s" % (e.__class__.__name__, e)
bm.Disconnect() # try to deallocate brokers
return 1
if __name__ == "__main__":
sys.exit(main())