parse milter.log from bms.py into a sequence of connections
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
# Analyze milter log to find abusers
|
||||
|
||||
class Connection(object);
|
||||
def __init__(self,dt,tm,id,ip)
|
||||
self.dt = dt
|
||||
self.tm = tm
|
||||
self.id = id
|
||||
_,self.host,self.ip = ip.split(None,2)
|
||||
|
||||
def connections(fp):
|
||||
conndict = {}
|
||||
for line in fp:
|
||||
a = line.split(None,4)
|
||||
if len(a) < 4: continue
|
||||
dt,tm,id,op = a[:4]
|
||||
if id,op == 'bms','milter':
|
||||
# FIXME: optionally yield all partial connections
|
||||
conndict = {}
|
||||
key = id
|
||||
if op == 'connect':
|
||||
ip = a[4].rstrip()
|
||||
conn = Connection(dt,tm,id,ip)
|
||||
conndict[key] = conn
|
||||
else:
|
||||
conn = conndict[key]
|
||||
if op == 'Subject:':
|
||||
if len(a) > 4: conn.subject = a[4].rstrip()
|
||||
elif op == 'mail':
|
||||
_,conn.mfrom = a[4].split(None,2)
|
||||
elif op == 'rcpt':
|
||||
_,conn.rcpt = a[4].split(None,2)
|
||||
elif op in ('eom','dspam','abort'):
|
||||
del conndict[key]
|
||||
conn.enddt = dt
|
||||
conn.endtm = tm
|
||||
conn.result = op
|
||||
yield conn
|
||||
elif op in ('REJECT:','DSPAM:','SPAM:'):
|
||||
conn.enddt = dt
|
||||
conn.endtm = tm
|
||||
conn.result = op
|
||||
conn.resmsg = a[4].rstrip()
|
||||
yield conn
|
||||
else:
|
||||
print line.rstrip()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import gzip
|
||||
import sys
|
||||
for fn in sys.argv[:1]:
|
||||
if fn.endswith('.gz'):
|
||||
fp = gzip.open(fn)
|
||||
else:
|
||||
fp = open(fn)
|
||||
for conn in connections(fp):
|
||||
print conn.dt,conn.tm,conn.id,conn.subject,conn.mfrom,conn.rcpt
|
||||
Reference in New Issue
Block a user