summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2012-02-23 18:26:25 +0000
committerTed Ross <tross@apache.org>2012-02-23 18:26:25 +0000
commit9b7a339fad8ae24256c959eabd8bacfe862ba4b3 (patch)
tree79ce80ef7828df190517c816f729c399ee94b2c9
parent79c70c772bd35bb24bc64d98eb8cc1b42577e1d1 (diff)
downloadqpid-python-9b7a339fad8ae24256c959eabd8bacfe862ba4b3.tar.gz
QPID-2894 - Added ACL stats to qpid-stat and a reload-file action to qpid-config.
Ported the ACL tests to use the faster API. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1292880 13f79535-47bb-0310-9956-ffa450edef68
-rwxr-xr-xqpid/cpp/src/tests/acl.py62
-rwxr-xr-xqpid/tools/src/py/qpid-config14
-rwxr-xr-xqpid/tools/src/py/qpid-stat65
-rw-r--r--qpid/tools/src/py/qpidtoollibs/broker.py12
-rw-r--r--qpid/tools/src/py/qpidtoollibs/disp.py46
5 files changed, 127 insertions, 72 deletions
diff --git a/qpid/cpp/src/tests/acl.py b/qpid/cpp/src/tests/acl.py
index 65d5242e51..16261795ff 100755
--- a/qpid/cpp/src/tests/acl.py
+++ b/qpid/cpp/src/tests/acl.py
@@ -48,8 +48,12 @@ class ACLTests(TestBase010):
return connection.session(str(uuid4()))
def reload_acl(self):
- acl = self.qmf.getObjects(_class="acl")[0]
- return acl.reloadACLFile()
+ result = None
+ try:
+ self.broker_access.reloadAclFile()
+ except Exception, e:
+ result = str(e)
+ return result
def get_acl_file(self):
return ACLFile(self.config.defines.get("policy-file", "data_dir/policy.acl"))
@@ -59,7 +63,7 @@ class ACLTests(TestBase010):
aclf.write('acl allow all all\n')
aclf.close()
TestBase010.setUp(self)
- self.startQmf()
+ self.startBrokerAccess()
self.reload_acl()
def tearDown(self):
@@ -84,7 +88,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
+ if (result):
self.fail(result)
session = self.get_session('bob','bob')
@@ -111,7 +115,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
+ if (result):
self.fail(result)
session = self.get_session('bob','bob')
@@ -144,7 +148,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("Insufficient tokens for acl definition",0,len(result.text)) == -1):
+ if (result.find("Insufficient tokens for acl definition",0,len(result)) == -1):
self.fail("ACL Reader should reject the acl file due to empty group name")
def test_illegal_acl_formats(self):
@@ -157,7 +161,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("Unknown ACL permission",0,len(result.text)) == -1):
+ if (result.find("Unknown ACL permission",0,len(result)) == -1):
self.fail(result)
def test_illegal_extension_lines(self):
@@ -173,13 +177,13 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("contains an illegal extension",0,len(result.text)) == -1):
+ if (result.find("contains an illegal extension",0,len(result)) == -1):
self.fail(result)
- if (result.text.find("Non-continuation line must start with \"group\" or \"acl\"",0,len(result.text)) == -1):
+ if (result.find("Non-continuation line must start with \"group\" or \"acl\"",0,len(result)) == -1):
self.fail(result)
- def test_llegal_extension_lines(self):
+ def test_illegal_extension_lines(self):
"""
Test proper extention lines
"""
@@ -192,7 +196,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("ACL format error",0,len(result.text)) != -1):
+ if (result):
self.fail(result)
def test_user_realm(self):
@@ -207,7 +211,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("Username 'bob' must contain a realm",0,len(result.text)) == -1):
+ if (result.find("Username 'bob' must contain a realm",0,len(result)) == -1):
self.fail(result)
def test_allowed_chars_for_username(self):
@@ -223,7 +227,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("ACL format error",0,len(result.text)) != -1):
+ if (result):
self.fail(result)
aclf = self.get_acl_file()
@@ -232,7 +236,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("Username \"joe$H@EXAMPLE.com\" contains illegal characters",0,len(result.text)) == -1):
+ if (result.find("Username \"joe$H@EXAMPLE.com\" contains illegal characters",0,len(result)) == -1):
self.fail(result)
#=====================================
@@ -252,7 +256,7 @@ class ACLTests(TestBase010):
result = self.reload_acl()
expected = "ding is not a valid value for 'policytype', possible values are one of" \
" { 'ring' 'ring_strict' 'flow_to_disk' 'reject' }";
- if (result.text != expected):
+ if (result.find(expected) == -1):
self.fail(result)
def test_illegal_queue_size(self):
@@ -268,7 +272,7 @@ class ACLTests(TestBase010):
result = self.reload_acl()
expected = "-1 is not a valid value for 'maxqueuesize', " \
"values should be between 0 and 9223372036854775807";
- if (result.text != expected):
+ if (result.find(expected) == -1):
self.fail(result)
aclf = self.get_acl_file()
@@ -279,7 +283,7 @@ class ACLTests(TestBase010):
result = self.reload_acl()
expected = "9223372036854775808 is not a valid value for 'maxqueuesize', " \
"values should be between 0 and 9223372036854775807";
- if (result.text != expected):
+ if (result.find(expected) == -1):
self.fail(result)
@@ -296,7 +300,7 @@ class ACLTests(TestBase010):
result = self.reload_acl()
expected = "-1 is not a valid value for 'maxqueuecount', " \
"values should be between 0 and 9223372036854775807";
- if (result.text != expected):
+ if (result.find(expected) == -1):
self.fail(result)
aclf = self.get_acl_file()
@@ -307,7 +311,7 @@ class ACLTests(TestBase010):
result = self.reload_acl()
expected = "9223372036854775808 is not a valid value for 'maxqueuecount', " \
"values should be between 0 and 9223372036854775807";
- if (result.text != expected):
+ if (result.find(expected) == -1):
self.fail(result)
@@ -330,7 +334,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
+ if (result):
self.fail(result)
session = self.get_session('bob','bob')
@@ -436,7 +440,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
+ if (result):
self.fail(result)
session = self.get_session('bob','bob')
@@ -556,7 +560,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
+ if (result):
self.fail(result)
session = self.get_session('bob','bob')
@@ -687,7 +691,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
+ if (result):
self.fail(result)
session = self.get_session('bob','bob')
@@ -805,7 +809,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
+ if (result):
self.fail(result)
bob = BrokerAdmin(self.config.broker, "bob", "bob")
@@ -844,7 +848,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
+ if (result):
self.fail(result)
session = self.get_session('bob','bob')
@@ -892,7 +896,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
+ if (result):
self.fail(result)
session = self.get_session('bob','bob')
@@ -937,7 +941,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
+ if (result):
self.fail(result)
session = self.get_session('bob','bob')
@@ -988,7 +992,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
+ if (result):
self.fail(result)
session = self.get_session('bob','bob')
@@ -1056,7 +1060,7 @@ class ACLTests(TestBase010):
aclf.close()
result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
+ if (result):
self.fail(result)
ts = None
diff --git a/qpid/tools/src/py/qpid-config b/qpid/tools/src/py/qpid-config
index 9433029590..60fc53ce4b 100755
--- a/qpid/tools/src/py/qpid-config
+++ b/qpid/tools/src/py/qpid-config
@@ -42,7 +42,8 @@ Usage: qpid-config [OPTIONS]
qpid-config [OPTIONS] bind <exchange-name> <queue-name> [binding-key]
<for type xml> [-f -|filename]
<for type header> [all|any] k1=v1 [, k2=v2...]
- qpid-config [OPTIONS] unbind <exchange-name> <queue-name> [binding-key]"""
+ qpid-config [OPTIONS] unbind <exchange-name> <queue-name> [binding-key]
+ qpid-config [OPTIONS] reload-acl"""
description = """
Examples:
@@ -624,6 +625,15 @@ class BrokerManager:
key = args[2]
self.broker.unbind(ename, qname, key)
+ def ReloadAcl(self):
+ try:
+ self.broker.reloadAclFile()
+ except Exception, e:
+ if str(e).find('No object found') != -1:
+ print "Failed: ACL Module Not Loaded in Broker"
+ else:
+ raise
+
def findById(self, items, id):
for item in items:
if item.name == id:
@@ -684,6 +694,8 @@ def main(argv=None):
bm.Bind(args[1:])
elif cmd == "unbind":
bm.Unbind(args[1:])
+ elif cmd == "reload-acl":
+ bm.ReloadAcl()
else:
Usage()
except KeyboardInterrupt:
diff --git a/qpid/tools/src/py/qpid-stat b/qpid/tools/src/py/qpid-stat
index c9c4da2aeb..cfe88c5eb3 100755
--- a/qpid/tools/src/py/qpid-stat
+++ b/qpid/tools/src/py/qpid-stat
@@ -31,7 +31,7 @@ home = os.environ.get("QPID_TOOLS_HOME", os.path.normpath("/usr/share/qpid-tools
sys.path.append(os.path.join(home, "python"))
from qpidtoollibs.broker import BrokerAgent
-from qpidtoollibs.disp import Display, Header, Sorter
+from qpidtoollibs.disp import Display, Header, Sorter, YN, Commas, TimeLong
class Config:
@@ -63,12 +63,13 @@ def OptionsAndArguments(argv):
parser.add_option_group(group1)
group2 = OptionGroup(parser, "Display Options")
- group2.add_option("-g", "--general", help="Show General Broker Stats", action="store_const", const="g", dest="show")
- group2.add_option("-c", "--connections", help="Show Connections", action="store_const", const="c", dest="show")
- group2.add_option("-e", "--exchanges", help="Show Exchanges", action="store_const", const="e", dest="show")
- group2.add_option("-q", "--queues", help="Show Queues", action="store_const", const="q", dest="show")
- group2.add_option("-u", "--subscriptions", help="Show Subscriptions", action="store_const", const="u", dest="show")
- group2.add_option("-m", "--memory", help="Show Broker Memory Stats", action="store_const", const="m", dest="show")
+ group2.add_option("-g", "--general", help="Show General Broker Stats", action="store_const", const="g", dest="show")
+ group2.add_option("-c", "--connections", help="Show Connections", action="store_const", const="c", dest="show")
+ group2.add_option("-e", "--exchanges", help="Show Exchanges", action="store_const", const="e", dest="show")
+ group2.add_option("-q", "--queues", help="Show Queues", action="store_const", const="q", dest="show")
+ group2.add_option("-u", "--subscriptions", help="Show Subscriptions", action="store_const", const="u", dest="show")
+ group2.add_option("-m", "--memory", help="Show Broker Memory Stats", action="store_const", const="m", dest="show")
+ group2.add_option( "--acl", help="Show Access Control List Stats", action="store_const", const="acl", dest="show")
group2.add_option("-S", "--sort-by", metavar="<colname>", help="Sort by column name")
group2.add_option("-I", "--increasing", action="store_true", default=False, help="Sort by increasing value (default = decreasing)")
group2.add_option("-L", "--limit", type="int", default=50, metavar="<n>", help="Limit output to n rows")
@@ -173,7 +174,7 @@ class BrokerManager:
hosts.append(bestUrl)
return hosts
- def displayBroker(self, subs):
+ def displayBroker(self):
disp = Display(prefix=" ")
heads = []
heads.append(Header('uptime', Header.DURATION))
@@ -227,7 +228,7 @@ class BrokerManager:
disp.formattedTable('Aggregate Broker Statistics:', heads, rows)
- def displayConn(self, subs):
+ def displayConn(self):
disp = Display(prefix=" ")
heads = []
heads.append(Header('client-addr'))
@@ -260,10 +261,10 @@ class BrokerManager:
dispRows = rows
disp.formattedTable(title, heads, dispRows)
- def displaySession(self, subs):
+ def displaySession(self):
disp = Display(prefix=" ")
- def displayExchange(self, subs):
+ def displayExchange(self):
disp = Display(prefix=" ")
heads = []
heads.append(Header("exchange"))
@@ -299,7 +300,7 @@ class BrokerManager:
dispRows = rows
disp.formattedTable(title, heads, dispRows)
- def displayQueues(self, subs):
+ def displayQueues(self):
disp = Display(prefix=" ")
heads = []
heads.append(Header("queue"))
@@ -340,7 +341,7 @@ class BrokerManager:
disp.formattedTable(title, heads, dispRows)
- def displayQueue(self, subs, name):
+ def displayQueue(self, name):
queue = self.broker.getQueue(name)
if not queue:
print "Queue '%s' not found" % name
@@ -399,7 +400,7 @@ class BrokerManager:
disp.formattedTable("Statistics:", heads, rows)
- def displaySubscriptions(self, subs):
+ def displaySubscriptions(self):
disp = Display(prefix=" ")
heads = []
heads.append(Header("subscr"))
@@ -452,6 +453,21 @@ class BrokerManager:
rows.append([k, v])
disp.formattedTable('Broker Memory Statistics:', heads, rows)
+ def displayAcl(self):
+ acl = self.broker.getAcl()
+ if not acl:
+ print "ACL Policy Module is not installed"
+ return
+ disp = Display(prefix=" ")
+ heads = [Header('Statistic'), Header('Value')]
+ rows = []
+ rows.append(['policy-file', acl.policyFile])
+ rows.append(['enforcing', YN(acl.enforcingAcl)])
+ rows.append(['has-transfer-acls', YN(acl.transferAcl)])
+ rows.append(['last-acl-load', TimeLong(acl.lastAclLoad)])
+ rows.append(['acl-denials', Commas(acl.aclDenyCount)])
+ disp.formattedTable('ACL Policy Statistics:', heads, rows)
+
def getExchangeMap(self):
exchanges = self.broker.getAllExchanges()
emap = {}
@@ -480,21 +496,22 @@ class BrokerManager:
cmap[c.address] = c
return cmap
- def displayMain(self, names, main, subs):
- if main == 'g': self.displayBroker(subs)
- elif main == 'c': self.displayConn(subs)
- elif main == 's': self.displaySession(subs)
- elif main == 'e': self.displayExchange(subs)
+ def displayMain(self, names, main):
+ if main == 'g': self.displayBroker()
+ elif main == 'c': self.displayConn()
+ elif main == 's': self.displaySession()
+ elif main == 'e': self.displayExchange()
elif main == 'q':
if len(names) >= 1:
- self.displayQueue(subs, names[0])
+ self.displayQueue(names[0])
else:
- self.displayQueues(subs)
- elif main == 'u': self.displaySubscriptions(subs)
- elif main == 'm': self.displayMemory(subs)
+ self.displayQueues()
+ elif main == 'u': self.displaySubscriptions()
+ elif main == 'm': self.displayMemory()
+ elif main == 'acl': self.displayAcl()
def display(self, names):
- self.displayMain(names, config._types[0], config._types[1:])
+ self.displayMain(names, config._types)
def main(argv=None):
diff --git a/qpid/tools/src/py/qpidtoollibs/broker.py b/qpid/tools/src/py/qpidtoollibs/broker.py
index b3616f0b3a..0714dd5d61 100644
--- a/qpid/tools/src/py/qpidtoollibs/broker.py
+++ b/qpid/tools/src/py/qpidtoollibs/broker.py
@@ -188,6 +188,12 @@ class BrokerAgent(object):
def getAllLinks(self):
return self._getAllBrokerObjects(Link)
+ def getAcl(self):
+ objects = self._getAllBrokerObjects(Acl)
+ if len(objects) > 0:
+ return objects[0]
+ return None # Acl module not loaded
+
def echo(self, sequence, body):
"""Request a response to test the path to the management broker"""
pass
@@ -263,6 +269,9 @@ class BrokerAgent(object):
'strict': True}
self._method('delete', args)
+ def reloadAclFile(self):
+ self._method('reloadACLFile', {}, "org.apache.qpid.acl:acl:org.apache.qpid.broker:broker:amqp-broker")
+
def create(self, _type, name, properties, strict):
"""Create an object of the specified type"""
pass
@@ -373,3 +382,6 @@ class Link(BrokerObject):
def __init__(self, broker, values):
BrokerObject.__init__(self, broker, values)
+class Acl(BrokerObject):
+ def __init__(self, broker, values):
+ BrokerObject.__init__(self, broker, values)
diff --git a/qpid/tools/src/py/qpidtoollibs/disp.py b/qpid/tools/src/py/qpidtoollibs/disp.py
index 7962a13329..a0c77370a5 100644
--- a/qpid/tools/src/py/qpidtoollibs/disp.py
+++ b/qpid/tools/src/py/qpidtoollibs/disp.py
@@ -21,6 +21,31 @@
from time import strftime, gmtime
+def YN(val):
+ if val:
+ return 'Y'
+ return 'N'
+
+def Commas(value):
+ sval = str(value)
+ result = ""
+ while True:
+ if len(sval) == 0:
+ return result
+ left = sval[:-3]
+ right = sval[-3:]
+ result = right + result
+ if len(left) > 0:
+ result = ',' + result
+ sval = left
+
+def TimeLong(value):
+ return strftime("%c", gmtime(value / 1000000000))
+
+def TimeShort(value):
+ return strftime("%X", gmtime(value / 1000000000))
+
+
class Header:
""" """
NONE = 1
@@ -59,9 +84,9 @@ class Header:
return 'Y'
return ''
if self.format == Header.TIME_LONG:
- return strftime("%c", gmtime(value / 1000000000))
+ return TimeLong(value)
if self.format == Header.TIME_SHORT:
- return strftime("%X", gmtime(value / 1000000000))
+ return TimeShort(value)
if self.format == Header.DURATION:
if value < 0: value = 0
sec = value / 1000000000
@@ -78,17 +103,7 @@ class Header:
result += "%ds" % (sec % 60)
return result
if self.format == Header.COMMAS:
- sval = str(value)
- result = ""
- while True:
- if len(sval) == 0:
- return result
- left = sval[:-3]
- right = sval[-3:]
- result = right + result
- if len(left) > 0:
- result = ',' + result
- sval = left
+ return Commas(value)
except:
return "?"
@@ -206,11 +221,6 @@ class Display:
result += "%ds" % (sec % 60)
return result
- def YN(self, val):
- if val:
- return 'Y'
- return 'N'
-
class Sortable:
""" """
def __init__(self, row, sortIndex):