#!/usr/bin/env python # Copyright (c) 2008, Net Easy, Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of Net Easy, Inc. nor the # names of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY Net Easy, Inc. ''AS IS'' AND ANY # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL Net Easy, Inc. BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # requires logcheck from ports import re, os from sys import argv logfile = "/var/log/daemon" class checker(object): def __init__(self): self.tarpit_count = 0 self.tarpit_total = 0 def __repr__(self): return "tarpit.value %s" % (self.tarpit_average()) def tarpit_average(self): if self.tarpit_count > 0: return "%.1f" % (self.tarpit_total / self.tarpit_count) else: return 0 def process_line(self, line): if re.search(' disconnected after ', line): self.tarpit_count += 1 tarpit_time = re.sub('^.*after ','',re.sub(' second.*$','',line)) self.tarpit_total += int(tarpit_time) def process_lines(self, file): for line in os.popen('logtail %s %s.tp.offset' % (file, file)).readlines(): self.process_line(line) if __name__ == "__main__": if len(argv) > 1 and argv[1] == 'config': print """graph_title spamd delay graph_vlabel Average delay. graph_category Mail graph_info Average time spammers delayed by spamd tarpit.label Average tarpit delay""" else: processor = checker() processor.process_lines(logfile) print processor