]>
gitweb.pimeys.fr Git - scripts-20-100.git/blob - mailman_bad_guys.py
4 ## TODO : Supprimer aussi les modérateurs/administrateurs
5 """Pour trouver dans quelle(s) ML(s) est quelqu'un et l'en virer.
7 À exécuter sur redisdead.
10 from __future__
import print_function
13 if socket
.gethostname() != "redisdead":
14 print("Not on redisdead, might not work")
19 sys
.path
.append("/var/lib/mailman/bin")
22 #from Mailman import mm_cfg
23 from Mailman
import MailList
24 from Mailman
import Utils
27 """Donne la liste des MLs"""
28 return [unicode(n
) for n
in Utils
.list_names()]
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
]
42 def get_all(dico
=None):
43 """Retourne un dico nom_de_ml -> [membres, admins, moderateurs]"""
46 return {n
: list_members(n
) for n
in list_lists()}
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."""
56 return [n
for (n
, fields
) in all
.iteritems() if mail
in fields
[fieldno
]]
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
)
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
)
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
)
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)
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
)
83 print("Exterminating %s from %s" % (bad_guy
, ", ".join(mls
)))
84 answer
= raw_input("[y/n] ?")
85 if answer
.lower() == "y":
87 exterminate(bad_guy
, n
)
89 print("No mailing list found")
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."""
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
))
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
}
105 if __name__
== "__main__":
106 bad_guy
= sys
.argv
[1].decode("utf-8").lower()
107 exterminate_this_guy(bad_guy
)