cpython/Demo/scripts/lpwatch.py

103 lines
2.8 KiB
Python
Raw Normal View History

#! /usr/bin/env python
1991-06-04 17:36:54 -03:00
# Watch line printer queue(s).
# Intended for BSD 4.3 lpq.
2009-10-11 11:23:49 -03:00
import os
1991-06-04 17:36:54 -03:00
import sys
import time
DEF_PRINTER = 'psc'
DEF_DELAY = 10
def main():
delay = DEF_DELAY # XXX Use getopt() later
try:
2009-10-11 11:23:49 -03:00
thisuser = os.environ['LOGNAME']
except:
2009-10-11 11:23:49 -03:00
thisuser = os.environ['USER']
printers = sys.argv[1:]
if printers:
# Strip '-P' from printer names just in case
# the user specified it...
2009-10-11 11:23:49 -03:00
for i, name in enumerate(printers):
if name[:2] == '-P':
printers[i] = name[2:]
else:
2009-10-11 11:23:49 -03:00
if os.environ.has_key('PRINTER'):
printers = [os.environ['PRINTER']]
else:
printers = [DEF_PRINTER]
2009-10-11 11:23:49 -03:00
clearhome = os.popen('clear', 'r').read()
while True:
text = clearhome
for name in printers:
2009-10-11 11:23:49 -03:00
text += makestatus(name, thisuser) + '\n'
print text
time.sleep(delay)
1991-06-04 17:36:54 -03:00
1991-12-18 09:38:58 -04:00
def makestatus(name, thisuser):
2009-10-11 11:23:49 -03:00
pipe = os.popen('lpq -P' + name + ' 2>&1', 'r')
lines = []
users = {}
aheadbytes = 0
aheadjobs = 0
2009-10-11 11:23:49 -03:00
userseen = False
totalbytes = 0
totaljobs = 0
2009-10-11 11:23:49 -03:00
for line in pipe:
fields = line.split()
n = len(fields)
if len(fields) >= 6 and fields[n-1] == 'bytes':
2009-10-11 11:23:49 -03:00
rank, user, job = fields[0:3]
files = fields[3:-2]
2009-10-11 11:23:49 -03:00
bytes = int(fields[n-2])
if user == thisuser:
2009-10-11 11:23:49 -03:00
userseen = True
elif not userseen:
2009-10-11 11:23:49 -03:00
aheadbytes += bytes
aheadjobs += 1
totalbytes += bytes
totaljobs += 1
ujobs, ubytes = users.get(user, (0, 0))
ujobs += 1
ubytes += bytes
users[user] = ujobs, ubytes
else:
2009-10-11 11:23:49 -03:00
if fields and fields[0] != 'Rank':
line = line.strip()
if line == 'no entries':
line = name + ': idle'
elif line[-22:] == ' is ready and printing':
line = name
lines.append(line)
2009-10-11 11:23:49 -03:00
if totaljobs:
2009-10-11 11:23:49 -03:00
line = '%d K' % ((totalbytes+1023) // 1024)
if totaljobs != len(users):
line += ' (%d jobs)' % totaljobs
if len(users) == 1:
2009-10-11 11:23:49 -03:00
line += ' for %s' % (users.keys()[0],)
else:
2009-10-11 11:23:49 -03:00
line += ' for %d users' % len(users)
if userseen:
if aheadjobs == 0:
2009-10-11 11:23:49 -03:00
line += ' (%s first)' % thisuser
else:
2009-10-11 11:23:49 -03:00
line += ' (%d K before %s)' % (
(aheadbytes+1023) // 1024, thisuser)
lines.append(line)
2009-10-11 11:23:49 -03:00
sts = pipe.close()
if sts:
lines.append('lpq exit status %r' % (sts,))
2009-10-11 11:23:49 -03:00
return ': '.join(lines)
1991-06-04 17:36:54 -03:00
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
pass