source: asadb/util/mailinglist.py @ ac9b167

space-accessstablestage
Last change on this file since ac9b167 was ac9b167, checked in by Alex Dehnert <adehnert@…>, 13 years ago

Update finboard-groups-only (ASA-#121)

Note that this doesn't bother to kinit, so it depends on KRB5CCNAME being set
already. Fixing that will come next.

  • Property mode set to 100644
File size: 3.9 KB
Line 
1import subprocess
2
3
4class MailingList(object):
5    def __init__(self, name, ):
6        self.name = name
7
8    def list_members(self, ):
9        raise NotImplementedError
10
11    def change_members(self, add_members, delete_members, ):
12        raise NotImplementedError
13
14
15BLANCHE_PATH="/usr/bin/blanche"
16class MoiraList(MailingList):
17    def list_members(self, ):
18        raise NotImplementedError
19        res = subprocess.Popen(
20            [BLANCHE_PATH, self.name, ],
21            stdout=subprocess.PIPE,
22            stderr=subprocess.PIPE,
23        )
24        stdout, stderr = res.communicate()
25        if res.returncode:
26            raise RuntimeError("Failed to list members: %s" % (stderr, ))
27        members = stdout.strip().split("\n")
28        return members
29
30    def strip_mit(self, email):
31        if '@' in email:
32            local, domain = email.split('@')
33            if domain.lower() == 'mit.edu':
34                return local
35        return email
36
37    def canonicalize_member(self, member):
38        if type(member) == type(()):
39            name, email = member
40        else:
41            name = None
42            email = member
43        email = self.strip_mit(email)
44        return name, email
45
46    def change_members(self, add_members, delete_members, ):
47        """
48        Add and/or remove members from the list.
49        """
50
51        # Note that it passes all members on the commandline, so it shouldn't be
52        # used for large lists at the moment. OTOH, "large" appears to be
53        # 2M characters, so.
54        # If that becomes an issue, it should probably check the number of
55        # changes, and use -al / -dl with a tempfile as appropriate.
56
57        cmdline = [BLANCHE_PATH, self.name, ]
58
59        for member in add_members:
60            name, email = self.canonicalize_member(member)
61            if name:
62                cmdline.extend(('-at', email, name))
63            else:
64                cmdline.extend(('-a', email))
65
66        for member in delete_members:
67            name, email = self.canonicalize_member(member)
68            cmdline.extend(('-d', email))
69
70        res = subprocess.Popen(
71            cmdline,
72            stdout=subprocess.PIPE,
73            stderr=subprocess.STDOUT,
74        )
75        stdout, stderr = res.communicate()
76        return stdout
77
78
79
80MMBLANCHE_PATH="/mit/consult/bin/mmblanche"
81class MailmanList(MailingList):
82    def list_members(self, ):
83        res = subprocess.Popen(
84            [MMBLANCHE_PATH, self.name, ],
85            stdout=subprocess.PIPE,
86            stderr=subprocess.PIPE,
87        )
88        stdout, stderr = res.communicate()
89        if res.returncode:
90            raise RuntimeError("Failed to list members: %s" % (stderr, ))
91        members = stdout.strip().split("\n")
92        return members
93
94    def change_members(self, add_members, delete_members, ):
95        """
96        Add and/or remove members from the list.
97        """
98
99        # Note that it passes all members on the commandline, so it shouldn't be
100        # used for large lists at the moment. OTOH, "large" appears to be
101        # 2M characters, so.
102        # If that becomes an issue, it should probably check the number of
103        # changes, and use -al / -dl with a tempfile as appropriate.
104
105        cmdline = [MMBLANCHE_PATH, self.name, ]
106        for member in add_members:
107            cmdline.append('-a')
108            if type(member) == type(()):
109                name, email = member
110                name = name.replace('"', "''")
111                member = '"%s" <%s>' % (name, email, )
112            cmdline.append(member)
113        for member in delete_members:
114            cmdline.append('-d')
115            if type(member) == type(()):
116                name, member = member
117            cmdline.append(member)
118        res = subprocess.Popen(
119            cmdline,
120            stdout=subprocess.PIPE,
121            stderr=subprocess.PIPE,
122        )
123        stdout, stderr = res.communicate()
124        assert stderr==""
125        return stdout
Note: See TracBrowser for help on using the repository browser.