]> gitweb.pimeys.fr Git - scripts-20-100.git/blob - mailman_bad_guys.py
[mailman] le script fait toujours ce qu'il doit faire, mais on peut maintenant obteni...
[scripts-20-100.git] / mailman_bad_guys.py
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3
4 ## TODO : Supprimer aussi les modérateurs/administrateurs
5 """Pour trouver dans quelle(s) ML(s) est quelqu'un et l'en virer.
6
7 À exécuter sur redisdead.
8 """
9
10 from __future__ import print_function
11
12 import socket
13 if socket.gethostname() != "redisdead":
14 print("Not on redisdead, might not work")
15
16 import sys
17
18 sys.path.append("/var/lib/mailman/bin")
19
20 import paths
21 #from Mailman import mm_cfg
22 from Mailman import MailList
23 from Mailman import Utils
24
25 def list_lists():
26 """Donne la liste des MLs"""
27 return [unicode(n) for n in Utils.list_names()]
28
29 def list_members(ml):
30 """Donne [la liste des membres de ``ml``, la liste de ses admins, la liste de ses modérateurs].
31 Deals with fucking unicode problems."""
32 ml = MailList.MailList(ml, lock=False)
33 rmembers = ml.getRegularMemberKeys()
34 dmembers = ml.getDigestMemberKeys()
35 members = rmembers + dmembers
36 members = [s if isinstance(s, unicode) else s.decode("utf-8") for s in members]
37 admins = [i for i in ml.owner]
38 moderators = [i for i in ml.moderator]
39 return [members, admins, moderators]
40
41 def get_all():
42 """Retourne un dico nom_de_ml -> [membres, admins, moderateurs]"""
43 return {n: list_members(n) for n in list_lists()}
44
45 def get_field_from_mail(mail, fieldno, all=None):
46 """Retourne la liste des mls dont mail est :
47 * membre si ``fieldno`` = 1
48 *
49 *
50 Calcule le dico ``all`` si on ne lui donne pas."""
51 if all == None:
52 all = get_all()
53 return [n for (n, fields) in all.iteritems() if mail in fields[fieldno]]
54
55 def get_mls_from_mail(mail, all=None):
56 """Retourne la liste des mls auxquelles est abonné ``mail``."""
57 return get_field_from_mail(mail, 0, all)
58
59 def get_admins_from_mail(mail, all=None):
60 """Retourne la liste des mls dont ``mail`` est admin."""
61 return get_field_from_mail(mail, 1, all)
62
63 def get_moderators_from_mail(mail, all=None):
64 """Retourne la liste des mls dont ``mail`` est admin."""
65 return get_field_from_mail(mail, 2, all)
66
67 def exterminate(mail, ml):
68 """Désabonne ``mail`` de ``ml``.
69 Pas de notification à mail, mais à l'admin."""
70 l = MailList.MailList(ml.encode(), lock=True)
71 l.DeleteMember(mail.encode(), admin_notif="prout", userack=False)
72 l.Save()
73 l.Unlock()
74
75 def exterminate_this_guy(bad_guy, dico=None):
76 """Trouve les MLs auxquelles est abonné ``bad_guy`` et l'en supprime en demandant confirmation."""
77 mls = get_mls_from_mail(bad_guy, dico)
78 mls.sort()
79 if mls:
80 print("Exterminating %s from %s" % (bad_guy, ", ".join(mls)))
81 answer = raw_input("[y/n] ?")
82 if answer.lower() == "y":
83 for n in mls:
84 exterminate(bad_guy, n)
85 else:
86 print("No mailing list found")
87
88 if __name__ == "__main__":
89 bad_guy = sys.argv[1].decode("utf-8").lower()
90 exterminate_this_guy(bad_guy)