rblanche: add support for -c (chpobox)
authorAlex Dehnert <adehnert@mit.edu>
Thu, 10 Oct 2013 05:04:28 +0000 (01:04 -0400)
committerAlex Dehnert <adehnert@mit.edu>
Thu, 10 Oct 2013 05:04:28 +0000 (01:04 -0400)
rblanche.py

index d135dcb858d4a729ed35f770c5a15931d7a0b274..fb31a4272ed2bd1ca028f43d5edd33e654ac11a4 100755 (executable)
@@ -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])