mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			102 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
#! /usr/bin/env python
 | 
						|
 | 
						|
# Watch line printer queue(s).
 | 
						|
# Intended for BSD 4.3 lpq.
 | 
						|
 | 
						|
import os
 | 
						|
import sys
 | 
						|
import time
 | 
						|
 | 
						|
DEF_PRINTER = 'psc'
 | 
						|
DEF_DELAY = 10
 | 
						|
 | 
						|
def main():
 | 
						|
    delay = DEF_DELAY # XXX Use getopt() later
 | 
						|
    try:
 | 
						|
        thisuser = os.environ['LOGNAME']
 | 
						|
    except:
 | 
						|
        thisuser = os.environ['USER']
 | 
						|
    printers = sys.argv[1:]
 | 
						|
    if printers:
 | 
						|
        # Strip '-P' from printer names just in case
 | 
						|
        # the user specified it...
 | 
						|
        for i, name in enumerate(printers):
 | 
						|
            if name[:2] == '-P':
 | 
						|
                printers[i] = name[2:]
 | 
						|
    else:
 | 
						|
        if os.environ.has_key('PRINTER'):
 | 
						|
            printers = [os.environ['PRINTER']]
 | 
						|
        else:
 | 
						|
            printers = [DEF_PRINTER]
 | 
						|
 | 
						|
    clearhome = os.popen('clear', 'r').read()
 | 
						|
 | 
						|
    while True:
 | 
						|
        text = clearhome
 | 
						|
        for name in printers:
 | 
						|
            text += makestatus(name, thisuser) + '\n'
 | 
						|
        print text
 | 
						|
        time.sleep(delay)
 | 
						|
 | 
						|
def makestatus(name, thisuser):
 | 
						|
    pipe = os.popen('lpq -P' + name + ' 2>&1', 'r')
 | 
						|
    lines = []
 | 
						|
    users = {}
 | 
						|
    aheadbytes = 0
 | 
						|
    aheadjobs = 0
 | 
						|
    userseen = False
 | 
						|
    totalbytes = 0
 | 
						|
    totaljobs = 0
 | 
						|
    for line in pipe:
 | 
						|
        fields = line.split()
 | 
						|
        n = len(fields)
 | 
						|
        if len(fields) >= 6 and fields[n-1] == 'bytes':
 | 
						|
            rank, user, job = fields[0:3]
 | 
						|
            files = fields[3:-2]
 | 
						|
            bytes = int(fields[n-2])
 | 
						|
            if user == thisuser:
 | 
						|
                userseen = True
 | 
						|
            elif not userseen:
 | 
						|
                aheadbytes += bytes
 | 
						|
                aheadjobs += 1
 | 
						|
            totalbytes += bytes
 | 
						|
            totaljobs += 1
 | 
						|
            ujobs, ubytes = users.get(user, (0, 0))
 | 
						|
            ujobs += 1
 | 
						|
            ubytes += bytes
 | 
						|
            users[user] = ujobs, ubytes
 | 
						|
        else:
 | 
						|
            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)
 | 
						|
 | 
						|
    if totaljobs:
 | 
						|
        line = '%d K' % ((totalbytes+1023) // 1024)
 | 
						|
        if totaljobs != len(users):
 | 
						|
            line += ' (%d jobs)' % totaljobs
 | 
						|
        if len(users) == 1:
 | 
						|
            line += ' for %s' % (users.keys()[0],)
 | 
						|
        else:
 | 
						|
            line += ' for %d users' % len(users)
 | 
						|
            if userseen:
 | 
						|
                if aheadjobs == 0:
 | 
						|
                    line += ' (%s first)' % thisuser
 | 
						|
                else:
 | 
						|
                    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 ': '.join(lines)
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    try:
 | 
						|
        main()
 | 
						|
    except KeyboardInterrupt:
 | 
						|
        pass
 |