summaryrefslogtreecommitdiffstats
path: root/Demo/scripts/lpwatch.py
blob: 00afba9d6b1dcc80e2063890dfb5158baf29f422 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#! /usr/bin/env 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 printers:
		# Strip '-P' from printer names just in case
		# the user specified it...
		for i in range(len(printers)):
			if printers[i][:2] == '-P':
				printers[i] = printers[i][2:]
	else:
		if posix.environ.has_key('PRINTER'):
			printers = [posix.environ['PRINTER']]
		else:
			printers = [DEF_PRINTER]
	#
	clearhome = posix.popen('clear', 'r').read()
	#
	while 1:
		text = clearhome
		for name in printers:
			text = text + makestatus(name, thisuser) + '\n'
		print text
		time.sleep(delay)

def makestatus(name, thisuser):
	pipe = posix.popen('lpq -P' + name + ' 2>&1', 'r')
	lines = []
	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':
				line = string.strip(line)
				if line == 'no entries':
					line = name + ': idle'
				elif line[-22:] == ' is ready and printing':
					line = name
				lines.append(line)
	#
	if totaljobs:
		line = '%d K' % ((totalbytes+1023)/1024)
		if totaljobs <> len(users):
			line = line + ' (%d jobs)' % totaljobs
		if len(users) == 1:
			line = line + ' for %s' % (users.keys()[0],)
		else:
			line = line + ' for %d users' % len(users)
			if userseen:
				if aheadjobs == 0:
					line =  line + ' (%s first)' % thisuser
				else:
					line = line + ' (%d K before %s)' % (
					               (aheadbytes+1023)/1024, thisuser)
		lines.append(line)
	#
	sts = pipe.close()
	if sts:
		lines.append('lpq exit status %r' % (sts,))
	return string.joinfields(lines, ': ')

try:
	main()
except KeyboardInterrupt:
	pass