[2] | 1 | #! /usr/bin/env python
|
---|
| 2 |
|
---|
| 3 | # Watch line printer queue(s).
|
---|
| 4 | # Intended for BSD 4.3 lpq.
|
---|
| 5 |
|
---|
[391] | 6 | import os
|
---|
[2] | 7 | import sys
|
---|
| 8 | import time
|
---|
| 9 |
|
---|
| 10 | DEF_PRINTER = 'psc'
|
---|
| 11 | DEF_DELAY = 10
|
---|
| 12 |
|
---|
| 13 | def main():
|
---|
| 14 | delay = DEF_DELAY # XXX Use getopt() later
|
---|
| 15 | try:
|
---|
[391] | 16 | thisuser = os.environ['LOGNAME']
|
---|
[2] | 17 | except:
|
---|
[391] | 18 | thisuser = os.environ['USER']
|
---|
[2] | 19 | printers = sys.argv[1:]
|
---|
| 20 | if printers:
|
---|
| 21 | # Strip '-P' from printer names just in case
|
---|
| 22 | # the user specified it...
|
---|
[391] | 23 | for i, name in enumerate(printers):
|
---|
| 24 | if name[:2] == '-P':
|
---|
| 25 | printers[i] = name[2:]
|
---|
[2] | 26 | else:
|
---|
[391] | 27 | if os.environ.has_key('PRINTER'):
|
---|
| 28 | printers = [os.environ['PRINTER']]
|
---|
[2] | 29 | else:
|
---|
| 30 | printers = [DEF_PRINTER]
|
---|
[391] | 31 |
|
---|
| 32 | clearhome = os.popen('clear', 'r').read()
|
---|
| 33 |
|
---|
| 34 | while True:
|
---|
[2] | 35 | text = clearhome
|
---|
| 36 | for name in printers:
|
---|
[391] | 37 | text += makestatus(name, thisuser) + '\n'
|
---|
[2] | 38 | print text
|
---|
| 39 | time.sleep(delay)
|
---|
| 40 |
|
---|
| 41 | def makestatus(name, thisuser):
|
---|
[391] | 42 | pipe = os.popen('lpq -P' + name + ' 2>&1', 'r')
|
---|
[2] | 43 | lines = []
|
---|
| 44 | users = {}
|
---|
| 45 | aheadbytes = 0
|
---|
| 46 | aheadjobs = 0
|
---|
[391] | 47 | userseen = False
|
---|
[2] | 48 | totalbytes = 0
|
---|
| 49 | totaljobs = 0
|
---|
[391] | 50 | for line in pipe:
|
---|
| 51 | fields = line.split()
|
---|
[2] | 52 | n = len(fields)
|
---|
| 53 | if len(fields) >= 6 and fields[n-1] == 'bytes':
|
---|
[391] | 54 | rank, user, job = fields[0:3]
|
---|
[2] | 55 | files = fields[3:-2]
|
---|
[391] | 56 | bytes = int(fields[n-2])
|
---|
[2] | 57 | if user == thisuser:
|
---|
[391] | 58 | userseen = True
|
---|
[2] | 59 | elif not userseen:
|
---|
[391] | 60 | 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
|
---|
[2] | 67 | users[user] = ujobs, ubytes
|
---|
| 68 | else:
|
---|
[391] | 69 | if fields and fields[0] != 'Rank':
|
---|
| 70 | line = line.strip()
|
---|
[2] | 71 | if line == 'no entries':
|
---|
| 72 | line = name + ': idle'
|
---|
| 73 | elif line[-22:] == ' is ready and printing':
|
---|
| 74 | line = name
|
---|
| 75 | lines.append(line)
|
---|
[391] | 76 |
|
---|
[2] | 77 | if totaljobs:
|
---|
[391] | 78 | line = '%d K' % ((totalbytes+1023) // 1024)
|
---|
| 79 | if totaljobs != len(users):
|
---|
| 80 | line += ' (%d jobs)' % totaljobs
|
---|
[2] | 81 | if len(users) == 1:
|
---|
[391] | 82 | line += ' for %s' % (users.keys()[0],)
|
---|
[2] | 83 | else:
|
---|
[391] | 84 | line += ' for %d users' % len(users)
|
---|
[2] | 85 | if userseen:
|
---|
| 86 | if aheadjobs == 0:
|
---|
[391] | 87 | line += ' (%s first)' % thisuser
|
---|
[2] | 88 | else:
|
---|
[391] | 89 | line += ' (%d K before %s)' % (
|
---|
| 90 | (aheadbytes+1023) // 1024, thisuser)
|
---|
[2] | 91 | lines.append(line)
|
---|
[391] | 92 |
|
---|
[2] | 93 | sts = pipe.close()
|
---|
| 94 | if sts:
|
---|
| 95 | lines.append('lpq exit status %r' % (sts,))
|
---|
[391] | 96 | return ': '.join(lines)
|
---|
[2] | 97 |
|
---|
| 98 | if __name__ == "__main__":
|
---|
| 99 | try:
|
---|
| 100 | main()
|
---|
| 101 | except KeyboardInterrupt:
|
---|
| 102 | pass
|
---|