def process_nic(info, server): nic_info = info['nic']['data'] # 新提交的数据 nic_name_set = set(nic_info) nic_name__db_set = { i.name for i in models.NIC.objects.filter(server=server) } # 新增 删除 更新 add_name_set = nic_name_set - nic_name__db_set # 新增的槽位 del_name_set = nic_name__db_set - nic_name_set # 删除的槽位 update_name_set = nic_name__db_set & nic_name_set # 更新的槽位 # 新增网卡 add_nic_lit = [] for name in add_name_set: nic = nic_info.get(name) nic['name'] = name add_nic_lit.append(models.NIC(**nic, server=server)) if add_nic_lit: models.NIC.objects.bulk_create(add_nic_lit) # 删除网卡 if del_name_set: models.NIC.objects.filter(server=server, name__in=del_name_set).delete() # 更新网卡 for name in update_name_set: nic = nic_info.get(name) nic['name'] = name models.NIC.objects.filter(server=server, name=name).update(**nic)
def post(self, request): info = request.data print(request) action = info.get('action') hostname = info['basic']['data']['hostname'] print("提交的所有信息", info) result = {'status': True, 'hostname': hostname} # print(info) if action == 'create': # 新增资产信息 # 新增server server_info = {} basic = info['basic']['data'] main_board = info.get('main_board').get('data') cpu = info['cpu']['data'] server_info.update(basic) server_info.update(main_board) server_info.update(cpu) print('#serverinfo#===', server_info) server = models.Server.objects.create(**server_info) # 新增disk disk_info = info.get('disk').get('data') disk_obj_list = [] for disk in disk_info.values(): disk_obj_list.append(models.Disk(**disk, server=server)) if disk_obj_list: models.Disk.objects.bulk_create(disk_obj_list) # 新增memory memory_info = info['memory']['data'] memory_obj_list = [] for memory in memory_info.values(): memory_obj_list.append(models.Memory(**memory, server=server)) if memory_obj_list: models.Memory.objects.bulk_create(memory_obj_list) # 新增nic nic_info = info['nic']['data'] nic_obj_list = [] for name, nic in nic_info.items(): nic_obj_list.append(models.NIC(**nic, name=name, server=server)) if nic_obj_list: models.NIC.objects.bulk_create(nic_obj_list) elif action == 'update' or action == 'update_host': # 只更新资产信息 # 更新主机表 server = process_basic(info) process_disk(info, server) process_memory(info, server) process_nic(info, server) return Response(result)
def add(self, new_slots, latest_network_dict): print('+++++ ', new_slots) nic_list = [] record_list = [] for slot in new_slots: new_nic = latest_network_dict[slot] nic_obj = models.NIC(**new_nic) nic_obj.server_obj = self.server_obj nic_list.append(nic_obj) record = '[{server}]新增网卡,名称为[{slot}]'.format( server=self.server_obj, slot=slot ) record_list.append(record) models.NIC.objects.bulk_create(nic_list) record_info = '\n'.join(record_list) print('新增网卡信息..\n', record_info)
def process(self, new, server_obj): new_data = new.get('data') if new.get('status'): new_slot = list(new_data.keys()) # 新采集网卡插槽列表 objs = server_obj.nic.all() old_slot = [obj.name for obj in objs] # 旧网卡插槽列表(槽位字段为name) add_slot = list(set(new_slot).difference(set(old_slot))) # 新增插槽 del_slot = list(set(old_slot).difference(set(new_slot))) # 删除插槽 update_slot = list(set(new_slot).intersection(set(old_slot))) # 更新插槽 # 新增槽位 log = [] add_objs = [] for slot in add_slot: new_data[slot]['server_obj_id'] = server_obj.id new_data[slot]['name'] = slot log.append('网卡信息:新增网卡{name};网卡mac地址{hwaddr};子网掩码{netmask};IP地址{ipaddrs};状态{up}'.format( **new_data[slot])) add_objs.append(models.NIC(**new_data.get(slot))) models.NIC.objects.bulk_create(add_objs, 5) if log: models.AssetRecord.objects.create(asset_obj=server_obj.asset, content='新增网卡:%s' % (';'.join(log))) # 删除槽位 if del_slot: models.NIC.objects.filter(server_obj=server_obj, slot__in=del_slot).delete() models.AssetRecord.objects.create(asset_obj=server_obj.asset, content='移除网卡:%s' % (';'.join(del_slot))) # 更新槽位 log = [] field_map = {'name': '网卡名称', 'hwaddr': '网卡mac地址', 'netmask': '子网掩码', 'ipaddrs': 'IP地址', 'up': '状态'} for slot in update_slot: slot_data = new_data.get(slot) slot_obj = models.NIC.objects.filter(name=slot, server_obj=server_obj).first() for k, v in slot_data.items(): value = getattr(slot_obj, k) if v != value: log.append('网卡槽位:%s,%s由%s变为%s' % (slot, field_map.get(k), value, v)) setattr(slot_obj, k, v) slot_obj.save() if log: models.AssetRecord.objects.create(asset_obj=server_obj.asset, content=';'.join(log)) else: models.ErrorLog.objects.create(title='网卡网卡信息采集出错', content=new_data)
def process(self, server_info, server_obj, compare_new_old): nic_info = server_info["nic"] if not nic_info["status"]: models.ErrorLog.objects.create( content=nic_info["data"], asset_obj=server_obj.asset, title="【%s】网卡采集错误信息" % (server_obj.hostname), ) new_nic_dict = nic_info['data'] # 客户端传来的相关数据 old_nic_list = models.NIC.objects.filter( server_obj=server_obj) # 数据库中的数据obj列表 new_slot_list = list(new_nic_dict.keys()) # 客户端传来的所有slot old_slot_list = [] for item in old_nic_list: old_slot_list.append(item.name) update_list, create_list, del_list = compare_new_old( new_slot_list, old_slot_list) # 删除【4,】 models.NIC.objects.filter(server_obj=server_obj, name__in=del_list).delete() if del_list: content = "删除网卡%s" % ("/".join(del_list)) models.AssetRecord.objects.create( asset_obj=server_obj.asset, content=content, ) # 创建【3,】 record_list = [] create_obj_list = [] for slot in create_list: nic_dict = new_nic_dict[slot] nic_dict["server_obj"] = server_obj nic_dict["name"] = slot create_obj_list.append(models.NIC(**nic_dict)) temp = "新增网卡:名称:{name},网卡mac地址{hwaddr},ip地址{ipaddrs},掩码{netmask},是否启动{up}".format( **nic_dict) record_list.append(temp) models.NIC.objects.bulk_create(create_obj_list) if record_list: models.AssetRecord.objects.create( asset_obj=server_obj.asset, content=";".join(record_list), ) # 交集:更新【5,】 record_list = [] row_map = { 'name': "名称", 'hwaddr': 'mac地址', 'ipaddrs': 'ip地址', 'netmask': '掩码', 'up': '是否启动' } for slot in update_list: new_nic_row = new_nic_dict[slot] # {'capacity': 1024, 'slot': 'DIMM #0', 'model': 'DRAM', 'speed': '667 MHz', 'manufacturer': 'Not Specified', 'sn': 'Not Specified'} old_nic_row = models.NIC.objects.filter(server_obj=server_obj, name=slot).first() for k, v in new_nic_row.items(): if hasattr(old_nic_row, k): value = getattr(old_nic_row, k) if v != value: setattr(old_nic_row, k, v) record_list.append("资产%s,%s由%s变更为%s" % (slot, row_map[k], value, v)) old_nic_row.save() if record_list: content = ";".join(record_list) models.AssetRecord.objects.create(asset_obj=server_obj.asset, content=content)
def post_assets(request): """ 添加资产信息 :param request: :return: """ response = BaseResponse() # 添加防火墙 isfirewall = request.POST.get('isfirewall', None) if isfirewall: nic_brand = request.POST.get('fire_brand') nic_model = request.POST.get('fire_model') nic_ip = request.POST.get('fire_ip') nic_sn = request.POST.get('fire_sn') nic_idc = request.POST.get('fire_idc') nic_cabinet = request.POST.get('fire_cabinet') nic_putaway = request.POST.get('fire_putaway') nic_service = request.POST.get('fire_service') num = models.NetWork.objects.filter(sn=nic_sn).count() if num != 0: response.status = False response.message = '相同的sn资产已经存在!--%s' % nic_sn return response try: asset_obj = models.Asset(host_ip=nic_ip, host_name=nic_model, host_status=1, host_type=4, host_cpu=2, host_memory=2) asset_obj.save() models.NetWork.objects.create(model=nic_model, ip=nic_ip, idc=nic_idc, cabinet=nic_cabinet, sn=nic_sn, putaway=nic_putaway, service=nic_service, asset=asset_obj.id, brand=nic_brand) except Exception as e: response.status = False response.message = '添加资产错误' return response response.status = True return response # 添加网卡设备 nic_model = request.POST.get('nic_model', None) if nic_model: nic_brand = request.POST.get('nic_brand') nic_ip = request.POST.get('nic_ip') nic_sn = request.POST.get('nic_sn') nic_idc = request.POST.get('nic_idc') nic_cabinet = request.POST.get('nic_cabinet') nic_putaway = request.POST.get('nic_putaway') nic_service = request.POST.get('nic_service') num = models.NetWork.objects.filter(sn=nic_sn).count() if num != 0: response.status = False response.message = '相同的sn资产已经存在!--%s' % nic_sn return response try: asset_obj = models.Asset(host_ip=nic_ip, host_name=nic_model, host_status=1, host_type=3, host_cpu=2, host_memory=2) asset_obj.save() models.NetWork.objects.create(model=nic_model, ip=nic_ip, idc=nic_idc, cabinet=nic_cabinet, sn=nic_sn, putaway=nic_putaway, service=nic_service, asset=asset_obj.id, brand=nic_brand) except Exception as e: response.status = False response.message = '添加资产错误' return response response.status = True return response host = request.POST.get('host') ip = request.POST.get('ip') memory = request.POST.get('memory') idc = request.POST.get('idc') cabinet = request.POST.get('cabinet') putaway = request.POST.get('putaway') machine = request.POST.get('machine') sn = request.POST.get('sn') cpu = request.POST.get('cpu') cpu_num = request.POST.get('cpu_num') core_num = request.POST.get('core_num') raid = request.POST.get('raid') service = request.POST.get('service') disk_list = request.POST.getlist('disk_list') nic_list = request.POST.getlist('nic_list') os = request.POST.get('os') for item in nic_list[2:]: item_list = item.split(',') ippaddrs = item_list[3] # 检查重复IP num = models.Asset.objects.filter(host_ip=ippaddrs).count() if num != 0: response.status = False response.message = '资产IP地址已经存在!' return response # 首先创建 Assets资产表 ➡️ 创建Server表关联Asset ➡️ 创建Disk表关联Server表 ➡️ 创建Memory表关联Server表 asset_obj = models.Asset(host_ip=ippaddrs, host_name=host, host_status=1, host_type=1, host_cpu=int(cpu_num)*int(core_num), host_memory=memory) asset_obj.save() server_obj = models.DellServer(asset_id=asset_obj.id, hostname=host, manage_ip=ip, idc=idc, cabinet=cabinet, putaway=putaway, model=machine, sn=sn, cpu_id=cpu, raid=raid, service=service, cpu_num=cpu_num, core_num=core_num, os=os) server_obj.save() # ['', '', ',1,500G,SAS,7200,SEAGATE ST300MM0006 LS08S0K2B5NV'] for item in disk_list[2:]: item_list = item.split(',') slot = item_list[1] capacity = item_list[2] model = item_list[3] rpm = item_list[4] pd_type = item_list[5] disk_obj = models.HardDisk(slot=slot, capacity=capacity, model=model, rpm=rpm, pd_type=pd_type, server_obj_id=server_obj.id) disk_obj.save() # ['', '', ',eth0,00:1c:42:a5:57:7a,192.168.1.1,192.168.1.254,8'] for item in nic_list[2:]: item_list = item.split(',') name = item_list[1] hwaddr = item_list[2] ippaddrs = item_list[3] switch_ip = item_list[4] switch_port = item_list[5] nic_obj = models.NIC(name=name, hwaddr=hwaddr, ipaddrs=ippaddrs, switch_ip=switch_ip, switch_port=switch_port, server_obj_id=server_obj.id) nic_obj.save() response.status = True return response