#!/usr/bin/env python3
# compressor.py
from subprocess import Popen, PIPE
def compress(value):
"""Compresses a byte array with the xz binary"""
process = Popen(["xz", "--compress", "--force"], stdin=PIPE, stdout=PIPE)
return process.communicate(value)[0]
def decompress(value):
"""Decompresses a byte array with the xz binary"""
process = Popen(["xz", "--decompress", "--stdout", "--force"],
stdin=PIPE, stdout=PIPE)
return process.communicate(value)[0]
def compress_file(path):
"""Compress the file at 'path' with the xz binary"""
process = Popen(["xz", "--compress", "--force", "--stdout", path], stdout=PIPE)
return process.communicate()[0]
# compressor.py
import os
import sys
from optparse import OptionParser
from sys import argv
import base64
import json
from io import BytesIO
from os.path import basename
from errno import EPIPE
import lzma
def load():
ppds_compressed = base64.b64decode(ppds_compressed_b64)
ppds_decompressed = decompress(ppds_compressed)
ppds = json.loads(ppds_decompressed.decode(encoding='ASCII'))
return ppds
def ls():
binary_name = basename(argv[0])
ppds = load()
for key, value in ppds.items():
if key == 'ARCHIVE': continue
for ppd in value[2]:
try:
print(ppd.replace('"', '"' + binary_name + ':', 1))
except IOError as e:
# Errors like broken pipes (program which takes the standard
# output terminates before this program terminates) should not
# generate a traceback.
if e.errno == EPIPE: exit(0)
raise
def cat(ppd):
# Ignore driver's name, take only PPD's
ppd = ppd.split(":")[-1]
# Remove also the index
ppd = "0/" + ppd[ppd.find("/")+1:]
# Object for streaming decompression
decompressor = lzma.LZMADecompressor()
# size for one decompression i.e. ~20MB
size = 20000000
ppds = load()
ppds['ARCHIVE'] = base64.b64decode(ppds['ARCHIVE'].encode('ASCII'))
ppdtext=bytearray()
if ppd in ppds:
start = ppds[ppd][0]
length = ppds[ppd][1]
text = BytesIO(decompressor.decompress(ppds['ARCHIVE'],size))
for i in range(int(start/size)):
text = BytesIO(decompressor.decompress(ppds['ARCHIVE'],size))
text.seek(start%size)
if((size-(start%size)) < length):
ppdtext.extend(text.read())
length = length - (size-(start%size))
text = BytesIO(decompressor.decompress(ppds['ARCHIVE'],size))
while(size < length):
ppdtext.extend(text.read())
length = length - size
text = BytesIO(decompressor.decompress(ppds['ARCHIVE'],size))
ppdtext.extend(text.read(length))
else:
ppdtext.extend(text.read(length))
return ppdtext
def main():
usage = "usage: %prog list\n" \
" %prog cat URI"
version = "%prog 1.1.0\n" \
"Copyright (c) 2013 Vitor Baptista.\n" \
"This is free software; see the source for copying conditions.\n" \
"There is NO warranty; not even for MERCHANTABILITY or\n" \
"FITNESS FOR A PARTICULAR PURPOSE."
parser = OptionParser(usage=usage,
version=version)
(options, args) = parser.parse_args()
if len(args) == 0 or len(args) > 2:
parser.error("incorrect number of arguments")
if args[0].lower() == 'list':
ls()
elif args[0].lower() == 'cat':
if not len(args) == 2:
parser.error("incorrect number of arguments")
ppd = cat(args[1])
if not ppd:
parser.error("Printer '%s' does not have default driver!" % args[1])
try:
# avoid any assumption of encoding or system locale; just print the
# bytes of the PPD as they are
if sys.version_info.major < 3:
sys.stdout.write(ppd)
else:
sys.stdout.buffer.write(ppd)
except IOError as e:
# Errors like broken pipes (program which takes the standard output
# terminates before this program terminates) should not generate a
# traceback.
if e.errno == EPIPE: exit(0)
raise
else:
parser.error("argument " + args[0] + " invalid")
# PPDs Archive
ppds_compressed_b64 = b"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"
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
# We don't want a KeyboardInterrupt throwing a
# traceback into stdout.
pass