66 lines
1.7 KiB
Python
Executable File
66 lines
1.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""CUPS filter for TA 3505ci - injects department account code into PostScript stream."""
|
|
import sys
|
|
|
|
|
|
def parse_options(options_str):
|
|
options = {}
|
|
for token in options_str.split():
|
|
if '=' in token:
|
|
k, v = token.split('=', 1)
|
|
options[k] = v
|
|
else:
|
|
options[token] = 'true'
|
|
return options
|
|
|
|
|
|
def get_account_code(options):
|
|
km = options.get('KmManagment', 'Default')
|
|
if km == 'Default' or not km.startswith('MG'):
|
|
return None
|
|
code = km[2:]
|
|
if not code.isdigit():
|
|
return None
|
|
return code.zfill(8)
|
|
|
|
|
|
def process_stream(lines, account_code):
|
|
if not account_code:
|
|
yield from lines
|
|
return
|
|
|
|
inject = f"({account_code}) statusdict /setmanagementnumber get exec\n".encode()
|
|
injected = False
|
|
|
|
for line in lines:
|
|
stripped = line.rstrip(b'\r\n')
|
|
if not injected and (stripped.rstrip() == b'%%EndSetup' or stripped.startswith(b'%%Page:')):
|
|
yield inject
|
|
injected = True
|
|
yield line
|
|
|
|
if not injected:
|
|
sys.stderr.write("kyofilter: WARNING: no injection point found in PostScript stream\n")
|
|
|
|
|
|
|
|
def main():
|
|
if len(sys.argv) < 6:
|
|
sys.stderr.write("Usage: kyofilter job-id user title copies options [file]\n")
|
|
sys.exit(1)
|
|
|
|
options = parse_options(sys.argv[5])
|
|
account_code = get_account_code(options)
|
|
|
|
infile = open(sys.argv[6], 'rb') if len(sys.argv) > 6 else sys.stdin.buffer
|
|
try:
|
|
for chunk in process_stream(infile, account_code):
|
|
sys.stdout.buffer.write(chunk)
|
|
finally:
|
|
if len(sys.argv) > 6:
|
|
infile.close()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|