3 # Extract statistics from ftp daemon log.
6 # ftpstats [-m maxitems] [-s search] [file]
7 # -m maxitems: restrict number of items in "top-N" lists, default 25.
8 # -s string: restrict statistics to lines containing this string.
9 # Default file is /usr/adm/ftpd; a "-" means read stdandard input.
11 # The script must be run on the host where the ftp daemon runs.
12 # (At CWI this is currently buizerd.)
20 pat
= '^\([a-zA-Z0-9 :]*\)!\(.*\)!\(.*\)!\([<>].*\)!\([0-9]+\)!\([0-9]+\)$'
21 prog
= regex
.compile(pat
)
27 opts
, args
= getopt
.getopt(sys
.argv
[1:], 'm:s:')
28 except getopt
.error
, msg
:
30 print 'usage: ftpstats [-m maxitems] [file]'
34 maxitems
= string
.atoi(a
)
37 file = '/usr/adm/ftpd'
38 if args
: file = args
[0]
60 if search
and string
.find(line
, search
) < 0:
62 if prog
.match(line
) < 0:
63 print 'Bad line', lineno
, ':', `line`
65 items
= prog
.group(1, 2, 3, 4, 5, 6)
66 logtime
, loguser
, loghost
, logfile
, logbytes
, logxxx2
= items
68 ## print '-->', loguser
69 ## print '--> -->', loghost
70 ## print '--> --> -->', logfile
71 ## print '--> --> --> -->', logbytes
72 ## print '--> --> --> --> -->', logxxx2
73 ## for i in logtime, loghost, logbytes, logxxx2:
74 ## if '!' in i: print '???', i
75 add(bydate
, logtime
[-4:] + ' ' + logtime
[:6], items
)
76 add(bytime
, logtime
[7:9] + ':00-59', items
)
77 direction
, logfile
= logfile
[0], logfile
[1:]
78 # The real path probably starts at the last //...
80 i
= string
.find(logfile
, '//')
82 logfile
= logfile
[i
+1:]
83 add(byfile
, logfile
+ ' ' + direction
, items
)
84 logdir
= os
.path
.dirname(logfile
)
85 ## logdir = os.path.normpath(logdir) + '/.'
87 add(bydir
, logdir
+ ' ' + direction
, items
)
88 dirhead
= os
.path
.dirname(logdir
)
89 if dirhead
== logdir
: break
91 add(byhost
, loghost
, items
)
92 add(byuser
, loguser
, items
)
93 add(bytype
, direction
, items
)
94 except KeyboardInterrupt:
95 print 'Interrupted at line', lineno
96 show(bytype
, 'by transfer direction', maxitems
)
97 show(bydir
, 'by directory', maxitems
)
98 show(byfile
, 'by file', maxitems
)
99 show(byhost
, 'by host', maxitems
)
100 show(byuser
, 'by user', maxitems
)
101 showbar(bydate
, 'by date')
102 showbar(bytime
, 'by time of day')
104 def showbar(dict, title
):
106 print '='*((70-n
)/2), title
, '='*((71-n
)/2)
112 list.append((len(dict[key
]), key
))
115 for count
, key
in list:
116 maxkeylength
= max(maxkeylength
, len(key
))
117 maxcount
= max(maxcount
, count
)
118 maxbarlength
= 72 - maxkeylength
- 7
119 for count
, key
in list:
120 barlength
= int(round(maxbarlength
*float(count
)/maxcount
))
122 print '%5d %-*s %s' % (count
, maxkeylength
, key
, bar
)
124 def show(dict, title
, maxitems
):
125 if len(dict) > maxitems
:
126 title
= title
+ ' (first %d)'%maxitems
128 print '='*((70-n
)/2), title
, '='*((71-n
)/2)
132 list.append((-len(dict[key
]), key
))
134 for count
, key
in list[:maxitems
]:
135 print '%5d %s' % (-count
, key
)
137 def add(dict, key
, item
):
138 if dict.has_key(key
):
139 dict[key
].append(item
)