This commit was manufactured by cvs2svn to create tag 'r22a4-fork'.
[python/dscho.git] / Demo / scripts / lpwatch.py
blob9f051ebbf396c31d2f2ac0dbf7ff36fc0d5b3335
1 #! /usr/bin/env python
3 # Watch line printer queue(s).
4 # Intended for BSD 4.3 lpq.
6 import posix
7 import sys
8 import time
9 import string
11 DEF_PRINTER = 'psc'
12 DEF_DELAY = 10
14 def main():
15 delay = DEF_DELAY # XXX Use getopt() later
16 try:
17 thisuser = posix.environ['LOGNAME']
18 except:
19 thisuser = posix.environ['USER']
20 printers = sys.argv[1:]
21 if printers:
22 # Strip '-P' from printer names just in case
23 # the user specified it...
24 for i in range(len(printers)):
25 if printers[i][:2] == '-P':
26 printers[i] = printers[i][2:]
27 else:
28 if posix.environ.has_key('PRINTER'):
29 printers = [posix.environ['PRINTER']]
30 else:
31 printers = [DEF_PRINTER]
33 clearhome = posix.popen('clear', 'r').read()
35 while 1:
36 text = clearhome
37 for name in printers:
38 text = text + makestatus(name, thisuser) + '\n'
39 print text
40 time.sleep(delay)
42 def makestatus(name, thisuser):
43 pipe = posix.popen('lpq -P' + name + ' 2>&1', 'r')
44 lines = []
45 users = {}
46 aheadbytes = 0
47 aheadjobs = 0
48 userseen = 0
49 totalbytes = 0
50 totaljobs = 0
51 while 1:
52 line = pipe.readline()
53 if not line: break
54 fields = string.split(line)
55 n = len(fields)
56 if len(fields) >= 6 and fields[n-1] == 'bytes':
57 rank = fields[0]
58 user = fields[1]
59 job = fields[2]
60 files = fields[3:-2]
61 bytes = eval(fields[n-2])
62 if user == thisuser:
63 userseen = 1
64 elif not userseen:
65 aheadbytes = aheadbytes + bytes
66 aheadjobs = aheadjobs + 1
67 totalbytes = totalbytes + bytes
68 totaljobs = totaljobs + 1
69 if users.has_key(user):
70 ujobs, ubytes = users[user]
71 else:
72 ujobs, ubytes = 0, 0
73 ujobs = ujobs + 1
74 ubytes = ubytes + bytes
75 users[user] = ujobs, ubytes
76 else:
77 if fields and fields[0] <> 'Rank':
78 line = string.strip(line)
79 if line == 'no entries':
80 line = name + ': idle'
81 elif line[-22:] == ' is ready and printing':
82 line = name
83 lines.append(line)
85 if totaljobs:
86 line = `(totalbytes+1023)/1024` + ' K'
87 if totaljobs <> len(users):
88 line = line + ' (' + `totaljobs` + ' jobs)'
89 if len(users) == 1:
90 line = line + ' for ' + users.keys()[0]
91 else:
92 line = line + ' for ' + `len(users)` + ' users'
93 if userseen:
94 if aheadjobs == 0:
95 line = line + ' (' + thisuser + ' first)'
96 else:
97 line = line + ' (' + `(aheadbytes+1023)/1024`
98 line = line + ' K before ' + thisuser + ')'
99 lines.append(line)
101 sts = pipe.close()
102 if sts:
103 lines.append('lpq exit status ' + `sts`)
104 return string.joinfields(lines, ': ')
106 try:
107 main()
108 except KeyboardInterrupt:
109 pass