if socket.gethostname() != "redisdead":
print("Not on redisdead, might not work")
+import re
import sys
sys.path.append("/var/lib/mailman/bin")
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``.
l.Save()
l.Unlock()
-def exterminate_this_guy(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)
+ mls = get_mls_from_mail(bad_guy, dico)
mls.sort()
if mls:
print("Exterminating %s from %s" % (bad_guy, ", ".join(mls)))
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)