#!/bin/env python3

import os
import glob
import argparse


parser = argparse.ArgumentParser(description='Zabov logs analyzer')

parser.add_argument('--ip', dest="ip", metavar='IP', type=str,
                    help='filter by source IP (substring to match). Default: any')
                    
parser.add_argument('--action', dest="action", metavar='action', type=str, default="killed",
                    help='filter action (substring to match): killed|forwarded|any. Default: killed')
                    
parser.add_argument('--config', dest="config", metavar='name', type=str,
                    help='filter by config name (substring to match). Default: any')
                    
parser.add_argument('--timetable', dest="timetable", metavar='name', type=str,
                    help='filter by timetable name (substring to match). Default: any')

parser.add_argument('--reqtype', dest="reqtype", metavar='TypeA', type=str, default="TypeA",
                    help='filter by reqtype name (substring to match): TypeA|TypeAAAA|TypeMX|...')
                    
parser.add_argument('--domain', dest="domain", metavar='name', type=str,
                    help='filter by domain name (substring to match). Default: all')
                    
parser.add_argument('--min-entries', dest="minentries", metavar='100', type=int, default=0,
                    help='filter output by minimum number of entries. Default: any')

parser.add_argument('--logs-path', dest="logs", metavar='path', type=str, default="./config/logs",
                    help='Zabov logs path')
                    
                    
                    
args = parser.parse_args()


timetables = {}
configs = {}

killed = {}
for x in glob.glob(os.path.join(args.logs, "*.log")):
    #print (x)
    f = open(x, "r")
    f.readline()
    if args.reqtype:
        args.reqtype = args.reqtype.lower()
    if args.domain:
        args.domain = args.domain.lower()
        
    for line in f.readlines():
        linel = line.strip().lower()
        fields = linel.split("\t")
        
        timetables[fields[5]] = timetables.get(fields[5], 0) +1
        configs[fields[4]] = configs.get(fields[4], 0) +1
        
        ok = all((not args.action or fields[6].find(args.action)>=0 or fields[6] == "any", \
            not args.timetable or fields[5].find(args.timetable)>=0 or fields[5] == "any", \
            not args.config or fields[4].find(args.config)>=0 or fields[4] == "any", \
            not args.ip or fields[1].find(args.ip)>=0 or fields[1] == "any",\
            not args.domain or fields[2].find(args.domain)>=0 or fields[2] == "any", \
            not args.reqtype or fields[3].find(args.reqtype)>=0 ))
        if ok:
            killed[fields[2]] = killed.get(fields[2], 0) +1

killed_sorted = {key: value for key, value in sorted(killed.items(), key=lambda item: item[1], reverse=True)}

total_queries_filtered = 0
total_domain_filtered = 0
total_queries = 0
for k in killed_sorted.keys():
    if args.minentries == 0 or killed[k] >= args.minentries:
        print (k, killed[k])
        total_queries_filtered += killed[k]
        total_domain_filtered+=1
    total_queries += killed[k]

print("")
print("TOTAL domains (filtered):", total_domain_filtered )
print("TOTAL queries (filtred):", total_queries_filtered )
print("TOTAL domains:", len(killed_sorted.keys()) )
print("TOTAL queries:", total_queries )


timetables = {key: value for key, value in sorted(timetables.items(), key=lambda item: item[0], reverse=False)}
configs = {key: value for key, value in sorted(configs.items(), key=lambda item: item[0], reverse=False)}

print("all available timetables:")
for k in timetables.keys():
    print(" '%s': %d items" % (k, timetables[k], ))
print("all available configs:")
for k in configs.keys():
    print(" '%s': %d items" % (k, configs[k], ))
