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