| #! /ufs/guido/bin/sgi/python |
| #! /usr/local/python |
| |
| # Watch line printer queue(s). |
| # Intended for BSD 4.3 lpq. |
| |
| import posix |
| import sys |
| import time |
| import string |
| |
| DEF_PRINTER = 'psc' |
| DEF_DELAY = 10 |
| |
| def main(): |
| delay = DEF_DELAY # XXX Use getopt() later |
| try: |
| thisuser = posix.environ['LOGNAME'] |
| except: |
| thisuser = posix.environ['USER'] |
| printers = sys.argv[1:] |
| if printers: |
| # Strip '-P' from printer names just in case |
| # the user specified it... |
| for i in range(len(printers)): |
| if printers[i][:2] = '-P': |
| printers[i] = printers[i][2:] |
| else: |
| if posix.environ.has_key('PRINTER'): |
| printers = [posix.environ['PRINTER']] |
| else: |
| printers = [DEF_PRINTER] |
| # |
| clearhome = posix.popen('clear', 'r').read() |
| # |
| while 1: |
| # Pipe output through cat for extra buffering, |
| # so the output (which overwrites the previous) |
| # appears instantaneous. |
| sys.stdout = posix.popen('exec cat', 'w') |
| sys.stdout.write(clearhome) |
| for name in printers: |
| pipe = posix.popen('lpq -P' + name + ' 2>&1', 'r') |
| showstatus(name, pipe, thisuser) |
| sts = pipe.close() |
| if sts: |
| print name + ': *** lpq exit status', sts |
| sts = sys.stdout.close() |
| time.sleep(delay) |
| |
| def showstatus(name, pipe, thisuser): |
| lines = 0 |
| users = {} |
| aheadbytes = 0 |
| aheadjobs = 0 |
| userseen = 0 |
| totalbytes = 0 |
| totaljobs = 0 |
| while 1: |
| line = pipe.readline() |
| if not line: break |
| fields = string.split(line) |
| n = len(fields) |
| if len(fields) >= 6 and fields[n-1] = 'bytes': |
| rank = fields[0] |
| user = fields[1] |
| job = fields[2] |
| files = fields[3:-2] |
| bytes = eval(fields[n-2]) |
| if user = thisuser: |
| userseen = 1 |
| elif not userseen: |
| aheadbytes = aheadbytes + bytes |
| aheadjobs = aheadjobs + 1 |
| totalbytes = totalbytes + bytes |
| totaljobs = totaljobs + 1 |
| if users.has_key(user): |
| ujobs, ubytes = users[user] |
| else: |
| ujobs, ubytes = 0, 0 |
| ujobs = ujobs + 1 |
| ubytes = ubytes + bytes |
| users[user] = ujobs, ubytes |
| else: |
| if fields and fields[0] <> 'Rank': |
| if line[-1:] = '\n': |
| line = line[:-1] |
| if not lines: |
| print name + ':', |
| else: |
| print |
| print line, |
| lines = lines + 1 |
| if totaljobs: |
| if lines > 1: |
| print |
| lines = lines+1 |
| print (totalbytes+1023)/1024, 'K', |
| if totaljobs <> len(users): |
| print '(' + `totaljobs` + ' jobs)', |
| if len(users) = 1: |
| print 'for', users.keys()[0], |
| else: |
| print 'for', len(users), 'users', |
| if userseen: |
| if aheadjobs = 0: |
| print '(' + thisuser + ' first)', |
| else: |
| print '(' + `(aheadbytes+1023)/1024`, |
| print 'K before', thisuser + ')' |
| if lines: |
| print |
| |
| try: |
| main() |
| except KeyboardInterrupt: |
| pass |