diff --git a/src/main/java/com/tongran/agent/client/core/vo/DiskVO.java b/src/main/java/com/tongran/agent/client/core/vo/DiskVO.java index 2b9bea8..7fe63ba 100644 --- a/src/main/java/com/tongran/agent/client/core/vo/DiskVO.java +++ b/src/main/java/com/tongran/agent/client/core/vo/DiskVO.java @@ -51,7 +51,9 @@ public class DiskVO implements Serializable { private long usedSpace; /** 健康状态 0 不健康,1健康 */ @Schema(description = "健康状态") - private long healthStatus; + private Long healthStatus; + @Schema(description = "健康分数") + private Integer healthScore; } diff --git a/src/main/java/com/tongran/agent/client/service/impl/AgentServiceImpl.java b/src/main/java/com/tongran/agent/client/service/impl/AgentServiceImpl.java index 019c15d..def0038 100644 --- a/src/main/java/com/tongran/agent/client/service/impl/AgentServiceImpl.java +++ b/src/main/java/com/tongran/agent/client/service/impl/AgentServiceImpl.java @@ -941,7 +941,7 @@ public class AgentServiceImpl implements AgentService { if(jsonObject.containsKey("tcpdumpTimes")){ String tcpdumpTimes = jsonObject.getString("tcpdumpTimes"); TcpdumpEO tcpdumpEO = JSON.parseObject(tcpdumpTimes, TcpdumpEO.class); - if(tcpdumpEO.getDetectFlag() == 1){ + if(tcpdumpEO.getDetectFlag() != null && tcpdumpEO.getDetectFlag() == 1){ if("1".equals(tcpdumpEO.getFrequency())){ handleTcpdump(tcpdumpEO); }else if("2".equals(tcpdumpEO.getFrequency())){ diff --git a/src/main/java/com/tongran/agent/client/service/impl/DiskServiceImpl.java b/src/main/java/com/tongran/agent/client/service/impl/DiskServiceImpl.java index 17fadd6..3e73d8a 100644 --- a/src/main/java/com/tongran/agent/client/service/impl/DiskServiceImpl.java +++ b/src/main/java/com/tongran/agent/client/service/impl/DiskServiceImpl.java @@ -32,11 +32,13 @@ public class DiskServiceImpl implements DiskService { // 处理磁盘名称:去掉/dev/前缀 String diskFullName = disk.getName(); // 获取磁盘是否健康 - boolean isHealth = isDiskHealthy(diskFullName); - if(isHealth){ - diskVO.setHealthStatus(1); - }else{ - diskVO.setHealthStatus(0); + Long isHealth = isDiskHealthy(diskFullName); + if (diskFullName.startsWith("/dev/nvme")) { + int score = getNvmeHealthScore(diskFullName); + diskVO.setHealthScore(score); + } + if (!diskFullName.startsWith("/dev/dm")) { + diskVO.setHealthStatus(isHealth); } String diskName = diskFullName.replace("/dev/", ""); diskVO.setName(diskName); // 保持原样存储 @@ -226,7 +228,7 @@ public class DiskServiceImpl implements DiskService { return partitionToDiskMap; } - public boolean isDiskHealthy(String diskDevice) { + public Long isDiskHealthy(String diskDevice) { try { Process process = new ProcessBuilder("smartctl", "-H", diskDevice) .redirectErrorStream(true) @@ -235,13 +237,86 @@ public class DiskServiceImpl implements DiskService { try (BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream()))) { - return reader.lines() + boolean isHealth = reader.lines() .anyMatch(line -> line.contains("PASSED") || line.contains("OK")) && process.waitFor() == 0; + if(isHealth){ + return 1L; + }else{ + return 0L; + } } } catch (Exception e) { - return false; + return null; + } + } + public int getNvmeHealthScore(String diskDevice) { + try { + // 检查是否为 NVMe 设备 + if (!diskDevice.startsWith("/dev/nvme")) { + return -1; // 非 NVMe 设备 + } + + Process process = new ProcessBuilder("smartctl", "-a", diskDevice) + .redirectErrorStream(true) + .start(); + + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(process.getInputStream()))) { + + int exitCode = process.waitFor(); + if (exitCode != 0) { + return -1; // 命令执行失败 + } + + int percentageUsed = -1; + int availableSpare = -1; + String line; + + // 解析 smartctl 输出 + while ((line = reader.readLine()) != null) { + // 查找 Percentage Used(已用百分比) + if (line.contains("Percentage Used:")) { + String[] parts = line.split(":"); + if (parts.length > 1) { + String value = parts[1].trim().split("\\s+")[0]; + try { + percentageUsed = Integer.parseInt(value.replace("%", "")); + } catch (NumberFormatException e) { + // 忽略解析错误 + } + } + } + // 查找 Available Spare(可用备用空间) + else if (line.contains("Available Spare:")) { + String[] parts = line.split(":"); + if (parts.length > 1) { + String value = parts[1].trim().split("\\s+")[0]; + try { + availableSpare = Integer.parseInt(value.replace("%", "")); + } catch (NumberFormatException e) { + // 忽略解析错误 + } + } + } + } + + // 计算健康分数 + if (percentageUsed >= 0) { + // 健康分数 = 100 - 已用百分比 + return 100 - percentageUsed; + } else if (availableSpare >= 0) { + // 如果没有 Percentage Used,使用 Available Spare + return availableSpare; + } else { + return -1; // 无法获取健康信息 + } + + } + + } catch (Exception e) { + return -1; } }