]> gitweb.pimeys.fr Git - scripts-20-100.git/blob - mailman_search_and_destroy.py
typo
[scripts-20-100.git] / mailman_search_and_destroy.py
1 #!/usr/bin/env python
2 # -*- encoding: utf-8 -*-
3
4 ## TODO : Les alias (matcher Original-recipient ET Final-recipient ?)
5
6 """ Pour récupérer les adresses mails des badguys à virer des MLs
7 (On considère que les mails sont non lus)
8 On appelle ensuite mailman_bad_guys dessus """
9
10 import os
11 import re
12
13 #import mailman_bad_guys
14
15 #: Regexp permettant de vérifier que ce fichier est bien un mail d'erreur
16 delivery_pattern = ur'Content-Type: multipart/report; report-type=delivery-status;'
17 delivery_regex = re.compile(delivery_pattern)
18
19 #: Regexp qui matche très exactement une adresse mail
20 #: (oui, bon, c'est pas très RFC-compliant)
21 justmail_pattern = ur"[^\s\n]+@[^\s\n]+"
22
23 #: Regexp permettant de trouver la ligne contenant le mail invalide et un peu de contexte
24 find_context_pattern = ur"(?P<context>Final-Recipient: rfc822; ?(?P<mail>%s)(?:.*\n){5})" % (justmail_pattern,)
25 find_context_regex = re.compile(find_context_pattern)
26
27 #: Dossier contenant les mails d'erreur de mailman
28 mailman_problems_dir = os.path.expanduser(u"~/Mail/.Cr@ns.Problems.4-Human-made.Mailman/cur/")
29
30 def list_files(where=mailman_problems_dir):
31 """Récupère la liste des noms de fichiers contenant a priori des échecs mailman."""
32 files = [mailman_problems_dir + f for f in os.listdir(mailman_problems_dir) if f.endswith(":2,a")]
33 return files
34
35 def get_context_and_mail(text):
36 """Récupère l'adresse mail qui a causé un échec et quelques lignes de contexte."""
37 results = [m.groupdict() for m in find_context_regex.finditer(text)]
38 return results
39
40 def files_to_mails(files):
41 """Trouve tous les mails des bad guys."""
42 bad_guys = []
43 for mailfile in files:
44 mail = open(mailfile).read().decode("utf-8")
45 # On regarde si il s'agit bien d'un échec
46 isdelivery = len(delivery_regex.findall(mail)) > 0
47 if isdelivery:
48 results = get_context_and_mail(mail)
49 if results:
50 if len(results) > 1:
51 print "hmm, strange, plusieurs matchs :"
52 print results
53 result = results[0]
54 bad_guys.append(result)
55 else:
56 ans = raw_input("Headers not found. Show mail ? ")
57 if not ans in "nN":
58 print mail
59 return bad_guys
60
61 def serial_exterminate(bad_guys):
62 """Extermine tout le monde, en demandant confirmation."""
63 import mailman_bad_guys
64 infos = mailman_bad_guys.get_all()
65 for bad_guy in bad_guys:
66 print bad_guy["context"]
67 mailman_bad_guys.exterminate_this_guy(bad_guy["mail"], infos)
68 print "\n\n\n"
69
70 def do_all():
71 """Fait le boulot."""
72 files = list_files()
73 bad_guys = files_to_mails(files)
74 serial_exterminate(bad_guys)
75
76 if __name__ == "__main__":
77 do_all()