]>
gitweb.pimeys.fr Git - scripts-20-100.git/blob - mailman_search_and_destroy.py
2 # -*- encoding: utf-8 -*-
4 ## TODO : Les alias (matcher Original-recipient ET Final-recipient ?)
6 """ Pour récupérer les adresses mails des badguys à virer des MLs
7 (On considère que les mails son non lus)
8 On appelle ensuite mailman_bad_guys dessus """
13 #import mailman_bad_guys
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
)
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]+"
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
)
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/")
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")]
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
)]
40 def files_to_mails(files
):
41 """Trouve tous les mails des 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
48 results
= get_context_and_mail(mail
)
51 print "hmm, strange, plusieurs matchs :"
54 bad_guys
.append(result
)
56 ans
= raw_input("Headers not found. Show mail ? ")
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
)
73 bad_guys
= files_to_mails(files
)
74 serial_exterminate(bad_guys
)
76 if __name__
== "__main__":