Benjamin Peterson | 90f5ba5 | 2010-03-11 22:53:45 +0000 | [diff] [blame^] | 1 | #! /usr/bin/env python3 |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 2 | |
| 3 | # Watch line printer queue(s). |
| 4 | # Intended for BSD 4.3 lpq. |
| 5 | |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 6 | import os |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 7 | import sys |
| 8 | import time |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 9 | |
| 10 | DEF_PRINTER = 'psc' |
| 11 | DEF_DELAY = 10 |
| 12 | |
| 13 | def main(): |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 14 | delay = DEF_DELAY # XXX Use getopt() later |
| 15 | try: |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 16 | thisuser = os.environ['LOGNAME'] |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 17 | except: |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 18 | thisuser = os.environ['USER'] |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 19 | printers = sys.argv[1:] |
| 20 | if printers: |
| 21 | # Strip '-P' from printer names just in case |
| 22 | # the user specified it... |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 23 | for i, name in enumerate(printers): |
| 24 | if name[:2] == '-P': |
| 25 | printers[i] = name[2:] |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 26 | else: |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 27 | if 'PRINTER' in os.environ: |
| 28 | printers = [os.environ['PRINTER']] |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 29 | else: |
| 30 | printers = [DEF_PRINTER] |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 31 | |
| 32 | clearhome = os.popen('clear', 'r').read() |
| 33 | |
| 34 | while True: |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 35 | text = clearhome |
| 36 | for name in printers: |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 37 | text += makestatus(name, thisuser) + '\n' |
Collin Winter | 6f2df4d | 2007-07-17 20:59:35 +0000 | [diff] [blame] | 38 | print(text) |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 39 | time.sleep(delay) |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 40 | |
Guido van Rossum | 7030d0a | 1991-12-18 13:38:58 +0000 | [diff] [blame] | 41 | def makestatus(name, thisuser): |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 42 | pipe = os.popen('lpq -P' + name + ' 2>&1', 'r') |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 43 | lines = [] |
| 44 | users = {} |
| 45 | aheadbytes = 0 |
| 46 | aheadjobs = 0 |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 47 | userseen = False |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 48 | totalbytes = 0 |
| 49 | totaljobs = 0 |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 50 | for line in pipe: |
| 51 | fields = line.split() |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 52 | n = len(fields) |
| 53 | if len(fields) >= 6 and fields[n-1] == 'bytes': |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 54 | rank, user, job = fields[0:3] |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 55 | files = fields[3:-2] |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 56 | bytes = int(fields[n-2]) |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 57 | if user == thisuser: |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 58 | userseen = True |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 59 | elif not userseen: |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 60 | aheadbytes += bytes |
| 61 | aheadjobs += 1 |
| 62 | totalbytes += bytes |
| 63 | totaljobs += 1 |
| 64 | ujobs, ubytes = users.get(user, (0, 0)) |
| 65 | ujobs += 1 |
| 66 | ubytes += bytes |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 67 | users[user] = ujobs, ubytes |
| 68 | else: |
Neal Norwitz | 3bd844e | 2006-08-29 04:39:12 +0000 | [diff] [blame] | 69 | if fields and fields[0] != 'Rank': |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 70 | line = line.strip() |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 71 | if line == 'no entries': |
| 72 | line = name + ': idle' |
| 73 | elif line[-22:] == ' is ready and printing': |
| 74 | line = name |
| 75 | lines.append(line) |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 76 | |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 77 | if totaljobs: |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 78 | line = '%d K' % ((totalbytes+1023) // 1024) |
Neal Norwitz | 3bd844e | 2006-08-29 04:39:12 +0000 | [diff] [blame] | 79 | if totaljobs != len(users): |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 80 | line += ' (%d jobs)' % totaljobs |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 81 | if len(users) == 1: |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 82 | line += ' for %s' % next(iter(users)) |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 83 | else: |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 84 | line += ' for %d users' % len(users) |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 85 | if userseen: |
| 86 | if aheadjobs == 0: |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 87 | line += ' (%s first)' % thisuser |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 88 | else: |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 89 | line += ' (%d K before %s)' % ( |
| 90 | (aheadbytes+1023) // 1024, thisuser) |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 91 | lines.append(line) |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 92 | |
Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 93 | sts = pipe.close() |
| 94 | if sts: |
| 95 | lines.append('lpq exit status %r' % (sts,)) |
Georg Brandl | ec8aab6 | 2009-10-11 14:27:51 +0000 | [diff] [blame] | 96 | return ': '.join(lines) |
Guido van Rossum | ec758ea | 1991-06-04 20:36:54 +0000 | [diff] [blame] | 97 | |
Johannes Gijsbers | 7a8c43e | 2004-09-11 16:34:35 +0000 | [diff] [blame] | 98 | if __name__ == "__main__": |
| 99 | try: |
| 100 | main() |
| 101 | except KeyboardInterrupt: |
| 102 | pass |