#!/usr/bin/python # encoding=utf-8 # author: tangwy from __future__ import division import json import os, re import codecs import traceback from datetime import datetime, timedelta from collections import defaultdict from dashboard_data_conversion import ip_summary_data_format, account_summary_data_format, \ interface_summary_data_format, menu_summary_data_format, adjust_times, jobnum_region_dict,find_region_by_code from dataInterface.functions import CFunction from dataInterface.db.params import CPgSqlParam from ext_logging import logger TABLE_NAME = "ueba_analysis_schema.logs" DATA_TYPE = { "IP": 1, "ACCOUNT": 2, "INTERFACE": 3, "MENU": 4, } def pg_get_ip_group_data(startTime, endTime): """ IP维度查询 :param startTime: 开始时间, :param endTime: 结束时间, """ result = [] sql = """ select ip, jobnum, sum(count) from {TABLE_NAME} where logdate >= %s and logdate <= %s and data_type = %s group by ip, jobnum""".format(TABLE_NAME=TABLE_NAME) res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, DATA_TYPE["IP"])))) if res: for item in res: result.append({ "ip": item[0], "jobnum": item[1], "count": item[2], }) return result def pg_get_account_group_data(startTime, endTime): """ 账号维度查询 :param startTime: 开始时间, :param endTime: 结束时间, """ result = [] sql = """ select account, jobnum, sum(count) from {TABLE_NAME} where logdate >= %s and logdate <= %s and data_type = %s group by account, jobnum""".format(TABLE_NAME=TABLE_NAME) res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, DATA_TYPE["ACCOUNT"])))) if res: for item in res: # print("items:"+json.dumps(item)) # print("pg_get_account_group_data维度data:"+json.dumps(item[0])) result.append({ "account": item[0], "jobnum": item[1], "count": item[2], }) return result def pg_get_interface_group_data(startTime, endTime): """ 接口维度查询 :param startTime: 开始时间, :param endTime: 结束时间, """ result = [] sql = """ select interface, ip, jobnum,account, sum(count) from {TABLE_NAME} where logdate >= %s and logdate <= %s and data_type = %s group by interface, ip, jobnum,account""".format(TABLE_NAME=TABLE_NAME) res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, DATA_TYPE["INTERFACE"])))) if res: for item in res: result.append({ "interface": item[0], "ip": item[1], "jobnum": item[2], "account": item[3], "count": item[4], }) return result def pg_get_menu_group_data(startTime, endTime): """ 菜单维度查询 :param startTime: 开始时间, :param endTime: 结束时间, """ result = [] sql = """ select menu, ip,jobnum,account,sum(count) from {TABLE_NAME} where logdate >= %s and logdate <= %s and data_type = %s group by menu, ip, jobnum ,account""".format(TABLE_NAME=TABLE_NAME) res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, DATA_TYPE["MENU"])))) if res: for item in res: result.append({ "menu": item[0], "ip": item[1], "jobnum": item[2], "account": item[3], "count": item[4], }) return result def pg_get_account_previous_company_count(startTime, endTime, data_type): """ 账号维度查询菜请求次数 :param startTime: 开始时间, :param endTime: 结束时间, :param data_type: 公司聚合类型 ACCOUNT or IP , """ result = defaultdict(int) if data_type in DATA_TYPE: data_type = DATA_TYPE[data_type] sql = """ select jobnum, account,sum(count) from {TABLE_NAME} where logdate >= %s and logdate <= %s and data_type = %s group by jobnum,account""".format(TABLE_NAME=TABLE_NAME) res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, data_type)))) if res: for item in res: company = find_region_by_code(item[0], jobnum_region_dict) result[company] += item[2] return result def pg_get_ip_previous_company_count(startTime, endTime, data_type): """ 账号维度查询菜请求次数 :param startTime: 开始时间, :param endTime: 结束时间, :param data_type: 公司聚合类型 ACCOUNT or IP , """ result = defaultdict(int) if data_type in DATA_TYPE: data_type = DATA_TYPE[data_type] sql = """ select jobnum,ip, sum(count) from {TABLE_NAME} where logdate >= %s and logdate <= %s and data_type = %s group by jobnum,ip """.format(TABLE_NAME=TABLE_NAME) res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, data_type)))) if res: for item in res: company = find_region_by_code(item[0], jobnum_region_dict) result[company] += item[2] return result def pg_get_previous_interface_count(startTime, endTime): """ 接口维度查询请求总次数 :param startTime: 开始时间, :param endTime: 结束时间, """ result = defaultdict(int) sql = """ select interface, ip, jobnum,account, sum(count) from {TABLE_NAME} where logdate >= %s and logdate <= %s and data_type = %s group by interface, ip, jobnum,account""".format(TABLE_NAME=TABLE_NAME) res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, DATA_TYPE["INTERFACE"])))) if res: for item in res: result[item[0]] += item[4] return result def pg_get_previous_menu_count(startTime, endTime): """ 菜单维度查询请求总次数 :param startTime: 开始时间, :param endTime: 结束时间, """ result = defaultdict(int) sql = """ select menu, ip,jobnum,account, sum(count) from {TABLE_NAME} where logdate >= %s and logdate <= %s and data_type = %s group by menu, ip,jobnum,account""".format(TABLE_NAME=TABLE_NAME) res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, DATA_TYPE["MENU"])))) if res: for item in res: result[item[0]] += item[4] return result def entry(data_type, start, end): # 前一段开始时间 date_format = "%Y-%m-%d %H:%M:%S" start = datetime.strptime(start, date_format) end = datetime.strptime(end, date_format) start = start.strftime('%Y-%m-%d') end = end.strftime('%Y-%m-%d') old_start,old_end = adjust_times(start, end) # print (old_start) # print (old_end) data = {} if data_type == "1": ip_summary_data = pg_get_ip_group_data(start, end) data = ip_summary_data_format(ip_summary_data) previous_company_dict = pg_get_ip_previous_company_count(old_start, old_end, "IP") for d in data["summary"]["ip"]: if previous_company_dict.get(d["company"], 0) == 0: d["trend"] = 0 # print("xxx") else: # print("dddd:"+str(d["req_frequency"])) # print(previous_company_dict.get(d["company"], 0)) d["trend"] = round( (d["req_frequency"] - previous_company_dict.get(d["company"], 0)) / previous_company_dict.get( d["company"], 0), 4) if data_type == "2": logger.info("准备获取账号维度数据") account_summary_data = pg_get_account_group_data(start, end) logger.info("准备做数据转换") data = account_summary_data_format(account_summary_data) logger.info("准备获取前一周期数据") previous_company_dict = pg_get_account_previous_company_count(old_start, old_end, "ACCOUNT") logger.info("完成前一周期数据") for d in data["summary"]["account"]: if previous_company_dict.get(d["company"], 0) == 0: d["trend"] = 0 else: # print("dddd:"+str(d["req_frequency"])) # print(previous_company_dict.get(d["company"], 0)) d["trend"] = round( (d["req_frequency"] - previous_company_dict.get(d["company"], 0)) / previous_company_dict.get( d["company"], 0), 4) if data_type == "3": logger.info("准备获取菜单维度数据") interface_summary_data = pg_get_interface_group_data(start, end) logger.info("准备做数据转换") data = interface_summary_data_format(interface_summary_data) logger.info("准备获取前一周期数据") previous_interface_dict = pg_get_previous_interface_count(old_start, old_end) logger.info("完成前一周期数据") for d in data["summary"]["interface"]: if previous_interface_dict.get(d["interface_addr"], 0) == 0: d["trend"] = 0 else: # print("dddd:"+str(d["req_frequency"])) # print(previous_interface_dict.get(d["interface_addr"], 0)) d["trend"] = round( (d["req_frequency"] - previous_interface_dict.get(d["interface_addr"], 0)) / previous_interface_dict.get( d["interface_addr"], 0), 4) logger.info("准备数返回") if data_type == "4": logger.info("准备获取菜单维度数据") menu_summary_data = pg_get_menu_group_data(start, end) logger.info("准备做数据转换") data = menu_summary_data_format(menu_summary_data) logger.info("准备获取前一周期数据") previous_menu_dict = pg_get_previous_menu_count(old_start, old_end) logger.info("完成前一周期数据") for d in data["summary"]["menu"]: if previous_menu_dict.get(d["menu_name"], 0) == 0: d["trend"] = 0 else: # print("dddd:"+str(d["req_frequency"])) # print(previous_menu_dict.get(d["menu_name"], 0)) d["trend"] = round( (d["req_frequency"] - previous_menu_dict.get(d["menu_name"], 0)) / previous_menu_dict.get( d["menu_name"], 0), 4) logger.info("准备数返回") return data # res = entry("1","2024-07-01 00:00:00","2024-07-20 23:59:59") # # print res # logger.info(json.dumps(res)) # res = entry("2","2024-07-01 00:00:00","2024-07-20 23:59:59") # logger.info(json.dumps(res)) # res = entry("3","2024-07-01 00:00:00","2024-07-20 23:59:59") # logger.info(json.dumps(res)) # res = entry("4","2024-07-01 00:00:00","2024-07-20 23:59:59") # logger.info(json.dumps(res))