| 
									
										
										
										
											1996-11-27 19:52:01 +00:00
										 |  |  | #! /usr/bin/env python | 
					
						
							| 
									
										
										
										
											1991-06-04 20:36:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # 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:] | 
					
						
							| 
									
										
										
										
											1991-07-01 18:21:32 +00:00
										 |  |  | 	if printers: | 
					
						
							|  |  |  | 		# Strip '-P' from printer names just in case | 
					
						
							|  |  |  | 		# the user specified it... | 
					
						
							|  |  |  | 		for i in range(len(printers)): | 
					
						
							| 
									
										
										
										
											1992-01-01 19:35:13 +00:00
										 |  |  | 			if printers[i][:2] == '-P': | 
					
						
							| 
									
										
										
										
											1991-07-01 18:21:32 +00:00
										 |  |  | 				printers[i] = printers[i][2:] | 
					
						
							|  |  |  | 	else: | 
					
						
							| 
									
										
										
										
											1991-06-04 20:36:54 +00:00
										 |  |  | 		if posix.environ.has_key('PRINTER'): | 
					
						
							|  |  |  | 			printers = [posix.environ['PRINTER']] | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			printers = [DEF_PRINTER] | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	clearhome = posix.popen('clear', 'r').read() | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	while 1: | 
					
						
							| 
									
										
										
										
											1991-12-18 13:38:58 +00:00
										 |  |  | 		text = clearhome | 
					
						
							| 
									
										
										
										
											1991-06-04 20:36:54 +00:00
										 |  |  | 		for name in printers: | 
					
						
							| 
									
										
										
										
											1991-12-18 13:38:58 +00:00
										 |  |  | 			text = text + makestatus(name, thisuser) + '\n' | 
					
						
							|  |  |  | 		print text | 
					
						
							| 
									
										
										
										
											1991-06-04 20:36:54 +00:00
										 |  |  | 		time.sleep(delay) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1991-12-18 13:38:58 +00:00
										 |  |  | def makestatus(name, thisuser): | 
					
						
							|  |  |  | 	pipe = posix.popen('lpq -P' + name + ' 2>&1', 'r') | 
					
						
							|  |  |  | 	lines = [] | 
					
						
							| 
									
										
										
										
											1991-06-04 20:36:54 +00:00
										 |  |  | 	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) | 
					
						
							| 
									
										
										
										
											1992-01-01 19:35:13 +00:00
										 |  |  | 		if len(fields) >= 6 and fields[n-1] == 'bytes': | 
					
						
							| 
									
										
										
										
											1991-06-04 20:36:54 +00:00
										 |  |  | 			rank = fields[0] | 
					
						
							|  |  |  | 			user = fields[1] | 
					
						
							|  |  |  | 			job = fields[2] | 
					
						
							|  |  |  | 			files = fields[3:-2] | 
					
						
							|  |  |  | 			bytes = eval(fields[n-2]) | 
					
						
							| 
									
										
										
										
											1992-01-01 19:35:13 +00:00
										 |  |  | 			if user == thisuser: | 
					
						
							| 
									
										
										
										
											1991-06-04 20:36:54 +00:00
										 |  |  | 				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': | 
					
						
							| 
									
										
										
										
											1991-12-18 13:38:58 +00:00
										 |  |  | 				line = string.strip(line) | 
					
						
							| 
									
										
										
										
											1992-01-01 19:35:13 +00:00
										 |  |  | 				if line == 'no entries': | 
					
						
							| 
									
										
										
										
											1991-12-18 13:38:58 +00:00
										 |  |  | 					line = name + ': idle' | 
					
						
							| 
									
										
										
										
											1992-01-01 19:35:13 +00:00
										 |  |  | 				elif line[-22:] == ' is ready and printing': | 
					
						
							| 
									
										
										
										
											1991-12-18 13:38:58 +00:00
										 |  |  | 					line = name | 
					
						
							|  |  |  | 				lines.append(line) | 
					
						
							|  |  |  | 	# | 
					
						
							| 
									
										
										
										
											1991-06-04 20:36:54 +00:00
										 |  |  | 	if totaljobs: | 
					
						
							| 
									
										
										
										
											1991-12-18 13:38:58 +00:00
										 |  |  | 		line = `(totalbytes+1023)/1024` + ' K' | 
					
						
							| 
									
										
										
										
											1991-06-04 20:36:54 +00:00
										 |  |  | 		if totaljobs <> len(users): | 
					
						
							| 
									
										
										
										
											1991-12-18 13:38:58 +00:00
										 |  |  | 			line = line + ' (' + `totaljobs` + ' jobs)' | 
					
						
							| 
									
										
										
										
											1992-01-01 19:35:13 +00:00
										 |  |  | 		if len(users) == 1: | 
					
						
							| 
									
										
										
										
											1991-12-18 13:38:58 +00:00
										 |  |  | 			line = line + ' for ' + users.keys()[0] | 
					
						
							| 
									
										
										
										
											1991-06-04 20:36:54 +00:00
										 |  |  | 		else: | 
					
						
							| 
									
										
										
										
											1991-12-18 13:38:58 +00:00
										 |  |  | 			line = line + ' for ' + `len(users)` + ' users' | 
					
						
							| 
									
										
										
										
											1991-07-01 18:21:32 +00:00
										 |  |  | 			if userseen: | 
					
						
							| 
									
										
										
										
											1992-01-01 19:35:13 +00:00
										 |  |  | 				if aheadjobs == 0: | 
					
						
							| 
									
										
										
										
											1991-12-18 13:38:58 +00:00
										 |  |  | 				  line =  line + ' (' + thisuser + ' first)' | 
					
						
							| 
									
										
										
										
											1991-07-01 18:21:32 +00:00
										 |  |  | 				else: | 
					
						
							| 
									
										
										
										
											1991-12-18 13:38:58 +00:00
										 |  |  | 				  line = line + ' (' + `(aheadbytes+1023)/1024` | 
					
						
							|  |  |  | 				  line = line + ' K before ' + thisuser + ')' | 
					
						
							|  |  |  | 		lines.append(line) | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	sts = pipe.close() | 
					
						
							|  |  |  | 	if sts: | 
					
						
							|  |  |  | 		lines.append('lpq exit status ' + `sts`) | 
					
						
							|  |  |  | 	return string.joinfields(lines, ': ') | 
					
						
							| 
									
										
										
										
											1991-06-04 20:36:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  | 	main() | 
					
						
							|  |  |  | except KeyboardInterrupt: | 
					
						
							|  |  |  | 	pass |