| #! /usr/local/bin/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: |
| text = clearhome |
| for name in printers: |
| text = text + makestatus(name, thisuser) + '\n' |
| print text |
| time.sleep(delay) |
| |
| def makestatus(name, thisuser): |
| pipe = posix.popen('lpq -P' + name + ' 2>&1', 'r') |
| lines = [] |
| 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': |
| line = string.strip(line) |
| if line == 'no entries': |
| line = name + ': idle' |
| elif line[-22:] == ' is ready and printing': |
| line = name |
| lines.append(line) |
| # |
| if totaljobs: |
| line = `(totalbytes+1023)/1024` + ' K' |
| if totaljobs <> len(users): |
| line = line + ' (' + `totaljobs` + ' jobs)' |
| if len(users) == 1: |
| line = line + ' for ' + users.keys()[0] |
| else: |
| line = line + ' for ' + `len(users)` + ' users' |
| if userseen: |
| if aheadjobs == 0: |
| line = line + ' (' + thisuser + ' first)' |
| else: |
| line = line + ' (' + `(aheadbytes+1023)/1024` |
| line = line + ' K before ' + thisuser + ')' |
| lines.append(line) |
| # |
| sts = pipe.close() |
| if sts: |
| lines.append('lpq exit status ' + `sts`) |
| return string.joinfields(lines, ': ') |
| |
| try: |
| main() |
| except KeyboardInterrupt: |
| pass |