From 970bc7818a9ec0d6e125a908c79d0c1844bfea94 Mon Sep 17 00:00:00 2001
From: HuangXin 该接口返回系统网络相关信息。返回数据通过加密协议进行保护,并记录操作日志。 该接口返回系统内存相关信息。返回数据通过加密协议进行保护,并记录操作日志。 该接口返回系统文件系统以及磁盘相关信息。返回数据通过加密协议进行保护,并记录操作日志。
- * 此类用于封装网络的详细信息,包括网络名称、网络类型、网络状态、网络速度等。
- * 主要用于监控系统网络的状态,例如网络连接的速度和稳定性。
+ * 该类通过 Lombok 的 {@code @Data} 注解自动生成 getter/setter 方法。
+ * 同时集成了 Swagger 3 的注释以支持接口文档的生成。
*
- * 依赖于 Lombok 的 {@code @Data} 注解,自动生成以下方法:
- *
- * 此类还集成了自定义注解 {@link AutoExternString},用于在 JSON 序列化时对字段进行额外处理。
- * 例如,自动将网络速度值格式化为更易识别的单位(如 Mbps、Kbps)。
- * 使用示例: JSON 输出示例: 注意:{@code @AutoExternString} 注解会自动根据字段值转换为适合的单位,并生成额外的格式化字符串。 例如,值 {@code 1024L}(字节/秒)在 JSON 中将自动格式化为 {@code "1 Mbps"}。
- * 该字段记录网络的名称,通常用于标识不同的网络连接,如 Wi-Fi、以太网等。
- * 在 JSON 序列化时,该字段直接输出原始值。
- * 示例值: JSON 输出示例:
- * 该字段记录网络的类型,如无线网络(Wireless)、有线网络(Wired)等。
- * 在 JSON 序列化时,该字段直接输出原始值。
- * 示例值: JSON 输出示例:
- * 该字段记录网络的当前状态,如已连接(Connected)、断开连接(Disconnected)等。
- * 在 JSON 序列化时,该字段直接输出原始值。
- * 示例值: JSON 输出示例:
- * 该字段记录网络的当前速度,通常用于表示网络连接的带宽或数据传输速率。
- * 在 JSON 序列化时,通过 {@link AutoExternString} 注解生成一个格式化后的额外字段。
- * 示例值: JSON 输出示例:
- *
- *
- *
- * NetworkInfo networkInfo = new NetworkInfo();
- * networkInfo.setNetworkName("Wi-Fi");
- * networkInfo.setNetworkType("Wireless");
- * networkInfo.setNetworkSpeed(1024L); // 设置网络速度为 1 Mbps
- *
- *
- *
- * {
- * "networkName": "Wi-Fi",
- * "networkType": "Wireless",
- * "networkSpeed": 1024,
- * "networkSpeedStr": "1 Mbps"
- * }
- *
- *
- *
- *
- *
- *
- * {
- * "networkName": "Wi-Fi"
- * }
- *
+ * 系统中所有的网络接口信息。
*/
- @Schema(description = "网络名称。", example = "Wi-Fi")
- private String networkName;
+ @Schema(description = "系统中所有的网络接口信息")
+ private List
- *
- *
- *
- * {
- * "networkType": "Wireless"
- * }
- *
+ * 系统的主机名。
*/
- @Schema(description = "网络类型。", example = "Wireless")
- private String networkType;
+ @Schema(description = "系统的主机名")
+ private String hostName;
/**
- * 网络状态。
- *
- *
- *
- *
- * {
- * "networkStatus": "Connected"
- * }
- *
+ * 系统所在的域名。
*/
- @Schema(description = "网络状态。", example = "Connected")
- private String networkStatus;
+ @Schema(description = "系统所在的域名")
+ private String domainName;
/**
- * 网络速度(单位:字节/秒)。
- *
- *
- *
- *
- * {
- * "networkSpeed": 1024,
- * "networkSpeedStr": "1 Mbps"
- * }
- *
- *
- * @see AutoExternString
+ * 系统配置的 DNS 服务器地址列表。
*/
- @Schema(description = "网络速度(单位:字节/秒)。", example = "1024")
- @AutoExternString(format = UtilsFormatType.FORMAT_BYTES)
- private Long networkSpeed;
+ @Schema(description = "系统配置的 DNS 服务器地址列表")
+ private String[] dnsServers;
+
+ /**
+ * 系统的 IPv4 默认网关地址。
+ */
+ @Schema(description = "系统的 IPv4 默认网关地址")
+ private String ipv4DefaultGateway;
+
+ /**
+ * 系统的 IPv6 默认网关地址。
+ */
+ @Schema(description = "系统的 IPv6 默认网关地址")
+ private String ipv6DefaultGateway;
}
diff --git a/src/main/java/com/cmhi/magent/pojo/po/ProcessorInfo.java b/src/main/java/com/cmhi/magent/pojo/po/ProcessorInfo.java
index 78954dd..6244e38 100644
--- a/src/main/java/com/cmhi/magent/pojo/po/ProcessorInfo.java
+++ b/src/main/java/com/cmhi/magent/pojo/po/ProcessorInfo.java
@@ -1,5 +1,7 @@
package com.cmhi.magent.pojo.po;
+import com.cmhi.magent.annotation.AutoExternString;
+import com.cmhi.magent.common.UtilsFormatType;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -116,6 +118,7 @@ public class ProcessorInfo {
*
+ * 用于封装文件存储信息的响应结果,继承自 {@link BaseRespStatus},包含状态码、消息以及文件存储的详细信息。 + *
+ * + *+ * 核心功能: + *
+ * 使用场景: + *
+ * 包含文件存储的详细信息,例如总存储空间、可用存储空间、文件系统类型等。 + * 类型为 {@link FileStoreInfo}。 + *
+ */ + private FileStoreInfo fileStoreInfo; +} diff --git a/src/main/java/com/cmhi/magent/pojo/vo/GetMemoryInfoResp.java b/src/main/java/com/cmhi/magent/pojo/vo/GetMemoryInfoResp.java new file mode 100644 index 0000000..1265404 --- /dev/null +++ b/src/main/java/com/cmhi/magent/pojo/vo/GetMemoryInfoResp.java @@ -0,0 +1,58 @@ +package com.cmhi.magent.pojo.vo; + +import com.cmhi.magent.pojo.po.BaseRespStatus; +import com.cmhi.magent.pojo.po.MemoryInfo; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * 内存信息响应类 {@code GetMemoryInfoResp}。 + *+ * 用于封装内存信息的响应结果,继承自 {@link BaseRespStatus},包含状态码、消息以及内存的详细信息。 + *
+ * + *+ * 核心功能: + *
+ * 使用场景: + *
+ * 包含内存的详细信息,例如总内存、可用内存、内存使用率等。 + * 类型为 {@link MemoryInfo}。 + *
+ */ + private MemoryInfo memoryInfo; +} diff --git a/src/main/java/com/cmhi/magent/pojo/vo/GetNetworkInfoResp.java b/src/main/java/com/cmhi/magent/pojo/vo/GetNetworkInfoResp.java new file mode 100644 index 0000000..25c1cef --- /dev/null +++ b/src/main/java/com/cmhi/magent/pojo/vo/GetNetworkInfoResp.java @@ -0,0 +1,74 @@ +package com.cmhi.magent.pojo.vo; + +import com.cmhi.magent.pojo.po.BaseRespStatus; +import com.cmhi.magent.pojo.po.NetworkInfo; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * 网络信息响应类 {@code GetNetworkInfoResp}。 + *+ * 用于封装网络信息的响应结果,继承自 {@link BaseRespStatus},包含状态码、消息以及网络的详细信息。 + *
+ * + *+ * 核心功能: + *
+ * 使用场景: + *
+ * JSON 输出示例: + *
+ * { + * "status": "SUCCESS", + * "message": "Network information retrieved successfully", + * "networkInfo": { + * "ipAddress": "192.168.1.100", + * "macAddress": "00:11:22:33:44:55", + * "networkInterfaces": [ + * "eth0", + * "wlan0" + * ] + * } + * } + *+ * + * + * @author huangxin@cmhi.chinamobile.com + * @version 1.0.0 + * @since 2025-01-07 + */ +@Schema(name = "网络信息", description = "包含网络的详细信息,如IP地址、MAC地址、网络接口等。") +@EqualsAndHashCode(callSuper = true) +@Data +@Builder +@JsonPropertyOrder({"networkInfo", "status", "message"}) +@AllArgsConstructor +@NoArgsConstructor +public class GetNetworkInfoResp extends BaseRespStatus { + + /** + * 网络信息内容。 + *
+ * 包含网络的详细信息,例如IP地址、MAC地址、网络接口等。 + * 类型为 {@link NetworkInfo}。 + *
+ */ + private NetworkInfo networkInfo; +} diff --git a/src/main/java/com/cmhi/magent/service/SystemInfoService.java b/src/main/java/com/cmhi/magent/service/SystemInfoService.java index 09292fa..4590142 100644 --- a/src/main/java/com/cmhi/magent/service/SystemInfoService.java +++ b/src/main/java/com/cmhi/magent/service/SystemInfoService.java @@ -1,6 +1,9 @@ package com.cmhi.magent.service; +import com.cmhi.magent.pojo.po.FileStoreInfo; import com.cmhi.magent.pojo.po.HwInfo; +import com.cmhi.magent.pojo.po.MemoryInfo; +import com.cmhi.magent.pojo.po.NetworkInfo; import com.cmhi.magent.pojo.po.ProcessorInfo; /** @@ -55,4 +58,32 @@ public interface SystemInfoService { * @return 硬件信息对象 */ HwInfo getHardwareInfo(); + + /** + * 获取网络信息。 + *+ * 封装网络的相关信息,如网络名称、网络类型、网络状态、网络速度等。结果以 {@link NetworkInfo} 对象形式返回。 + *
+ * + * @return 网络信息对象 + */ + NetworkInfo getNetworkInfo(); + + /** + * 获取内存信息 + *+ * 封装内存的相关信息,如物理内存大小,可用内存,当前内存占用情况等。结果以 {@link MemoryInfo} 对象形式返回。 + *
+ * @return 返回一个 MemoryInfo 对象,包含内存的详细信息 + */ + MemoryInfo getMemoryInfo(); + + /** + * 获取文件存储信息 + *+ * 封装操作系统文件系统相关信息,如磁盘大小,分区大小等。结果以 {@link FileStoreInfo} 对象形式返回。 + *
+ * @return 返回一个 MemoryInfo 对象,包含内存的详细信息 + */ + FileStoreInfo getFileStoreInfo(); } diff --git a/src/main/java/com/cmhi/magent/service/impl/SystemInfoServiceImpl.java b/src/main/java/com/cmhi/magent/service/impl/SystemInfoServiceImpl.java index 80dd892..ce9a910 100644 --- a/src/main/java/com/cmhi/magent/service/impl/SystemInfoServiceImpl.java +++ b/src/main/java/com/cmhi/magent/service/impl/SystemInfoServiceImpl.java @@ -1,19 +1,15 @@ package com.cmhi.magent.service.impl; import com.cmhi.magent.pojo.mapper.IObjectConvert; -import com.cmhi.magent.pojo.po.FileStoreDetails; import com.cmhi.magent.pojo.po.FileStoreInfo; import com.cmhi.magent.pojo.po.HwInfo; +import com.cmhi.magent.pojo.po.MemoryInfo; +import com.cmhi.magent.pojo.po.NetworkInfo; import com.cmhi.magent.pojo.po.ProcessorInfo; import com.cmhi.magent.service.SystemInfoService; import org.springframework.stereotype.Service; import oshi.SystemInfo; import oshi.hardware.CentralProcessor; -import oshi.hardware.ComputerSystem; -import oshi.hardware.GlobalMemory; -import oshi.software.os.OSFileStore; - -import java.util.ArrayList; /** * 系统信息服务实现类。 @@ -98,26 +94,46 @@ public class SystemInfoServiceImpl implements SystemInfoService { */ @Override public HwInfo getHardwareInfo() { - ComputerSystem cs = si.getHardware().getComputerSystem(); - GlobalMemory gm = si.getHardware().getMemory(); - HwInfo hw = IObjectConvert.INSTANCE.toHwInfo(si); + return IObjectConvert.INSTANCE.toHwInfo(si); + } - // FileStoreInfo fi = new FileStoreInfo(); - // fi.setFileStore(new ArrayList<>()); - // - // for (OSFileStore os : si.getOperatingSystem().getFileSystem().getFileStores()) { - // fi.getFileStore().add(FileStoreDetails.builder() - // .name(os.getName()) - // .volume(os.getVolume()) - // .mountPoint(os.getMount()) - // .uuid(os.getUUID()) - // .fsType(os.getType()) - // .description(os.getDescription()) - // .freeSpace(os.getFreeSpace()) - // .totalSpace(os.getTotalSpace()) - // .usableSpace(os.getUsableSpace()) - // .build()); - // } - return hw; + /** + * 获取网络信息。 + *+ * 通过 OSHI 库获取网络接口的详细信息,包括网络名称、网络类型、网络状态、网络速度等, + * 并通过 {@link IObjectConvert} 工具类将其转换为自定义的 {@link NetworkInfo} 对象。 + *
+ * + * @return 包含网络详细信息的 {@link NetworkInfo} 对象。 + */ + @Override + public NetworkInfo getNetworkInfo() { + return IObjectConvert.INSTANCE.toNetworkInfo(si, si.getOperatingSystem().getNetworkParams()); + } + + /** + * 获取内存信息 + *+ * 封装内存的相关信息,如物理内存大小,可用内存,当前内存占用情况等。结果以 {@link MemoryInfo} 对象形式返回。 + *
+ * + * @return 返回一个 MemoryInfo 对象,包含内存的详细信息 + */ + @Override + public MemoryInfo getMemoryInfo() { + return IObjectConvert.INSTANCE.toMemoryInfo(si.getHardware().getMemory()); + } + + /** + * 获取文件存储信息 + *+ * 封装操作系统文件系统相关信息,如磁盘大小,分区大小等。结果以 {@link FileStoreInfo} 对象形式返回。 + *
+ * + * @return 返回一个 MemoryInfo 对象,包含内存的详细信息 + */ + @Override + public FileStoreInfo getFileStoreInfo() { + return IObjectConvert.INSTANCE.toFileStoreInfo(si.getOperatingSystem().getFileSystem(), si.getHardware().getDiskStores()); } } diff --git a/src/test/java/com/cmhi/magent/controller/SystemInfoApiTest.java b/src/test/java/com/cmhi/magent/controller/SystemInfoApiTest.java index bf2a5df..ad086d2 100644 --- a/src/test/java/com/cmhi/magent/controller/SystemInfoApiTest.java +++ b/src/test/java/com/cmhi/magent/controller/SystemInfoApiTest.java @@ -1,7 +1,10 @@ package com.cmhi.magent.controller; import com.cmhi.magent.common.TestBaseAuthentication; +import com.cmhi.magent.pojo.vo.GetFileStoreInfoResp; import com.cmhi.magent.pojo.vo.GetHwInfoResp; +import com.cmhi.magent.pojo.vo.GetMemoryInfoResp; +import com.cmhi.magent.pojo.vo.GetNetworkInfoResp; import com.cmhi.magent.pojo.vo.GetOsInfoResp; import com.cmhi.magent.pojo.vo.GetProcessorInfoResp; import org.junit.jupiter.api.Assertions; @@ -57,4 +60,46 @@ public class SystemInfoApiTest extends TestBaseAuthentication { // 验证硬件信息数据的合法性 Assertions.assertNotNull(resp.getHwInfo(), "硬件信息不应为空"); } + + @Test + @DisplayName("获取内存信息") + void testGetMemoryInfo() throws Exception { + // 发起 GET 请求,调用 /api/systemInfo/memoryInfo 接口 + GetMemoryInfoResp resp = (GetMemoryInfoResp) performanceRestful(RequestMethod.GET, null, "/api/systemInfo/memoryInfo", + new Class[] {GetMemoryInfoResp.class}); + + // 验证通用响应数据的合法性 + AssertValidCommonResp(resp); + + // 验证硬件信息数据的合法性 + Assertions.assertNotNull(resp.getMemoryInfo(), "内存信息不应为空"); + } + + @Test + @DisplayName("获取网络信息") + void testGetNetworkInfo() throws Exception { + // 发起 GET 请求,调用 /api/systemInfo/networkInfo 接口 + GetNetworkInfoResp resp = (GetNetworkInfoResp) performanceRestful(RequestMethod.GET, null, "/api/systemInfo/networkInfo", + new Class[] {GetNetworkInfoResp.class}); + + // 验证通用响应数据的合法性 + AssertValidCommonResp(resp); + + // 验证硬件信息数据的合法性 + Assertions.assertNotNull(resp.getNetworkInfo(), "网络信息不应为空"); + } + + @Test + @DisplayName("获取文件存储信息") + void testGetFileStoreInfo() throws Exception { + // 发起 GET 请求,调用 /api/systemInfo/fileStoreInfo 接口 + GetFileStoreInfoResp resp = (GetFileStoreInfoResp) performanceRestful(RequestMethod.GET, null, "/api/systemInfo/fileStoreInfo", + new Class[] {GetFileStoreInfoResp.class}); + + // 验证通用响应数据的合法性 + AssertValidCommonResp(resp); + + // 验证硬件信息数据的合法性 + Assertions.assertNotNull(resp.getFileStoreInfo(), "文件存储信息不应为空"); + } } diff --git a/src/test/java/com/cmhi/magent/service/SystemInfoServiceImplTest.java b/src/test/java/com/cmhi/magent/service/SystemInfoServiceImplTest.java new file mode 100644 index 0000000..5a73048 --- /dev/null +++ b/src/test/java/com/cmhi/magent/service/SystemInfoServiceImplTest.java @@ -0,0 +1,114 @@ +package com.cmhi.magent.service; + +import com.cmhi.magent.misc.HelperUtils; +import com.cmhi.magent.pojo.mapper.IObjectConvert; +import com.cmhi.magent.pojo.po.HwInfo; +import com.cmhi.magent.pojo.po.MemoryDetails; +import com.cmhi.magent.pojo.po.ProcessorInfo; +import com.cmhi.magent.service.impl.SystemInfoServiceImpl; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import oshi.SystemInfo; +import oshi.hardware.GlobalMemory; +import oshi.hardware.HWDiskStore; +import oshi.hardware.NetworkIF; +import oshi.hardware.PhysicalMemory; +import oshi.software.os.FileSystem; +import oshi.software.os.NetworkParams; +import oshi.software.os.OSFileStore; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@SpringBootTest +class SystemInfoServiceTest { + + private SystemInfoServiceImpl systemInfoService; // 实现类对象 + + @Resource + private ObjectMapper objectMapper; + + @BeforeEach + void setUp() { + // 实例化实现类 + systemInfoService = new SystemInfoServiceImpl(); + } + + @Test + void testGetOsName() { + // 调用接口方法 + String osName = systemInfoService.getOsName(); + + // 检查返回值是否符合预期(这里只能验证非空,因为操作系统名称依赖具体环境) + assertNotNull(osName, "操作系统名称不能为空!"); + System.out.println("操作系统名称: " + osName); + } + + @Test + void testGetOsBootTimeStamp() { + // 调用接口方法 + long bootTimeStamp = systemInfoService.getOsBootTimeStamp(); + + // 验证时间戳(一般会大于当前时间减去一个合理的范围) + assertTrue(bootTimeStamp > 0, "启动时间戳应该是正值!"); + System.out.println("操作系统启动时间戳: " + bootTimeStamp); + } + + @Test + void testGetProcessInfo() { + // 调用接口方法获取处理器信息 + ProcessorInfo processorInfo = systemInfoService.getProcessInfo(); + + // 检查返回的处理器信息是否合理 + assertNotNull(processorInfo, "处理器信息不能为空!"); + assertTrue(processorInfo.getPhysicalCores() > 0, "处理器核心数量应该大于0!"); + assertTrue(processorInfo.getLogicalCpu() >= processorInfo.getPhysicalCores(), "线程数量应该不小于核心数量!"); + assertTrue(processorInfo.getCpuVendorFreq() > 0, "CPU频率应该大于0!"); + System.out.println( + "处理器信息: 核心数量 = " + processorInfo.getPhysicalCores() + ", 线程数量 = " + processorInfo.getLogicalCpu() + ", 主频 = " + processorInfo.getCpuVendorFreq() + " GHz"); + } + + @Test + void testGetHardwareInfo() { + // // 调用接口方法获取硬件信息 + // HwInfo hardwareInfo = systemInfoService.getHardwareInfo(); + // + // // 检查返回的硬件信息是否合理 + // assertNotNull(hardwareInfo, "硬件信息不能为空!"); + // assertTrue(hardwareInfo.get() > 0, "内存大小应该大于0!"); + // assertTrue(hardwareInfo.getDiskCapacity() > 0, "磁盘容量应该大于0!"); + // System.out.println("硬件信息: 内存大小 = " + hardwareInfo.getMemorySize() + + // " GB, 磁盘容量 = " + hardwareInfo.getDiskCapacity() + " GB"); + } + + @Test + void testGetMemoryInfo() throws JsonProcessingException { + SystemInfo si = new SystemInfo(); + GlobalMemory memory = si.getHardware().getMemory(); + List