You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.7 KiB
94 lines
2.7 KiB
#!/usr/bin/env python |
|
|
|
import crochet |
|
import glob |
|
import pappyproxy |
|
|
|
import zipfile |
|
import tarfile |
|
|
|
# This is a gross hack, please help |
|
bz2 = None |
|
try: |
|
import bz2 |
|
except: |
|
print "BZ2 not installed on your system" |
|
|
|
from base64 import b64encode, b64decode |
|
from os import getcwd, sep, path, urandom |
|
|
|
class Compress(object): |
|
def __init__(self, sessconfig): |
|
self.config = sessconfig |
|
self.zip_archive = sessconfig.archive |
|
self.bz2_archive = sessconfig.archive |
|
|
|
def compress_project(): |
|
if bz2: |
|
tar_project() |
|
else: |
|
zip_project() |
|
|
|
def decompress_project(): |
|
if bz2: |
|
untar_project() |
|
else: |
|
unzip_project() |
|
|
|
def zip_project(): |
|
""" |
|
Zip project files |
|
|
|
Using append mode (mode='a') will create a zip archive |
|
if none exists in the project. |
|
""" |
|
try: |
|
zf = zipfile.ZipFile(self.zip_archive, mode="a") |
|
project_files = self.config.get_project_files() |
|
for pf in project_files: |
|
zf.write(pf) |
|
zf.close() |
|
except e: |
|
raise PappyException("Error creating the zipfile", e) |
|
pass |
|
|
|
def unzip_project(): |
|
""" |
|
Extract project files from decrypted zip archive. |
|
Initially checks the zip archive's magic number and |
|
attempts to extract pappy.json to validate integrity |
|
of the zipfile. |
|
""" |
|
if not zipfile.is_zipfile(self.zip_archive): |
|
raise PappyException("Project archive corrupted.") |
|
|
|
zf = zipfile.ZipFile(self.zip_archive) |
|
|
|
try: |
|
zf.extract("config.json") |
|
except e: |
|
raise PappyException("Project archive contents corrupted. Error: ", e) |
|
|
|
zf.extractall() |
|
|
|
def tar_project(): |
|
if tarfile.is_tarfile(self.bz2_archive): |
|
archive = tarfile.open(self.bz2_archive, 'w:bz2') |
|
project_files = self.config.get_project_files() |
|
|
|
# Read files line by line to accomodate larger files, e.g. the project database |
|
for pf in project_files: |
|
archive.add(pf) |
|
archive.close() |
|
|
|
def untar_project(): |
|
if tarfile.is_tarfile(self.bz2_archive): |
|
# Attempt to read the first 16 bytes of the archive |
|
# Raise exception if there is a failure |
|
project_files = self.config.get_project_files() |
|
try: |
|
with tarfile.open(self.bz2_archive, "r:bz2") as archive: |
|
for pf in project_files: |
|
archive.add(pf) |
|
except e: |
|
raise PappyException("Project archive contents corrupted. Error: ", e)
|
|
|