#! /usr/bin/env python

# Watch line printer queue(s).
# Intended for BSD 4.3 lpq.

import os
import sys
import time

DEF_PRINTER = 'psc'
DEF_DELAY = 10

def main():
    delay = DEF_DELAY # XXX Use getopt() later
    try:
        thisuser = os.environ['LOGNAME']
    except:
        thisuser = os.environ['USER']
    printers = sys.argv[1:]
    if printers:
        # Strip '-P' from printer names just in case
        # the user specified it...
        for i, name in enumerate(printers):
            if name[:2] == '-P':
                printers[i] = name[2:]
    else:
        if os.environ.has_key('PRINTER'):
            printers = [os.environ['PRINTER']]
        else:
            printers = [DEF_PRINTER]

    clearhome = os.popen('clear', 'r').read()

    while True:
        text = clearhome
        for name in printers:
            text += makestatus(name, thisuser) + '\n'
        print text
        time.sleep(delay)

def makestatus(name, thisuser):
    pipe = os.popen('lpq -P' + name + ' 2>&1', 'r')
    lines = []
    users = {}
    aheadbytes = 0
    aheadjobs = 0
    userseen = False
    totalbytes = 0
    totaljobs = 0
    for line in pipe:
        fields = line.split()
        n = len(fields)
        if len(fields) >= 6 and fields[n-1] == 'bytes':
            rank, user, job = fields[0:3]
            files = fields[3:-2]
            bytes = int(fields[n-2])
            if user == thisuser:
                userseen = True
            elif not userseen:
                aheadbytes += bytes
                aheadjobs += 1
            totalbytes += bytes
            totaljobs += 1
            ujobs, ubytes = users.get(user, (0, 0))
            ujobs += 1
            ubytes += bytes
            users[user] = ujobs, ubytes
        else:
            if fields and fields[0] != 'Rank':
                line = line.strip()
                if line == 'no entries':
                    line = name + ': idle'
                elif line[-22:] == ' is ready and printing':
                    line = name
                lines.append(line)

    if totaljobs:
        line = '%d K' % ((totalbytes+1023) // 1024)
        if totaljobs != len(users):
            line += ' (%d jobs)' % totaljobs
        if len(users) == 1:
            line += ' for %s' % (users.keys()[0],)
        else:
            line += ' for %d users' % len(users)
            if userseen:
                if aheadjobs == 0:
                    line += ' (%s first)' % thisuser
                else:
                    line += ' (%d K before %s)' % (
                        (aheadbytes+1023) // 1024, thisuser)
        lines.append(line)

    sts = pipe.close()
    if sts:
        lines.append('lpq exit status %r' % (sts,))
    return ': '.join(lines)

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        pass
