def save_ip(self, data): '''保存ip资产相关的结果 ''' ip_app = Ip() port_app = Port() port_attr_app = PortAttr() result = {'ip': len(data), 'port': 0} for ip in data: # 保存IP if 'ip' not in ip: continue if self.org_id: ip['org_id'] = self.org_id ip_id = ip_app.save_and_update(ip) if ip_id > 0: result['port'] += len(ip['port']) # 保存每个端口数据 if 'port' not in ip: continue for port in ip['port']: port['ip_id'] = ip_id port_id = port_app.save_and_update(port) if port_id > 0: # 保存端口的属性 for attr_key in self.result_attr_keys: if attr_key in port and port[attr_key]: data_port_attr = { 'r_id': port_id, 'source': self.source, 'tag': attr_key, 'content': port[attr_key]} port_attr_app.save_and_update(data_port_attr) return result
def test_port_attr(): from nemo.core.database.attr import PortAttr pa = PortAttr() # row_id = pa.add(data={'r_id':2,'source':'scan','tag':'service','content':'nginx'}) # print(row_id) # obj = pa.get(row_id) # print(obj) print(pa.get(1)) print(pa.gets(query={'r_id': 2})) print(pa.gets(query={'r_id': 2}, fields=('tag', 'content')))
def save_ip(self, data): '''保存ip资产相关的结果 ''' ip_app = Ip() port_app = Port() port_attr_app = PortAttr() result = {'ip': len(data), 'port': 0} for ip in data: # 保存IP if 'ip' not in ip: continue if self.org_id: ip['org_id'] = self.org_id ip_id = ip_app.save_and_update(ip) if ip_id > 0: # 保存每个端口数据 if 'port' not in ip: continue result['port'] += len(ip['port']) for port in ip['port']: port['ip_id'] = ip_id try: port_id = port_app.save_and_update(port) if port_id > 0: # 保存端口的属性 for attr_key in self.result_attr_keys: if attr_key in port and port[attr_key]: data_port_attr = { 'r_id': port_id, 'source': self.source, 'tag': attr_key, 'content': port[attr_key][:800]} try: port_attr_app.save_and_update(data_port_attr) except Exception as e: logger.error(traceback.format_exc()) logger.error('save port port attr:{}-{}-{}-{}'.format(ip['port'], port['port'], data_port_attr['tag'], data_port_attr['content'])) except Exception as ex: logger.error(traceback.format_exc()) logger.error('save ip port:{}-{}'.format(ip['port'], port['port'])) return result
def get_ip_port_info(self, ip, ip_id): '''获取IP端口属性,并生成port、title、banner聚合信息 ''' port_list = [] # 端口列表 port_status_dict = {} # 端口对应的状态字典 title_set = set() # 标题聚合 banner_set = set() # banner聚合 ports_attr_info = [] # 每一个端口的详细属性 ports_obj = Port().gets(query={'ip_id': ip_id}) for port_obj in ports_obj: port_list.append(port_obj['port']) if port_obj['status']: port_status_dict[str(port_obj['port'])] = port_obj['status'] # 获取端口属性 port_attrs_obj = PortAttr().gets(query={'r_id': port_obj['id']}) FIRST_ROW = True # 每个端口的一个属性生成一行记录 # 第一行记录显示IP和PORT,其它行保持为空(方便查看) for port_attr_obj in port_attrs_obj: pai = {} if FIRST_ROW: pai.update(ip=ip, port=port_obj['port']) FIRST_ROW = False else: pai.update(ip='', port='') pai.update( id=port_attr_obj['id'], tag=port_attr_obj['tag'], content=port_attr_obj['content'], source=port_attr_obj['source'], update_datetime=port_attr_obj['update_datetime'].strftime( '%Y-%m-%d %H:%M')) # 更新集合 if port_attr_obj['tag'] == 'title': title_set.add(port_attr_obj['content']) elif port_attr_obj['tag'] in ('banner', 'tag', 'server'): if port_attr_obj['content'] and port_attr_obj[ 'content'] != 'unknown': banner_set.add(port_attr_obj['content']) ports_attr_info.append(pai) return port_list, title_set, banner_set, ports_attr_info, port_status_dict
def delete_port_attr_view(port_attr_id): '''删除一个端口的属性记录 ''' rows = PortAttr().delete(port_attr_id) return jsonify({'status': 'success', 'msg': rows})