diff options
| author | jvoisin | 2011-07-24 21:31:20 +0200 |
|---|---|---|
| committer | jvoisin | 2011-07-24 21:31:20 +0200 |
| commit | 5bcc33f6d7b5267ff06f610920abe8ae3bfaeb37 (patch) | |
| tree | 2de895654a81541f1f350d5b8f7313dd3a0a0546 | |
| parent | b49ea7dc02270cfcc94d101d03857c6e5df94532 (diff) | |
Now archive.py use tempfiles
| -rw-r--r-- | lib/archive.py | 78 |
1 files changed, 35 insertions, 43 deletions
diff --git a/lib/archive.py b/lib/archive.py index d7d3509..8a305d5 100644 --- a/lib/archive.py +++ b/lib/archive.py | |||
| @@ -1,10 +1,10 @@ | |||
| 1 | import tarfile | 1 | import tarfile |
| 2 | import zipfile | 2 | import zipfile |
| 3 | 3 | ||
| 4 | import sys | ||
| 5 | import shutil | 4 | import shutil |
| 6 | import os | 5 | import os |
| 7 | import logging | 6 | import logging |
| 7 | import tempfile | ||
| 8 | 8 | ||
| 9 | import parser | 9 | import parser |
| 10 | import mat | 10 | import mat |
| @@ -17,12 +17,14 @@ class GenericArchiveStripper(parser.Generic_parser): | |||
| 17 | super(GenericArchiveStripper, self).__init__(realname, | 17 | super(GenericArchiveStripper, self).__init__(realname, |
| 18 | filename, parser, editor, backup, add2archive) | 18 | filename, parser, editor, backup, add2archive) |
| 19 | self.compression = '' | 19 | self.compression = '' |
| 20 | self.folder_list = [] | ||
| 21 | self.add2archive = add2archive | 20 | self.add2archive = add2archive |
| 21 | self.tempdir = tempfile.mkdtemp() | ||
| 22 | 22 | ||
| 23 | def remove_folder(self): | 23 | def __del__(self): |
| 24 | [shutil.rmtree(folder) for folder in self.folder_list] | 24 | ''' |
| 25 | self.folder_list = [] | 25 | Remove the temp dir |
| 26 | ''' | ||
| 27 | shutil.rmtree(self.tempdir) | ||
| 26 | 28 | ||
| 27 | def remove_all(self): | 29 | def remove_all(self): |
| 28 | self._remove_all('normal') | 30 | self._remove_all('normal') |
| @@ -50,20 +52,18 @@ class ZipStripper(GenericArchiveStripper): | |||
| 50 | for item in zipin.infolist(): | 52 | for item in zipin.infolist(): |
| 51 | if not self.is_file_clean(item): | 53 | if not self.is_file_clean(item): |
| 52 | return False | 54 | return False |
| 53 | zipin.extract(item) | 55 | zipin.extract(item, self.tempdir) |
| 54 | if os.path.isfile(item.filename): | 56 | name = os.path.join(self.tempdir, item.filename) |
| 57 | if os.path.isfile(name): | ||
| 55 | try: | 58 | try: |
| 56 | cfile = mat.create_class_file(item.filename, False, | 59 | cfile = mat.create_class_file(name, False, |
| 57 | self.add2archive) | 60 | self.add2archive) |
| 58 | except: | 61 | except: |
| 59 | logging.error('%s is not supported' % item.filename) | 62 | logging.error('%s is not supported' % item.filename) |
| 60 | #Returning false is the best solution imho | 63 | #Returning false is the best solution imho |
| 61 | return False | 64 | return False |
| 62 | mat.secure_remove(item.filename) | 65 | mat.secure_remove(name) |
| 63 | else: | ||
| 64 | self.folder_list.insert(0, item.filename) | ||
| 65 | zipin.close() | 66 | zipin.close() |
| 66 | self.remove_folder() | ||
| 67 | return False | 67 | return False |
| 68 | 68 | ||
| 69 | def get_meta(self): | 69 | def get_meta(self): |
| @@ -86,10 +86,11 @@ class ZipStripper(GenericArchiveStripper): | |||
| 86 | zipout = zipfile.ZipFile(self.filename + parser.POSTFIX, 'w', | 86 | zipout = zipfile.ZipFile(self.filename + parser.POSTFIX, 'w', |
| 87 | allowZip64=True) | 87 | allowZip64=True) |
| 88 | for item in zipin.infolist(): | 88 | for item in zipin.infolist(): |
| 89 | zipin.extract(item) | 89 | zipin.extract(item, self.tempdir) |
| 90 | if os.path.isfile(item.filename): | 90 | name = os.path.join(self.tempdir, item.filename) |
| 91 | if os.path.isfile(name): | ||
| 91 | try: | 92 | try: |
| 92 | cfile = mat.create_class_file(item.filename, False, | 93 | cfile = mat.create_class_file(name, False, |
| 93 | self.add2archive) | 94 | self.add2archive) |
| 94 | if method is 'normal': | 95 | if method is 'normal': |
| 95 | cfile.remove_all() | 96 | cfile.remove_all() |
| @@ -97,18 +98,15 @@ class ZipStripper(GenericArchiveStripper): | |||
| 97 | cfile.remove_all_ugly() | 98 | cfile.remove_all_ugly() |
| 98 | logging.debug('Processing %s from %s' % (item.filename, | 99 | logging.debug('Processing %s from %s' % (item.filename, |
| 99 | self.filename)) | 100 | self.filename)) |
| 100 | zipout.write(item.filename) | 101 | zipout.write(name, item.filename) |
| 101 | except: | 102 | except: |
| 102 | logging.info('%s\' fileformat is not supported' % | 103 | logging.info('%s\' fileformat is not supported' % |
| 103 | item.filename) | 104 | item.filename) |
| 104 | if self.add2archive: | 105 | if self.add2archive: |
| 105 | zipout.write(item.filename) | 106 | zipout.write(name, item.filename) |
| 106 | mat.secure_remove(item.filename) | 107 | mat.secure_remove(name) |
| 107 | else: | ||
| 108 | self.folder_list.insert(0, item.filename) | ||
| 109 | zipout.comment = '' | 108 | zipout.comment = '' |
| 110 | logging.info('%s treated' % self.filename) | 109 | logging.info('%s treated' % self.filename) |
| 111 | self.remove_folder() | ||
| 112 | zipin.close() | 110 | zipin.close() |
| 113 | zipout.close() | 111 | zipout.close() |
| 114 | 112 | ||
| @@ -129,29 +127,27 @@ class TarStripper(GenericArchiveStripper): | |||
| 129 | tarin = tarfile.open(self.filename, 'r' + self.compression) | 127 | tarin = tarfile.open(self.filename, 'r' + self.compression) |
| 130 | tarout = tarfile.open(self.filename + parser.POSTFIX, | 128 | tarout = tarfile.open(self.filename + parser.POSTFIX, |
| 131 | 'w' + self.compression) | 129 | 'w' + self.compression) |
| 132 | for current_file in tarin.getmembers(): | 130 | for item in tarin.getmembers(): |
| 133 | tarin.extract(current_file) | 131 | tarin.extract(item, self.tempdir) |
| 134 | if current_file.type is '0': #is current_file a regular file ? | 132 | name = os.path.join(self.tempdir, item.name) |
| 133 | if item.type is '0': #is item a regular file ? | ||
| 135 | #no backup file | 134 | #no backup file |
| 136 | try: | 135 | try: |
| 137 | cfile = mat.create_class_file(current_file.name, False, | 136 | cfile = mat.create_class_file(name, False, |
| 138 | self.add2archive) | 137 | self.add2archive) |
| 139 | if method is 'normal': | 138 | if method is 'normal': |
| 140 | cfile.remove_all() | 139 | cfile.remove_all() |
| 141 | else: | 140 | else: |
| 142 | cfile.remove_all_ugly() | 141 | cfile.remove_all_ugly() |
| 143 | tarout.add(current_file.name, filter=self._remove) | 142 | tarout.add(name, item.name, filter=self._remove) |
| 144 | except: | 143 | except: |
| 145 | logging.info('%s\' format is not supported' % | 144 | logging.info('%s\' format is not supported' % |
| 146 | current_file.name) | 145 | item.name) |
| 147 | if self.add2archive: | 146 | if self.add2archive: |
| 148 | tarout.add(current_file.name, filter=self._remove) | 147 | tarout.add(name, item.name,filter=self._remove) |
| 149 | mat.secure_remove(current_file.name) | 148 | mat.secure_remove(name) |
| 150 | else: | ||
| 151 | self.folder_list.insert(0, current_file.name) | ||
| 152 | tarin.close() | 149 | tarin.close() |
| 153 | tarout.close() | 150 | tarout.close() |
| 154 | self.remove_folder() | ||
| 155 | 151 | ||
| 156 | if self.backup is False: | 152 | if self.backup is False: |
| 157 | mat.secure_remove(self.filename) | 153 | mat.secure_remove(self.filename) |
| @@ -176,23 +172,19 @@ class TarStripper(GenericArchiveStripper): | |||
| 176 | 172 | ||
| 177 | def is_clean(self): | 173 | def is_clean(self): |
| 178 | tarin = tarfile.open(self.filename, 'r' + self.compression) | 174 | tarin = tarfile.open(self.filename, 'r' + self.compression) |
| 179 | for current_file in tarin.getmembers(): | 175 | for item in tarin.getmembers(): |
| 180 | if not self.is_file_clean(current_file): | 176 | if not self.is_file_clean(item): |
| 181 | return False | 177 | return False |
| 182 | tarin.extract(current_file) | 178 | tarin.extract(item, self.tempdir) |
| 183 | if current_file.type is '0': #is current_file a regular file ? | 179 | name = os.path.join(self.tempdir, item.name) |
| 180 | if item.type is '0': #is item a regular file ? | ||
| 184 | #no backup file | 181 | #no backup file |
| 185 | class_file = mat.create_class_file(current_file.name, False, | 182 | class_file = mat.create_class_file(name, False, |
| 186 | self.add2archive) | 183 | self.add2archive) |
| 184 | mat.secure_remove(name) | ||
| 187 | if not class_file.is_clean():#if the extracted file is not clean | 185 | if not class_file.is_clean():#if the extracted file is not clean |
| 188 | mat.secure_remove(current_file.name) #remove it | ||
| 189 | self.remove_folder() #remove all the remaining folders | ||
| 190 | return False | 186 | return False |
| 191 | mat.secure_remove(current_file.name) | ||
| 192 | else: | ||
| 193 | self.folder_list.insert(0, current_file.name) | ||
| 194 | tarin.close() | 187 | tarin.close() |
| 195 | self.remove_folder() | ||
| 196 | return True | 188 | return True |
| 197 | 189 | ||
| 198 | def get_meta(self): | 190 | def get_meta(self): |
