nixspamsum
changeset 2 a72ea07394cc
parent 1 7d5cee19c20a
child 3 6b0d09cdfbdb
equal deleted inserted replaced
1:7d5cee19c20a 2:a72ea07394cc
     2 # -*- coding: utf-8 -*-
     2 # -*- coding: utf-8 -*-
     3 # Copyright 2009 Pascal Volk
     3 # Copyright 2009 Pascal Volk
     4 
     4 
     5 __author__ = 'Pascal Volk'
     5 __author__ = 'Pascal Volk'
     6 __version__ = '0.1.1'
     6 __version__ = '0.1.1'
     7 __date__ = '2009-06-07'
     7 __date__ = '2009-06-08'
     8 
     8 
     9 import os
     9 import os
    10 import re
    10 import re
    11 
    11 
    12 class NiXSapmSum:
    12 class NiXSapmSum:
    48         return self._doms
    48         return self._doms
    49 
    49 
    50     def getMXs(self):
    50     def getMXs(self):
    51         return self._mxs
    51         return self._mxs
    52 
    52 
    53     def getTotal(self):
       
    54         return sum(self._mxs.values())
       
    55 
       
    56 def getOptionParser():
    53 def getOptionParser():
    57     from optparse import OptionParser
    54     from optparse import OptionParser
    58     description = 'do something ...'
    55     description = 'do something ...'
    59     usage  = 'usage: %prog [options] maillog [maillog [...]]'
    56     usage  = 'usage: %prog [options] maillog [maillog [...]]'
    60     version = '%prog '+__version__
    57     version = '%prog '+__version__
    87         l = len(d)
    84         l = len(d)
    88         if l > dlen:
    85         if l > dlen:
    89             dlen = l
    86             dlen = l
    90     return dlen
    87     return dlen
    91 
    88 
       
    89 def buildTable(output, domains, percent, orderBy):
       
    90     k = 0 if orderBy == 'name' else 1
       
    91     doms = sorted(domains.items(), lambda d,c: cmp(d[k],c[k]), reverse=k)
       
    92     dlen = getDomLen(domains.keys())+1
       
    93     clen = len(str(max(domains.values())))
       
    94     total = sum(domains.values())
       
    95     if percent:
       
    96         format = '%%%ds  %%%dd  %%5.2f %%%%\n' % (dlen, clen)
       
    97         for d, c in doms:
       
    98             dfrac = 100./total*c
       
    99             output.write(format % (d, c, dfrac))
       
   100     else:
       
   101         format = '%%%ds  %%%dd\n' % (dlen, clen)
       
   102         for d in doms:
       
   103             output.write(format % d)
       
   104 
    92 def showResult(nixspamsum, options):
   105 def showResult(nixspamsum, options):
       
   106     from cStringIO import StringIO
       
   107     output = StringIO()
    93     if options.countByDom:
   108     if options.countByDom:
    94         nixspamsum.countByDom()
   109         nixspamsum.countByDom()
    95         domains = nixspamsum.getDomains()
   110         domains = nixspamsum.getDomains()
    96     else:
   111     else:
    97         domains = nixspamsum.getMXs()
   112         domains = nixspamsum.getMXs()
    98     k = 0 if options.order == 'name' else 1
   113     # build the table
    99     doms = sorted(domains.items(), lambda d,c: cmp(d[k],c[k]), reverse=k)
       
   100     # print table
       
   101     if options.oFormat == 'table':
   114     if options.oFormat == 'table':
   102         dlen = getDomLen(domains.keys())+1
   115         buildTable(output, domains, options.percent, options.order)
   103         clen = len(str(max(domains.values())))
   116     # generate comma separated values
   104         if options.percent:
       
   105             total = nixspamsum.getTotal()
       
   106             format = '%%%ds  %%%dd  %%5.2f %%%%' % (dlen, clen)
       
   107             for d, c in doms:
       
   108                 dfrac = 100./total*c
       
   109                 print format % (d, c, dfrac)
       
   110         else:
       
   111             format = '%%%ds: %%%dd' % (dlen, clen)
       
   112             for d in doms:
       
   113                 print format % d
       
   114     # print comma separated values
       
   115     elif options.oFormat == 'csv':
   117     elif options.oFormat == 'csv':
   116         for d in doms:
   118         for d in domains.items():
   117             print "'%s',%d" % d
   119             output.write("'%s',%d\n" % d)
   118     # print a hint ;-)
   120     # should never be reached
   119     else:
   121     else:
   120         print "Output format '%s' is not supported" % options.oFormat
   122         print "Oops, error in function showResult() happend"
       
   123     # show the result
       
   124     print output.getvalue()
   121 
   125 
   122 def main():
   126 def main():
   123     parser = getOptionParser()
   127     parser = getOptionParser()
   124     opts, args = parser.parse_args()
   128     opts, args = parser.parse_args()
       
   129     if opts.oFormat not in ('csv', 'table'):
       
   130         parser.error("Output format '%s' is not supported" % opts.oFormat)
   125     if len(args) < 1:
   131     if len(args) < 1:
   126         parser.error('No logfiles specified')
   132         parser.error('No logfiles specified')
   127     nixss = NiXSapmSum()
   133     nixss = NiXSapmSum()
   128     nixss.setLogFormat(opts.format)
   134     nixss.setLogFormat(opts.format)
   129     for fn in args:
   135     for fn in args: