blob: 90b3ecf0ede0d2da364bb6bf2c3195e20919ebd8 [file] [log] [blame]
Guido van Rossumf06ee5f1996-11-27 19:52:01 +00001#! /usr/bin/env python
Guido van Rossumec758ea1991-06-04 20:36:54 +00002
3# Watch line printer queue(s).
4# Intended for BSD 4.3 lpq.
5
Georg Brandlec8aab62009-10-11 14:27:51 +00006import os
Guido van Rossumec758ea1991-06-04 20:36:54 +00007import sys
8import time
Guido van Rossumec758ea1991-06-04 20:36:54 +00009
10DEF_PRINTER = 'psc'
11DEF_DELAY = 10
12
13def main():
Tim Peterse6ddc8b2004-07-18 05:56:09 +000014 delay = DEF_DELAY # XXX Use getopt() later
15 try:
Georg Brandlec8aab62009-10-11 14:27:51 +000016 thisuser = os.environ['LOGNAME']
Tim Peterse6ddc8b2004-07-18 05:56:09 +000017 except:
Georg Brandlec8aab62009-10-11 14:27:51 +000018 thisuser = os.environ['USER']
Tim Peterse6ddc8b2004-07-18 05:56:09 +000019 printers = sys.argv[1:]
20 if printers:
21 # Strip '-P' from printer names just in case
22 # the user specified it...
Georg Brandlec8aab62009-10-11 14:27:51 +000023 for i, name in enumerate(printers):
24 if name[:2] == '-P':
25 printers[i] = name[2:]
Tim Peterse6ddc8b2004-07-18 05:56:09 +000026 else:
Georg Brandlec8aab62009-10-11 14:27:51 +000027 if 'PRINTER' in os.environ:
28 printers = [os.environ['PRINTER']]
Tim Peterse6ddc8b2004-07-18 05:56:09 +000029 else:
30 printers = [DEF_PRINTER]
Georg Brandlec8aab62009-10-11 14:27:51 +000031
32 clearhome = os.popen('clear', 'r').read()
33
34 while True:
Tim Peterse6ddc8b2004-07-18 05:56:09 +000035 text = clearhome
36 for name in printers:
Georg Brandlec8aab62009-10-11 14:27:51 +000037 text += makestatus(name, thisuser) + '\n'
Collin Winter6f2df4d2007-07-17 20:59:35 +000038 print(text)
Tim Peterse6ddc8b2004-07-18 05:56:09 +000039 time.sleep(delay)
Guido van Rossumec758ea1991-06-04 20:36:54 +000040
Guido van Rossum7030d0a1991-12-18 13:38:58 +000041def makestatus(name, thisuser):
Georg Brandlec8aab62009-10-11 14:27:51 +000042 pipe = os.popen('lpq -P' + name + ' 2>&1', 'r')
Tim Peterse6ddc8b2004-07-18 05:56:09 +000043 lines = []
44 users = {}
45 aheadbytes = 0
46 aheadjobs = 0
Georg Brandlec8aab62009-10-11 14:27:51 +000047 userseen = False
Tim Peterse6ddc8b2004-07-18 05:56:09 +000048 totalbytes = 0
49 totaljobs = 0
Georg Brandlec8aab62009-10-11 14:27:51 +000050 for line in pipe:
51 fields = line.split()
Tim Peterse6ddc8b2004-07-18 05:56:09 +000052 n = len(fields)
53 if len(fields) >= 6 and fields[n-1] == 'bytes':
Georg Brandlec8aab62009-10-11 14:27:51 +000054 rank, user, job = fields[0:3]
Tim Peterse6ddc8b2004-07-18 05:56:09 +000055 files = fields[3:-2]
Georg Brandlec8aab62009-10-11 14:27:51 +000056 bytes = int(fields[n-2])
Tim Peterse6ddc8b2004-07-18 05:56:09 +000057 if user == thisuser:
Georg Brandlec8aab62009-10-11 14:27:51 +000058 userseen = True
Tim Peterse6ddc8b2004-07-18 05:56:09 +000059 elif not userseen:
Georg Brandlec8aab62009-10-11 14:27:51 +000060 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 Peterse6ddc8b2004-07-18 05:56:09 +000067 users[user] = ujobs, ubytes
68 else:
Neal Norwitz3bd844e2006-08-29 04:39:12 +000069 if fields and fields[0] != 'Rank':
Georg Brandlec8aab62009-10-11 14:27:51 +000070 line = line.strip()
Tim Peterse6ddc8b2004-07-18 05:56:09 +000071 if line == 'no entries':
72 line = name + ': idle'
73 elif line[-22:] == ' is ready and printing':
74 line = name
75 lines.append(line)
Georg Brandlec8aab62009-10-11 14:27:51 +000076
Tim Peterse6ddc8b2004-07-18 05:56:09 +000077 if totaljobs:
Georg Brandlec8aab62009-10-11 14:27:51 +000078 line = '%d K' % ((totalbytes+1023) // 1024)
Neal Norwitz3bd844e2006-08-29 04:39:12 +000079 if totaljobs != len(users):
Georg Brandlec8aab62009-10-11 14:27:51 +000080 line += ' (%d jobs)' % totaljobs
Tim Peterse6ddc8b2004-07-18 05:56:09 +000081 if len(users) == 1:
Georg Brandlec8aab62009-10-11 14:27:51 +000082 line += ' for %s' % next(iter(users))
Tim Peterse6ddc8b2004-07-18 05:56:09 +000083 else:
Georg Brandlec8aab62009-10-11 14:27:51 +000084 line += ' for %d users' % len(users)
Tim Peterse6ddc8b2004-07-18 05:56:09 +000085 if userseen:
86 if aheadjobs == 0:
Georg Brandlec8aab62009-10-11 14:27:51 +000087 line += ' (%s first)' % thisuser
Tim Peterse6ddc8b2004-07-18 05:56:09 +000088 else:
Georg Brandlec8aab62009-10-11 14:27:51 +000089 line += ' (%d K before %s)' % (
90 (aheadbytes+1023) // 1024, thisuser)
Tim Peterse6ddc8b2004-07-18 05:56:09 +000091 lines.append(line)
Georg Brandlec8aab62009-10-11 14:27:51 +000092
Tim Peterse6ddc8b2004-07-18 05:56:09 +000093 sts = pipe.close()
94 if sts:
95 lines.append('lpq exit status %r' % (sts,))
Georg Brandlec8aab62009-10-11 14:27:51 +000096 return ': '.join(lines)
Guido van Rossumec758ea1991-06-04 20:36:54 +000097
Johannes Gijsbers7a8c43e2004-09-11 16:34:35 +000098if __name__ == "__main__":
99 try:
100 main()
101 except KeyboardInterrupt:
102 pass