Network card & adapters

验证网卡工作状态
本文介绍了一种简单的方法来检查Windows系统的网络适配器是否正常工作。通过打开设备管理器并定位到网络适配器部分,可以查看网络卡的状态。这有助于用户快速诊断网络连接问题。
network端口信息: {'@odata.context': '/redfish/v1/$metadata#Chassis/Members/1/NetworkAdapters/Members/$entity', '@odata.id': '/redfish/v1/Chassis/1/NetworkAdapters/MainboardOCPCard1(XC333)', '@odata.type': '#NetworkAdapter.v1_0_0.NetworkAdapter', 'Id': 'MainboardOCPCard1(XC333)', 'Name': 'MainboardOCPCard1(XC333)', 'Manufacturer': 'Broadcom', 'Model': 'BCM57412', 'Oem': {'xFusion': {'Name': 'XC333', 'DriverName': None, 'DriverVersion': None, 'CardManufacturer': 'XFUSION', 'CardModel': '2*10GE', 'PcieSlotId': None, 'DeviceLocator': 'OCP Card 1 (XC333)', 'SlotNumber': 1, 'Position': 'Mainboard', 'NetworkTechnology': ['Ethernet'], 'RootBDF': '0000:16:04.0', 'FirmwareVersion': '225.3.39.0', 'VenderID': '0x14e4', 'DeviceID': '0x16d6', 'SubsystemVenderID': '0x1f24', 'SubsystemDeviceID': '0x2014', 'Configuration': None, 'BoardId': None, 'BoardIdHex': None, 'ComponentId': None, 'PCBVersion': 'A', 'MctpEnabled': True, 'HotPlugSupported': False, 'HotPlugAttention': False, 'OrderlyHotplugCtrlStatus': None, 'AssociatedResource': 'CPU1', 'VirtualEthernetInterfaces': []}}, 'Controllers': [{'FirmwarePackageVersion': '225.3.39.0', 'ControllerCapabilities': {'NetworkPortCount': 2}, 'Links': {'NetworkPorts@odata.count': 2, 'NetworkPorts': [{'@odata.id': '/redfish/v1/Chassis/1/NetworkAdapters/MainboardOCPCard1(XC333)/NetworkPorts/1'}, {'@odata.id': '/redfish/v1/Chassis/1/NetworkAdapters/MainboardOCPCard1(XC333)/NetworkPorts/2'}]}}], 'NetworkPorts': {'@odata.id': '/redfish/v1/Chassis/1/NetworkAdapters/MainboardOCPCard1(XC333)/NetworkPorts'}, 'Status': {'State': 'Enabled', 'Oem': {'xFusion': {'Severity': 'Informational'}}, 'Health': 'OK'}} network端口信息: {'@odata.context': '/redfish/v1/$metadata#Chassis/Members/1/NetworkAdapters/Members/$entity', '@odata.id': '/redfish/v1/Chassis/1/NetworkAdapters/RiserCard1PCIeCard2(XP380)', '@odata.type': '#NetworkAdapter.v1_0_0.NetworkAdapter', 'Id': 'RiserCard1PCIeCard2(XP380)', 'Name': 'RiserCard1PCIeCard2(XP380)', 'Manufacturer': 'Mellanox', 'Model': 'ConnectX-4 Lx', 'Oem': {'xFusion': {'Name': 'XP380', 'DriverName': None, 'DriverVersion': None, 'CardManufacturer': 'XFUSION', 'CardModel': '2*25GE', 'PcieSlotId': 2, 'DeviceLocator': 'PCIe Card 2 (XP380)', 'SlotNumber': 2, 'Position': 'Riser Card1', 'NetworkTechnology': ['Ethernet'], 'RootBDF': '0000:30:02.0', 'FirmwareVersion': '14.32.1010', 'VenderID': '0x15b3', 'DeviceID': '0x1015', 'SubsystemVenderID': '0x1f24', 'SubsystemDeviceID': '0x2005', 'BoardId': 88, 'BoardIdHex': '0x0058', 'Configuration': None, 'ComponentId': None, 'PCBVersion': '.A', 'MctpEnabled': True, 'HotPlugSupported': False, 'HotPlugAttention': False, 'OrderlyHotplugCtrlStatus': None, 'AssociatedResource': 'CPU1', 'VirtualEthernetInterfaces': []}}, 'Controllers': [{'FirmwarePackageVersion': '14.32.1010', 'ControllerCapabilities': {'NetworkPortCount': 2}, 'Links': {'PCIeDevices@odata.count': 1, 'PCIeDevices': [{'@odata.id': '/redfish/v1/Chassis/1/PCIeDevices/PCIeCard2'}], 'NetworkPorts@odata.count': 2, 'NetworkPorts': [{'@odata.id': '/redfish/v1/Chassis/1/NetworkAdapters/RiserCard1PCIeCard2(XP380)/NetworkPorts/1'}, {'@odata.id': '/redfish/v1/Chassis/1/NetworkAdapters/RiserCard1PCIeCard2(XP380)/NetworkPorts/2'}]}}], 'NetworkPorts': {'@odata.id': '/redfish/v1/Chassis/1/NetworkAdapters/RiserCard1PCIeCard2(XP380)/NetworkPorts'}, 'Status': {'State': 'Enabled', 'Oem': {'xFusion': {'Severity': 'Informational'}}, 'Health': 'OK'}} 给我已json输出
10-10
import requests from requests.auth import HTTPBasicAuth import json import time import pandas as pd from collections import Counter from collections import defaultdict # 抑制 SSL 警告 requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning) # 配置 USERNAME = "Administrator" PASSWORD = "Admin@9000" VERIFY_SSL = False # 安全获取嵌套值 def get_nested(data, *keys, default="未知"): for key in keys: if isinstance(data, dict): data = data.get(key) elif isinstance(data, list): if isinstance(key, int) and key < len(data): data = data[key] else: return default else: return default return data if data is not None else default # =============== 登录并获取 token ============= def login(session, base_url): login_url = f"{base_url}/redfish/v1/SessionService/Sessions" headers = {"Content-Type": "application/json"} body = {"UserName": USERNAME, "Password": PASSWORD} try: response = session.post( login_url, json=body, headers=headers, auth=HTTPBasicAuth(USERNAME, PASSWORD), verify=VERIFY_SSL ) response.raise_for_status() return response.headers.get("X-Auth-Token") except requests.exceptions.RequestException as e: return None # =============== 获取网卡信息 ============= def get_nic_info(session, base_url, auth_token): chassis_id = "1" nic_url = f"{base_url}/redfish/v1/Chassis/1/PCIeDevices?x-Auth-Token={auth_token}" headers = {"X-Auth-Token": auth_token} nics = [] try: response = session.get(nic_url, headers=headers, verify=VERIFY_SSL) response.raise_for_status() nic_data = response.json() for member in nic_data.get("Members", []): member_url = f"{base_url}{member['@odata.id']}" member_response = session.get(member_url, headers=headers, verify=VERIFY_SSL) member_response.raise_for_status() member_data = member_response.json() # print(f"network信息: {member_data}") # 提取 OEM xFusion 信息 xfusion_oem = get_nested(member_data, "Oem", "xFusion") function_type = get_nested(xfusion_oem, "FunctionType") description = get_nested(member_data, "Description") CardModel = get_nested(member_data, "CardModel") # 只保留网卡设备 if "network" in description.lower() or function_type == "Net Card": nics.append({ "description": description, "cardmodel": CardModel, }) except requests.exceptions.RequestException as e: print(f"❌ 获取网卡信息失败: {e}") return nics # =============== 获取 NetworkAdapters端口信息 ============= def get_network_adapter_info(session, base_url, auth_token): chassis_id = "1" net_adapter_url = f"{base_url}/redfish/v1/Chassis/{chassis_id}/NetworkAdapters?x-Auth-Token={auth_token}" headers = {"X-Auth-Token": auth_token} adapters = {} try: response = session.get(net_adapter_url, headers=headers, verify=VERIFY_SSL) response.raise_for_status() adapter_data = response.json() for member in adapter_data.get("Members", []): member_url = f"{base_url}{member['@odata.id']}" member_response = session.get(member_url, headers=headers, verify=VERIFY_SSL) member_response.raise_for_status() member_data = member_response.json() print(f"network端口信息: {member_data}") adapter_name = get_nested(member_data, "Name") num_ports = get_nested(member_data, "Controllers", 0, "NetworkPortCount") if adapter_name and num_ports != "未知": adapters[adapter_name] = num_ports return adapters except requests.exceptions.RequestException as e: print(f"❌ 获取 NetworkAdapters 信息失败: {e}") return {} def main(): df = pd.read_excel("xFusion_hw_info.xlsx", engine="openpyxl") new_rows = [] with requests.Session() as session: for ip in df['IP 地址'].unique(): base_url = f"https://{ip}" auth_token = login(session, base_url) if not auth_token: print(f"❌ 无法登录 {ip}") continue time.sleep(0.5) # 获取网卡信息 nic_info_list = get_nic_info(session, base_url, auth_token) # 获取 NetworkAdapters 信息 net_adapters = get_network_adapter_info(session, base_url, auth_token) # 获取原始行 ip_rows = df[df['IP 地址'] == ip] if ip_rows.empty: continue base_row = ip_rows.iloc[0].to_dict() if not nic_info_list: # 没有网卡信息时 base_row.update({ "网卡1模型": "未知", "网卡1型号": "未知", "网卡1数量": 1, "网卡1端口数": 0 }) else: # 按 description 分组 desc_group = defaultdict(list) for nic in nic_info_list: desc = nic.get("description", "未知") desc_group[desc].append(nic) # 每个分组写入一列 idx = 1 for desc, nics in desc_group.items(): cardmodel = nics[0].get("cardmodel", "未知") # 从第一个网卡中获取 cardmodel # 获取端口数(根据网卡模型名称匹配 NetworkAdapters) port_count = 0 for adapter_name, port_num in net_adapters.items(): if cardmodel in adapter_name: port_count = port_num break base_row.update({ f"网卡{idx}模型": cardmodel, f"网卡{idx}型号": desc, f"网卡{idx}数量": len(nics), f"网卡{idx}端口数": port_count }) idx += 1 new_rows.append(base_row) # 写入 Excel pd.DataFrame(new_rows).to_excel("xFusion_hw_info.xlsx", index=False) print("✅ 已按网卡描述统计数量并写入 xFusion_hw_info.xlsx") if __name__ == "__main__": main() 这是我目前的代码,请根据上面的进行修改
10-10
import requests from requests.auth import HTTPBasicAuth import json import time import pandas as pd from collections import Counter from collections import defaultdict # 抑制 SSL 警告 requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning) # 配置 USERNAME = "Administrator" PASSWORD = "Admin@9000" VERIFY_SSL = False # 安全获取嵌套值 def get_nested(data, *keys, default="未知"): for key in keys: if isinstance(data, dict): data = data.get(key) elif isinstance(data, list): if isinstance(key, int) and key < len(data): data = data[key] else: return default else: return default return data if data is not None else default # =============== 登录并获取 token ============= def login(session, base_url): login_url = f"{base_url}/redfish/v1/SessionService/Sessions" headers = {"Content-Type": "application/json"} body = {"UserName": USERNAME, "Password": PASSWORD} try: response = session.post( login_url, json=body, headers=headers, auth=HTTPBasicAuth(USERNAME, PASSWORD), verify=VERIFY_SSL ) response.raise_for_status() return response.headers.get("X-Auth-Token") except requests.exceptions.RequestException as e: return None # =============== 获取网卡信息 ============= def get_nic_info(session, base_url, auth_token): chassis_id = "1" nic_url = f"{base_url}/redfish/v1/Chassis/1/PCIeDevices?x-Auth-Token={auth_token}" headers = {"X-Auth-Token": auth_token} nics = [] try: response = session.get(nic_url, headers=headers, verify=VERIFY_SSL) # 这里修复 response.raise_for_status() nic_data = response.json() for member in nic_data.get("Members", []): member_url = f"{base_url}{member['@odata.id']}" member_response = session.get(member_url, headers=headers, verify=VERIFY_SSL) member_response.raise_for_status() member_data = member_response.json() # 提取 OEM xFusion 信息 xfusion_oem = get_nested(member_data, "Oem", "xFusion") function_type = get_nested(xfusion_oem, "FunctionType") description = get_nested(member_data, "Description") CardModel = get_nested(member_data, "CardModel") # 只保留网卡设备 if "network" in description.lower() or function_type == "Net Card": nics.append({ "description": description, "cardmodel": CardModel, }) except requests.exceptions.RequestException as e: print(f"❌ 获取网卡信息失败: {e}") return nics # =============== 获取 NetworkAdapters端口信息 ============= def get_network_adapter_info(session, base_url, auth_token): chassis_id = "1" net_adapter_url = f"{base_url}/redfish/v1/Chassis/{chassis_id}/NetworkAdapters?x-Auth-Token={auth_token}" headers = {"X-Auth-Token": auth_token} adapters = {} try: response = session.get(net_adapter_url, headers=headers, verify=VERIFY_SSL) response.raise_for_status() adapter_data = response.json() for member in adapter_data.get("Members", []): member_url = f"{base_url}{member['@odata.id']}" member_response = session.get(member_url, headers=headers, verify=VERIFY_SSL) member_response.raise_for_status() member_data = member_response.json() # 保留完整数据 adapter_name = get_nested(member_data, "Name") adapter_cardmodel_oem = get_nested(member_data, "Name") if adapter_name: adapters[adapter_name] = member_data # 保存完整信息,用于后续判断匹配 return adapters except requests.exceptions.RequestException as e: print(f"❌ 获取 NetworkAdapters 信息失败: {e}") return {} def main(): df = pd.read_excel("xFusion_hw_info.xlsx", engine="openpyxl") new_rows = [] with requests.Session() as session: for ip in df['IP 地址'].unique(): base_url = f"https://{ip}" auth_token = login(session, base_url) if not auth_token: print(f"❌ 无法登录 {ip}") continue time.sleep(0.5) # 获取网卡信息 nic_info_list = get_nic_info(session, base_url, auth_token) # 获取 NetworkAdapters 信息 net_adapters = get_network_adapter_info(session, base_url, auth_token) # 获取原始行 ip_rows = df[df['IP 地址'] == ip] if ip_rows.empty: continue base_row = ip_rows.iloc[0].to_dict() if not nic_info_list: # 没有网卡信息时 base_row.update({ "网卡1模型": "未知", "网卡1型号": "未知", "网卡1数量": 1, "网卡1端口数": 0, "网卡速率": 0, }) else: # 按 description 分组 desc_group = defaultdict(list) for nic in nic_info_list: desc = nic.get("description", "未知") desc_group[desc].append(nic) # 每个分组写入一列 idx = 1 for desc, nics in desc_group.items(): cardmodel = nics[0].get("cardmodel", "未知") # 从第一个网卡中获取 cardmodel # 获取端口数(根据 Oem.xFusion.Name 匹配) port_count = 0 for adapter_name, adapter_data in net_adapters.items(): name_in_adapter = get_nested(adapter_data, "Oem", "xFusion", "Name") if name_in_adapter == cardmodel: port_count = get_nested(adapter_data, "Controllers", 0, "ControllerCapabilities", "NetworkPortCount") break base_row.update({ f"网卡{idx}模型": cardmodel, f"网卡{idx}型号": desc, f"网卡{idx}端口数": port_count, f"网卡{idx}数量": len(nics) }) idx += 1 new_rows.append(base_row) # 写入 Excel pd.DataFrame(new_rows).to_excel("xFusion_hw_info.xlsx", index=False) print("✅ 已按网卡描述统计数量并写入 xFusion_hw_info.xlsx") if __name__ == "__main__": main() 需要继续给我判断还是取,"Oem": { "xFusion": { "Name": "XC333", "DriverName": null, "DriverVersion": null, "CardManufacturer": "XFUSION", "CardModel": "2*10GE", CardModel 还需要加一个字段,这个也给我取接口为 get_network_adapter_info
10-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值