X-Git-Url: http://gitweb.pimeys.fr/?p=scripts-20-100.git;a=blobdiff_plain;f=mailman_bad_guys.py;h=71d9ea84f1ca2e75682c0394b45c1a969b5c58e5;hp=eba0821a2a0ce3e83f16608d79d39c74907025a7;hb=7e4a560133f4679b54210d674b306f58373d99d9;hpb=1b6abf4f92d98345887f34e9efd78c6150362f84 diff --git a/mailman_bad_guys.py b/mailman_bad_guys.py index eba0821..71d9ea8 100755 --- a/mailman_bad_guys.py +++ b/mailman_bad_guys.py @@ -1,6 +1,7 @@ #!/usr/bin/env python # -*- coding:utf-8 -*- +## TODO : Supprimer aussi les modérateurs/administrateurs """Pour trouver dans quelle(s) ML(s) est quelqu'un et l'en virer. À exécuter sur redisdead. @@ -12,6 +13,7 @@ import socket if socket.gethostname() != "redisdead": print("Not on redisdead, might not work") +import re import sys sys.path.append("/var/lib/mailman/bin") @@ -26,25 +28,44 @@ def list_lists(): return [unicode(n) for n in Utils.list_names()] def list_members(ml): - """Donne la liste des membres de ``ml``. + """Donne [la liste des membres de ``ml``, la liste de ses admins, la liste de ses modérateurs]. Deals with fucking unicode problems.""" ml = MailList.MailList(ml, lock=False) rmembers = ml.getRegularMemberKeys() dmembers = ml.getDigestMemberKeys() - l = rmembers + dmembers - l = [s if isinstance(s, unicode) else s.decode("utf-8") for s in l] - return l + members = rmembers + dmembers + members = [s if isinstance(s, unicode) else s.decode("utf-8") for s in members] + admins = [i for i in ml.owner] + moderators = [i for i in ml.moderator] + return [members, admins, moderators] -def get_all(): - """Retourne un dico nom_de_ml -> membres""" +def get_all(dico=None): + """Retourne un dico nom_de_ml -> [membres, admins, moderateurs]""" + if dico: + return dico return {n: list_members(n) for n in list_lists()} -def get_mls_from_mail(mail, all=None): - """Retourne la liste des mls auxquelles est abonné ``mail``. +def get_field_from_mail(mail, fieldno, all=None): + """Retourne la liste des mls dont mail est : + * membre si ``fieldno`` = 0 + * admin si ``fieldno`` = 1 + * modérateur si ``fieldno`` = 2 Calcule le dico ``all`` si on ne lui donne pas.""" if all == None: all = get_all() - return [n for (n, members) in all.iteritems() if mail in members] + return [n for (n, fields) in all.iteritems() if mail in fields[fieldno]] + +def get_mls_from_mail(mail, all=None): + """Retourne la liste des mls auxquelles est abonné ``mail``.""" + return get_field_from_mail(mail, 0, all) + +def get_admins_from_mail(mail, all=None): + """Retourne la liste des mls dont ``mail`` est admin.""" + return get_field_from_mail(mail, 1, all) + +def get_moderators_from_mail(mail, all=None): + """Retourne la liste des mls dont ``mail`` est admin.""" + return get_field_from_mail(mail, 2, all) def exterminate(mail, ml): """Désabonne ``mail`` de ``ml``. @@ -54,9 +75,9 @@ def exterminate(mail, ml): l.Save() l.Unlock() -if __name__ == "__main__": - bad_guy = sys.argv[1].decode("utf-8").lower() - mls = get_mls_from_mail(bad_guy) +def exterminate_this_guy(bad_guy, dico=None): + """Trouve les MLs auxquelles est abonné ``bad_guy`` et l'en supprime en demandant confirmation.""" + mls = get_mls_from_mail(bad_guy, dico) mls.sort() if mls: print("Exterminating %s from %s" % (bad_guy, ", ".join(mls))) @@ -66,3 +87,21 @@ if __name__ == "__main__": exterminate(bad_guy, n) else: print("No mailing list found") + +def find_modadmin_domain(domain, dico=None): + """Retourne un dico ``mail`` -> ``[liste de MLs dont mail est admin, liste de MLs dont mail est modéro]`` + où mail est un mail dont la partie domaine matche la regexp domain.""" + all = get_all(dico) + # On récupère toutes les adresses d'admins et de modéros dans le même panier + suspects = sum([ml[1] + ml[2] for ml in all.values()], []) + suspects = list(set(suspects)) + # On matche + regexp = re.compile(".*@%s" % domain) + coupables = [mail for mail in suspects if regexp.match(mail)] + # On retrouve les MLs correspondantes + coupables = {mail : [get_admins_from_mail(mail, all), get_moderators_from_mail(mail, all)] for mail in coupables} + return coupables + +if __name__ == "__main__": + bad_guy = sys.argv[1].decode("utf-8").lower() + exterminate_this_guy(bad_guy)