from mycode.DBManager import app_DBM class AssetsManager: def __init__(self): pass def __del__(self): pass def get_IP_assets(self,IP,user,safe_rank): ip_assets = [] ip_assets = app_DBM.get_ip_assets_db(IP,user,safe_rank) if not ip_assets: ip_assets = [] return ip_assets def get_IP_info(self,IP): ip_info = app_DBM.get_ip_info_db(IP) if not ip_info: ip_info = [] return ip_info def get_assets_users(self,uname): assets_users = app_DBM.get_assets_users_db(uname) if not assets_users: assets_users = [] return assets_users def update_assets_users(self,IP,owner_id,itype = 1): return app_DBM.update_assets_users_db(IP,owner_id,itype) def get_port_latest(self,ip): return app_DBM.get_port_latest_db(ip) def get_port_history(self,ip): #拿ip_id strsql = "select id,scan_count from ip_assets where ip_address = %s" params = (ip,) ip_data = app_DBM.safe_do_select(strsql,params,1) ip_id = ip_data[0] scan_count = ip_data[1] # 1) 拿批次 sql_batches = ''' SELECT DISTINCT scan_count, scan_time FROM port_assets WHERE ip_id=%s ORDER BY scan_count ASC; ''' batches = app_DBM.safe_do_select(sql_batches, (ip_id,)) times = [row[1] for row in batches] counts = [row[0] for row in batches] if len(times) != scan_count: print(f"*****数据批次有问题") # 2) 拿所有端口数据 sql_ports = ''' SELECT port, service, version, status, scan_count FROM port_assets WHERE ip_id=%s ORDER BY port ASC, scan_count ASC; ''' rows = app_DBM.safe_do_select(sql_ports, (ip_id,)) # 3) 组织成: { port: { service, version, statuses: [...], changed: [...] } } from collections import OrderedDict port_dict = OrderedDict() for port, service, version, status, sc in rows: entry = port_dict.setdefault(port, { 'service': [], 'version': [], 'statuses': [], 'scancount': [], 'changed': [] }) entry['service'].append(service) entry['version'].append(version) entry['statuses'].append(status) entry['scancount'].append(sc) # 4) 计算 changed 数组:与前一批次对比 for port, info in port_dict.items(): service = info['service'] version = info['version'] statuses = info['statuses'] #scancount = info['scancount'] #执行次序不用对比 changed = [] for i in range(len(service)): if i == 0: changed.append(0) # 第一个批次,默认无变化 else: if service[i] != service[i-1] or version[i] != version[i-1] or statuses[i] != statuses[i-1]: changed.append(1) else: changed.append(0) info['changed'] = changed return times,port_dict def get_ip_url_latest(self,ip): return app_DBM.get_ip_url_latest_db(ip) def get_ip_url_history(self,ip): return app_DBM.get_ip_url_history_db(ip) def get_vul_data(self,ip,nodeName,vulType,vulLevel): # 先获取该IP最新的task_id task_id = app_DBM.get_last_task_by_ip(ip) if not task_id: return [] vuls = app_DBM.get_task_vul(task_id, nodeName, vulType, vulLevel) return vuls def del_ip_assets(self,ip): bsuccess,error = app_DBM.del_ip_assets(ip) return bsuccess,error def get_url_assets(self,url,owner,email): url_assets = app_DBM.get_url_assets_db(url,owner,email) return url_assets def get_url_to_ip(self,url_id): last_to_ips,his_to_ip = app_DBM.get_url_to_ip_db(url_id) return last_to_ips,his_to_ip def del_url_assets(self,url_id): bsuccess, error = app_DBM.del_url_assets_db(url_id) return bsuccess, error def get_owners(self,owner, owner_type, contact, tellnum): owner_list = [] owner_list = app_DBM.get_owner_db(owner, owner_type, contact, tellnum) return owner_list def add_update_owner(self,owner_data, do_mode): ''' :param owner_data: :param do_mode: :return: ''' id = owner_data["id"] user = owner_data["user"] type = owner_data["type"] contact = owner_data["contact"] phone = owner_data["phone"] IDno = owner_data["IOno"] if not user or not type or not contact or not phone or not IDno: return False, "有信息没有填写,请补充完整!", [] if do_mode =="add": strsql = "select ID from assets_user where ID_num = %s" params = (IDno,) data = app_DBM.safe_do_select(strsql, params, 1) if data: return False, "证件号码已经存在,请重新修改", [] strsql = "insert into assets_user (itype,uname,tellnum,tell_username,ID_num) values (%s,%s,%s,%s,%s);" params = (type,user,phone,contact,IDno) bok,new_id = app_DBM.safe_do_sql(strsql,params,1) elif do_mode == "edit": strsql = "select ID from assets_user where ID_num = %s and ID <> %s" params = (IDno,id) data = app_DBM.safe_do_select(strsql, params, 1) if data: return False, "证件号码已经存在,请重新修改", [] strsql = "update assets_user set itype=%s,uname=%s,tellnum=%s,tell_username=%s,ID_num=%s where ID=%s;" params = (type, user, phone, contact, IDno,id) bok,_ = app_DBM.safe_do_sql(strsql,params) else: return False,"操作模式超出预期",[] if bok: owner_list = app_DBM.get_owner_db("", "", "", "") return True,"",owner_list else: return False, "数据库操作失败", [] def del_owner(self,id): bsuccess,error = app_DBM.del_owner_db(id) return bsuccess,error g_AssetsM = AssetsManager()