Add python implementation of consult's rblanche
[user/alex/software/my-snippets.git] / rblanche.py
1 #!/usr/bin/python
2 import moira
3 import sys
4
5 cache = {}
6
7 def get_members_of_list(lst):
8     return moira.query('get_members_of_list', lst)
9
10 def expand(lst):
11     if lst in cache: return cache[lst]
12     try:
13         members = get_members_of_list(lst)
14     except moira.MoiraException, e:
15         code, message = e
16         if message == "Insufficient permission to perform requested database access":
17             cache[lst] = [{'member_type': 'ERR', 'member_name':'** Error: no permissions to look up this list **'}]
18             return cache[lst]
19         else: raise
20     for member in members:
21         if member['member_type'] == 'LIST':
22             member['members'] = expand(member['member_name'])
23     cache[lst] = members
24     return members
25
26 def print_tree(path, lst_tree):
27     for member in lst_tree:
28         if 'members' in member:
29             path.append(member['member_name'])
30             print_tree(path, member['members'])
31             path.pop()
32         else:
33             if member['member_type'] == "USER":
34                 text = member['member_name']
35             elif member['member_type'] == "ERR":
36                 text = member['member_name']
37             else:
38                 text = "%s:%s" % (member['member_type'], member['member_name'], )
39             print ":  ".join(path+[text])
40
41 def rblanche(lst):
42     result = expand(lst)
43     print_tree([lst], result)
44
45 if __name__ == '__main__':
46     moira.connect()
47     rblanche(sys.argv[1])