[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 listeDeListes = Utils.list_names() #Recupère les noms des listes sous forme de string
if DISK_USAGE: listes = []
print "\n \n%-40s | %-12s | %s | %s\n" %("Nom de la liste", "Dernier post", "Taille", "Membres") for name in listeDeListes:
else: liste = MailList.MailList(name, lock=False) #Créer les objets temporaire liste à l'aide de leurs noms
print "\n \n%-40s | %-12s | %s\n" %("Nom de la liste", "Dernier post", "Membres") 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: def formatData(listes, dict_key, REVERSED):
break '''
dateFormatee = time.strftime("%d/%m/%Y", time.gmtime(l[1])) Fonction de formatage des données, attend en entrée une liste de même structure que celle crée par getData.
if DISK_USAGE: Trie les listes par date du dernier post et crée une date formatée de celui-ci sous le format JJ/MM/AAAA.
taille = 0 Cette date est ajoutée en tant qu'entrée dans le dictionnaire de chaque liste présente dans la liste de listes.
chemin = l[2] '''
#Recherche de la taille du dossier d'archive
for (path, dirs, files) in os.walk(chemin): listes.sort(key=lambda l : l[dict_key], reverse=REVERSED) #Classement par type demandée
for file in files: for l in listes : #Crée une date formatée (format JJ/MM/AAAA)
filename = os.path.join(path, file) l['last_post_formated_time']= time.strftime("%d/%m/%Y", time.gmtime(l['last_post_timestamp']))
taille += os.path.getsize(filename) return listes
taille = taille / 1048576.0
tailleTotale += taille def printData(listes,tailleTotale):
print "%-40s | %-11s | %-6.1f MB | %s" %(l[0], dateFormatee, taille, len(l[3])) '''
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