Add python implementation of consult's rblanche
authorAlex Dehnert <adehnert@mit.edu>
Wed, 9 Oct 2013 15:03:35 +0000 (11:03 -0400)
committerAlex Dehnert <adehnert@mit.edu>
Wed, 9 Oct 2013 15:05:17 +0000 (11:05 -0400)
This isn't complete yet, but it includes the key functionality and (for deeply
nested lists) is much faster. It also handles member lists that start with
hyphens.

Missing features include:
- auth support
- most of rblanche's options

rblanche.py [new file with mode: 0755]

diff --git a/rblanche.py b/rblanche.py
new file mode 100755 (executable)
index 0000000..10b0705
--- /dev/null
@@ -0,0 +1,47 @@
+#!/usr/bin/python
+import moira
+import sys
+
+cache = {}
+
+def get_members_of_list(lst):
+    return moira.query('get_members_of_list', lst)
+
+def expand(lst):
+    if lst in cache: return cache[lst]
+    try:
+        members = get_members_of_list(lst)
+    except moira.MoiraException, e:
+        code, message = e
+        if message == "Insufficient permission to perform requested database access":
+            cache[lst] = [{'member_type': 'ERR', 'member_name':'** Error: no permissions to look up this list **'}]
+            return cache[lst]
+        else: raise
+    for member in members:
+        if member['member_type'] == 'LIST':
+            member['members'] = expand(member['member_name'])
+    cache[lst] = members
+    return members
+
+def print_tree(path, lst_tree):
+    for member in lst_tree:
+        if 'members' in member:
+            path.append(member['member_name'])
+            print_tree(path, member['members'])
+            path.pop()
+        else:
+            if member['member_type'] == "USER":
+                text = member['member_name']
+            elif member['member_type'] == "ERR":
+                text = member['member_name']
+            else:
+                text = "%s:%s" % (member['member_type'], member['member_name'], )
+            print ":  ".join(path+[text])
+
+def rblanche(lst):
+    result = expand(lst)
+    print_tree([lst], result)
+
+if __name__ == '__main__':
+    moira.connect()
+    rblanche(sys.argv[1])