/usr/lib/cups/driver/dymo is in printer-driver-dymo 1.4.0-2.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | #!/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
try:
import cPickle as pickle
except ImportError:
import pickle
from io import BytesIO
from os.path import basename
from errno import EPIPE
def load():
ppds_compressed = base64.b64decode(ppds_compressed_b64)
ppds_decompressed = decompress(ppds_compressed)
ppds = pickle.loads(ppds_decompressed)
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:]
ppds = load()
ppds['ARCHIVE'] = BytesIO(decompress(ppds['ARCHIVE']))
if ppd in ppds:
start = ppds[ppd][0]
length = ppds[ppd][1]
ppds['ARCHIVE'].seek(start)
return ppds['ARCHIVE'].read(length)
def main():
usage = "usage: %prog list\n" \
" %prog cat URI"
version = "%prog 1.0.1\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
|