diff --git a/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusCommand.java b/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusCommand.java index 15bc5fc..0a65bcb 100644 --- a/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusCommand.java +++ b/src/main/java/ru/ldeloff/servermonitorbot/service/command/mdadm/MdadmStatusCommand.java @@ -15,6 +15,7 @@ import ru.ldeloff.servermonitorbot.utils.SshServerUtils; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; @Service @Slf4j @@ -55,7 +56,7 @@ public class MdadmStatusCommand extends CommandTemplate { .findFirst(); if (server.isPresent()) { // узнаю скок рейдов - Command commandRaid = sshService.execute(new Command("mdadm --monitor", 500, server.get())); + Command commandRaid = sshService.execute(new Command("mdadm --detail --scan", 500, server.get())); List raidNames = parseRaidNames(commandRaid); // Для каждого рейда надо выяснить статус StringBuilder result = new StringBuilder(); @@ -72,9 +73,8 @@ public class MdadmStatusCommand extends CommandTemplate { } } private List parseRaidNames(Command result) { - String raidInfo = result.getResponse(); List names = new ArrayList<>(); - Arrays.stream(raidInfo.split("\n")) + Arrays.stream(result.getResponse().split("\n")) .map(line -> line.split(" ")) .filter(lineArray -> lineArray.length >= 2) .map(lineArray -> lineArray[1]) @@ -83,18 +83,30 @@ public class MdadmStatusCommand extends CommandTemplate { } private List parseHddState(Command result) { - String raidInfo = result.getResponse(); List names = new ArrayList<>(); - Pattern pattern = Pattern.compile("^\\s*(\\d+)\\s+\\d+\\s+\\d+\\s+\\d+\\s+\\w+\\s+(.+)$"); - Matcher matcher = pattern.matcher(raidInfo); + String[] lines = result.getResponse().split("\n"); - while (matcher.find()) { - String number = matcher.group(1); - String state = matcher.group(2); - names.add("Number: " + number + ", State: " + state); + boolean foundHeader = false; + + for (String line : lines) { + if (!foundHeader) { + if ( line.contains("Number") && + line.contains("Major") && + line.contains("Minor") && + line.contains("RaidDevice") ) { + foundHeader = true; + } + } else { + List elements = Arrays.stream(line.split(" ")) + .filter(x -> !Objects.equals(x, "")).toList(); + names.add("Number Name State"); + names.add(elements.get(0) + ", " + + elements.get(6) + ", " + + elements.get(4) + " " + + elements.get(5)); + } } - return names; } }