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