summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjvoisin2011-07-24 21:31:20 +0200
committerjvoisin2011-07-24 21:31:20 +0200
commit5bcc33f6d7b5267ff06f610920abe8ae3bfaeb37 (patch)
tree2de895654a81541f1f350d5b8f7313dd3a0a0546
parentb49ea7dc02270cfcc94d101d03857c6e5df94532 (diff)
Now archive.py use tempfiles
-rw-r--r--lib/archive.py78
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 @@
1import tarfile 1import tarfile
2import zipfile 2import zipfile
3 3
4import sys
5import shutil 4import shutil
6import os 5import os
7import logging 6import logging
7import tempfile
8 8
9import parser 9import parser
10import mat 10import 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):