From d61569d2db4380d531eb4771b5369d96edf95a86 Mon Sep 17 00:00:00 2001 From: Alex Dehnert Date: Thu, 10 Oct 2013 01:04:28 -0400 Subject: [PATCH] rblanche: add support for -c (chpobox) --- rblanche.py | 105 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 70 insertions(+), 35 deletions(-) diff --git a/rblanche.py b/rblanche.py index d135dcb..fb31a42 100755 --- a/rblanche.py +++ b/rblanche.py @@ -4,49 +4,83 @@ import sys import moira -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 +class RBlanche(object): + def __init__(self, chpoboxing=False, ): + self.reset_caches() + self.chpoboxing = chpoboxing + + def reset_caches(self, ): + self.cache = {} + self.chpobox = {} + + def expand(self, lst): + if lst in self.cache: return self.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": + self.cache[lst] = [{'member_type': 'ERR', 'member_name':'** Error: no permissions to look up this list **'}] + return self.cache[lst] + else: raise + for member in members: + if member['member_type'] == 'LIST': + member['members'] = self.expand(member['member_name']) + self.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() + def get_and_format_pobox(self, user): + result = moira.query('get_pobox', user)[0] + if result['type'] == 'SMTP': + fmt = '-> %s' + elif result['type'] == 'SPLIT': + fmt = '=> %s' + elif result['type'] in ('EXCHANGE', 'IMAP', 'POP', ''): + fmt = ' (%s)' else: - if member['member_type'] == "USER": - text = member['member_name'] - elif member['member_type'] == "ERR": - text = member['member_name'] + raise ValueError("Unknown pobox type %s" % (result['type'], )) + text = ('%8s ' + fmt) % (result['login'], result['address'], ) + return text + + def format_user(self, user): + text = user + if self.chpoboxing: + if user not in self.chpobox: + self.chpobox[user] = self.get_and_format_pobox(user) + text = self.chpobox[user] + return text + + def print_tree(self, path, lst_tree): + for member in lst_tree: + if 'members' in member: + path.append(member['member_name']) + self.print_tree(path, member['members']) + path.pop() else: - text = "%s:%s" % (member['member_type'], member['member_name'], ) - print ": ".join(path+[text]) + if member['member_type'] == "USER": + text = self.format_user(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) + def rblanche(self, lst): + result = self.expand(lst) + self.print_tree([lst], result) def parse_args(): - parser = optparse.OptionParser(usage='usage: %prog [--auth=yes|no|try] list') - parser.add_option('--auth', dest='auth', default=None, ) + parser = optparse.OptionParser(usage='usage: %prog [--auth=yes|no|try] [-cd] list') + parser.add_option('--auth', dest='auth', default=None, + help='authenticate to the moira server? (yes, no, or try)' + ) + parser.add_option('-c', '--chpobox', + dest='chpoboxing', action='store_true', default=False, + help='check mail forwarding for each user', + ) options, args = parser.parse_args() if len(args) != 1: @@ -71,4 +105,5 @@ if __name__ == '__main__': moira.auth('rblnchpy') except moira.MoiraException: print >>sys.stderr, "Warning: Failed to authenticate to moira" - rblanche(args[0]) + rblanche = RBlanche(chpoboxing=options.chpoboxing) + rblanche.rblanche(args[0]) -- 2.34.1