Explorar o código

调整 machine 相关的数据,引入 oshi 包统一获取机器硬件和系统相关的数据

reghao %!s(int64=4) %!d(string=hai) anos
pai
achega
ec86b17150
Modificáronse 49 ficheiros con 513 adicións e 489 borrados
  1. 4 23
      common/src/main/java/cn/reghao/autodop/common/beans/BeansConfig.java
  2. 2 2
      common/src/main/java/cn/reghao/autodop/common/log/MqttAppender.java
  3. 18 62
      common/src/main/java/cn/reghao/autodop/common/machine/Cpu.java
  4. 49 0
      common/src/main/java/cn/reghao/autodop/common/machine/Disk.java
  5. 0 14
      common/src/main/java/cn/reghao/autodop/common/machine/LinuxProc.java
  6. 44 34
      common/src/main/java/cn/reghao/autodop/common/machine/Machine.java
  7. 34 59
      common/src/main/java/cn/reghao/autodop/common/machine/Memory.java
  8. 12 20
      common/src/main/java/cn/reghao/autodop/common/machine/Os.java
  9. 2 2
      common/src/main/java/cn/reghao/autodop/common/mqtt/DefaultMqttClient.java
  10. 1 1
      common/src/main/java/cn/reghao/autodop/common/msg/pub/clazz/NodePubClazz.java
  11. 5 4
      dagent/src/main/java/cn/reghao/autodop/dagent/app/DockerAppServiceImpl.java
  12. 5 3
      dagent/src/main/java/cn/reghao/autodop/dagent/machine/NodeClazzPubImpl.java
  13. 4 4
      dagent/src/main/java/cn/reghao/autodop/dagent/mqttsub/RpcListener.java
  14. 3 3
      dagent/src/main/java/cn/reghao/autodop/dagent/mqttsub/impl/AppClazzRpcImpl.java
  15. 1 1
      dagent/src/main/java/cn/reghao/autodop/dagent/mqttsub/impl/DockerClazzRpcImpl.java
  16. 1 1
      dagent/src/main/java/cn/reghao/autodop/dagent/mqttsub/impl/MachineClazzRpcImpl.java
  17. 2 3
      dagent/src/main/java/cn/reghao/autodop/dagent/spring/DagentLifecycle.java
  18. 37 0
      dagent/src/main/test/Test.java
  19. 2 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/BuildDirPageController.java
  20. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/CompilerPageController.java
  21. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/PackerPageController.java
  22. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/AppDeployer.java
  23. 10 7
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/BuildDirServiceImpl.java
  24. 0 13
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/rpc/AppRpcClazzResultHandler.java
  25. 14 14
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/controller/MachineController.java
  26. 26 26
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/controller/MachinePageController.java
  27. 5 11
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/po/DiskInfo.java
  28. 10 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/po/DiskUsage.java
  29. 1 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/po/MachineHost.java
  30. 19 23
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/po/MachineInfo.java
  31. 10 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/po/MemUsage.java
  32. 4 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/po/NetworkInfo.java
  33. 6 6
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/vo/DiskUsage.java
  34. 9 12
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/vo/MachineHostVO.java
  35. 4 31
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/service/MachineService.java
  36. 46 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/service/MachineServiceImpl.java
  37. 12 12
      dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/MessageListener.java
  38. 10 10
      dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/pub/NodePubClazzHandler.java
  39. 17 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/pub/NodePubClazzImpl.java
  40. 7 8
      dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/rpcresult/AppRpcClazzResultHandler.java
  41. 8 10
      dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/rpcresult/AppRpcClazzResultImpl.java
  42. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/rpcresult/DockerRpcClazzResultHandler.java
  43. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/rpcresult/MachineRpcClazzResultHandler.java
  44. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/spring/DmasterLifecycle.java
  45. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/util/log/MongoAppender.java
  46. 35 27
      dmaster/src/main/resources/templates/machine/detail.html
  47. 9 10
      dmaster/src/main/resources/templates/machine/host.html
  48. 1 1
      dmaster/src/main/resources/templates/machine/webssh.html
  49. 6 0
      pom.xml

+ 4 - 23
common/src/main/java/cn/reghao/autodop/common/beans/BeansConfig.java

@@ -1,12 +1,9 @@
 package cn.reghao.autodop.common.beans;
 
 import cn.reghao.autodop.common.machine.Machine;
-import cn.reghao.autodop.common.machine.Cpu;
-import cn.reghao.autodop.common.machine.Memory;
-import cn.reghao.autodop.common.machine.Os;
-import cn.reghao.jdkutil.text.TextFile;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import oshi.SystemInfo;
 
 /**
  * @author reghao
@@ -15,27 +12,11 @@ import org.springframework.context.annotation.Configuration;
 @Configuration
 public class BeansConfig {
     @Bean
-    public TextFile textFile() {
-        return new TextFile();
+    public SystemInfo systemInfo() {
+        return new SystemInfo();
     }
 
-    @Bean
     public Machine machine() {
-        return new Machine(os(), cpu(), memory());
-    }
-
-    @Bean
-    public Os os() {
-        return new Os(textFile());
-    }
-
-    @Bean
-    public Cpu cpu() {
-        return new Cpu(textFile());
-    }
-
-    @Bean
-    public Memory memory() {
-        return new Memory(textFile());
+        return new Machine(systemInfo());
     }
 }

+ 2 - 2
common/src/main/java/cn/reghao/autodop/common/log/MqttAppender.java

@@ -2,13 +2,13 @@ package cn.reghao.autodop.common.log;
 
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.core.UnsynchronizedAppenderBase;
+import cn.reghao.autodop.common.machine.Machine;
 import cn.reghao.autodop.common.mqtt.DefaultMqttClient;
 import cn.reghao.autodop.common.msg.Message;
 import cn.reghao.autodop.common.msg.MsgQueue;
 import cn.reghao.autodop.common.msg.pub.PubMsg;
 import cn.reghao.autodop.common.msg.pub.clazz.NodePubClazz;
 import cn.reghao.autodop.common.msg.pub.dto.node.NodeLogDTO;
-import cn.reghao.jdkutil.machine.MachineId;
 import cn.reghao.jdkutil.serializer.JsonConverter;
 import org.eclipse.paho.client.mqttv3.MqttException;
 
@@ -52,7 +52,7 @@ public class MqttAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
 
     private NodeLogDTO nodeLogDTO(ILoggingEvent event) {
         NodeLogDTO nodeLogDTO = new NodeLogDTO();
-        nodeLogDTO.setMachineId(MachineId.id());
+        nodeLogDTO.setMachineId(Machine.ID);
         nodeLogDTO.setAppId(appId);
         nodeLogDTO.setTimestamp(event.getTimeStamp());
         nodeLogDTO.setLevel(event.getLevel().toString());

+ 18 - 62
common/src/main/java/cn/reghao/autodop/common/machine/Cpu.java

@@ -1,77 +1,33 @@
 package cn.reghao.autodop.common.machine;
 
-import cn.reghao.jdkutil.text.TextFile;
-import lombok.Data;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.Serializable;
-import java.util.*;
+import cn.reghao.jdkutil.machine.MachineData;
+import cn.reghao.jdkutil.machine.detail.CpuDetail;
+import cn.reghao.jdkutil.machine.stat.CpuStat;
+import oshi.hardware.CentralProcessor;
 
 /**
- * 处理器
- *
  * @author reghao
  * @date 2019-10-25 13:12:36
  */
-@Slf4j
-public class Cpu {
-    private final TextFile textFile;
+public class Cpu implements MachineData<CpuDetail, CpuStat> {
+    private CentralProcessor processor;
 
-    public Cpu(TextFile textFile) {
-        this.textFile = textFile;
+    public Cpu(CentralProcessor processor) {
+        this.processor = processor;
     }
 
+    @Override
     public CpuDetail detail() {
-        List<String> list = textFile.read(LinuxProc.CPU_INFO);
-        if (list.isEmpty()) {
-            log.error("CPU 信息获取失败");
-            return null;
-        }
-
-        List<Map<String, String>> result = new ArrayList<>();
-        Map<String, String> map = new HashMap<>();
-        for (String line : list) {
-            if (!line.isEmpty()) {
-                String[] kv = line.replace("\t", " ").split(":");
-                if (kv.length == 2) {
-                    map.put(kv[0].toLowerCase().trim(), kv[1].trim());
-                }
-            } else {
-                result.add(map);
-                map = new HashMap<>();
-            }
-        }
-
-        if (result.isEmpty()) {
-            log.error("CPU 信息获取失败");
-            return null;
-        }
-
-        Map<String, String> info = result.get(0);
-        CpuDetail cpuInfo = new CpuDetail();
-        // TODO Raspbian 系统没有此字段
-        String cpuCores = info.get("cpu cores");
-        if (cpuCores != null) {
-            cpuInfo.setPhysicalCore(Integer.parseInt(cpuCores));
-        }
-
-        cpuInfo.setVendorId(info.get("vendor_id"));
-        cpuInfo.setModelName(info.get("model name"));
-        cpuInfo.setBogoMips(info.get("bogomips"));
-
-        Map<String, String> info1 = result.get(result.size()-1);
-        cpuInfo.setLogicalCore(Integer.parseInt(info1.get("processor")) + 1);
-        return cpuInfo;
+        CentralProcessor.ProcessorIdentifier processorIdentifier = processor.getProcessorIdentifier();
+        String vendor = processorIdentifier.getVendor();
+        String name = processorIdentifier.getName();
+        int physicalCore = processor.getPhysicalProcessorCount();
+        int logicalCore = processor.getLogicalProcessorCount();
+        return new CpuDetail(vendor, name, physicalCore, logicalCore);
     }
 
-    @Data
-    public static class CpuDetail implements Serializable {
-        private static final long serialVersionUID = 1L;
-
-        private int physicalCore;
-        private int logicalCore;
-        private String vendorId;
-        private String modelName;
-        private String bogoMips;
+    @Override
+    public CpuStat stat() {
+        return null;
     }
 }

+ 49 - 0
common/src/main/java/cn/reghao/autodop/common/machine/Disk.java

@@ -0,0 +1,49 @@
+package cn.reghao.autodop.common.machine;
+
+import cn.reghao.jdkutil.machine.MachineData;
+import cn.reghao.jdkutil.machine.detail.DiskDetail;
+import cn.reghao.jdkutil.machine.stat.DiskStat;
+import oshi.SystemInfo;
+import oshi.software.os.OperatingSystem;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2019-10-25 13:21:25
+ */
+public class Disk implements MachineData<List<DiskDetail>, List<DiskStat>> {
+    private OperatingSystem os;
+
+    public Disk(SystemInfo si) {
+        this.os = si.getOperatingSystem();
+    }
+
+    @Override
+    public List<DiskDetail> detail() {
+        List<DiskDetail> diskDetails = os.getFileSystem().getFileStores().stream()
+                .map(osFileStore -> {
+                    String vol = osFileStore.getVolume();
+                    String mount = osFileStore.getMount();
+                    String fsType = osFileStore.getType();
+
+                    long total = osFileStore.getTotalSpace();
+                    long userAvail = osFileStore.getUsableSpace();
+                    long rootAvail = osFileStore.getFreeSpace();
+
+                    long inodeTotal = osFileStore.getTotalInodes();
+                    long inodeFree = osFileStore.getFreeInodes();
+
+                    return new DiskDetail(vol, mount, fsType, total, userAvail, total-userAvail, inodeTotal, inodeFree);
+                })
+                .collect(Collectors.toList());
+
+        return diskDetails;
+    }
+
+    @Override
+    public List<DiskStat> stat() {
+        return null;
+    }
+}

+ 0 - 14
common/src/main/java/cn/reghao/autodop/common/machine/LinuxProc.java

@@ -1,14 +0,0 @@
-package cn.reghao.autodop.common.machine;
-
-/**
- * /proc 文件系统中的文件路径
- *
- * @author reghao
- * @date 2020-03-20 11:39:26
- */
-public class LinuxProc {
-    public static final String LOAD_AVG = "/proc/loadavg";
-    public static final String CPU_INFO = "/proc/cpuinfo";
-    public static final String CPU_STAT = "/proc/stat";
-    public static final String MEM_INFO = "/proc/meminfo";
-}

+ 44 - 34
common/src/main/java/cn/reghao/autodop/common/machine/Machine.java

@@ -1,66 +1,76 @@
 package cn.reghao.autodop.common.machine;
 
+import cn.reghao.jdkutil.http.WebClient;
+import cn.reghao.jdkutil.http.WebRequest;
+import cn.reghao.jdkutil.http.WebResponse;
 import cn.reghao.jdkutil.machine.Disk;
-import cn.reghao.jdkutil.machine.MachineId;
 import cn.reghao.jdkutil.machine.Network;
-import cn.reghao.jdkutil.machine.OsDetail;
-import lombok.Data;
+import cn.reghao.jdkutil.machine.detail.*;
+import cn.reghao.jdkutil.machine.id.MachineId;
+import cn.reghao.jdkutil.machine.id.MachineIdLinux;
+import cn.reghao.jdkutil.machine.stat.MachineStat;
+import org.springframework.stereotype.Service;
+import oshi.SystemInfo;
 
-import java.io.Serializable;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author reghao
  * @date 2020-10-22 15:47:58
  */
+@Service
 public class Machine {
+    public final static String ID;
+    public final static String IPV4;
+    static {
+        MachineId machineId = new MachineIdLinux();
+        ID = machineId.id();
+        IPV4 = machineId.ipv4();
+    }
+
     private final Os os;
+    private final Network network;
     private final Cpu cpu;
     private final Memory memory;
+    private final Disk disk;
+
+    private final WebRequest webRequest = new WebClient();
 
-    public Machine(Os os, Cpu cpu, Memory memory) {
-        this.os = os;
-        this.cpu = cpu;
-        this.memory = memory;
+    public Machine(SystemInfo si) {
+        this.os = new Os(si.getOperatingSystem());
+        this.network = new Network();
+        this.cpu = new Cpu(si.getHardware().getProcessor());
+        this.memory = new Memory(si.getHardware().getMemory());
+        this.disk = new Disk();
     }
 
     public MachineDetail detail() {
         MachineDetail machineDetail = new MachineDetail();
-        machineDetail.setMachineId(MachineId.id());
+        machineDetail.setMachineId(Machine.ID);
         machineDetail.setOsDetail(os.detail());
-        machineDetail.setNetworkDetails(Network.details());
+
+        List<NetworkDetail> list = network.detail().stream()
+                .peek(networkDetail -> {
+                    WebResponse webResponse = webRequest.get("http://ip.iquizoo.com");
+                    if (webResponse.getStatusCode() == 200) {
+                        networkDetail.setPubicIpv4(webResponse.getBody());
+                    }
+                })
+                .collect(Collectors.toList());
+        machineDetail.setNetworkDetails(list);
+
         machineDetail.setCpuDetail(cpu.detail());
         machineDetail.setMemoryDetail(memory.detail());
-        machineDetail.setDiskDetails(Disk.details());
+        machineDetail.setDiskDetails(disk.detail());
         return machineDetail;
     }
 
     public MachineStat stat() {
         MachineStat machineStat = new MachineStat();
-        machineStat.setMachineId(MachineId.id());
+        machineStat.setMachineId(Machine.ID);
         machineStat.setMemoryDetail(memory.detail());
-        machineStat.setDiskDetails(Disk.details());
+        machineStat.setDiskDetails(disk.detail());
         return machineStat;
     }
-
-    @Data
-    public static class MachineDetail implements Serializable {
-        private static final long serialVersionUID = 1L;
-
-        private String machineId;
-        private OsDetail osDetail;
-        private List<Network.NetworkDetail> networkDetails;
-        private Cpu.CpuDetail cpuDetail;
-        private Memory.MemoryDetail memoryDetail;
-        private List<Disk.DiskDetail> diskDetails;
-    }
-
-    @Data
-    public static class MachineStat implements Serializable {
-        private static final long serialVersionUID = 1L;
-
-        private String machineId;
-        private Memory.MemoryDetail memoryDetail;
-        private List<Disk.DiskDetail> diskDetails;
-    }
 }

+ 34 - 59
common/src/main/java/cn/reghao/autodop/common/machine/Memory.java

@@ -1,78 +1,53 @@
 package cn.reghao.autodop.common.machine;
 
-import cn.reghao.jdkutil.text.TextFile;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import cn.reghao.autodop.common.util.jvm.po.MemoryStat;
+import cn.reghao.jdkutil.machine.MachineData;
+import cn.reghao.jdkutil.machine.detail.MemoryDetail;
+import oshi.hardware.GlobalMemory;
+import oshi.hardware.VirtualMemory;
 
 /**
- * 内存
- *
  * @author reghao
  * @date 2019-10-25 13:21:25
  */
-public class Memory {
-    private final TextFile textFile;
-
-    public Memory(TextFile textFile) {
-        this.textFile = textFile;
+public class Memory implements MachineData<MemoryDetail, MemoryStat> {
+    private GlobalMemory globalMemory;
+    private VirtualMemory virtualMemory;
+    private MemoryDetail memoryDetail;
+
+    public Memory(GlobalMemory globalMemory) {
+        this.globalMemory = globalMemory;
+        this.virtualMemory = globalMemory.getVirtualMemory();
     }
 
+    @Override
     public MemoryDetail detail() {
-        Map<String, String> map = parseMemInfo();
-        long total = Long.parseLong(map.get("MemTotal").split("kB")[0]);
-        long free = Long.parseLong(map.get("MemFree").split("kB")[0]);
-        long shared = Long.parseLong(map.get("Shmem").split("kB")[0]);
-        long buffers = Long.parseLong(map.get("Buffers").split("kB")[0]);
-        long cached = Long.parseLong(map.get("Cached").split("kB")[0]) +
-                Long.parseLong(map.get("SReclaimable").split("kB")[0]);
-        long buffCache = buffers + cached;
-        long available = Long.parseLong(map.get("MemAvailable").split("kB")[0]);
-        long used = total - free - buffCache;
-
-        long swapTotal = Long.parseLong(map.get("SwapTotal").split("kB")[0]);
-        long swapUnused = Long.parseLong(map.get("SwapFree").split("kB")[0]);
-        long swapUsed = swapTotal - swapUnused;
+        long total = globalMemory.getTotal();
+        long avail = globalMemory.getAvailable();
+        long swapTotal = virtualMemory.getSwapTotal();
+        long swapUsed = virtualMemory.getSwapUsed();
 
-        MemoryDetail memoryInfo = new MemoryDetail();
-        memoryInfo.setTotal(total);
-        memoryInfo.setUsed(used);
-        memoryInfo.setFree(free);
-        memoryInfo.setShared(shared);
-        memoryInfo.setBuffCache(buffCache);
-        memoryInfo.setAvailable(available);
+        if (memoryDetail == null) {
+            memoryDetail = new MemoryDetail(total, avail, total-avail, swapTotal, swapTotal-swapUsed);
+        }
 
-        memoryInfo.setSwapTotal(total);
-        memoryInfo.setSwapUsed(swapUsed);
-        memoryInfo.setSwapFree(swapUnused);
-        return memoryInfo;
+        return memoryDetail;
     }
 
-    private Map<String, String> parseMemInfo() {
-        String info = textFile.readFile(LinuxProc.MEM_INFO);
-        Map<String, String> map = new LinkedHashMap<>();
-        for (String line : info.split(System.lineSeparator())) {
-            String[] strs = line.replace("\t", "").split(":");
-            map.put(strs[0], strs[1].replace(" ", ""));
+    @Override
+    public MemoryStat stat() {
+        if (memoryDetail == null) {
+            memoryDetail = detail();
         }
-        return map;
-    }
 
-    @Data
-    public static class MemoryDetail implements Serializable {
-        private static final long serialVersionUID = 1L;
+        long total = globalMemory.getTotal();
+        long avail = globalMemory.getAvailable();
+        memoryDetail.setAvail(avail);
+        memoryDetail.setUsed(total-avail);
 
-        // KiB
-        private long total;
-        private long used;
-        private long free;
-        private long shared;
-        private long buffCache;
-        private long available;
-        private long swapTotal;
-        private long swapUsed;
-        private long swapFree;
+        long swapTotal = virtualMemory.getSwapTotal();
+        long swapUsed = virtualMemory.getSwapUsed();
+        memoryDetail.setAvail(swapTotal-swapUsed);
+        return null;
     }
 }

+ 12 - 20
common/src/main/java/cn/reghao/autodop/common/machine/Os.java

@@ -1,38 +1,30 @@
 package cn.reghao.autodop.common.machine;
 
-import cn.reghao.jdkutil.converter.DateTimeConverter;
-import cn.reghao.jdkutil.machine.OsDetail;
-import cn.reghao.jdkutil.text.TextFile;
-import lombok.extern.slf4j.Slf4j;
-
-import java.time.LocalDateTime;
+import cn.reghao.jdkutil.machine.MachineData;
+import cn.reghao.jdkutil.machine.detail.OsDetail;
+import cn.reghao.jdkutil.machine.stat.OsStat;
+import oshi.software.os.OperatingSystem;
 
 /**
  * @author reghao
  * @date 2020-10-20 23:17:30
  */
-@Slf4j
-public class Os {
-    private final TextFile textFile;
+public class Os implements MachineData<OsDetail, OsStat> {
+    private OperatingSystem os;
 
-    public Os(TextFile textFile) {
-        this.textFile = textFile;
+    public Os(OperatingSystem os) {
+        this.os = os;
     }
 
+    @Override
     public OsDetail detail() {
         OsDetail osDetail = new OsDetail();
-        osDetail.setBootTime(bootTime());
+        osDetail.setBootTime(os.getSystemBootTime());
         return osDetail;
     }
 
-    private LocalDateTime bootTime() {
-        String cpuStat = textFile.readFile(LinuxProc.CPU_STAT);
-        for (String line : cpuStat.split(System.lineSeparator())) {
-            if (line.startsWith("btime")) {
-                long btime = Long.parseLong(line.split("\\s+")[1]);
-                return DateTimeConverter.localDateTime(btime*1000);
-            }
-        }
+    @Override
+    public OsStat stat() {
         return null;
     }
 }

+ 2 - 2
common/src/main/java/cn/reghao/autodop/common/mqtt/DefaultMqttClient.java

@@ -1,8 +1,8 @@
 package cn.reghao.autodop.common.mqtt;
 
+import cn.reghao.autodop.common.machine.Machine;
 import cn.reghao.autodop.common.msg.Message;
 import cn.reghao.autodop.common.msg.rpc.RpcMsg;
-import cn.reghao.jdkutil.machine.MachineId;
 import cn.reghao.jdkutil.serializer.JsonConverter;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.paho.client.mqttv3.*;
@@ -29,7 +29,7 @@ public class DefaultMqttClient implements AutoCloseable {
 
     public DefaultMqttClient(MosquittoProperties properties) throws MqttException, IOException {
         this.properties = properties;
-        String clientId = properties.getClientId() + MachineId.id();
+        String clientId = properties.getClientId() + Machine.ID;
         this.client = new MqttClient(properties.getBroker(), clientId, new MemoryPersistence());
     }
 

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/msg/pub/clazz/NodePubClazz.java

@@ -5,5 +5,5 @@ package cn.reghao.autodop.common.msg.pub.clazz;
  * @date 2021-09-15 09:19:14
  */
 public enum NodePubClazz {
-    start, shutdown, heartbeat, log,
+    start, heartbeat, shutdown, log
 }

+ 5 - 4
dagent/src/main/java/cn/reghao/autodop/dagent/app/DockerAppServiceImpl.java

@@ -1,5 +1,6 @@
 package cn.reghao.autodop.dagent.app;
 
+import cn.reghao.autodop.common.machine.Machine;
 import cn.reghao.autodop.common.msg.rpc.dto.app.AppStatus;
 import cn.reghao.autodop.common.msg.rpc.dto.app.DeployParam;
 import cn.reghao.autodop.common.dagent.app.log.AppLogArgs;
@@ -13,10 +14,9 @@ import cn.reghao.autodop.common.docker.pojo.HostConfig;
 import cn.reghao.autodop.common.docker.pojo.State;
 import cn.reghao.autodop.common.docker.pojo.result.ContainerInfo;
 import cn.reghao.autodop.common.util.ExceptionUtil;
-import cn.reghao.jdkutil.machine.MachineId;
 import cn.reghao.jdkutil.converter.DateTimeConverter;
 import cn.reghao.jdkutil.serializer.JsonConverter;
-import cn.reghao.autodop.dagent.spring.DagentLifecycle;
+import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -25,6 +25,7 @@ import java.util.List;
  * @author reghao
  * @date 2021-02-22 16:21:37
  */
+@Service
 public class DockerAppServiceImpl implements AppService {
     private final long sleep = 10_000;
 
@@ -56,8 +57,8 @@ public class DockerAppServiceImpl implements AppService {
 
     private AppStatus getAppStatus(String appId, ContainerInfo containerInfo) {
         AppStatus appStatus = new AppStatus();
-        appStatus.setMachineId(MachineId.id());
-        appStatus.setMachineIpv4(MachineId.ipv4());
+        appStatus.setMachineId(Machine.ID);
+        appStatus.setMachineIpv4(Machine.IPV4);
         appStatus.setAppId(appId);
         appStatus.setPackagePath(containerInfo.getConfig().getImage());
 

+ 5 - 3
dagent/src/main/java/cn/reghao/autodop/dagent/machine/NodeClazzPubImpl.java

@@ -7,6 +7,8 @@ import cn.reghao.autodop.common.msg.MsgQueue;
 import cn.reghao.autodop.common.msg.pub.PubMsg;
 import cn.reghao.autodop.common.msg.pub.clazz.NodePubClazz;
 import cn.reghao.autodop.common.util.thread.ThreadPoolWrapper;
+import cn.reghao.jdkutil.machine.detail.MachineDetail;
+import cn.reghao.jdkutil.machine.stat.MachineStat;
 import cn.reghao.jdkutil.serializer.JsonConverter;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.paho.client.mqttv3.MqttException;
@@ -33,7 +35,7 @@ public class NodeClazzPubImpl {
     }
     
     public void nodeStart() {
-        Machine.MachineDetail machineDetail = machine.detail();
+        MachineDetail machineDetail = machine.detail();
         String jsonPayload = JsonConverter.objectToJson(machineDetail);
         PubMsg pubMsg = PubMsg.pubMsg(pubClazz, NodePubClazz.start.name(), jsonPayload);
         pub(pubMsg);
@@ -41,7 +43,7 @@ public class NodeClazzPubImpl {
 
     public void nodeShutdown() {
         ThreadPoolWrapper.shutdownScheduler(scheduler);
-        Machine.MachineStat machineStat = machine.stat();
+        MachineStat machineStat = machine.stat();
         String jsonPayload = JsonConverter.objectToJson(machineStat);
         PubMsg pubMsg = PubMsg.pubMsg(pubClazz, NodePubClazz.shutdown.name(), jsonPayload);
         pub(pubMsg);
@@ -67,7 +69,7 @@ public class NodeClazzPubImpl {
     class Heartbeat implements Runnable {
         @Override
         public void run() {
-            Machine.MachineStat machineStat = machine.stat();
+            MachineStat machineStat = machine.stat();
             String jsonPayload = JsonConverter.objectToJson(machineStat);
             PubMsg pubMsg = PubMsg.pubMsg(pubClazz, NodePubClazz.heartbeat.name(), jsonPayload);
             pub(pubMsg);

+ 4 - 4
dagent/src/main/java/cn/reghao/autodop/dagent/rpc/RpcListener.java → dagent/src/main/java/cn/reghao/autodop/dagent/mqttsub/RpcListener.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dagent.rpc;
+package cn.reghao.autodop.dagent.mqttsub;
 
 import cn.reghao.autodop.common.mqtt.DefaultMqttClient;
 import cn.reghao.autodop.common.msg.Message;
@@ -7,9 +7,9 @@ import cn.reghao.autodop.common.msg.rpc.RpcPayload;
 import cn.reghao.autodop.common.msg.rpc.RpcMsg;
 import cn.reghao.autodop.common.msg.rpc.RpcResult;
 import cn.reghao.autodop.common.msg.rpc.clazz.RpcClazz;
-import cn.reghao.autodop.dagent.rpc.impl.AppClazzRpcImpl;
-import cn.reghao.autodop.dagent.rpc.impl.DockerClazzRpcImpl;
-import cn.reghao.autodop.dagent.rpc.impl.MachineClazzRpcImpl;
+import cn.reghao.autodop.dagent.mqttsub.impl.AppClazzRpcImpl;
+import cn.reghao.autodop.dagent.mqttsub.impl.DockerClazzRpcImpl;
+import cn.reghao.autodop.dagent.mqttsub.impl.MachineClazzRpcImpl;
 import cn.reghao.jdkutil.serializer.JsonConverter;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;

+ 3 - 3
dagent/src/main/java/cn/reghao/autodop/dagent/rpc/impl/AppClazzRpcImpl.java → dagent/src/main/java/cn/reghao/autodop/dagent/mqttsub/impl/AppClazzRpcImpl.java

@@ -1,8 +1,9 @@
-package cn.reghao.autodop.dagent.rpc.impl;
+package cn.reghao.autodop.dagent.mqttsub.impl;
 
 import cn.reghao.autodop.common.dagent.app.log.AppLogArgs;
 import cn.reghao.autodop.common.dagent.app.log.LogConfig;
 import cn.reghao.autodop.common.dagent.app.log.LogFile;
+import cn.reghao.autodop.common.machine.Machine;
 import cn.reghao.autodop.common.msg.rpc.dto.app.*;
 import cn.reghao.autodop.common.msg.rpc.RpcPayload;
 import cn.reghao.autodop.common.msg.rpc.RpcResult;
@@ -11,7 +12,6 @@ import cn.reghao.autodop.common.util.ExceptionUtil;
 import cn.reghao.autodop.dagent.app.AppService;
 import cn.reghao.autodop.dagent.app.DockerAppServiceImpl;
 import cn.reghao.autodop.dagent.app.ZipAppServiceImpl;
-import cn.reghao.jdkutil.machine.MachineId;
 import cn.reghao.jdkutil.result.Result;
 import cn.reghao.jdkutil.result.ResultStatus;
 import cn.reghao.jdkutil.serializer.JsonConverter;
@@ -67,7 +67,7 @@ public class AppClazzRpcImpl {
         String packType = deployParam.getPackType();
 
         AppStatus appStatus;
-        DeployResult deployResult = new DeployResult(buildLogId, MachineId.id(), MachineId.ipv4());
+        DeployResult deployResult = new DeployResult(buildLogId, Machine.ID, Machine.IPV4);
         try {
             switch (PackType.valueOf(packType)) {
                 case docker:

+ 1 - 1
dagent/src/main/java/cn/reghao/autodop/dagent/rpc/impl/DockerClazzRpcImpl.java → dagent/src/main/java/cn/reghao/autodop/dagent/mqttsub/impl/DockerClazzRpcImpl.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dagent.rpc.impl;
+package cn.reghao.autodop.dagent.mqttsub.impl;
 
 import cn.reghao.autodop.common.docker.Docker;
 import cn.reghao.autodop.common.msg.rpc.RpcPayload;

+ 1 - 1
dagent/src/main/java/cn/reghao/autodop/dagent/rpc/impl/MachineClazzRpcImpl.java → dagent/src/main/java/cn/reghao/autodop/dagent/mqttsub/impl/MachineClazzRpcImpl.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dagent.rpc.impl;
+package cn.reghao.autodop.dagent.mqttsub.impl;
 
 import cn.reghao.autodop.common.machine.Machine;
 import cn.reghao.autodop.common.msg.rpc.RpcPayload;

+ 2 - 3
dagent/src/main/java/cn/reghao/autodop/dagent/spring/DagentLifecycle.java

@@ -8,9 +8,8 @@ import cn.reghao.autodop.common.mqtt.DefaultMqttClient;
 import cn.reghao.autodop.common.msg.MsgQueue;
 import cn.reghao.autodop.common.msg.pub.dto.node.constant.AppId;
 import cn.reghao.autodop.dagent.machine.NodeClazzPubImpl;
-import cn.reghao.autodop.dagent.rpc.RpcListener;
+import cn.reghao.autodop.dagent.mqttsub.RpcListener;
 import cn.reghao.autodop.common.log.LoggerConfig;
-import cn.reghao.jdkutil.machine.MachineId;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.paho.client.mqttv3.MqttException;
 import org.springframework.beans.factory.DisposableBean;
@@ -60,7 +59,7 @@ public class DagentLifecycle implements ApplicationRunner, DisposableBean {
     }
 
     private void subTopic() throws MqttException {
-        String topic = MsgQueue.dagentTopic(MachineId.id());
+        String topic = MsgQueue.dagentTopic(Machine.ID);
         mqttClient.sub(topic, rpcListener);
     }
 

+ 37 - 0
dagent/src/main/test/Test.java

@@ -0,0 +1,37 @@
+import oshi.SystemInfo;
+import oshi.hardware.HardwareAbstractionLayer;
+import oshi.software.os.OperatingSystem;
+import oshi.hardware.*;
+import oshi.software.os.*;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2021-10-16 17:00:58
+ */
+public class Test {
+    public static void main(String[] args) {
+        SystemInfo si = new SystemInfo();
+
+        OperatingSystem os = si.getOperatingSystem();
+        os.getFileSystem().getFileStores().stream()
+                .map(osFileStore -> {
+                    String vol = osFileStore.getVolume();
+                    String mount = osFileStore.getMount();
+                    String fsType = osFileStore.getType();
+
+                    long total = osFileStore.getTotalSpace();
+                    long userAvail = osFileStore.getUsableSpace();
+                    long rootAvail = osFileStore.getFreeSpace();
+
+                    long inodeTotal = osFileStore.getTotalInodes();
+                    long inodeFree = osFileStore.getFreeInodes();
+
+                    return osFileStore;
+                })
+                .collect(Collectors.toList());
+        System.out.println();
+    }
+}

+ 2 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/BuildDirPageController.java

@@ -30,6 +30,7 @@ import java.util.stream.Collectors;
 @RequestMapping("/app/config/build/dir")
 public class BuildDirPageController {
     private BuildDirQuery buildDirQuery;
+    private Disk disk = new Disk();
 
     public BuildDirPageController(BuildDirQuery buildDirQuery) {
         this.buildDirQuery = buildDirQuery;
@@ -49,7 +50,7 @@ public class BuildDirPageController {
 
     @GetMapping("/diskinfo")
     public String diskInfoPage(Model model) {
-        List<DiskUsage> diskUsages = Disk.details().stream().map(DiskUsage::new).collect(Collectors.toList());
+        List<DiskUsage> diskUsages = disk.detail().stream().map(DiskUsage::new).collect(Collectors.toList());
         model.addAttribute("list", diskUsages);
         return "/app/config/builddir/diskinfo";
     }

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/CompilerPageController.java

@@ -1,12 +1,12 @@
 package cn.reghao.autodop.dmaster.app.controller.page;
 
+import cn.reghao.autodop.common.machine.Machine;
 import cn.reghao.autodop.dmaster.app.db.query.config.CompilerConfigQuery;
 import cn.reghao.autodop.dmaster.app.model.constant.build.CompileType;
 import cn.reghao.autodop.dmaster.app.model.po.config.build.CompilerConfig;
 import cn.reghao.autodop.dmaster.app.model.vo.KeyValue;
 import cn.reghao.autodop.dmaster.util.db.PageList;
 import cn.reghao.autodop.dmaster.util.db.PageSort;
-import cn.reghao.jdkutil.machine.MachineId;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -67,8 +67,8 @@ public class CompilerPageController {
             compileTypes.add(new KeyValue(compileType.name(), compileType.name()));
         }
         model.addAttribute("compileTypes", compileTypes);
-        model.addAttribute("machineId", MachineId.id());
-        model.addAttribute("machineIpv4", MachineId.ipv4());
+        model.addAttribute("machineId", Machine.ID);
+        model.addAttribute("machineIpv4", Machine.IPV4);
     }
 
     @GetMapping("/detail/{id}")

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/PackerPageController.java

@@ -1,12 +1,12 @@
 package cn.reghao.autodop.dmaster.app.controller.page;
 
+import cn.reghao.autodop.common.machine.Machine;
 import cn.reghao.autodop.common.msg.rpc.dto.app.PackType;
 import cn.reghao.autodop.dmaster.app.db.query.config.PackerConfigQuery;
 import cn.reghao.autodop.dmaster.app.model.po.config.build.PackerConfig;
 import cn.reghao.autodop.dmaster.app.model.vo.KeyValue;
 import cn.reghao.autodop.dmaster.util.db.PageList;
 import cn.reghao.autodop.dmaster.util.db.PageSort;
-import cn.reghao.jdkutil.machine.MachineId;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -67,8 +67,8 @@ public class PackerPageController {
             packTypes.add(new KeyValue(packType.name(), packType.name()));
         }
         model.addAttribute("packTypes", packTypes);
-        model.addAttribute("machineId", MachineId.id());
-        model.addAttribute("machineIpv4", MachineId.ipv4());
+        model.addAttribute("machineId", Machine.ID);
+        model.addAttribute("machineIpv4", Machine.IPV4);
     }
 
     @GetMapping("/detail/{id}")

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/AppDeployer.java

@@ -1,5 +1,6 @@
 package cn.reghao.autodop.dmaster.app.service.bd;
 
+import cn.reghao.autodop.common.machine.Machine;
 import cn.reghao.autodop.common.msg.Message;
 import cn.reghao.autodop.common.msg.MsgQueue;
 import cn.reghao.autodop.common.msg.rpc.RpcMsg;
@@ -7,7 +8,6 @@ import cn.reghao.autodop.common.msg.rpc.RpcPayload;
 import cn.reghao.autodop.common.msg.rpc.clazz.AppRpcClazz;
 import cn.reghao.autodop.common.msg.rpc.dto.app.DeployParam;
 import cn.reghao.autodop.common.mqtt.DefaultMqttClient;
-import cn.reghao.jdkutil.machine.MachineId;
 import cn.reghao.jdkutil.serializer.JsonConverter;
 import cn.reghao.autodop.dmaster.app.db.query.config.AppConfigQuery;
 import cn.reghao.autodop.dmaster.app.model.po.config.DeployConfig;
@@ -54,7 +54,7 @@ public class AppDeployer {
             Message message = Message.rpcMessage(rpcMsg);
 
             // TODO 对于需要返回值的 pub,需要做一个记录,pub 和 sub 一一对应
-            String topic = MsgQueue.dagentTopic(MachineId.id());
+            String topic = MsgQueue.dagentTopic(Machine.ID);
             mqttClient.pubWithResult(topic, 1, message);
         }
     }

+ 10 - 7
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/BuildDirServiceImpl.java

@@ -1,5 +1,6 @@
 package cn.reghao.autodop.dmaster.app.service.config.impl;
 
+import cn.reghao.autodop.common.machine.Machine;
 import cn.reghao.autodop.common.util.ByteConverter;
 import cn.reghao.autodop.common.util.ByteType;
 import cn.reghao.autodop.common.util.FileOps;
@@ -9,7 +10,7 @@ import cn.reghao.autodop.dmaster.app.model.po.config.build.BuildDir;
 import cn.reghao.autodop.dmaster.app.model.po.config.build.LocalBuildDir;
 import cn.reghao.autodop.dmaster.app.service.config.BuildDirService;
 import cn.reghao.jdkutil.machine.Disk;
-import cn.reghao.jdkutil.machine.MachineId;
+import cn.reghao.jdkutil.machine.detail.DiskDetail;
 import cn.reghao.jdkutil.result.Result;
 import cn.reghao.jdkutil.result.ResultStatus;
 import lombok.extern.slf4j.Slf4j;
@@ -26,9 +27,11 @@ import java.util.Objects;
 @Slf4j
 @Service
 public class BuildDirServiceImpl implements BuildDirService {
+    // TODO 将 machineId 设置为一个常量
     private final BuildDirQuery buildDirQuery;
     private final BuildDirCrud buildDirCrud;
     private final ByteConverter converter;
+    private Disk disk = new Disk();
 
     public BuildDirServiceImpl(BuildDirQuery buildDirQuery, BuildDirCrud buildDirCrud) {
         this.buildDirQuery = buildDirQuery;
@@ -55,13 +58,13 @@ public class BuildDirServiceImpl implements BuildDirService {
     }
 
     private BuildDir createLocalBuildDir(String localBuildDir) throws Exception {
-        Disk.DiskDetail diskDetail = Disk.diskDetail(localBuildDir);
+        DiskDetail diskDetail = disk.diskDetail(localBuildDir);
         BuildDir buildDir = new BuildDir();
-        buildDir.setMachineId(MachineId.id());
-        buildDir.setMachineIpv4(MachineId.ipv4());
+        buildDir.setMachineId(Machine.ID);
+        buildDir.setMachineIpv4(Machine.IPV4);
         buildDir.setDirPath(localBuildDir);
         buildDir.setMountedOn(diskDetail.getMountedOn());
-        buildDir.setTotal(converter.convert(ByteType.Bytes, diskDetail.getSize()));
+        buildDir.setTotal(converter.convert(ByteType.Bytes, diskDetail.getTotal()));
         buildDir.setUsed(converter.convertStr(ByteType.Bytes, ByteType.MiB, diskDetail.getUsed()));
         buildDir.setAvail(converter.convertStr(ByteType.Bytes, ByteType.MiB, diskDetail.getAvail()));
         buildDir.setIsDelete(false);
@@ -98,7 +101,7 @@ public class BuildDirServiceImpl implements BuildDirService {
     public void refresh(BuildDir buildDir) {
         setLocalBuildDir(buildDir);
         String dirPath = buildDir.getDirPath();
-        Disk.DiskDetail diskDetail = Disk.diskDetail(dirPath);
+        DiskDetail diskDetail = disk.diskDetail(dirPath);
         if (diskDetail != null) {
             buildDir.setUsed(converter.convertStr(ByteType.Bytes, ByteType.MiB, diskDetail.getUsed()));
             buildDir.setAvail(converter.convertStr(ByteType.Bytes, ByteType.MiB, diskDetail.getAvail()));
@@ -118,7 +121,7 @@ public class BuildDirServiceImpl implements BuildDirService {
         String oldDirPath = oldBuildDir.getDirPath();
         String oldMountedOn = oldBuildDir.getMountedOn();
         String newDirPath = buildDir.getDirPath();
-        String newMountedOn = Disk.diskDetail(newDirPath).getMountedOn();
+        String newMountedOn = disk.diskDetail(newDirPath).getMountedOn();
 
         if (newDirPath.equals(oldDirPath)) {
             return Result.result(ResultStatus.FAIL, "目录没有改变");

+ 0 - 13
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/rpc/AppRpcClazzResultHandler.java

@@ -1,13 +0,0 @@
-package cn.reghao.autodop.dmaster.app.service.rpc;
-
-import cn.reghao.autodop.common.msg.rpc.dto.app.AppStatus;
-import cn.reghao.autodop.common.msg.rpc.dto.app.DeployResult;
-
-/**
- * @author reghao
- * @date 2021-07-01 20:15:57
- */
-public interface AppRpcClazzResultHandler {
-    void deployResult(DeployResult deployResult);
-    void statusResult(AppStatus appStatus);
-}

+ 14 - 14
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/controller/MachineController.java

@@ -1,8 +1,8 @@
 package cn.reghao.autodop.dmaster.machine.controller;
 
+import cn.reghao.autodop.dmaster.machine.service.MachineService;
 import cn.reghao.jdkutil.result.WebBody;
 import cn.reghao.autodop.dmaster.machine.model.po.SshAuth;
-import cn.reghao.autodop.dmaster.machine.service.MachineService;
 import cn.reghao.autodop.dmaster.notification.model.po.NotifyGroup;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -23,18 +23,17 @@ import java.util.List;
 @RestController
 @RequestMapping("/api/machine")
 public class MachineController {
-    private MachineService machineService;
+    private final MachineService machineService;
 
     public MachineController(MachineService machineService) {
         this.machineService = machineService;
     }
 
-    @ApiOperation(value = "设置机器通知")
-    @PostMapping(value = "/notify/{machineId}", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ResponseBody
-    public ResponseEntity<String> setMonitorNotify(@PathVariable("machineId") String machineId,
-                                                   @RequestParam("groupId") List<NotifyGroup> notifyGroups) {
-        machineService.setMachineNotify(machineId, notifyGroups);
+    @ApiOperation(value = "设置机器环境")
+    @PostMapping(value = "/env/{machineId}", produces = MediaType.APPLICATION_JSON_VALUE)
+    public ResponseEntity<String> editExtraMachineInfo(@PathVariable("machineId") String machineId,
+                                                       @RequestParam("env") String env) {
+        machineService.setEnv(machineId, env);
         return ResponseEntity.ok().body(WebBody.success());
     }
 
@@ -45,16 +44,17 @@ public class MachineController {
         return ResponseEntity.ok().body(WebBody.success());
     }
 
-    @ApiOperation(value = "编辑机器额外信息")
-    @PostMapping(value = "/host/extra/{machineId}", produces = MediaType.APPLICATION_JSON_VALUE)
-    public ResponseEntity<String> editExtraMachineInfo(@PathVariable("machineId") String machineId,
-                                                       @RequestParam("env") String env) {
-        machineService.setEnv(machineId, env);
+    @ApiOperation(value = "设置机器通知")
+    @PostMapping(value = "/notify/{machineId}", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public ResponseEntity<String> setMonitorNotify(@PathVariable("machineId") String machineId,
+                                                   @RequestParam("groupId") List<NotifyGroup> notifyGroups) {
+        machineService.setMachineNotify(machineId, notifyGroups);
         return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "删除机器")
-    @DeleteMapping(value = "/host/{machineId}", produces = MediaType.APPLICATION_JSON_VALUE)
+    @DeleteMapping(value = "/{machineId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public ResponseEntity<String> machine(@PathVariable("machineId") String machineId) {
         return ResponseEntity.ok().body(WebBody.successWithMsg("暂未实现"));
     }

+ 26 - 26
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/controller/MachinePageController.java

@@ -43,8 +43,8 @@ import java.util.stream.Collectors;
 @Controller
 @RequestMapping("/machine")
 public class MachinePageController {
-    private MachineInfoCrud infoCrud;
     private MachineInfoQuery infoQuery;
+    private MachineInfoCrud infoCrud;
     private MachineHostQuery hostQuery;
     private MachineStatQuery statQuery;
     private NotifyGroupRepository receiverRepository;
@@ -95,17 +95,19 @@ public class MachinePageController {
         model.addAttribute("list", pageList.getList());
     }
 
-    @ApiOperation(value = "机器通知设置页面")
-    @GetMapping("/notify/{machineId}")
-    public String machineNotifyPage(@PathVariable("machineId") String machineId, Model model) {
-        MachineHost machineHost = hostQuery.findByMachineId(machineId);
-        Set<NotifyGroup> currentSet = new HashSet<>(machineHost.getNotifyGroups());
-        List<NotifyGroup> list = receiverRepository.findAll();
+    @ApiOperation(value = "机器所属环境设置页面")
+    @GetMapping("/env/{machineId}")
+    public String hostEditPage(@PathVariable("machineId") String machineId, Model model) {
+        List<KeyValue> envs = new ArrayList<>();
+        for (EnvList envList : EnvList.values()) {
+            envs.add(new KeyValue(envList.name(), envList.name()));
+        }
 
+        MachineHost machineHost = hostQuery.findByMachineId(machineId);
         model.addAttribute("machineId", machineId);
-        model.addAttribute("currentSet", currentSet);
-        model.addAttribute("list", list);
-        return "/machine/machinenotify";
+        model.addAttribute("environments", envs);
+        model.addAttribute("env", machineHost.getEnv());
+        return "/machine/edit";
     }
 
     @ApiOperation(value = "SSH 认证设置页面")
@@ -119,6 +121,19 @@ public class MachinePageController {
         return "/machine/sshauth";
     }
 
+    @ApiOperation(value = "机器通知设置页面")
+    @GetMapping("/notify/{machineId}")
+    public String machineNotifyPage(@PathVariable("machineId") String machineId, Model model) {
+        MachineHost machineHost = hostQuery.findByMachineId(machineId);
+        Set<NotifyGroup> currentSet = new HashSet<>(machineHost.getNotifyGroups());
+        List<NotifyGroup> list = receiverRepository.findAll();
+
+        model.addAttribute("machineId", machineId);
+        model.addAttribute("currentSet", currentSet);
+        model.addAttribute("list", list);
+        return "/machine/machinenotify";
+    }
+
     @ApiOperation(value = "SSH 控制台页面")
     @GetMapping("/webssh/{machineId}")
     public String webSshPage(@PathVariable("machineId") String machineId, Model model) {
@@ -140,23 +155,8 @@ public class MachinePageController {
         return "/machine/webssh";
     }
 
-    @ApiOperation(value = "机器额外信息编辑页面")
-    @GetMapping("/host/edit/{machineId}")
-    public String hostEditPage(@PathVariable("machineId") String machineId, Model model) {
-        List<KeyValue> envs = new ArrayList<>();
-        for (EnvList envList : EnvList.values()) {
-            envs.add(new KeyValue(envList.name(), envList.name()));
-        }
-
-        MachineHost machineHost = hostQuery.findByMachineId(machineId);
-        model.addAttribute("machineId", machineId);
-        model.addAttribute("environments", envs);
-        model.addAttribute("env", machineHost.getEnv());
-        return "/machine/edit";
-    }
-
     @ApiOperation(value = "机器信息详情页面")
-    @GetMapping("/host/detail/{machineId}")
+    @GetMapping("/detail/{machineId}")
     public String hostDetailPage(@PathVariable("machineId") String machineId, Model model) {
         MachineInfo machineInfo = infoQuery.findByMachineId(machineId);
         model.addAttribute("machine", machineInfo);

+ 5 - 11
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/po/DiskInfo.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.machine.model.po;
 
-import cn.reghao.jdkutil.machine.Disk;
+import cn.reghao.jdkutil.machine.detail.DiskDetail;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
@@ -20,20 +20,14 @@ public class DiskInfo implements Serializable {
     private String diskPath;
     private String mountedOn;
     private String fsType;
-    private long size;
-    private long used;
-    private long avail;
-    private int inodeTotal;
-    private int inodeFree;
+    private long total;
+    private long inodeTotal;
 
-    public DiskInfo(Disk.DiskDetail diskDetail) {
+    public DiskInfo(DiskDetail diskDetail) {
         this.diskPath = diskDetail.getDiskPath();
         this.mountedOn = diskDetail.getMountedOn();
         this.fsType = diskDetail.getFsType();
-        this.size = diskDetail.getSize();
-        this.used = diskDetail.getUsed();
-        this.avail = diskDetail.getAvail();
+        this.total = diskDetail.getTotal();
         this.inodeTotal = diskDetail.getInodeTotal();
-        this.inodeFree = diskDetail.getInodeFree();
     }
 }

+ 10 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/po/DiskUsage.java

@@ -0,0 +1,10 @@
+package cn.reghao.autodop.dmaster.machine.model.po;
+
+/**
+ * 磁盘使用情况
+ *
+ * @author reghao
+ * @date 2021-10-16 14:39:32
+ */
+public class DiskUsage {
+}

+ 1 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/po/MachineHost.java

@@ -9,7 +9,6 @@ import org.hibernate.annotations.LazyCollection;
 import org.hibernate.annotations.LazyCollectionOption;
 
 import javax.persistence.*;
-import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -24,7 +23,7 @@ public class MachineHost extends BaseEntity<Integer> {
     @Column(unique = true, nullable = false)
     private String machineId;
     private String machineIpv4;
-    private LocalDateTime bootTime;
+    private long bootTime;
     private String osArch;
     private String osName;
     private String osVersion;

+ 19 - 23
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/po/MachineInfo.java

@@ -1,10 +1,7 @@
 package cn.reghao.autodop.dmaster.machine.model.po;
 
-import cn.reghao.autodop.common.machine.Cpu;
-import cn.reghao.autodop.common.machine.Machine;
-import cn.reghao.autodop.common.machine.Memory;
 import cn.reghao.autodop.dmaster.util.db.BaseEntity;
-import cn.reghao.jdkutil.machine.OsDetail;
+import cn.reghao.jdkutil.machine.detail.*;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
@@ -28,30 +25,29 @@ import java.util.stream.Collectors;
 public class MachineInfo  extends BaseEntity<Integer> {
     private String machineId;
     private String machineIpv4;
+
     private String arch;
     private String name;
     // 系统版本或内核版本
     private String version;
     private String byteOrder;
-    private LocalDateTime bootTime;
+    private long bootTime;
 
+    private String vendor;
+    private String modelName;
     private int physicalCore;
     private int logicalCore;
-    private String vendorId;
-    private String modelName;
-    private String bogoMips;
 
     private long memTotal;
-    private long memUsed;
-    private long memAvail;
-    @ElementCollection(targetClass = NetworkInfo.class)
-    @LazyCollection(LazyCollectionOption.FALSE)
-    private List<NetworkInfo> networkInfos;
+    private long swapTotal;
     @ElementCollection(targetClass = DiskInfo.class)
     @LazyCollection(LazyCollectionOption.FALSE)
     private List<DiskInfo> diskInfos;
+    @ElementCollection(targetClass = NetworkInfo.class)
+    @LazyCollection(LazyCollectionOption.FALSE)
+    private List<NetworkInfo> networkInfos;
 
-    public MachineInfo(Machine.MachineDetail machineDetail) {
+    public MachineInfo(MachineDetail machineDetail) {
         this.machineId = machineDetail.getMachineId();
 
         OsDetail osDetail = machineDetail.getOsDetail();
@@ -61,20 +57,20 @@ public class MachineInfo  extends BaseEntity<Integer> {
         this.byteOrder = osDetail.getByteOrder();
         this.bootTime = osDetail.getBootTime();
 
-        Cpu.CpuDetail cpuDetail = machineDetail.getCpuDetail();
+        CpuDetail cpuDetail = machineDetail.getCpuDetail();
+        this.vendor = cpuDetail.getVendor();
+        this.modelName = cpuDetail.getName();
         this.physicalCore = cpuDetail.getPhysicalCore();
         this.logicalCore = cpuDetail.getLogicalCore();
-        this.vendorId = cpuDetail.getVendorId();
-        this.modelName = cpuDetail.getModelName();
-        this.bogoMips = getBogoMips();
 
-        Memory.MemoryDetail memoryDetail = machineDetail.getMemoryDetail();
+        MemoryDetail memoryDetail = machineDetail.getMemoryDetail();
         this.memTotal = memoryDetail.getTotal();
-        this.memUsed = memoryDetail.getUsed();
-        this.memAvail = memoryDetail.getFree();
-
-        this.networkInfos = machineDetail.getNetworkDetails().stream().map(NetworkInfo::new).collect(Collectors.toList());
         this.diskInfos = machineDetail.getDiskDetails().stream().map(DiskInfo::new).collect(Collectors.toList());
+        setNetworkInfos(machineDetail.getNetworkDetails());
+    }
+
+    public void setNetworkInfos(List<NetworkDetail> networkDetails) {
+        this.networkInfos = networkDetails.stream().map(NetworkInfo::new).collect(Collectors.toList());
         this.machineIpv4 = networkInfos.isEmpty() ? "127.0.0.1" : networkInfos.get(0).getIpv4();
     }
 }

+ 10 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/po/MemUsage.java

@@ -0,0 +1,10 @@
+package cn.reghao.autodop.dmaster.machine.model.po;
+
+/**
+ * 内存使用情况
+ *
+ * @author reghao
+ * @date 2021-10-16 14:39:41
+ */
+public class MemUsage {
+}

+ 4 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/po/NetworkInfo.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.machine.model.po;
 
-import cn.reghao.jdkutil.machine.Network;
+import cn.reghao.jdkutil.machine.detail.NetworkDetail;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
@@ -20,12 +20,14 @@ public class NetworkInfo implements Serializable {
     private String iface;
     private String mac;
     private String ipv4;
+    private String publicIpv4;
     private String ipv6;
 
-    public NetworkInfo(Network.NetworkDetail networkDetail) {
+    public NetworkInfo(NetworkDetail networkDetail) {
         this.iface = networkDetail.getIface();
         this.mac = networkDetail.getMac();
         this.ipv4 = networkDetail.getIpv4();
+        this.publicIpv4 = networkDetail.getPubicIpv4();
         this.ipv6 = networkDetail.getIpv6();
     }
 }

+ 6 - 6
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/vo/DiskUsage.java

@@ -2,7 +2,7 @@ package cn.reghao.autodop.dmaster.machine.model.vo;
 
 import cn.reghao.autodop.common.util.ByteConverter;
 import cn.reghao.autodop.common.util.ByteType;
-import cn.reghao.jdkutil.machine.Disk;
+import cn.reghao.jdkutil.machine.detail.DiskDetail;
 import lombok.Data;
 
 /**
@@ -16,17 +16,17 @@ public class DiskUsage {
     private String total;
     private String used;
     private String avail;
-    private int inodeTotal;
-    private int inodeFree;
+    private long inodeTotal;
+    private long inodeAvail;
 
-    public DiskUsage(Disk.DiskDetail diskDetail) {
+    public DiskUsage(DiskDetail diskDetail) {
         this.mountedOn = diskDetail.getMountedOn();
         this.fsType = diskDetail.getFsType();
         this.inodeTotal = diskDetail.getInodeTotal();
-        this.inodeFree = diskDetail.getInodeFree();
+        this.inodeAvail = diskDetail.getInodeAvail();
 
         ByteConverter converter = new ByteConverter();
-        this.total = converter.convert(ByteType.Bytes, diskDetail.getSize());
+        this.total = converter.convert(ByteType.Bytes, diskDetail.getTotal());
         this.used = converter.convertStr(ByteType.Bytes, ByteType.MiB, diskDetail.getUsed());
         this.avail = converter.convertStr(ByteType.Bytes, ByteType.MiB, diskDetail.getAvail());
     }

+ 9 - 12
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/vo/MachineHostVO.java

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.dmaster.machine.model.vo;
 
 import cn.reghao.autodop.dmaster.machine.model.po.MachineHost;
-import cn.reghao.autodop.dmaster.machine.model.po.MachineInfo;
+import cn.reghao.jdkutil.converter.DateTimeConverter;
 import lombok.Data;
 
 /**
@@ -19,17 +19,14 @@ public class MachineHostVO {
     private String status;
     private String lastCheck;
 
-    public MachineHostVO(MachineInfo machineInfo, MachineHost machineHost) {
-        /*this.machineId = machineInfo.getMachineId();
-        List<NetworkInfo> list = machineInfo.getNetworkInfos();
-        if (!list.isEmpty()) {
-            this.machineIpv4 = list.get(0).getIpv4();
-        }
-        this.bootTime = DateTimeConverter.format(machineInfo.getOsInfo().getBootTime());
-        this.osArch = machineInfo.getOsInfo().getArch();
-        this.osName = machineInfo.getOsInfo().getName();
-        this.osVersion = machineInfo.getOsInfo().getVersion();
+    public MachineHostVO(MachineHost machineHost) {
+        this.machineId = machineHost.getMachineId();
+        this.machineIpv4 = machineHost.getMachineIpv4();
+        this.bootTime = DateTimeConverter.format(machineHost.getBootTime());
+        this.osArch = machineHost.getOsArch();
+        this.osName = machineHost.getOsName();
+        this.osVersion = machineHost.getOsVersion();
         this.status = machineHost.getStatus();
-        this.lastCheck = DateTimeConverter.format(machineHost.getLastCheck());*/
+        this.lastCheck = DateTimeConverter.format(machineHost.getLastCheck());
     }
 }

+ 4 - 31
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/service/MachineService.java

@@ -1,11 +1,7 @@
 package cn.reghao.autodop.dmaster.machine.service;
 
-import cn.reghao.autodop.dmaster.machine.db.crud.MachineHostCrud;
-import cn.reghao.autodop.dmaster.machine.db.query.MachineHostQuery;
-import cn.reghao.autodop.dmaster.machine.model.po.MachineHost;
 import cn.reghao.autodop.dmaster.machine.model.po.SshAuth;
 import cn.reghao.autodop.dmaster.notification.model.po.NotifyGroup;
-import org.springframework.stereotype.Service;
 
 import java.util.List;
 
@@ -13,31 +9,8 @@ import java.util.List;
  * @author reghao
  * @date 2019-11-15 08:48:04
  */
-@Service
-public class MachineService {
-    private final MachineHostQuery hostQuery;
-    private final MachineHostCrud hostCrud;
-
-    public MachineService(MachineHostQuery hostQuery, MachineHostCrud hostCrud) {
-        this.hostQuery = hostQuery;
-        this.hostCrud = hostCrud;
-    }
-
-    public void setMachineNotify(String machineId, List<NotifyGroup> notifyGroups) {
-        MachineHost machineHost = hostQuery.findByMachineId(machineId);
-        machineHost.setNotifyGroups(notifyGroups);
-        hostCrud.save(machineHost);
-    }
-
-    public void setSshAuth(String machineId, SshAuth sshAuth) {
-        MachineHost machineHost = hostQuery.findByMachineId(machineId);
-        machineHost.setSshAuth(sshAuth);
-        hostCrud.save(machineHost);
-    }
-
-    public void setEnv(String machineId, String env) {
-        MachineHost machineHost = hostQuery.findByMachineId(machineId);
-        machineHost.setEnv(env);
-        hostCrud.save(machineHost);
-    }
+public interface MachineService {
+    void setEnv(String machineId, String env);
+    void setSshAuth(String machineId, SshAuth sshAuth);
+    void setMachineNotify(String machineId, List<NotifyGroup> notifyGroups);
 }

+ 46 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/service/MachineServiceImpl.java

@@ -0,0 +1,46 @@
+package cn.reghao.autodop.dmaster.machine.service;
+
+import cn.reghao.autodop.dmaster.machine.db.crud.MachineHostCrud;
+import cn.reghao.autodop.dmaster.machine.db.query.MachineHostQuery;
+import cn.reghao.autodop.dmaster.machine.model.po.MachineHost;
+import cn.reghao.autodop.dmaster.machine.model.po.SshAuth;
+import cn.reghao.autodop.dmaster.notification.model.po.NotifyGroup;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2019-11-15 08:48:04
+ */
+@Service
+public class MachineServiceImpl implements MachineService {
+    private final MachineHostQuery hostQuery;
+    private final MachineHostCrud hostCrud;
+
+    public MachineServiceImpl(MachineHostQuery hostQuery, MachineHostCrud hostCrud) {
+        this.hostQuery = hostQuery;
+        this.hostCrud = hostCrud;
+    }
+
+    @Override
+    public void setEnv(String machineId, String env) {
+        MachineHost machineHost = hostQuery.findByMachineId(machineId);
+        machineHost.setEnv(env);
+        hostCrud.save(machineHost);
+    }
+
+    @Override
+    public void setSshAuth(String machineId, SshAuth sshAuth) {
+        MachineHost machineHost = hostQuery.findByMachineId(machineId);
+        machineHost.setSshAuth(sshAuth);
+        hostCrud.save(machineHost);
+    }
+
+    @Override
+    public void setMachineNotify(String machineId, List<NotifyGroup> notifyGroups) {
+        MachineHost machineHost = hostQuery.findByMachineId(machineId);
+        machineHost.setNotifyGroups(notifyGroups);
+        hostCrud.save(machineHost);
+    }
+}

+ 12 - 12
dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/MessageListener.java

@@ -8,10 +8,10 @@ import cn.reghao.autodop.common.msg.rpc.RpcPayload;
 import cn.reghao.autodop.common.msg.rpc.RpcMsg;
 import cn.reghao.autodop.common.msg.rpc.RpcResult;
 import cn.reghao.autodop.common.msg.rpc.clazz.RpcClazz;
-import cn.reghao.autodop.dmaster.mqttsub.rpcresult.AppRpcClazzResult;
-import cn.reghao.autodop.dmaster.mqttsub.impl.NodePubClazzHandler;
-import cn.reghao.autodop.dmaster.mqttsub.rpcresult.DockerRpcClazzResult;
-import cn.reghao.autodop.dmaster.mqttsub.rpcresult.MachineRpcClazzResult;
+import cn.reghao.autodop.dmaster.mqttsub.impl.rpcresult.AppRpcClazzResultHandler;
+import cn.reghao.autodop.dmaster.mqttsub.impl.pub.NodePubClazzHandler;
+import cn.reghao.autodop.dmaster.mqttsub.impl.rpcresult.DockerRpcClazzResultHandler;
+import cn.reghao.autodop.dmaster.mqttsub.impl.rpcresult.MachineRpcClazzResultHandler;
 import cn.reghao.jdkutil.serializer.JsonConverter;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
@@ -28,14 +28,14 @@ import org.springframework.stereotype.Component;
 @Slf4j
 @Component
 public class MessageListener implements MqttCallback {
-    private final NodePubClazzHandler nodeClazzPubResult;
-    private final MachineRpcClazzResult machineRpcClazzResult;
-    private final AppRpcClazzResult appRpcClazzResult;
-    private final DockerRpcClazzResult dockerRpcClazzResult;
+    private final NodePubClazzHandler nodePubClazzHandler;
+    private final MachineRpcClazzResultHandler machineRpcClazzResult;
+    private final AppRpcClazzResultHandler appRpcClazzResult;
+    private final DockerRpcClazzResultHandler dockerRpcClazzResult;
 
-    public MessageListener(NodePubClazzHandler nodeClazzPubResult, MachineRpcClazzResult machineRpcClazzResult,
-                           AppRpcClazzResult appRpcClazzResult, DockerRpcClazzResult dockerRpcClazzResult) {
-        this.nodeClazzPubResult = nodeClazzPubResult;
+    public MessageListener(NodePubClazzHandler nodePubClazzHandler, MachineRpcClazzResultHandler machineRpcClazzResult,
+                           AppRpcClazzResultHandler appRpcClazzResult, DockerRpcClazzResultHandler dockerRpcClazzResult) {
+        this.nodePubClazzHandler = nodePubClazzHandler;
         this.machineRpcClazzResult = machineRpcClazzResult;
         this.appRpcClazzResult = appRpcClazzResult;
         this.dockerRpcClazzResult = dockerRpcClazzResult;
@@ -71,7 +71,7 @@ public class MessageListener implements MqttCallback {
         String jsonPayload = pubMsg.getJsonPayload();
         switch (PubClazz.valueOf(clazz)) {
             case NodePubClazz:
-                nodeClazzPubResult.process(method, jsonPayload);
+                nodePubClazzHandler.process(method, jsonPayload);
                 break;
             default:
                 ;

+ 10 - 10
dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/NodePubClazzHandler.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/pub/NodePubClazzHandler.java

@@ -1,9 +1,9 @@
-package cn.reghao.autodop.dmaster.mqttsub.impl;
+package cn.reghao.autodop.dmaster.mqttsub.impl.pub;
 
-import cn.reghao.autodop.common.machine.Machine;
 import cn.reghao.autodop.common.msg.pub.clazz.NodePubClazz;
 import cn.reghao.autodop.common.msg.pub.dto.node.NodeLogDTO;
-import cn.reghao.autodop.dmaster.machine.service.NodePubClazzImpl;
+import cn.reghao.jdkutil.machine.detail.MachineDetail;
+import cn.reghao.jdkutil.machine.stat.MachineStat;
 import cn.reghao.jdkutil.serializer.JsonConverter;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
@@ -24,16 +24,16 @@ public class NodePubClazzHandler {
     public void process(String method, String jsonPayload) {
         switch (NodePubClazz.valueOf(method)) {
             case start:
-                Machine.MachineDetail machineDetail = JsonConverter.jsonToObject(jsonPayload, Machine.MachineDetail.class);
+                MachineDetail machineDetail = JsonConverter.jsonToObject(jsonPayload, MachineDetail.class);
                 nodePubClazz.start(machineDetail);
                 break;
-            case shutdown:
-                Machine.MachineStat machineStat = JsonConverter.jsonToObject(jsonPayload, Machine.MachineStat.class);
-                nodePubClazz.shutdown(machineStat);
-                break;
             case heartbeat:
-                Machine.MachineStat machineStat1 = JsonConverter.jsonToObject(jsonPayload, Machine.MachineStat.class);
-                nodePubClazz.heartbeat(machineStat1);
+                MachineStat machineStat = JsonConverter.jsonToObject(jsonPayload, MachineStat.class);
+                nodePubClazz.heartbeat(machineStat);
+                break;
+            case shutdown:
+                MachineStat machineStat1 = JsonConverter.jsonToObject(jsonPayload, MachineStat.class);
+                nodePubClazz.shutdown(machineStat1);
                 break;
             case log:
                 NodeLogDTO nodeLogDTO = JsonConverter.jsonToObject(jsonPayload, NodeLogDTO.class);

+ 17 - 9
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/service/NodePubClazzImpl.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/pub/NodePubClazzImpl.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.machine.service;
+package cn.reghao.autodop.dmaster.mqttsub.impl.pub;
 
 import cn.reghao.autodop.common.machine.Machine;
 import cn.reghao.autodop.common.msg.pub.dto.node.NodeLogDTO;
@@ -11,6 +11,10 @@ import cn.reghao.autodop.dmaster.machine.model.po.MachineHost;
 import cn.reghao.autodop.dmaster.machine.model.po.MachineInfo;
 import cn.reghao.autodop.dmaster.machine.db.crud.NodeLogCrud;
 import cn.reghao.autodop.dmaster.machine.model.po.NodeLog;
+import cn.reghao.jdkutil.http.WebClient;
+import cn.reghao.jdkutil.http.WebRequest;
+import cn.reghao.jdkutil.machine.detail.MachineDetail;
+import cn.reghao.jdkutil.machine.stat.MachineStat;
 import org.springframework.stereotype.Service;
 
 /**
@@ -35,39 +39,43 @@ public class NodePubClazzImpl {
         this.nodeLogCrud = nodeLogCrud;
     }
 
-    public void start(Machine.MachineDetail machineDetail) {
+    // TODO MachineInfo 和 MachineHost 应该在一个事务内完成
+    public void start(MachineDetail machineDetail) {
         String machineId = machineDetail.getMachineId();
         MachineInfo machineInfo = infoQuery.findByMachineId(machineId);
         if (machineInfo == null) {
             machineInfo = new MachineInfo(machineDetail);
             infoCrud.save(machineInfo);
             hostCrud.save(new MachineHost(machineInfo));
-        }
+        } else {
+            machineInfo.setNetworkInfos(machineDetail.getNetworkDetails());
+            infoCrud.update(machineInfo);
 
-        MachineHost machineHost = hostQuery.findByMachineId(machineId);
-        if (machineHost != null) {
+            // 由事务来保证 MachineHost 一定存在且唯一
+            MachineHost machineHost = hostQuery.findByMachineId(machineId);
+            machineHost.setMachineIpv4(machineInfo.getMachineIpv4());
             machineHost.setLastCheck(System.currentTimeMillis());
             machineHost.setStatus(NodeStatus.Online.name());
             hostCrud.update(machineHost);
         }
     }
 
-    public void shutdown(Machine.MachineStat machineStat) {
+    // TODO 根据 MachineStat 中的信息检查系统负载,CPU,内存,磁盘等使用情况(暂未实现)
+    public void heartbeat(MachineStat machineStat) {
         String machineId = machineStat.getMachineId();
         MachineHost machineHost = hostQuery.findByMachineId(machineId);
         if (machineHost != null) {
             machineHost.setLastCheck(System.currentTimeMillis());
-            machineHost.setStatus(NodeStatus.Offline.name());
             hostCrud.update(machineHost);
         }
     }
 
-    // TODO 根据 MachineStat 中的信息检查系统负载,CPU,内存,磁盘等使用情况
-    public void heartbeat(Machine.MachineStat machineStat) {
+    public void shutdown(MachineStat machineStat) {
         String machineId = machineStat.getMachineId();
         MachineHost machineHost = hostQuery.findByMachineId(machineId);
         if (machineHost != null) {
             machineHost.setLastCheck(System.currentTimeMillis());
+            machineHost.setStatus(NodeStatus.Offline.name());
             hostCrud.update(machineHost);
         }
     }

+ 7 - 8
dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/rpcresult/AppRpcClazzResult.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/rpcresult/AppRpcClazzResultHandler.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.mqttsub.rpcresult;
+package cn.reghao.autodop.dmaster.mqttsub.impl.rpcresult;
 
 import cn.reghao.autodop.common.msg.rpc.RpcResult;
 import cn.reghao.autodop.common.msg.rpc.clazz.AppRpcClazz;
@@ -7,7 +7,6 @@ import cn.reghao.autodop.common.msg.rpc.dto.app.DeployResult;
 import cn.reghao.autodop.common.mqtt.DefaultMqttClient;
 import cn.reghao.jdkutil.result.ResultStatus;
 import cn.reghao.jdkutil.serializer.JsonConverter;
-import cn.reghao.autodop.dmaster.app.service.rpc.AppRpcClazzResultHandler;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
@@ -19,12 +18,12 @@ import org.springframework.stereotype.Component;
  */
 @Slf4j
 @Component
-public class AppRpcClazzResult {
-    private final AppRpcClazzResultHandler appRpcClazzResultService;
+public class AppRpcClazzResultHandler {
+    private final AppRpcClazzResultImpl appRpcClazzResult;
     private final DefaultMqttClient mqttClient;
 
-    public AppRpcClazzResult(AppRpcClazzResultHandler appRpcClazzResultService, DefaultMqttClient mqttClient) {
-        this.appRpcClazzResultService = appRpcClazzResultService;
+    public AppRpcClazzResultHandler(AppRpcClazzResultImpl appRpcClazzResult, DefaultMqttClient mqttClient) {
+        this.appRpcClazzResult = appRpcClazzResult;
         this.mqttClient = mqttClient;
     }
 
@@ -56,13 +55,13 @@ public class AppRpcClazzResult {
 
     private void processDeployResult(String payload) {
         DeployResult deployResult = JsonConverter.jsonToObject(payload, DeployResult.class);
-        appRpcClazzResultService.deployResult(deployResult);
+        appRpcClazzResult.deployResult(deployResult);
     }
 
     private void processStatusResult(String payload) {
         AppStatus appStatus = JsonConverter.jsonToObject(payload, AppStatus.class);
         if (appStatus != null) {
-            appRpcClazzResultService.statusResult(appStatus);
+            appRpcClazzResult.statusResult(appStatus);
         }
     }
 }

+ 8 - 10
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/rpc/AppRpcClazzResultHandlerImpl.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/rpcresult/AppRpcClazzResultImpl.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.app.service.rpc;
+package cn.reghao.autodop.dmaster.mqttsub.impl.rpcresult;
 
 import cn.reghao.autodop.common.http.DefaultWebRequest;
 import cn.reghao.autodop.common.http.WebRequest;
@@ -29,7 +29,7 @@ import java.util.Optional;
  * @date 2021-07-01 20:15:57
  */
 @Service
-public class AppRpcClazzResultHandlerImpl implements AppRpcClazzResultHandler {
+public class AppRpcClazzResultImpl {
     private AppRunningRepository runningRepository;
     private NotifyService notifyService;
     private WebRequest webRequest;
@@ -38,12 +38,12 @@ public class AppRpcClazzResultHandlerImpl implements AppRpcClazzResultHandler {
     private AppDeployingRepository deployingRepository;
     private AppConfigQuery appConfigQuery;
 
-    public AppRpcClazzResultHandlerImpl(AppRunningRepository runningRepository,
-                                        NotifyService notifyService,
-                                        BuildLogRepository buildLogRepository,
-                                        DeployLogRepository deployLogRepository,
-                                        AppDeployingRepository deployingRepository,
-                                        AppConfigQuery appConfigQuery) {
+    public AppRpcClazzResultImpl(AppRunningRepository runningRepository,
+                                 NotifyService notifyService,
+                                 BuildLogRepository buildLogRepository,
+                                 DeployLogRepository deployLogRepository,
+                                 AppDeployingRepository deployingRepository,
+                                 AppConfigQuery appConfigQuery) {
         this.runningRepository = runningRepository;
         this.notifyService = notifyService;
         this.webRequest = new DefaultWebRequest();
@@ -53,7 +53,6 @@ public class AppRpcClazzResultHandlerImpl implements AppRpcClazzResultHandler {
         this.appConfigQuery = appConfigQuery;
     }
 
-    @Override
     public void deployResult(DeployResult deployResult) {
         DeployLog deployLog = DeployLog.from(deployResult);
         deployLogRepository.save(deployLog);
@@ -108,7 +107,6 @@ public class AppRpcClazzResultHandlerImpl implements AppRpcClazzResultHandler {
         });
     }
 
-    @Override
     public void statusResult(AppStatus appStatus) {
         String appId = appStatus.getAppId();
         String machineId = appStatus.getMachineId();

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/rpcresult/DockerRpcClazzResult.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/rpcresult/DockerRpcClazzResultHandler.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.mqttsub.rpcresult;
+package cn.reghao.autodop.dmaster.mqttsub.impl.rpcresult;
 
 import cn.reghao.autodop.common.mqtt.DefaultMqttClient;
 import cn.reghao.autodop.common.msg.rpc.RpcResult;
@@ -10,10 +10,10 @@ import org.springframework.stereotype.Component;
  * @date 2021-09-15 14:45:43
  */
 @Component
-public class DockerRpcClazzResult {
+public class DockerRpcClazzResultHandler {
     private final DefaultMqttClient mqttClient;
 
-    public DockerRpcClazzResult(DefaultMqttClient mqttClient) {
+    public DockerRpcClazzResultHandler(DefaultMqttClient mqttClient) {
         this.mqttClient = mqttClient;
     }
 

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/rpcresult/MachineRpcClazzResult.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/rpcresult/MachineRpcClazzResultHandler.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.mqttsub.rpcresult;
+package cn.reghao.autodop.dmaster.mqttsub.impl.rpcresult;
 
 import cn.reghao.autodop.common.mqtt.DefaultMqttClient;
 import cn.reghao.autodop.common.msg.rpc.RpcResult;
@@ -12,10 +12,10 @@ import org.springframework.stereotype.Component;
  */
 @Slf4j
 @Component
-public class MachineRpcClazzResult {
+public class MachineRpcClazzResultHandler {
     private final DefaultMqttClient mqttClient;
 
-    public MachineRpcClazzResult(DefaultMqttClient mqttClient) {
+    public MachineRpcClazzResultHandler(DefaultMqttClient mqttClient) {
         this.mqttClient = mqttClient;
     }
 

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/spring/DmasterLifecycle.java

@@ -3,6 +3,7 @@ package cn.reghao.autodop.dmaster.spring;
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.core.Appender;
 import cn.reghao.autodop.common.log.LoggerConfig;
+import cn.reghao.autodop.common.machine.Machine;
 import cn.reghao.autodop.common.mqtt.DefaultMqttClient;
 import cn.reghao.autodop.common.msg.MsgQueue;
 import cn.reghao.autodop.dmaster.app.model.po.config.build.BuildDir;
@@ -10,7 +11,6 @@ import cn.reghao.autodop.dmaster.app.service.config.BuildDirService;
 import cn.reghao.autodop.dmaster.mqttsub.MessageListener;
 import cn.reghao.autodop.dmaster.machine.db.crud.NodeLogCrud;
 import cn.reghao.autodop.dmaster.util.log.Appenders;
-import cn.reghao.jdkutil.machine.MachineId;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.paho.client.mqttv3.MqttException;
 import org.springframework.beans.factory.DisposableBean;
@@ -65,7 +65,7 @@ public class DmasterLifecycle implements ApplicationRunner, DisposableBean {
 
     private void initBuildDir() {
         log.info("初始化构建目录");
-        BuildDir buildDir = buildDirService.get(MachineId.id());
+        BuildDir buildDir = buildDirService.get(Machine.ID);
         if (buildDir == null) {
             buildDirService.createAndSave();
         } else {

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/util/log/MongoAppender.java

@@ -2,10 +2,10 @@ package cn.reghao.autodop.dmaster.util.log;
 
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.core.UnsynchronizedAppenderBase;
+import cn.reghao.autodop.common.machine.Machine;
 import cn.reghao.autodop.common.msg.pub.dto.node.constant.AppId;
 import cn.reghao.autodop.dmaster.machine.db.crud.NodeLogCrud;
 import cn.reghao.autodop.dmaster.machine.model.po.NodeLog;
-import cn.reghao.jdkutil.machine.MachineId;
 
 /**
  * @author reghao
@@ -38,7 +38,7 @@ public class MongoAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
 
     private NodeLog nodeLog(ILoggingEvent event) {
         NodeLog machineNodeLog = new NodeLog();
-        machineNodeLog.setMachineId(MachineId.id());
+        machineNodeLog.setMachineId(Machine.ID);
         machineNodeLog.setAppId(appId);
         machineNodeLog.setTimestamp(event.getTimeStamp());
         machineNodeLog.setLevel(event.getLevel().toString());

+ 35 - 27
dmaster/src/main/resources/templates/machine/detail.html

@@ -6,54 +6,62 @@
     <div class="timo-detail-page">
         <div class="timo-detail-title">操作系统信息</div>
         <table class="layui-table timo-detail-table">
-            <tbody>
+            <thead>
             <tr>
-                <th>系统名字</th>
-                <td th:text="${machine.osInfo.name}"></td>
-                <th>系统架构</th>
-                <td th:text="${machine.osInfo.arch}"></td>
-                <th>系统版本</th>
-                <td th:text="${machine.osInfo.version}"></td>
+                <th data-field="name">名字</th>
+                <th data-field="arch">架构</th>
+                <th data-field="version">版本</th>
+                <th data-field="byteOrder">字节序</th>
+                <th data-field="bootTime">启动时间</th>
             </tr>
+            </thead>
+            <tbody>
             <tr>
-                <th>系统字节序</th>
-                <td th:text="${machine.osInfo.byteOrder}"></td>
-                <th>系统启动时间</th>
-                <td th:text="${machine.osInfo.bootTime}"></td>
+                <td th:text="${machine.name}"></td>
+                <td th:text="${machine.arch}"></td>
+                <td th:text="${machine.version}"></td>
+                <td th:text="${machine.byteOrder}"></td>
+                <td th:text="${machine.bootTime}"></td>
             </tr>
             </tbody>
         </table>
         <div class="timo-detail-title">网络信息</div>
         <table class="layui-table timo-detail-table">
+            <thead>
+            <tr>
+                <th data-field="iface">网卡接口</th>
+                <th data-field="mac">MAC 地址</th>
+                <th data-field="ipv4">IPv4 地址</th>
+                <th data-field="pubicIpv4">IPv4 公网地址</th>
+                <th data-field="ipv6">IPv6 地址</th>
+            </tr>
+            </thead>
             <tbody>
             <tr th:each="item:${machine.networkInfos}">
-                <th>网卡接口</th>
                 <td th:text="${item.iface}"></td>
-                <th>MAC 地址</th>
                 <td th:text="${item.mac}"></td>
-                <th>IPv4 地址</th>
                 <td th:text="${item.ipv4}"></td>
-                <th>IPv6 地址</th>
+                <td th:text="${item.publicIpv4}"></td>
                 <td th:text="${item.ipv6}"></td>
             </tr>
             </tbody>
         </table>
-        <div class="timo-detail-title">处理器信息</div>
+        <div class="timo-detail-title">CPU 信息</div>
         <table class="layui-table timo-detail-table">
-            <tbody>
+            <thead>
             <tr>
-                <th>物理处理器数量</th>
-                <td th:text="${machine.cpuInfo.physicalCore}"></td>
-                <th>逻辑处理器数量</th>
-                <td th:text="${machine.cpuInfo.logicalCore}"></td>
+                <th data-field="vendor">CPU 品牌</th>
+                <th data-field="modelName">CPU 型号</th>
+                <th data-field="physicalCore">物理 CPU 数量</th>
+                <th data-field="logicalCore">逻辑 CPU 数量</th>
             </tr>
+            </thead>
+            <tbody>
             <tr>
-                <th>处理器品牌</th>
-                <td th:text="${machine.cpuInfo.vendorId}"></td>
-                <th>处理器型号</th>
-                <td th:text="${machine.cpuInfo.modelName}"></td>
-                <th>bogoMips</th>
-                <td th:text="${machine.cpuInfo.bogoMips}"></td>
+                <td th:text="${machine.vendor}"></td>
+                <td th:text="${machine.modelName}"></td>
+                <td th:text="${machine.physicalCore}"></td>
+                <td th:text="${machine.logicalCore}"></td>
             </tr>
             </tbody>
         </table>

+ 9 - 10
dmaster/src/main/resources/templates/machine/host.html

@@ -51,9 +51,9 @@
                     <th data-field="osArch">系统架构</th>
                     <th data-field="osName">系统名字</th>
                     <th data-field="osVersion">系统版本</th>
-                    <th>通知组</th>
+                    <th>所属环境</th>
                     <th>SSH 认证</th>
-                    <th>SSH 控制台</th>
+                    <th>通知组</th>
                     <th>操作</th>
                 </tr>
                 </thead>
@@ -69,23 +69,22 @@
                     <td th:text="${item.osName}">系统名字</td>
                     <td th:text="${item.osVersion}">系统版本</td>
                     <td>
-                        <a class="open-popup" data-title="设置通知组"
-                           th:attr="data-url=@{'/machine/notify/'+${item.machineId}}" href="#">设置</a>
+                        <a class="open-popup" data-title="设置机器所属环境"
+                           th:attr="data-url=@{'/machine/env/'+${item.machineId}}" href="#">设置</a>
                     </td>
                     <td>
                         <a class="open-popup" data-title="设置 SSH 帐号"
                            th:attr="data-url=@{'/machine/sshauth/'+${item.machineId}}" href="#">设置</a>
                     </td>
                     <td>
-                        <a class="open-popup" data-title="WebTerminal"
-                           th:attr="data-url=@{'/machine/webssh/'+${item.machineId}}"
-                           href="#">SSH</a>
+                        <a class="open-popup" data-title="设置通知组"
+                           th:attr="data-url=@{'/machine/notify/'+${item.machineId}}" href="#">设置</a>
                     </td>
                     <td>
-                        <a class="open-popup" data-title="机器详细信息" th:attr="data-url=@{'/machine/host/detail/'+${item.machineId}}"
+                        <a class="open-popup" data-title="WebTerminal" th:attr="data-url=@{'/machine/webssh/'+${item.machineId}}"
+                           href="#">SSH 终端</a>
+                        <a class="open-popup" data-title="机器详细信息" th:attr="data-url=@{'/machine/detail/'+${item.machineId}}"
                            data-size="960,480" href="#">详细</a>
-                        <a class="open-popup" data-title="编辑" th:attr="data-url=@{'/machine/host/edit/'+${item.machineId}}"
-                           href="#">编辑</a>
                         <a class="ajax-delete" th:attr="data-msg='确定要删除 '+ ${item.machineId} + ' 机器?'"
                            th:href="@{'/api/machine/host/' + ${item.machineId}}">删除</a>
                     </td>

+ 1 - 1
dmaster/src/main/resources/templates/machine/webssh.html

@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <html xmlns:th="http://www.thymeleaf.org">
 <head>
-    <title>WebSSH</title>
+    <title>SSH Terminal</title>
     <link rel="stylesheet" th:href="@{/css/xterm.css}"/>
 </head>
 

+ 6 - 0
pom.xml

@@ -44,6 +44,12 @@
             <version>1.0.0</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.github.oshi</groupId>
+            <artifactId>oshi-core</artifactId>
+            <version>5.8.2</version>
+        </dependency>
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter</artifactId>