Sprawdzanie integralności plików tar w Pythonie
Pracuję nad przekształceniem mojego skryptu kopii zapasowej z powłoki na Python. Jedną z funkcji mojego starego skryptu było sprawdzenie utworzonego pliku tar pod kątem integralności, wykonując: gzip -t.
Wydaje się, że jest to trochę trudne w Pythonie.
Wydaje się, że jedynym sposobem, aby to zrobić, jest odczytanie każdego ze skompresowanych obiektów TarInfo w pliku tar.
Czy istnieje sposób na sprawdzenie integralności pliku tar, bez wyodrębniania na dysk lub przechowywania go w pamięci (w całości)?
Dobrzy ludzie na #python na freenode sugerowali, że powinienem czytać każdy fragment TarInfo po kawałku, odrzucając każdą przeczytaną porcję.
Muszę przyznać, że nie mam pojęcia, jak to zrobić, ponieważ właśnie uruchomiłem Pythona.
Wyobraź sobie, że mam plik tar o rozmiarze 30 GB, który zawiera pliki od 1 kb do 10 GB ...
To jest rozwiązanie, które zacząłem pisać:
try:
tardude = tarfile.open("zero.tar.gz")
except:
print "There was an error opening tarfile. The file might be corrupt or missing."
for member_info in tardude.getmembers():
try:
check = tardude.extractfile(member_info.name)
except:
print "File: %r is corrupt." % member_info.name
tardude.close()
Ten kod jest daleki od zakończenia. Nie odważyłbym się uruchomić tego na ogromnym archiwum tar 30 GB, ponieważ w pewnym momencie sprawdzenie byłoby obiektem 10 + GB (jeśli mam tak duże pliki w archiwum tar)
Bonus: Próbowałem ręcznie uszkodzić zero.tar.gz (edytor hex - edytuj kilka bajtów pliku pośredniego). Pierwszy z wyjątkiem nie łapie IOError ... Oto wyjście:
Traceback (most recent call last):
File "./test.py", line 31, in <module>
for member_info in tardude.getmembers():
File "/usr/lib/python2.7/tarfile.py", line 1805, in getmembers
self._load() # all members, we first have to
File "/usr/lib/python2.7/tarfile.py", line 2380, in _load
tarinfo = self.next()
File "/usr/lib/python2.7/tarfile.py", line 2315, in next
self.fileobj.seek(self.offset)
File "/usr/lib/python2.7/gzip.py", line 429, in seek
self.read(1024)
File "/usr/lib/python2.7/gzip.py", line 256, in read
self._read(readsize)
File "/usr/lib/python2.7/gzip.py", line 320, in _read
self._read_eof()
File "/usr/lib/python2.7/gzip.py", line 342, in _read_eof
hex(self.crc)))
IOError: CRC check failed 0xe5384b87 != 0xdfe91e1L