mirror of
https://github.com/python/cpython.git
synced 2024-11-28 16:45:42 +01:00
112 lines
2.4 KiB
Python
112 lines
2.4 KiB
Python
|
#! /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
|