From 6c5cad3f96a1bbe20b668730ba66dfb43eb14b08 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Mon, 27 Jun 2011 17:42:42 +0200 Subject: Add is_clean() method to archives, and move the 'secure_remove' function from parser.py to mat.py --- lib/archive.py | 58 +++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 21 deletions(-) (limited to 'lib/archive.py') diff --git a/lib/archive.py b/lib/archive.py index 89425cf..446e493 100644 --- a/lib/archive.py +++ b/lib/archive.py @@ -5,47 +5,63 @@ import mat import shutil class TarStripper(parser.Generic_parser): - def compression_type(self): + def __init__(self, realname, filename, parser, editor, backup): + super(TarStripper, self).__init__(realname, + filename, parser, editor, backup) self.compression = '' + self.tarin = tarfile.open(self.filename, 'r' + self.compression) + self.folder_list = [] def remove_all(self): - self.compression_type() - if not tarfile.is_tarfile(self.filename): - print('%s is not a valid tar file' % self.filename) - sys.exit(1) - - tarin = tarfile.open(self.filename, 'r' + self.compression) - tarout = tarfile.open(self.filename + parser.POSTFIX, + self.tarout = tarfile.open(self.filename + parser.POSTFIX, 'w' + self.compression) - folder_list = [] - - for current_file in tarin.getmembers(): - tarin.extract(current_file) + for current_file in self.tarin.getmembers(): + self.tarin.extract(current_file) if current_file.type is '0': #is current_file a regular file ? #no backup file class_file = mat.create_class_file(current_file.name, False) class_file.remove_all() - tarout.add(current_file.name) - class_file.secure_remove() + self.tarout.add(current_file.name) + mat.secure_remove(current_file.name) else: - folder_list.insert(0, current_file.name) + self.folder_list.insert(0, current_file.name) - for folder in folder_list: #delete remainings folders + for folder in self.folder_list: #delete remainings folders shutil.rmtree(folder) #meta from the tar itself - tarout.mtime = None + self.tarout.mtime = None - tarout.close() - tarin.close() + self.tarout.close() + self.tarin.close() def is_clean(self): + for current_file in self.tarin.getmembers(): + self.tarin.extract(current_file) + if current_file.type is '0': #is current_file a regular file ? + #no backup file + class_file = mat.create_class_file(current_file.name, False) + if not class_file.is_clean(): + self.folder_list = [] + return False + mat.secure_remove(current_file.name) + else: + self.folder_list.insert(0, current_file.name) + self.tarin.close() + + for folder in self.folder_list: #delete remainings folders + shutil.rmtree(folder) + self.folder_list = [] return False class GzipStripper(TarStripper): - def compression_type(self): + def __init__(self, realname, filename, parser, editor, backup): + super(GzipStripper, self).__init__(realname, + filename, parser, editor, backup) self.compression = ':gz' class Bzip2Stripper(TarStripper): - def compression_type(self): + def __init__(self, realname, filename, parser, editor, backup): + super(Bzip2Stripper, self).__init__(realname, + filename, parser, editor, backup) self.compression = ':bz2' -- cgit v1.3