]> gitweb.pimeys.fr Git - scripts-20-100.git/blobdiff - mailman_bad_guys.py
[update_myconfig] Refresh de la liste
[scripts-20-100.git] / mailman_bad_guys.py
index eba0821a2a0ce3e83f16608d79d39c74907025a7..71d9ea84f1ca2e75682c0394b45c1a969b5c58e5 100755 (executable)
@@ -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)