summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1994-01-07 10:53:41 (GMT)
committerGuido van Rossum <guido@python.org>1994-01-07 10:53:41 (GMT)
commit4e8aef842cf2f1b0b6115fffbd79796c54afa325 (patch)
tree65edd6b3e46f3df90c245622a00b827c9d967dc8
parent658c9982d8ba936b085afcbe1a62c4e5bb9bd070 (diff)
downloadcpython-4e8aef842cf2f1b0b6115fffbd79796c54afa325.zip
cpython-4e8aef842cf2f1b0b6115fffbd79796c54afa325.tar.gz
cpython-4e8aef842cf2f1b0b6115fffbd79796c54afa325.tar.bz2
Initial revision
-rwxr-xr-xDemo/scripts/ftpstats.py143
1 files changed, 143 insertions, 0 deletions
diff --git a/Demo/scripts/ftpstats.py b/Demo/scripts/ftpstats.py
new file mode 100755
index 0000000..9c643fe
--- /dev/null
+++ b/Demo/scripts/ftpstats.py
@@ -0,0 +1,143 @@
+#! /usr/local/bin/python
+
+# Extract statistics from ftp daemon log.
+
+# Usage:
+# ftpstats [-m maxitems] [-s search] [file]
+# -m maxitems: restrict number of items in "top-N" lists, default 25.
+# -s string: restrict statistics to lines containing this string.
+# Default file is /usr/adm/ftpd; a "-" means read stdandard input.
+
+# The script must be run on the host where the ftp daemon runs.
+# (At CWI this is currently buizerd.)
+
+import os
+import sys
+import regex
+import string
+import getopt
+
+pat = '^\([a-zA-Z0-9 :]*\)!\(.*\)!\(.*\)!\([<>].*\)!\([0-9]+\)!\([0-9]+\)$'
+prog = regex.compile(pat)
+
+def main():
+ maxitems = 25
+ search = None
+ try:
+ opts, args = getopt.getopt(sys.argv[1:], 'm:s:')
+ except getopt.error, msg:
+ print msg
+ print 'usage: ftpstats [-m maxitems] [file]'
+ sys.exit(2)
+ for o, a in opts:
+ if o == '-m':
+ maxitems = string.atoi(a)
+ if o == '-s':
+ search = a
+ file = '/usr/adm/ftpd'
+ if args: file = args[0]
+ if file == '-':
+ f = sys.stdin
+ else:
+ try:
+ f = open(file, 'r')
+ except IOError, msg:
+ print file, ':', msg
+ sys.exit(1)
+ bydate = {}
+ bytime = {}
+ byfile = {}
+ bydir = {}
+ byhost = {}
+ byuser = {}
+ bytype = {}
+ lineno = 0
+ try:
+ while 1:
+ line = f.readline()
+ if not line: break
+ lineno = lineno + 1
+ if search and string.find(line, search) < 0:
+ continue
+ if prog.match(line) < 0:
+ print 'Bad line', lineno, ':', `line`
+ continue
+ items = prog.group(1, 2, 3, 4, 5, 6)
+ logtime, loguser, loghost, logfile, logbytes, logxxx2 = items
+## print logtime
+## print '-->', loguser
+## print '--> -->', loghost
+## print '--> --> -->', logfile
+## print '--> --> --> -->', logbytes
+## print '--> --> --> --> -->', logxxx2
+## for i in logtime, loghost, logbytes, logxxx2:
+## if '!' in i: print '???', i
+ add(bydate, logtime[-4:] + ' ' + logtime[:6], items)
+ add(bytime, logtime[7:9] + ':00-59', items)
+ direction, logfile = logfile[0], logfile[1:]
+ # The real path probably starts at the last //...
+ while 1:
+ i = string.find(logfile, '//')
+ if i < 0: break
+ logfile = logfile[i+1:]
+ add(byfile, logfile + ' ' + direction, items)
+ logdir = os.path.dirname(logfile)
+## logdir = os.path.normpath(logdir) + '/.'
+ while 1:
+ add(bydir, logdir + ' ' + direction, items)
+ dirhead = os.path.dirname(logdir)
+ if dirhead == logdir: break
+ logdir = dirhead
+ add(byhost, loghost, items)
+ add(byuser, loguser, items)
+ add(bytype, direction, items)
+ except KeyboardInterrupt:
+ print 'Interrupted at line', lineno
+ show(bytype, 'by transfer direction', maxitems)
+ show(bydir, 'by directory', maxitems)
+ show(byfile, 'by file', maxitems)
+ show(byhost, 'by host', maxitems)
+ show(byuser, 'by user', maxitems)
+ showbar(bydate, 'by date')
+ showbar(bytime, 'by time of day')
+
+def showbar(dict, title):
+ n = len(title)
+ print '='*((70-n)/2), title, '='*((71-n)/2)
+ list = []
+ keys = dict.keys()
+ keys.sort()
+ for key in keys:
+ n = len(str(key))
+ list.append((len(dict[key]), key))
+ maxkeylength = 0
+ maxcount = 0
+ for count, key in list:
+ maxkeylength = max(maxkeylength, len(key))
+ maxcount = max(maxcount, count)
+ maxbarlength = 72 - maxkeylength - 7
+ for count, key in list:
+ barlength = int(round(maxbarlength*float(count)/maxcount))
+ bar = '*'*barlength
+ print '%5d %-*s %s' % (count, maxkeylength, key, bar)
+
+def show(dict, title, maxitems):
+ if len(dict) > maxitems:
+ title = title + ' (first %d)'%maxitems
+ n = len(title)
+ print '='*((70-n)/2), title, '='*((71-n)/2)
+ list = []
+ keys = dict.keys()
+ for key in keys:
+ list.append((-len(dict[key]), key))
+ list.sort()
+ for count, key in list[:maxitems]:
+ print '%5d %s' % (-count, key)
+
+def add(dict, key, item):
+ if dict.has_key(key):
+ dict[key].append(item)
+ else:
+ dict[key] = [item]
+
+main()