You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
2.1 KiB
Python

#!/usr/bin/env python
import zlib, base64, sys, os, random, shlex, subprocess
run_after_extract = {%run_after_extract}
targz = {%targz}
extension = "{%extension}"
command = "{%command}"
try:
if sys.argv[1] != "-q":
quiet = True
else:
quiet = False
except IndexError:
quiet = False
if quiet == False:
sys.stdout.write("PySFX 1.0 by Sven Slootweg http://cryto.net/pysfx\n")
sys.stdout.write("PySFX may be reused, modified, and redistributed freely without restriction under the WTFPL.\n\n")
identifier = "pysfx-%s" % "".join(["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"[random.randint(0, 61)] for i in xrange(0, 16)])
directory_destination = "/var/tmp/%s" % identifier
file_destination = "/var/tmp/%s.%s" % (identifier, extension)
if targz == True:
name = "/var/tmp/%s"
else:
name = "/var/tmp/%s.%s" % (identifier, extension)
reader = open(__file__, "rb")
reading_data = False
writer = open(file_destination, "wb")
dobj = zlib.decompressobj()
total_bytes = 0
original_bytes = 0
for line in reader:
if line.startswith('"""'):
reading_data = False
if reading_data == True:
data = dobj.decompress(base64.b64decode(line.rstrip("\r\n")))
writer.write(data)
total_bytes += (len(line) - 1)
original_bytes += len(data)
if line.startswith('"""EOFDATA'):
reading_data = True
writer.write(dobj.flush())
writer.close()
reader.close()
if quiet == False:
sys.stdout.write("Processed %d bytes, of which %d bytes were written to %s.\n" % (total_bytes, original_bytes, file_destination))
if targz == True:
stfu = open(os.devnull, 'w')
if quiet == False:
sys.stdout.write("Unpacking archive...\n")
os.makedirs(directory_destination)
result = subprocess.call(["tar", "-xzf", file_destination, "-C", directory_destination], stdout=stfu, stderr=stfu)
if result != 0:
sys.stderr.write("Extraction of inner archive failed. The file may be corrupted.\n")
exit(1)
if run_after_extract == True:
tokens = shlex.split(command)
result = subprocess.call(tokens, cwd=directory_destination)
if result != 0:
sys.stderr.write("Autorun command failed. The file may be corrupted.\n")
exit(1)
"""EOFDATA
"""