nixspamsum
changeset 7 83c4798e291d
parent 6 723b4c4e15cb
child 8 7f131cf431bc
equal deleted inserted replaced
6:723b4c4e15cb 7:83c4798e291d
     1 #!/usr/bin/env python
     1 #!/usr/bin/env python
     2 # -*- coding: utf-8 -*-
     2 # -*- coding: utf-8 -*-
     3 # Copyright 2009 Pascal Volk
     3 # Copyright 2009 - 2010 Pascal Volk
     4 # See COPYING for distribution information.
     4 # See COPYING for distribution information.
     5 
     5 
     6 __author__ = 'Pascal Volk'
     6 __author__ = 'Pascal Volk'
     7 __version__ = '0.1.2'
     7 __version__ = '0.1.2'
     8 __date__ = '2009-07-03'
     8 __date__ = '2009-07-03'
    64     parser.add_option('-d', action='store_true', dest='countByDom',
    64     parser.add_option('-d', action='store_true', dest='countByDom',
    65             default=False, help='summarize all MX by domain')
    65             default=False, help='summarize all MX by domain')
    66     parser.add_option('-m', action='store_false', dest='countByDom',
    66     parser.add_option('-m', action='store_false', dest='countByDom',
    67             help='count per MX host [default]')
    67             help='count per MX host [default]')
    68     parser.add_option('-o', dest='oFormat', default='table',metavar='FORMAT',
    68     parser.add_option('-o', dest='oFormat', default='table',metavar='FORMAT',
       
    69             choices=('csv', 'table'),
    69             help='the output format: table or csv [default: %default]')
    70             help='the output format: table or csv [default: %default]')
    70     parser.add_option('-p', action='store_true', dest='percent', default=False,
    71     parser.add_option('-p', action='store_true', dest='percent', default=False,
    71             help='show also percentages in table output [default: %default]')
    72             help='show also percentages in table output [default: %default]')
    72     parser.add_option('-s', dest='order', default='name', metavar='SORTBY',
    73     parser.add_option('-s', dest='order', default='name', metavar='SORTBY',
    73             help='arrange output by: name or count [default: %default]')
    74             help='arrange output by: name or count [default: %default]')
    74     parser.add_option('-t', dest='format', default='postfix',metavar='MTA',
    75     parser.add_option('-t', dest='format', default='postfix',metavar='MTA',
       
    76             choices=('postfix',),
    75             help='MTA that generated the maillog [default: %default]')
    77             help='MTA that generated the maillog [default: %default]')
    76     return parser
    78     return parser
       
    79 
    77 
    80 
    78 def openLogFile(fname):
    81 def openLogFile(fname):
    79     try:
    82     try:
    80         fh = open(fname)
    83         fh = open(fname)
    81         return fh
    84         return fh
    82     except IOError, e:
    85     except IOError, e:
    83         os.sys.stderr.write('Warning: %s\nskipped file: %s\n' % (e.strerror,
    86         os.sys.stderr.write('Warning: %s\nskipped file: %s\n' % (e.strerror,
    84             fname))
    87             fname))
    85 
    88 
    86 def getDomLen(domainnames):
       
    87     dlen = 0
       
    88     for d in domainnames:
       
    89         l = len(d)
       
    90         if l > dlen:
       
    91             dlen = l
       
    92     return dlen
       
    93 
    89 
    94 def buildTable(output, domains, percent, orderBy):
    90 def buildTable(output, domains, percent, orderBy):
    95     k = 0 if orderBy == 'name' else 1
    91     k = 0 if orderBy == 'name' else 1
    96     doms = sorted(domains.items(), lambda d,c: cmp(d[k],c[k]), reverse=k)
    92     doms = sorted(domains.items(), lambda d,c: cmp(d[k],c[k]), reverse=k)
    97     dlen = getDomLen(domains.keys())+1
    93     dlen = len(max(domains.iterkeys(), key=len)) + 1
    98     clen = len(str(max(domains.values())))
    94     clen = len(str(max(domains.values())))
    99     total = sum(domains.values())
    95     total = sum(domains.values())
   100     if percent:
    96     if percent:
   101         format = ' %%%ds  %%%dd  %%6.2f %%%%\n' % (-dlen, clen)
    97         format = ' %%%ds  %%%dd  %%6.2f %%%%\n' % (-dlen, clen)
   102         for d, c in doms:
    98         for d, c in doms:
   115     if options.countByDom:
   111     if options.countByDom:
   116         nixspamsum.countByDom()
   112         nixspamsum.countByDom()
   117         domains = nixspamsum.getDomains()
   113         domains = nixspamsum.getDomains()
   118     else:
   114     else:
   119         domains = nixspamsum.getMXs()
   115         domains = nixspamsum.getMXs()
   120     if not len(domains):
   116     if not domains:
   121         print "No NiX Spam DNSBL rejects found"
   117         print "No NiX Spam DNSBL rejects found"
   122         return
   118         return
   123 
   119 
   124     from cStringIO import StringIO
   120     from cStringIO import StringIO
   125     output = StringIO()
   121     output = StringIO()
   139     print output.getvalue()
   135     print output.getvalue()
   140 
   136 
   141 def main():
   137 def main():
   142     parser = getOptionParser()
   138     parser = getOptionParser()
   143     opts, args = parser.parse_args()
   139     opts, args = parser.parse_args()
   144     if opts.oFormat not in ('csv', 'table'):
       
   145         parser.error("Output format '%s' is not supported" % opts.oFormat)
       
   146     if len(args) < 1:
   140     if len(args) < 1:
   147         parser.error('No log file specified')
   141         parser.error('No log file specified')
   148     nixss = NiXSapmSum()
   142     nixss = NiXSapmSum()
   149     nixss.setLogFormat(opts.format)
   143     nixss.setLogFormat(opts.format)
   150     for fn in args:
   144     for fn in args: