[old_ml] Mise à jour du script: rajout de fonctions pour l'import et ajout d'arguments optionnels

This commit is contained in:
Lucas Serrano 2013-03-14 15:13:51 +01:00 committed by Daniel STAN
parent 3c9d8634be
commit fd8109bb44

View file

@ -2,7 +2,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
'''Script de retrait des vielles Mailing-List '''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. Merci à Vincent Le Gallic pour son aide.
''' '''
@ -10,57 +10,93 @@
import time import time
import sys import sys
import os import os
#import argparse import argparse
sys.path.insert(0, '/var/lib/mailman') sys.path.insert(0, '/var/lib/mailman')
from Mailman import MailList from Mailman import MailList
from Mailman import Utils from Mailman import Utils
#Parsing des arguments #Parsing des arguments
DISK_USAGE = True parser = argparse.ArgumentParser(description = 'Liste les Mailing List dont de dernier post est antérieur à la date donnée')
if "--no-du" in sys.argv: parser.add_argument('--no-du', dest = 'DISK_USAGE', action = 'store_const', const = False, default = True, help = 'Ne calcule pas la taille des archives')
DISK_USAGE = False 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")
try: parser.add_argument('date', type = str, help = 'Date à laquelle les MLs ne sont plus considérées comme utilisées')
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")
listeDeListes = Utils.list_names() #Recupère les noms des listes sous forme de string def getData(date, DU):
listes = list() '''
for n in listeDeListes: Fonction de collectage de données.
temp = MailList.MailList(n, lock=False) #Créer les objets liste à l'aide de leurs noms Récupère d'abord tous les noms des MailingList sous forme d'une liste de noms.
listes.append([n, temp.last_post_time, temp.archive_dir(), temp.members.keys()]) 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.
listes.sort(key=lambda list:list[1]) #Classement par date du dernier post 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 tailleTotale = 0
if DISK_USAGE: listeDeListes = Utils.list_names() #Recupère les noms des listes sous forme de string
print "\n \n%-40s | %-12s | %s | %s\n" %("Nom de la liste", "Dernier post", "Taille", "Membres") listes = []
else: for name in listeDeListes:
print "\n \n%-40s | %-12s | %s\n" %("Nom de la liste", "Dernier post", "Membres") liste = MailList.MailList(name, lock=False) #Créer les objets temporaire liste à l'aide de leurs noms
liste_time = liste.last_post_time
for l in listes: if liste_time <= date:
if l[1] > date: liste_arch_dir = liste.archive_dir()
break liste_members_nbr = len(liste.members)
dateFormatee = time.strftime("%d/%m/%Y", time.gmtime(l[1])) liste_size=0
if DISK_USAGE: if DU:
taille = 0
chemin = l[2]
#Recherche de la taille du dossier d'archive #Recherche de la taille du dossier d'archive
for (path, dirs, files) in os.walk(chemin): for (path, dirs, files) in os.walk(liste_arch_dir):
for file in files: for file in files:
filename = os.path.join(path, file) filename = os.path.join(path, file)
taille += os.path.getsize(filename) liste_size += os.path.getsize(filename)
taille = taille / 1048576.0 liste_size = liste_size / 1048576.0
tailleTotale += taille tailleTotale += liste_size
print "%-40s | %-11s | %-6.1f MB | %s" %(l[0], dateFormatee, taille, len(l[3])) 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)
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: else:
print "%-40s | %-11s | %s" %(l[0], dateFormatee, len(l[3])) dict_key = 'last_post_timestamp'
listes, tailleTotale=getData(date, DISK_USAGE)
if DISK_USAGE: listes=formatData(listes, dict_key, REVERSED)
print "Taille Totale: %0.1f MB" % (tailleTotale) txt = printData(listes, tailleTotale)
print txt