]> gitweb.pimeys.fr Git - scripts-20-100.git/blob - mailman_bad_guys.py
Pratique pour brûler les gens suite aux rapppels de mdp de Mailman
[scripts-20-100.git] / mailman_bad_guys.py
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3
4 """Pour trouver dans quelle(s) ML(s) est quelqu'un et l'en virer.
5
6 À exécuter sur redisdead.
7 """
8
9 from __future__ import print_function
10
11 import socket
12 if socket.gethostname() != "redisdead":
13 print("Not on redisdead, might not work")
14
15 import sys
16
17 sys.path.append("/var/lib/mailman/bin")
18
19 import paths
20 #from Mailman import mm_cfg
21 from Mailman import MailList
22 from Mailman import Utils
23
24 def list_lists():
25 """Donne la liste des MLs"""
26 return [unicode(n) for n in Utils.list_names()]
27
28 def list_members(ml):
29 """Donne la liste des membres de ``ml``.
30 Deals with fucking unicode problems."""
31 ml = MailList.MailList(ml, lock=False)
32 rmembers = ml.getRegularMemberKeys()
33 dmembers = ml.getDigestMemberKeys()
34 l = rmembers + dmembers
35 l = [s if isinstance(s, unicode) else s.decode("utf-8") for s in l]
36 return l
37
38 def get_all():
39 """Retourne un dico nom_de_ml -> membres"""
40 return {n: list_members(n) for n in list_lists()}
41
42 def get_mls_from_mail(mail, all=None):
43 """Retourne la liste des mls auxquelles est abonné ``mail``.
44 Calcule le dico ``all`` si on ne lui donne pas."""
45 if all == None:
46 all = get_all()
47 return [n for (n, members) in all.iteritems() if mail in members]
48
49 def exterminate(mail, ml):
50 """Désabonne ``mail`` de ``ml``.
51 Pas de notification à mail, mais à l'admin."""
52 l = MailList.MailList(ml.encode(), lock=True)
53 l.DeleteMember(mail.encode(), admin_notif="prout", userack=False)
54 l.Save()
55 l.Unlock()
56
57 if __name__ == "__main__":
58 bad_guy = sys.argv[1].decode("utf-8").lower()
59 mls = get_mls_from_mail(bad_guy)
60 mls.sort()
61 if mls:
62 print("Exterminating %s from %s" % (bad_guy, ", ".join(mls)))
63 answer = raw_input("[y/n] ?")
64 if answer.lower() == "y":
65 for n in mls:
66 exterminate(bad_guy, n)
67 else:
68 print("No mailing list found")