rblanche: add optional authentication
[user/alex/software/my-snippets.git] / rblanche.py
1 #!/usr/bin/python
2 import optparse
3 import sys
4
5 import moira
6
7 cache = {}
8
9 def get_members_of_list(lst):
10     return moira.query('get_members_of_list', lst)
11
12 def expand(lst):
13     if lst in cache: return cache[lst]
14     try:
15         members = get_members_of_list(lst)
16     except moira.MoiraException, e:
17         code, message = e
18         if message == "Insufficient permission to perform requested database access":
19             cache[lst] = [{'member_type': 'ERR', 'member_name':'** Error: no permissions to look up this list **'}]
20             return cache[lst]
21         else: raise
22     for member in members:
23         if member['member_type'] == 'LIST':
24             member['members'] = expand(member['member_name'])
25     cache[lst] = members
26     return members
27
28 def print_tree(path, lst_tree):
29     for member in lst_tree:
30         if 'members' in member:
31             path.append(member['member_name'])
32             print_tree(path, member['members'])
33             path.pop()
34         else:
35             if member['member_type'] == "USER":
36                 text = member['member_name']
37             elif member['member_type'] == "ERR":
38                 text = member['member_name']
39             else:
40                 text = "%s:%s" % (member['member_type'], member['member_name'], )
41             print ":  ".join(path+[text])
42
43 def rblanche(lst):
44     result = expand(lst)
45     print_tree([lst], result)
46
47 def parse_args():
48     parser = optparse.OptionParser(usage='usage: %prog [--auth=yes|no|try] list')
49     parser.add_option('--auth', dest='auth', default=None, )
50     options, args = parser.parse_args()
51
52     if len(args) != 1:
53         parser.error("incorrect number of arguments")
54
55     if options.auth:
56         if options.auth == 'yes': options.auth = True
57         elif options.auth == 'try': options.auth = None
58         elif options.auth == 'no': options.auth = False
59         else:
60             parser.error("--auth takes yes, no, and try (default; auth if possible)")
61
62     return options, args
63
64 if __name__ == '__main__':
65     options, args = parse_args()
66     moira.connect()
67     if options.auth:
68         moira.auth('rblnchpy')
69     elif options.auth is None:
70         try:
71             moira.auth('rblnchpy')
72         except moira.MoiraException:
73             print >>sys.stderr, "Warning: Failed to authenticate to moira"
74     rblanche(args[0])