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