# coding = utf-8

import json
import logging
import re
import time

from lib.sqldb import Sqldb

dbname = 'result'


def get_port(ipaddr):
    try:
        sql = "select port from ports where ipaddr='{}'".format(ipaddr)
        getport = Sqldb(dbname).query(sql)
        if getport:
            result = []
            for i in getport:
                result.append(i[0])
            result = list(map(int, result))
            result = sorted(result)
            result = list(map(str, result))
            ports = ' , '.join(result)
            return ports
    except Exception as e:
        logging.exception(e)


def gen_webinfo():
    tableData = []
    sql = 'select time,domain,waf,title,apps,server,address,ipaddr,os from webinfo'
    try:
        res = Sqldb(dbname).query(sql)
        for i in res:
            time, domain, waf, title, apps, server, address, ipaddr, os = i
            ports = get_port(domain)
            webinfo = {
                "time": time,
                "domain": domain,
                "waf": waf,
                "title": title,
                "apps": apps,
                "server": server,
                "address": address,
                "ipaddr": ipaddr,
                "ports": ports,
                "os": os
            }
            tableData.append(webinfo)
        column = [
            {
                "field": "time",
                "title": "TIME",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
            {
                "field": "domain",
                "title": "domain",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
            {
                "field": "waf",
                "title": "waf",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
            {
                "field": "title",
                "title": "title",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
            {
                "field": "apps",
                "title": "apps",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
            {
                "field": "server",
                "title": "server",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
            {
                "field": "address",
                "title": "address",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
            {
                "field": "ipaddr",
                "title": "ipaddr",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
            {
                "field": "ports",
                "title": "ports",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
            {
                "field": "os",
                "title": "os",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
        ]
        data = {"name": "webinfo", "tableData": tableData, "columns": column}

        return data
    except TypeError:
        pass
    except Exception as e:
        logging.exception(e)


def gen_ports():
    tableData = []
    sql = 'select time,ipaddr,service,port,banner from ports'
    try:
        res = Sqldb(dbname).query(sql)
        for i in res:
            time, ipaddr, service, port, banner = i
            ports = {"time": time, "ip": ipaddr, "port": port, "service": service, "banner": banner}
            tableData.append(ports)
        column = [
            {
                "field": "time",
                "title": "TIME",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
            {
                "field": "ip",
                "title": "IP",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
            {
                "field": "port",
                "title": "PORT",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
            {
                "field": "service",
                "title": "SERVICE",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
            {
                "field": "banner",
                "title": "Banner",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
        ]
        data = {"name": "Ports", "tableData": tableData, "columns": column}

        return data
    except TypeError:
        pass
    except Exception as e:
        logging.exception(e)


def gen_urls():
    tableData = []
    sql = 'select time,domain,title,url,contype,rsp_len,rsp_code from urls'
    try:
        res = Sqldb(dbname).query(sql)
        if res:
            for i in res:
                time, domain, title, url, contype, rsp_len, rsp_code = i
                urls = {
                    "time": time,
                    "domain": domain,
                    "title": title,
                    "url": url,
                    "contype": contype,
                    "rsp_len": rsp_len,
                    "rsp_code": rsp_code
                }
                tableData.append(urls)
            column = [{
                "field": "time",
                "title": "TIME",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            }, {
                "field": "domain",
                "title": "Domain",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            }, {
                "field": "title",
                "title": "TITLE",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            }, {
                "field": "url",
                "title": "URL",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            }, {
                "field": "contype",
                "title": "ConType",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            }, {
                "field": "rsp_len",
                "title": "rsp_len",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            }, {
                "field": "rsp_code",
                "title": "rsp_code",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            }]
            data = {"name": "URLS", "tableData": tableData, "columns": column}
            return data
    except TypeError:
        pass
    except Exception as e:
        logging.exception(e)


def gen_vuln():
    tableData = []
    sql = 'select time, domain, vuln from vuln'
    try:
        res = Sqldb(dbname).query(sql)
        for i in res:
            time, ip, vuln = i
            vuln = {"time": time, "ip": ip, "vuln": vuln}
            tableData.append(vuln)
        column = [
            {
                "field": "time",
                "title": "TIME",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
            {
                "field": "ip",
                "title": "IP",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
            {
                "field": "vuln",
                "title": "VULN",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
        ]
        data = {"name": "Vuln", "tableData": tableData, "columns": column}
        return data
    except TypeError:
        pass
    except Exception as e:
        logging.exception(e)


def gen_crawl():
    tableData = []
    sql = 'select time, domain, type,leaks from Crawl'
    try:
        res = Sqldb(dbname).query(sql)
        for i in res:
            time, domain, type, leaks = i
            vuln = {"time": time, "domain": domain, "type": type, "leaks": leaks}
            tableData.append(vuln)
        column = [
            {
                "field": "time",
                "title": "TIME",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
            {
                "field": "domain",
                "title": "DOMAIN",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
            {
                "field": "type",
                "title": "TYPE",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
            {
                "field": "leaks",
                "title": "Leaks",
                "width": 100,
                "tilteAlign": "center",
                "columnAlign": "center"
            },
        ]
        data = {"name": "Crawl", "tableData": tableData, "columns": column}
        return data
    except TypeError:
        pass
    except Exception as e:
        logging.exception(e)


def gener():
    out = []
    for i in [gen_webinfo(), gen_urls(), gen_ports(), gen_vuln(), gen_crawl()]:
        if i:
            out.append(i)
    result = {"table": out}
    result = json.dumps(result)
    result = re.sub(r'^{|}$', '', result)
    times = time.strftime("%Y%m%d%H%M%S", time.localtime())
    name = 'Vxscan_' + times + '.html'
    with open('report/report.htm', 'r', encoding='utf-8') as f, open(name, 'w') as f1:
        text = f.read()
        f1.write(text.replace("'summary': {}", result))


if __name__ == "__main__":
    # if sys.argv[1]:
    #     dbname = sys.argv[1]
    #     dbname = re.sub('.db', '', dbname)
    gener()