From fd8109bb44f9ff056048aa743a2202becf815e13 Mon Sep 17 00:00:00 2001 From: Lucas Serrano Date: Thu, 14 Mar 2013 15:13:51 +0100 Subject: [PATCH] =?UTF-8?q?[old=5Fml]=20Mise=20=C3=A0=20jour=20du=20script?= =?UTF-8?q?:=20rajout=20de=20fonctions=20pour=20l'import=20et=20ajout=20d'?= =?UTF-8?q?arguments=20optionnels?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/old_ml.py | 124 +++++++++++++++++++++++++++++++----------------- 1 file changed, 80 insertions(+), 44 deletions(-) diff --git a/utils/old_ml.py b/utils/old_ml.py index 634db406..5f913e96 100755 --- a/utils/old_ml.py +++ b/utils/old_ml.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- '''Script de retrait des vielles Mailing-List - v0.2b (02/2012) par Lucas Serrano + v1 (03/2012) par Lucas Serrano Merci à Vincent Le Gallic pour son aide. ''' @@ -10,57 +10,93 @@ import time import sys import os -#import argparse +import argparse sys.path.insert(0, '/var/lib/mailman') from Mailman import MailList from Mailman import Utils - #Parsing des arguments -DISK_USAGE = True -if "--no-du" in sys.argv: - DISK_USAGE = False - -try: - date=sys.argv[1] - date=time.mktime(time.strptime(date, "%d/%m/%Y")) -except: - sys.exit("\nErreur: Veuillez poster une date de peremption sous le format JJ/MM/AAAA\n") +parser = argparse.ArgumentParser(description = 'Liste les Mailing List dont de dernier post est antérieur à la date donnée') +parser.add_argument('--no-du', dest = 'DISK_USAGE', action = 'store_const', const = False, default = True, help = 'Ne calcule pas la taille des archives') +parser.add_argument('-o', '--order-by', type = str, choices = ['date', 'size', 'members'], metavar = 'paramètre', dest='order', default = 'date', help = "Change le paramètre utiliser pour le classement des résultats. Les paramètres possibles sont: date, size ou members (Par défaut: date)") +parser.add_argument('-r', '--reverse-order', dest='REVERSED', action = 'store_true', default = False, help = "Renverse l'ordre d'affichage des résultats") +parser.add_argument('date', type = str, help = 'Date à laquelle les MLs ne sont plus considérées comme utilisées') -listeDeListes = Utils.list_names() #Recupère les noms des listes sous forme de string -listes = list() -for n in listeDeListes: - temp = MailList.MailList(n, lock=False) #Créer les objets liste à l'aide de leurs noms - listes.append([n, temp.last_post_time, temp.archive_dir(), temp.members.keys()]) -listes.sort(key=lambda list:list[1]) #Classement par date du dernier post +def getData(date, DU): + ''' + Fonction de collectage de données. + Récupère d'abord tous les noms des MailingList sous forme d'une liste de noms. + Récupère ensuite pour chaque liste: la date du dernier post sur la liste, le chemin du dossier d'archivage, la taille de l'archive si le booléen DU est vrai, et le nombre de membres. + Si la date du dernier post de la liste précèdemment récupérée est inférieure à la date donnée alors les infos de celle-ci sont stockés sous forme de dictionnaire. + Retourne la liste de ces dictionnaires et la taille totale de tous les dossiers d'archives (0 si DU est à False). + ''' -#Partie affichage -tailleTotale = 0 -if DISK_USAGE: - print "\n \n%-40s | %-12s | %s | %s\n" %("Nom de la liste", "Dernier post", "Taille", "Membres") -else: - print "\n \n%-40s | %-12s | %s\n" %("Nom de la liste", "Dernier post", "Membres") + tailleTotale = 0 + listeDeListes = Utils.list_names() #Recupère les noms des listes sous forme de string + listes = [] + for name in listeDeListes: + liste = MailList.MailList(name, lock=False) #Créer les objets temporaire liste à l'aide de leurs noms + liste_time = liste.last_post_time + if liste_time <= date: + liste_arch_dir = liste.archive_dir() + liste_members_nbr = len(liste.members) + liste_size=0 + if DU: + #Recherche de la taille du dossier d'archive + for (path, dirs, files) in os.walk(liste_arch_dir): + for file in files: + filename = os.path.join(path, file) + liste_size += os.path.getsize(filename) + liste_size = liste_size / 1048576.0 + tailleTotale += liste_size + listes.append({"name" : name, "last_post_timestamp" : liste_time, "archive_directory" : liste_arch_dir, "members_number" : liste_members_nbr,"directory_size" : liste_size}) + return (listes, tailleTotale) -for l in listes: - if l[1] > date: - break - dateFormatee = time.strftime("%d/%m/%Y", time.gmtime(l[1])) - if DISK_USAGE: - taille = 0 - chemin = l[2] - #Recherche de la taille du dossier d'archive - for (path, dirs, files) in os.walk(chemin): - for file in files: - filename = os.path.join(path, file) - taille += os.path.getsize(filename) - taille = taille / 1048576.0 - tailleTotale += taille - print "%-40s | %-11s | %-6.1f MB | %s" %(l[0], dateFormatee, taille, len(l[3])) + +def formatData(listes, dict_key, REVERSED): + ''' + Fonction de formatage des données, attend en entrée une liste de même structure que celle crée par getData. + Trie les listes par date du dernier post et crée une date formatée de celui-ci sous le format JJ/MM/AAAA. + Cette date est ajoutée en tant qu'entrée dans le dictionnaire de chaque liste présente dans la liste de listes. + ''' + + listes.sort(key=lambda l : l[dict_key], reverse=REVERSED) #Classement par type demandée + for l in listes : #Crée une date formatée (format JJ/MM/AAAA) + l['last_post_formated_time']= time.strftime("%d/%m/%Y", time.gmtime(l['last_post_timestamp'])) + return listes + +def printData(listes,tailleTotale): + ''' + Fonction d'écriture du texte à afficher, attend en entrée une liste formatée de même structure que celle formatée par formatData. + Retourne le texte à afficher. + ''' + txt = "\n \n%-40s | %-12s | %s | %s\n\n" %("Nom de la liste", "Dernier post", "Taille", "Membres") + for l in listes: + txt += "%-40s | %-11s | %-6.1f MB | %s\n" %(l['name'], l['last_post_formated_time'], l['directory_size'], l['members_number']) + txt += "Taille Totale: %0.1f MB\n" % (tailleTotale) + return txt + + +if __name__ == "__main__": + args = parser.parse_args() + DISK_USAGE = args.DISK_USAGE + REVERSED = args.REVERSED + try: + date = time.mktime(time.strptime(args.date, "%d/%m/%Y")) + except: + sys.exit("\nErreur: Veuillez poster une date de péremption sous le format JJ/MM/AAAA\n") + dict_key = '' + order=args.order + if order == 'members': + dict_key = 'members_number' + elif (order == 'size') & (DISK_USAGE == True): #On vérifie que la demande à un sens + dict_key = 'directory_size' else: - print "%-40s | %-11s | %s" %(l[0], dateFormatee, len(l[3])) - -if DISK_USAGE: - print "Taille Totale: %0.1f MB" % (tailleTotale) - + dict_key = 'last_post_timestamp' + listes, tailleTotale=getData(date, DISK_USAGE) + listes=formatData(listes, dict_key, REVERSED) + txt = printData(listes, tailleTotale) + print txt +