]> gitweb.pimeys.fr Git - scripts-20-100.git/blob - mailman_bad_guys.py
dos2unix à installer always
[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 re
17 import sys
18
19 sys.path.append("/var/lib/mailman/bin")
20
21 import paths
22 #from Mailman import mm_cfg
23 from Mailman import MailList
24 from Mailman import Utils
25
26 def list_lists():
27 """Donne la liste des MLs"""
28 return [unicode(n) for n in Utils.list_names()]
29
30 def list_members(ml):
31 """Donne [la liste des membres de ``ml``, la liste de ses admins, la liste de ses modérateurs].
32 Deals with fucking unicode problems."""
33 ml = MailList.MailList(ml, lock=False)
34 rmembers = ml.getRegularMemberKeys()
35 dmembers = ml.getDigestMemberKeys()
36 members = rmembers + dmembers
37 members = [s if isinstance(s, unicode) else s.decode("utf-8") for s in members]
38 admins = [i for i in ml.owner]
39 moderators = [i for i in ml.moderator]
40 return [members, admins, moderators]
41
42 def get_all(dico=None):
43 """Retourne un dico nom_de_ml -> [membres, admins, moderateurs]"""
44 if dico:
45 return dico
46 return {n: list_members(n) for n in list_lists()}
47
48 def get_field_from_mail(mail, fieldno, all=None):
49 """Retourne la liste des mls dont mail est :
50 * membre si ``fieldno`` = 0
51 * admin si ``fieldno`` = 1
52 * modérateur si ``fieldno`` = 2
53 Calcule le dico ``all`` si on ne lui donne pas."""
54 if all == None:
55 all = get_all()
56 return [n for (n, fields) in all.iteritems() if mail in fields[fieldno]]
57
58 def get_mls_from_mail(mail, all=None):
59 """Retourne la liste des mls auxquelles est abonné ``mail``."""
60 return get_field_from_mail(mail, 0, all)
61
62 def get_admins_from_mail(mail, all=None):
63 """Retourne la liste des mls dont ``mail`` est admin."""
64 return get_field_from_mail(mail, 1, all)
65
66 def get_moderators_from_mail(mail, all=None):
67 """Retourne la liste des mls dont ``mail`` est admin."""
68 return get_field_from_mail(mail, 2, all)
69
70 def exterminate(mail, ml):
71 """Désabonne ``mail`` de ``ml``.
72 Pas de notification à mail, mais à l'admin."""
73 l = MailList.MailList(ml.encode(), lock=True)
74 l.DeleteMember(mail.encode(), admin_notif="prout", userack=False)
75 l.Save()
76 l.Unlock()
77
78 def exterminate_this_guy(bad_guy, dico=None):
79 """Trouve les MLs auxquelles est abonné ``bad_guy`` et l'en supprime en demandant confirmation."""
80 mls = get_mls_from_mail(bad_guy, dico)
81 mls.sort()
82 if mls:
83 print("Exterminating %s from %s" % (bad_guy, ", ".join(mls)))
84 answer = raw_input("[y/n] ?")
85 if answer.lower() == "y":
86 for n in mls:
87 exterminate(bad_guy, n)
88 else:
89 print("No mailing list found")
90
91 def find_modadmin_domain(domain, dico=None):
92 """Retourne un dico ``mail`` -> ``[liste de MLs dont mail est admin, liste de MLs dont mail est modéro]``
93 où mail est un mail dont la partie domaine matche la regexp domain."""
94 all = get_all(dico)
95 # On récupère toutes les adresses d'admins et de modéros dans le même panier
96 suspects = sum([ml[1] + ml[2] for ml in all.values()], [])
97 suspects = list(set(suspects))
98 # On matche
99 regexp = re.compile(".*@%s" % domain)
100 coupables = [mail for mail in suspects if regexp.match(mail)]
101 # On retrouve les MLs correspondantes
102 coupables = {mail : [get_admins_from_mail(mail, all), get_moderators_from_mail(mail, all)] for mail in coupables}
103 return coupables
104
105 if __name__ == "__main__":
106 bad_guy = sys.argv[1].decode("utf-8").lower()
107 exterminate_this_guy(bad_guy)