cpython/Demo/scripts/lpwatch.py

112 lines
2.4 KiB
Python
Executable File

#! /ufs/guido/bin/sgi/python
#! /usr/local/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 not printers:
if posix.environ.has_key('PRINTER'):
printers = [posix.environ['PRINTER']]
else:
printers = [DEF_PRINTER]
#
clearhome = posix.popen('clear', 'r').read()
#
while 1:
# Pipe output through cat for extra buffering,
# so the output (which overwrites the previous)
# appears instantaneous.
sys.stdout = posix.popen('exec cat', 'w')
sys.stdout.write(clearhome)
for name in printers:
pipe = posix.popen('lpq -P' + name + ' 2>&1', 'r')
showstatus(name, pipe, thisuser)
sts = pipe.close()
if sts:
print name + ': *** lpq exit status', sts
sts = sys.stdout.close()
time.sleep(delay)
def showstatus(name, pipe, thisuser):
lines = 0
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':
if line[-1:] = '\n':
line = line[:-1]
if not lines:
print name + ':',
else:
print
print line,
lines = lines + 1
if totaljobs:
if lines > 1:
print
lines = lines+1
print (totalbytes+1023)/1024, 'K',
if totaljobs <> len(users):
print '(' + `totaljobs` + ' jobs)',
if len(users) = 1:
print 'for', users.keys()[0],
else:
print 'for', len(users), 'users',
if userseen:
if aheadjobs = 0:
print '(' + thisuser + ' first)',
else:
print '(' + `(aheadbytes+1023)/1024`,
print 'K before', thisuser + ')'
if lines:
print
try:
main()
except KeyboardInterrupt:
pass