From 6bef88b88bbe5724217c41c0db50977dc957b2fd Mon Sep 17 00:00:00 2001 From: Alex Dehnert Date: Wed, 9 Oct 2013 11:03:35 -0400 Subject: [PATCH] Add python implementation of consult's rblanche 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 | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100755 rblanche.py diff --git a/rblanche.py b/rblanche.py new file mode 100755 index 0000000..10b0705 --- /dev/null +++ b/rblanche.py @@ -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]) -- 2.34.1