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