annotate Demo/scripts/ftpstats.py @ 5817:48b94de85bf3 legacy-trunk

Extensive changes by AMK.
author Guido van Rossum <guido@python.org>
date Thu, 17 Jul 1997 16:29:42 +0000
parents 73758db2f464
children b52864c5e9c9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4573
73758db2f464 /usr/local/bin/python -> /usr/bin/env python
Guido van Rossum <guido@python.org>
parents: 1501
diff changeset
1 #! /usr/bin/env python
1501
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # Extract statistics from ftp daemon log.
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # Usage:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 # ftpstats [-m maxitems] [-s search] [file]
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # -m maxitems: restrict number of items in "top-N" lists, default 25.
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 # -s string: restrict statistics to lines containing this string.
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 # Default file is /usr/adm/ftpd; a "-" means read stdandard input.
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 # The script must be run on the host where the ftp daemon runs.
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 # (At CWI this is currently buizerd.)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 import os
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 import sys
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 import regex
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 import string
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 import getopt
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 pat = '^\([a-zA-Z0-9 :]*\)!\(.*\)!\(.*\)!\([<>].*\)!\([0-9]+\)!\([0-9]+\)$'
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 prog = regex.compile(pat)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 def main():
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 maxitems = 25
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 search = None
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 try:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 opts, args = getopt.getopt(sys.argv[1:], 'm:s:')
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 except getopt.error, msg:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 print msg
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 print 'usage: ftpstats [-m maxitems] [file]'
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 sys.exit(2)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 for o, a in opts:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 if o == '-m':
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 maxitems = string.atoi(a)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 if o == '-s':
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 search = a
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 file = '/usr/adm/ftpd'
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 if args: file = args[0]
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 if file == '-':
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 f = sys.stdin
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 else:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 try:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 f = open(file, 'r')
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 except IOError, msg:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 print file, ':', msg
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 sys.exit(1)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 bydate = {}
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 bytime = {}
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 byfile = {}
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 bydir = {}
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 byhost = {}
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 byuser = {}
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 bytype = {}
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 lineno = 0
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 try:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 while 1:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 line = f.readline()
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 if not line: break
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 lineno = lineno + 1
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 if search and string.find(line, search) < 0:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 continue
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 if prog.match(line) < 0:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 print 'Bad line', lineno, ':', `line`
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 continue
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 items = prog.group(1, 2, 3, 4, 5, 6)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 logtime, loguser, loghost, logfile, logbytes, logxxx2 = items
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 ## print logtime
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 ## print '-->', loguser
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 ## print '--> -->', loghost
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 ## print '--> --> -->', logfile
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 ## print '--> --> --> -->', logbytes
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 ## print '--> --> --> --> -->', logxxx2
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 ## for i in logtime, loghost, logbytes, logxxx2:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 ## if '!' in i: print '???', i
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 add(bydate, logtime[-4:] + ' ' + logtime[:6], items)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 add(bytime, logtime[7:9] + ':00-59', items)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 direction, logfile = logfile[0], logfile[1:]
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 # The real path probably starts at the last //...
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 while 1:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 i = string.find(logfile, '//')
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 if i < 0: break
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 logfile = logfile[i+1:]
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 add(byfile, logfile + ' ' + direction, items)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 logdir = os.path.dirname(logfile)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 ## logdir = os.path.normpath(logdir) + '/.'
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 while 1:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 add(bydir, logdir + ' ' + direction, items)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 dirhead = os.path.dirname(logdir)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 if dirhead == logdir: break
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 logdir = dirhead
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 add(byhost, loghost, items)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 add(byuser, loguser, items)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 add(bytype, direction, items)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 except KeyboardInterrupt:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 print 'Interrupted at line', lineno
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 show(bytype, 'by transfer direction', maxitems)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 show(bydir, 'by directory', maxitems)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 show(byfile, 'by file', maxitems)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 show(byhost, 'by host', maxitems)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 show(byuser, 'by user', maxitems)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 showbar(bydate, 'by date')
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 showbar(bytime, 'by time of day')
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 def showbar(dict, title):
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 n = len(title)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 print '='*((70-n)/2), title, '='*((71-n)/2)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 list = []
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 keys = dict.keys()
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 keys.sort()
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 for key in keys:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 n = len(str(key))
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 list.append((len(dict[key]), key))
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 maxkeylength = 0
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 maxcount = 0
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 for count, key in list:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 maxkeylength = max(maxkeylength, len(key))
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 maxcount = max(maxcount, count)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 maxbarlength = 72 - maxkeylength - 7
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 for count, key in list:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 barlength = int(round(maxbarlength*float(count)/maxcount))
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 bar = '*'*barlength
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 print '%5d %-*s %s' % (count, maxkeylength, key, bar)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
123
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 def show(dict, title, maxitems):
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 if len(dict) > maxitems:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 title = title + ' (first %d)'%maxitems
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 n = len(title)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 print '='*((70-n)/2), title, '='*((71-n)/2)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 list = []
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 keys = dict.keys()
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 for key in keys:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 list.append((-len(dict[key]), key))
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 list.sort()
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 for count, key in list[:maxitems]:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 print '%5d %s' % (-count, key)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
136
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 def add(dict, key, item):
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 if dict.has_key(key):
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 dict[key].append(item)
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 else:
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 dict[key] = [item]
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142
783ef361f395 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 main()