| #! /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 |