7 def lenient_query(*query):
9 results = moira.query(*query)
10 except moira.MoiraException as e:
12 if msg == 'No records in database match query':
19 def expand_closure(lst, owns=True, members=True, member_of=True, recursive=True, ):
22 if recursive: include_type = 'rlist'
24 results = lenient_query('get_ace_use', include_type, lst)
25 for result in results:
26 if result['use_type'] == 'LIST':
27 closure.add(result['use_name'])
30 results = lenient_query('get_members_of_list', lst)
31 for result in results:
32 if result['member_type'] == 'LIST':
33 closure.add(result['member_name'])
36 results = lenient_query('get_lists_of_member', include_type, lst)
37 for result in results:
38 closure.add(result['list_name'])
42 def get_exclusions(lst):
44 results = lenient_query('get_members_of_list', lst)
45 for result in results:
46 if result['member_type'] == 'LIST':
47 exclusions.add(result['member_name'])
50 def compute_closure(lists, exclude):
54 the_queue = Queue.Queue()
60 while not the_queue.empty():
63 print "skipping %s" % (lst, )
67 new_lists = expand_closure(lst, member_of=False, recursive=False, )
68 except moira.MoiraException as e:
70 if msg == 'Insufficient permission to perform requested database access':
72 print >>sys.stderr, "List %s (parent %s) appears to be hidden; ignoring. (Queue length: %d; closure length: %d)" % (lst, parent[lst], the_queue.qsize(), len(closure), )
75 for new_list in new_lists:
76 if new_list in closure:
78 elif new_list in exclude:
79 print "Excluding %s (parent %s)" % (new_list, lst)
81 the_queue.put(new_list)
82 parent[new_list] = lst
83 print "%s (from %s)" % (new_list, lst)
86 if __name__ == '__main__':
88 moira.auth('awdflu') # client name is awdflu --- Alex Dehnert file-lists-updater
89 starter_list = sys.argv[1]
90 exclude_list = sys.argv[2]
91 exclude = get_exclusions(exclude_list)
92 closure = compute_closure([starter_list], exclude)
98 print "Count:", len(closure)