From: Alex Dehnert Date: Wed, 9 Oct 2013 15:03:35 +0000 (-0400) Subject: Add python implementation of consult's rblanche X-Git-Url: https://www.dehnerts.com/gitweb/?p=user%2Falex%2Fsoftware%2Fmy-snippets.git;a=commitdiff_plain;h=6bef88b88bbe5724217c41c0db50977dc957b2fd 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 --- 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])