Преглед на файлове

优化 machine 模块的数据和操作

reghao преди 4 години
родител
ревизия
75bb52419b
променени са 75 файла, в които са добавени 588 реда и са изтрити 566 реда
  1. 19 7
      common/src/main/java/cn/reghao/autodop/common/beans/BeansConfig.java
  2. 2 2
      common/src/main/java/cn/reghao/autodop/common/log/Appenders.java
  3. 5 6
      common/src/main/java/cn/reghao/autodop/common/log/MqttAppender.java
  4. 11 16
      common/src/main/java/cn/reghao/autodop/common/machine/Machine.java
  5. 4 3
      common/src/main/java/cn/reghao/autodop/common/machine/MachineInfo.java
  6. 5 2
      common/src/main/java/cn/reghao/autodop/common/machine/MachineStat.java
  7. 9 3
      common/src/main/java/cn/reghao/autodop/common/machine/cpu/Cpu.java
  8. 5 1
      common/src/main/java/cn/reghao/autodop/common/machine/cpu/CpuInfo.java
  9. 5 1
      common/src/main/java/cn/reghao/autodop/common/machine/cpu/CpuStat.java
  10. 1 1
      common/src/main/java/cn/reghao/autodop/common/machine/cpu/util/AbstractPercentageCalculator.java
  11. 3 2
      common/src/main/java/cn/reghao/autodop/common/machine/cpu/util/CpuPercentageCalculator.java
  12. 5 1
      common/src/main/java/cn/reghao/autodop/common/machine/disk/DiskInfo.java
  13. 5 1
      common/src/main/java/cn/reghao/autodop/common/machine/memory/Memory.java
  14. 5 1
      common/src/main/java/cn/reghao/autodop/common/machine/memory/MemoryInfo.java
  15. 11 6
      common/src/main/java/cn/reghao/autodop/common/machine/network/Network.java
  16. 5 1
      common/src/main/java/cn/reghao/autodop/common/machine/network/NetworkInfo.java
  17. 4 1
      common/src/main/java/cn/reghao/autodop/common/machine/network/NetworkStat.java
  18. 5 1
      common/src/main/java/cn/reghao/autodop/common/machine/network/TcpConnStat.java
  19. 5 1
      common/src/main/java/cn/reghao/autodop/common/machine/os/Os.java
  20. 4 1
      common/src/main/java/cn/reghao/autodop/common/machine/os/OsInfo.java
  21. 5 1
      common/src/main/java/cn/reghao/autodop/common/machine/os/OsStat.java
  22. 6 2
      common/src/main/java/cn/reghao/autodop/common/machine/proc/Process.java
  23. 1 1
      common/src/main/java/cn/reghao/autodop/common/machine/proc/ProcessStat.java
  24. 0 14
      common/src/main/java/cn/reghao/autodop/common/machine/shell/MachineShellArgs.java
  25. 6 6
      common/src/main/java/cn/reghao/autodop/common/mqtt/DefaultMqttClient.java
  26. 2 2
      common/src/main/java/cn/reghao/autodop/common/msg/MsgQueue.java
  27. 0 9
      common/src/main/java/cn/reghao/autodop/common/msg/pub/clazz/MachineClazz.java
  28. 1 1
      common/src/main/java/cn/reghao/autodop/common/msg/pub/clazz/NodePubClazz.java
  29. 1 1
      common/src/main/java/cn/reghao/autodop/common/msg/pub/clazz/PubClazz.java
  30. 0 32
      common/src/main/java/cn/reghao/autodop/common/msg/pub/dto/node/NodeDTO.java
  31. 1 1
      common/src/main/java/cn/reghao/autodop/common/msg/pub/dto/node/constant/AppStatus.java
  32. 1 1
      common/src/main/java/cn/reghao/autodop/common/msg/rpc/clazz/AppRpcClazz.java
  33. 1 1
      common/src/main/java/cn/reghao/autodop/common/msg/rpc/clazz/DockerRpcClazz.java
  34. 1 1
      common/src/main/java/cn/reghao/autodop/common/msg/rpc/clazz/MachineRpcClazz.java
  35. 1 1
      common/src/main/java/cn/reghao/autodop/common/msg/rpc/clazz/RpcClazz.java
  36. 0 58
      common/src/main/java/cn/reghao/autodop/common/util/MachineId.java
  37. 4 4
      dagent/src/main/java/cn/reghao/autodop/dagent/app/App.java
  38. 3 2
      dagent/src/main/java/cn/reghao/autodop/dagent/app/DockerAppServiceImpl.java
  39. 79 0
      dagent/src/main/java/cn/reghao/autodop/dagent/machine/NodeClazzPubImpl.java
  40. 0 112
      dagent/src/main/java/cn/reghao/autodop/dagent/machine/NodeOpsImpl.java
  41. 11 11
      dagent/src/main/java/cn/reghao/autodop/dagent/rpc/RpcListener.java
  42. 6 6
      dagent/src/main/java/cn/reghao/autodop/dagent/rpc/impl/AppClazzRpcImpl.java
  43. 4 4
      dagent/src/main/java/cn/reghao/autodop/dagent/rpc/impl/DockerClazzRpcImpl.java
  44. 5 5
      dagent/src/main/java/cn/reghao/autodop/dagent/rpc/impl/MachineClazzRpcImpl.java
  45. 11 17
      dagent/src/main/java/cn/reghao/autodop/dagent/spring/DagentLifecycle.java
  46. 5 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/BuildConfigPageController.java
  47. 3 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/po/config/build/BuildDirLocal.java
  48. 16 16
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/controller/MachinePageController.java
  49. 3 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/query/MachineStatQuery.java
  50. 3 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/query/MachineStatQueryImpl.java
  51. 0 11
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/constant/MachineStatus.java
  52. 12 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/po/MachineHost.java
  53. 1 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/po/MachineStat.java
  54. 2 11
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/service/NodeService.java
  55. 1 27
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/job/MachineStatCheckJob.java
  56. 9 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/MessageListener.java
  57. 0 71
      dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/NodeClazzImpl.java
  58. 119 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/NodeClazzPubResult.java
  59. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/rpcresult/AppClazzRpcResult.java
  60. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/rpcresult/DockerClazzRpcResult.java
  61. 2 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/rpcresult/MachineClazzRpcResult.java
  62. 4 15
      dmaster/src/main/java/cn/reghao/autodop/dmaster/spring/DmasterLifecycle.java
  63. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/model/vo/AppRuntimeLogVO.java
  64. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/model/vo/RuntimeLogVO.java
  65. 10 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/util/log/MongoAppender.java
  66. 5 7
      dmaster/src/main/resources/templates/machine/host.html
  67. 111 0
      dmaster/src/main/resources/templates/machine/node.html
  68. 0 0
      dmaster/src/main/resources/templates/machine/stat/cpu.html
  69. 0 0
      dmaster/src/main/resources/templates/machine/stat/disk.html
  70. 0 0
      dmaster/src/main/resources/templates/machine/stat/mem.html
  71. 0 0
      dmaster/src/main/resources/templates/machine/stat/network.html
  72. 0 0
      dmaster/src/main/resources/templates/machine/stat/sysload.html
  73. 4 7
      dmaster/src/main/resources/templates/machine/status.html
  74. 3 3
      dmaster/src/main/resources/templates/sys/log/runtime.html
  75. 1 1
      dmaster/src/main/resources/templates/sys/log/runtimeinfo.html

+ 19 - 7
common/src/main/java/cn/reghao/autodop/common/machine/MachineBeanConfig.java → common/src/main/java/cn/reghao/autodop/common/beans/BeansConfig.java

@@ -1,37 +1,49 @@
-package cn.reghao.autodop.common.machine;
+package cn.reghao.autodop.common.beans;
 
+import cn.reghao.autodop.common.machine.Machine;
 import cn.reghao.autodop.common.machine.cpu.Cpu;
 import cn.reghao.autodop.common.machine.disk.Disk;
 import cn.reghao.autodop.common.machine.memory.Memory;
 import cn.reghao.autodop.common.machine.network.Network;
 import cn.reghao.autodop.common.machine.os.Os;
+import cn.reghao.jdkutil.text.TextFile;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
 /**
  * @author reghao
- * @date 2020-10-20 21:02:31
+ * @date 2021-09-16 09:28:04
  */
 @Configuration
-public class MachineBeanConfig {
+public class BeansConfig {
+    @Bean
+    public TextFile textFile() {
+        return new TextFile();
+    }
+
+    @Bean
+    public Machine machine() {
+        return new Machine(os(), network(), cpu(), memory(), disk());
+    }
+
     @Bean
     public Os os() {
-        return new Os();
+        return new Os(textFile());
     }
 
     @Bean
     public Network network() {
-        return new Network();
+        return new Network(textFile());
     }
 
     @Bean
     public Cpu cpu() {
-        return new Cpu();
+        return new Cpu(textFile());
     }
 
     @Bean
     public Memory memory() {
-        return new Memory();
+        return new Memory(textFile());
     }
 
     @Bean

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

@@ -16,13 +16,13 @@ import org.slf4j.LoggerFactory;
 public class Appenders {
     private static LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
 
-    public static Appender<ILoggingEvent> mqttAppender(String machineId, String appId, DefaultMqttClient mqttClient) {
+    public static Appender<ILoggingEvent> mqttAppender(String appId, DefaultMqttClient mqttClient) {
         PatternLayoutEncoder layoutEncoder = new PatternLayoutEncoder();
         layoutEncoder.setPattern("%date %level [%thread] %logger{10} [%file:%line] %msg%n");
         layoutEncoder.setContext(loggerContext);
         layoutEncoder.start();
 
-        MqttAppender mqttAppender = new MqttAppender(machineId, appId, mqttClient);
+        MqttAppender mqttAppender = new MqttAppender(appId, mqttClient);
         mqttAppender.setContext(loggerContext);
         mqttAppender.start();
         return mqttAppender;

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

@@ -6,8 +6,9 @@ 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.NodeClazz;
+import cn.reghao.autodop.common.msg.pub.clazz.NodePubClazz;
 import cn.reghao.autodop.common.msg.pub.dto.node.NodeLogDTO;
+import cn.reghao.jdkutil.MachineId;
 import cn.reghao.jdkutil.serializer.JsonConverter;
 import org.eclipse.paho.client.mqttv3.MqttException;
 
@@ -16,13 +17,11 @@ import org.eclipse.paho.client.mqttv3.MqttException;
  * @date 2021-06-08 19:37:21
  */
 public class MqttAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
-    private final String machineId;
     private final String appId;
     private final String topic;
     private final DefaultMqttClient mqttClient;
 
-    public MqttAppender(String machineId, String appId, DefaultMqttClient mqttClient) {
-        this.machineId = machineId;
+    public MqttAppender(String appId, DefaultMqttClient mqttClient) {
         this.appId = appId;
         this.topic = MsgQueue.dmasterTopic();
         this.mqttClient = mqttClient;
@@ -42,7 +41,7 @@ public class MqttAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
     protected void append(ILoggingEvent event) {
         NodeLogDTO nodeLogDTO = nodeLogDTO(event);
         String jsonPayload = JsonConverter.objectToJson(nodeLogDTO);
-        PubMsg pubMsg = PubMsg.pubMsg(NodeClazz.class.getSimpleName(), NodeClazz.log.name(), jsonPayload);
+        PubMsg pubMsg = PubMsg.pubMsg(NodePubClazz.class.getSimpleName(), NodePubClazz.log.name(), jsonPayload);
         Message message = Message.pubMessage("", "", pubMsg);
         try {
             mqttClient.pub(topic, 1, JsonConverter.objectToJson(message));
@@ -53,7 +52,7 @@ public class MqttAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
 
     private NodeLogDTO nodeLogDTO(ILoggingEvent event) {
         NodeLogDTO nodeLogDTO = new NodeLogDTO();
-        nodeLogDTO.setMachineId(machineId);
+        nodeLogDTO.setMachineId(MachineId.id());
         nodeLogDTO.setAppId(appId);
         nodeLogDTO.setTimestamp(event.getTimeStamp());
         nodeLogDTO.setLevel(event.getLevel().toString());

+ 11 - 16
common/src/main/java/cn/reghao/autodop/common/machine/Machine.java

@@ -5,47 +5,42 @@ import cn.reghao.autodop.common.machine.disk.Disk;
 import cn.reghao.autodop.common.machine.memory.Memory;
 import cn.reghao.autodop.common.machine.network.Network;
 import cn.reghao.autodop.common.machine.os.Os;
-import cn.reghao.autodop.common.util.MachineId;
-import org.springframework.stereotype.Component;
+import cn.reghao.jdkutil.MachineId;
 
-import java.io.IOException;
 import java.time.LocalDateTime;
 
 /**
  * @author reghao
  * @date 2020-10-22 15:47:58
  */
-@Component
 public class Machine {
+    private final Os os;
+    private final Network network;
     private final Cpu cpu;
     private final Memory memory;
     private final Disk disk;
-    private final Network network;
-    private final Os os;
-    private final String machineId;
 
-    public Machine(Cpu cpu, Memory memory, Disk disk, Network network, Os os) throws IOException {
+    public Machine(Os os, Network network, Cpu cpu, Memory memory, Disk disk) {
+        this.os = os;
+        this.network = network;
         this.cpu = cpu;
         this.memory = memory;
         this.disk = disk;
-        this.network = network;
-        this.os = os;
-        this.machineId = MachineId.id();
     }
 
-    public MachineInfo registry() {
+    public MachineInfo info() {
         MachineInfo machineInfo = new MachineInfo();
-        machineInfo.setMachineId(machineId);
+        machineInfo.setMachineId(MachineId.id());
         machineInfo.setOsInfo(os.info());
         machineInfo.setNetworkInfos(network.info());
         machineInfo.setCpuInfo(cpu.info());
         return machineInfo;
     }
 
-    public MachineStat heartbeat() {
+    public MachineStat stat() {
         MachineStat machineStat = new MachineStat();
-        machineStat.setMachineId(machineId);
-        machineStat.setMachineTime(LocalDateTime.now());
+        machineStat.setMachineId(MachineId.id());
+        machineStat.setTimestamp(System.currentTimeMillis());
         machineStat.setOsStat(os.stat());
         machineStat.setNetworkStat(network.stat());
         machineStat.setCpuStat(null);

+ 4 - 3
common/src/main/java/cn/reghao/autodop/common/machine/MachineInfo.java

@@ -4,8 +4,8 @@ import cn.reghao.autodop.common.machine.cpu.CpuInfo;
 import cn.reghao.autodop.common.machine.network.NetworkInfo;
 import cn.reghao.autodop.common.machine.os.OsInfo;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
 
+import java.io.Serializable;
 import java.util.List;
 
 /**
@@ -13,8 +13,9 @@ import java.util.List;
  * @date 2020-12-25 17:53:15
  */
 @Data
-@EqualsAndHashCode(callSuper = false)
-public class MachineInfo {
+public class MachineInfo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
     private String machineId;
     private OsInfo osInfo;
     private List<NetworkInfo> networkInfos;

+ 5 - 2
common/src/main/java/cn/reghao/autodop/common/machine/MachineStat.java

@@ -7,6 +7,7 @@ import cn.reghao.autodop.common.machine.network.NetworkStat;
 import cn.reghao.autodop.common.machine.os.OsStat;
 import lombok.Data;
 
+import java.io.Serializable;
 import java.time.LocalDateTime;
 import java.util.List;
 
@@ -15,9 +16,11 @@ import java.util.List;
  * @date 2020-12-25 17:53:15
  */
 @Data
-public class MachineStat {
+public class MachineStat implements Serializable {
+    private static final long serialVersionUID = 1L;
+
     private String machineId;
-    private LocalDateTime machineTime;
+    private long timestamp;
     private OsStat osStat;
     private NetworkStat networkStat;
     private CpuStat cpuStat;

+ 9 - 3
common/src/main/java/cn/reghao/autodop/common/machine/cpu/Cpu.java

@@ -1,7 +1,8 @@
 package cn.reghao.autodop.common.machine.cpu;
 
 import cn.reghao.autodop.common.machine.LinuxProc;
-import cn.reghao.autodop.common.util.AbstractPercentageCalculator;
+import cn.reghao.autodop.common.machine.cpu.util.AbstractPercentageCalculator;
+import cn.reghao.autodop.common.machine.cpu.util.CpuPercentageCalculator;
 import cn.reghao.jdkutil.text.TextFile;
 import lombok.extern.slf4j.Slf4j;
 
@@ -15,8 +16,13 @@ import java.util.*;
  */
 @Slf4j
 public class Cpu {
-    private AbstractPercentageCalculator<CpuStats> calculator = new CpuPercentageCalculator();;
-    private TextFile textFile = new TextFile();
+    private final AbstractPercentageCalculator<CpuStats> calculator;
+    private final TextFile textFile;
+
+    public Cpu(TextFile textFile) {
+        this.calculator = new CpuPercentageCalculator();
+        this.textFile = textFile;
+    }
 
     public CpuInfo info() {
         List<String> list = textFile.read(LinuxProc.CPU_INFO);

+ 5 - 1
common/src/main/java/cn/reghao/autodop/common/machine/cpu/CpuInfo.java

@@ -2,12 +2,16 @@ package cn.reghao.autodop.common.machine.cpu;
 
 import lombok.Data;
 
+import java.io.Serializable;
+
 /**
  * @author reghao
  * @date 2020-10-20 09:51:52
  */
 @Data
-public class CpuInfo {
+public class CpuInfo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
     private int physicalCore;
     private int logicalCore;
     private String vendorId;

+ 5 - 1
common/src/main/java/cn/reghao/autodop/common/machine/cpu/CpuStat.java

@@ -2,6 +2,8 @@ package cn.reghao.autodop.common.machine.cpu;
 
 import lombok.Data;
 
+import java.io.Serializable;
+
 /**
  * CPU 使用率
  * top 命令中的 CPU 数据
@@ -10,7 +12,9 @@ import lombok.Data;
  * @date 2020-03-19 10:01:03
  */
 @Data
-public class CpuStat {
+public class CpuStat implements Serializable {
+    private static final long serialVersionUID = 1L;
+
     private String us;
     private String sy;
     private String ni;

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/util/AbstractPercentageCalculator.java → common/src/main/java/cn/reghao/autodop/common/machine/cpu/util/AbstractPercentageCalculator.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.util;
+package cn.reghao.autodop.common.machine.cpu.util;
 
 import java.text.DecimalFormat;
 

+ 3 - 2
common/src/main/java/cn/reghao/autodop/common/machine/cpu/CpuPercentageCalculator.java → common/src/main/java/cn/reghao/autodop/common/machine/cpu/util/CpuPercentageCalculator.java

@@ -1,6 +1,7 @@
-package cn.reghao.autodop.common.machine.cpu;
+package cn.reghao.autodop.common.machine.cpu.util;
 
-import cn.reghao.autodop.common.util.AbstractPercentageCalculator;
+import cn.reghao.autodop.common.machine.cpu.CpuStat;
+import cn.reghao.autodop.common.machine.cpu.CpuStats;
 
 /**
  * @author reghao

+ 5 - 1
common/src/main/java/cn/reghao/autodop/common/machine/disk/DiskInfo.java

@@ -2,6 +2,8 @@ package cn.reghao.autodop.common.machine.disk;
 
 import lombok.Data;
 
+import java.io.Serializable;
+
 /**
  * df -h 命令输出
  *
@@ -9,7 +11,9 @@ import lombok.Data;
  * @date 2020-10-20 10:51:59
  */
 @Data
-public class DiskInfo {
+public class DiskInfo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
     private String diskPath;
     private String mountedOn;
     private String fsType;

+ 5 - 1
common/src/main/java/cn/reghao/autodop/common/machine/memory/Memory.java

@@ -13,7 +13,11 @@ import java.util.Map;
  * @date 2019-10-25 13:21:25
  */
 public class Memory {
-    private TextFile textFile = new TextFile();
+    private final TextFile textFile;
+
+    public Memory(TextFile textFile) {
+        this.textFile = textFile;
+    }
 
     public MemoryInfo info() {
         Map<String, String> map = parseMemInfo();

+ 5 - 1
common/src/main/java/cn/reghao/autodop/common/machine/memory/MemoryInfo.java

@@ -2,6 +2,8 @@ package cn.reghao.autodop.common.machine.memory;
 
 import lombok.Data;
 
+import java.io.Serializable;
+
 /**
  * free -h 命令输出
  *
@@ -9,7 +11,9 @@ import lombok.Data;
  * @date 2020-10-20 10:51:50
  */
 @Data
-public class MemoryInfo {
+public class MemoryInfo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
     // KiB
     private long total;
     private long used;

+ 11 - 6
common/src/main/java/cn/reghao/autodop/common/machine/network/Network.java

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.common.machine.network;
 
 import cn.reghao.autodop.common.machine.LinuxProc;
-import cn.reghao.autodop.common.machine.os.ProcessStat;
+import cn.reghao.autodop.common.machine.proc.ProcessStat;
 import cn.reghao.autodop.common.util.IpAddressConverter;
 import cn.reghao.jdkutil.text.TextFile;
 
@@ -17,8 +17,13 @@ import java.util.List;
  * @date 2019-10-23 21:17:04
  */
 public class Network {
-    private TextFile textFile = new TextFile();
-    private IpAddressConverter conversion = new IpAddressConverter();
+    private final TextFile textFile;
+    private final IpAddressConverter converter;
+
+    public Network(TextFile textFile) {
+        this.textFile = textFile;
+        this.converter = new IpAddressConverter();
+    }
 
     public List<NetworkInfo> info() {
         List<NetworkInfo> list = new ArrayList<>();
@@ -28,7 +33,7 @@ public class Network {
             while (interfaces.hasMoreElements()) {
                 NetworkInterface iface = interfaces.nextElement();
                 String name = iface.getName();
-                // TODO 过滤掉 localhost 和虚拟网卡
+                // 过滤掉 localhost 和虚拟网卡
                 if (name.startsWith("lo") || name.startsWith("docker") || name.startsWith("v")) {
                     continue;
                 }
@@ -86,12 +91,12 @@ public class Network {
             TcpConnStat tcpConnStat = new TcpConnStat();
             String localAddr = fields[2].split(":")[0];
             String localPort = fields[2].split(":")[1];
-            tcpConnStat.setLocalAddr(conversion.hex2dotDecimal(localAddr));
+            tcpConnStat.setLocalAddr(converter.hex2dotDecimal(localAddr));
             tcpConnStat.setLocalPort(Integer.valueOf(localPort, 16));
 
             String remoteAddr = fields[3].split(":")[0];
             String remotePort = fields[3].split(":")[1];
-            tcpConnStat.setRemoteAddr(conversion.hex2dotDecimal(remoteAddr));
+            tcpConnStat.setRemoteAddr(converter.hex2dotDecimal(remoteAddr));
             tcpConnStat.setRemotePort(Integer.valueOf(remotePort, 16));
             tcpConnStat.setTcpState(tcpState(Integer.valueOf(fields[4], 16)));
 

+ 5 - 1
common/src/main/java/cn/reghao/autodop/common/machine/network/NetworkInfo.java

@@ -2,12 +2,16 @@ package cn.reghao.autodop.common.machine.network;
 
 import lombok.Data;
 
+import java.io.Serializable;
+
 /**
  * @author reghao
  * @date 2020-10-20 10:53:12
  */
 @Data
-public class NetworkInfo {
+public class NetworkInfo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
     private String iface;
     // 格式 e8-2a-ea-7c-4a-a2
     private String mac;

+ 4 - 1
common/src/main/java/cn/reghao/autodop/common/machine/network/NetworkStat.java

@@ -2,6 +2,7 @@ package cn.reghao.autodop.common.machine.network;
 
 import lombok.Data;
 
+import java.io.Serializable;
 import java.util.List;
 
 /**
@@ -9,7 +10,9 @@ import java.util.List;
  * @date 2021-06-15 18:06:31
  */
 @Data
-public class NetworkStat {
+public class NetworkStat implements Serializable {
+    private static final long serialVersionUID = 1L;
+
     private List<NetworkInfo> networkInfos;
     private List<TcpConnStat> tcpConnStats;
 }

+ 5 - 1
common/src/main/java/cn/reghao/autodop/common/machine/network/TcpConnStat.java

@@ -2,6 +2,8 @@ package cn.reghao.autodop.common.machine.network;
 
 import lombok.Data;
 
+import java.io.Serializable;
+
 /**
  * TCP 连接状态
  * netstat -anp|grep '^tcp.*' 命令输出
@@ -10,7 +12,9 @@ import lombok.Data;
  * @date 2019-10-25 08:55:25
  */
 @Data
-public class TcpConnStat {
+public class TcpConnStat implements Serializable {
+    private static final long serialVersionUID = 1L;
+
     private String localAddr;
     private int localPort;
     private String remoteAddr;

+ 5 - 1
common/src/main/java/cn/reghao/autodop/common/machine/os/Os.java

@@ -13,7 +13,11 @@ import java.time.LocalDateTime;
  */
 @Slf4j
 public class Os {
-    private TextFile textFile = new TextFile();
+    private final TextFile textFile;
+
+    public Os(TextFile textFile) {
+        this.textFile = textFile;
+    }
 
     public OsInfo info() {
         OsInfo osInfo = new OsInfo();

+ 4 - 1
common/src/main/java/cn/reghao/autodop/common/machine/os/OsInfo.java

@@ -2,6 +2,7 @@ package cn.reghao.autodop.common.machine.os;
 
 import lombok.Data;
 
+import java.io.Serializable;
 import java.time.LocalDateTime;
 
 /**
@@ -9,7 +10,9 @@ import java.time.LocalDateTime;
  * @date 2020-10-20 23:16:42
  */
 @Data
-public class OsInfo {
+public class OsInfo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
     private String arch;
     private String name;
     // 系统版本或内核版本

+ 5 - 1
common/src/main/java/cn/reghao/autodop/common/machine/os/OsStat.java

@@ -2,12 +2,16 @@ package cn.reghao.autodop.common.machine.os;
 
 import lombok.Data;
 
+import java.io.Serializable;
+
 /**
  * @author reghao
  * @date 2020-10-20 23:16:42
  */
 @Data
-public class OsStat {
+public class OsStat implements Serializable {
+    private static final long serialVersionUID = 1L;
+
     private double loadAvg1;
     private double loadAvg5;
     private double loadAvg15;

+ 6 - 2
common/src/main/java/cn/reghao/autodop/common/machine/os/Process.java → common/src/main/java/cn/reghao/autodop/common/machine/proc/Process.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.machine.os;
+package cn.reghao.autodop.common.machine.proc;
 
 import cn.reghao.autodop.common.machine.LinuxProc;
 import cn.reghao.jdkutil.text.TextFile;
@@ -23,7 +23,11 @@ import java.util.stream.Collectors;
 @Slf4j
 public class Process {
     private final Pattern pattern = Pattern.compile("[0-9]*");
-    private TextFile textFile = new TextFile();
+    private final TextFile textFile;
+
+    public Process(TextFile textFile) {
+        this.textFile = textFile;
+    }
 
     /**
      * top 命令进程部分

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/machine/os/ProcessStat.java → common/src/main/java/cn/reghao/autodop/common/machine/proc/ProcessStat.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.machine.os;
+package cn.reghao.autodop.common.machine.proc;
 
 import lombok.Data;
 

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

@@ -1,14 +0,0 @@
-package cn.reghao.autodop.common.machine.shell;
-
-import lombok.Data;
-
-/**
- * @author reghao
- * @date 2020-12-25 17:55:46
- */
-@Data
-public class MachineShellArgs {
-    // command or script
-    private String type;
-    private String content;
-}

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

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.common.mqtt;
 
 import cn.reghao.autodop.common.message.AsyncMsg;
-import cn.reghao.autodop.common.util.MachineId;
+import cn.reghao.jdkutil.MachineId;
 import cn.reghao.jdkutil.serializer.JsonConverter;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.paho.client.mqttv3.*;
@@ -19,12 +19,12 @@ import java.util.Map;
 @Slf4j
 @Component
 public class DefaultMqttClient implements AutoCloseable {
-    private MosquittoProperties properties;
-    private MqttClient client;
+    private final MosquittoProperties properties;
+    private final MqttClient client;
     // 记录需要返回结果的 pub 消息, size 为 0 时表示所有 pub 消息的结果都已 sub
-    private Map<String, AsyncMsg> pubSubRecorder = new HashMap<>();
-    private Map<String, IMqttMessageListener> subMap = new HashMap<>();
-    private MqttCallback callback = new MqttClientCallback();
+    private final Map<String, AsyncMsg> pubSubRecorder = new HashMap<>();
+    private final Map<String, IMqttMessageListener> subMap = new HashMap<>();
+    private final MqttCallback callback = new MqttClientCallback();
 
     public DefaultMqttClient(MosquittoProperties properties) throws MqttException, IOException {
         this.properties = properties;

+ 2 - 2
common/src/main/java/cn/reghao/autodop/common/msg/MsgQueue.java

@@ -11,7 +11,7 @@ public class MsgQueue {
         return String.format("sub.%s", AppId.dmaster.name());
     }
 
-    public static String dagentTopic(String nodeId) {
-        return String.format("rpc.%s.%s", nodeId, AppId.dagent.name());
+    public static String dagentTopic(String appId) {
+        return String.format("rpc.%s.%s", appId, AppId.dagent.name());
     }
 }

+ 0 - 9
common/src/main/java/cn/reghao/autodop/common/msg/pub/clazz/MachineClazz.java

@@ -1,9 +0,0 @@
-package cn.reghao.autodop.common.msg.pub.clazz;
-
-/**
- * @author reghao
- * @date 2021-09-15 16:02:01
- */
-public enum MachineClazz {
-    stat, heartbeat
-}

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

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

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

@@ -5,5 +5,5 @@ package cn.reghao.autodop.common.msg.pub.clazz;
  * @date 2021-09-15 11:51:17
  */
 public enum PubClazz {
-    NodeClazz, MachineClazz
+    NodePubClazz, MachinePubClazz
 }

+ 0 - 32
common/src/main/java/cn/reghao/autodop/common/msg/pub/dto/node/NodeDTO.java

@@ -1,32 +0,0 @@
-package cn.reghao.autodop.common.msg.pub.dto.node;
-
-import cn.reghao.autodop.common.msg.pub.dto.node.constant.AppId;
-import cn.reghao.autodop.common.msg.pub.dto.node.constant.AppStatus;
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * @author reghao
- * @date 2021-08-25 22:22:35
- */
-@Data
-public class NodeDTO implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private String machineId;
-    private String appId;
-    private String publicIp;
-    private String privateIp;
-    private String appStatus;
-    private long heartbeatTime;
-
-    public NodeDTO(String machineId, AppId appId, String publicIp, String privateIp, AppStatus appStatus) {
-        this.machineId = machineId;
-        this.appId = appId.name();
-        this.publicIp = publicIp;
-        this.privateIp = privateIp;
-        this.appStatus = appStatus.name();
-        this.heartbeatTime = System.currentTimeMillis();
-    }
-}

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/msg/pub/dto/node/constant/AppStatus.java

@@ -5,5 +5,5 @@ package cn.reghao.autodop.common.msg.pub.dto.node.constant;
  * @date 2021-08-27 17:33:20
  */
 public enum AppStatus {
-    online, offline
+    Online, Offline
 }

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/msg/rpc/clazz/AppClazz.java → common/src/main/java/cn/reghao/autodop/common/msg/rpc/clazz/AppRpcClazz.java

@@ -4,6 +4,6 @@ package cn.reghao.autodop.common.msg.rpc.clazz;
  * @author reghao
  * @date 2020-12-25 19:15:00
  */
-public enum AppClazz {
+public enum AppRpcClazz {
     deploy, status, restart, stop, start, log,
 }

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/msg/rpc/clazz/DockerClazz.java → common/src/main/java/cn/reghao/autodop/common/msg/rpc/clazz/DockerRpcClazz.java

@@ -4,6 +4,6 @@ package cn.reghao.autodop.common.msg.rpc.clazz;
  * @author reghao
  * @date 2020-12-25 19:15:00
  */
-public enum DockerClazz {
+public enum DockerRpcClazz {
     dockerImage,
 }

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/msg/rpc/clazz/MachineClazz.java → common/src/main/java/cn/reghao/autodop/common/msg/rpc/clazz/MachineRpcClazz.java

@@ -4,6 +4,6 @@ package cn.reghao.autodop.common.msg.rpc.clazz;
  * @author reghao
  * @date 2020-12-25 19:15:00
  */
-public enum MachineClazz {
+public enum MachineRpcClazz {
     shell, stat,
 }

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/msg/rpc/clazz/RpcClazz.java

@@ -5,5 +5,5 @@ package cn.reghao.autodop.common.msg.rpc.clazz;
  * @date 2021-09-14 18:15:05
  */
 public enum RpcClazz {
-    AppClazz, MachineClazz, DockerClazz,
+    AppRpcClazz, MachineRpcClazz, DockerRpcClazz,
 }

+ 0 - 58
common/src/main/java/cn/reghao/autodop/common/util/MachineId.java

@@ -1,58 +0,0 @@
-package cn.reghao.autodop.common.util;
-
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.*;
-import java.net.*;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
-
-/**
- * 机器标识
- *
- * @author reghao
- * @date 2021-05-20 15:45:28
- */
-public class MachineId {
-    public static String id() throws IOException {
-        File file = new File("/etc/machine-id");
-        BufferedReader in =  new BufferedReader(new InputStreamReader(new FileInputStream(file)));
-        String line = in.readLine();
-        in.close();
-
-        if (line.isBlank()) {
-            throw new IOException("/etc/machine-id 文件中没有 machine-id");
-        }
-        return line;
-    }
-
-    public static String ipv4() {
-        List<String> ipv4List = new ArrayList<>();
-        try {
-            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
-            // 遍历主机的网络接口
-            while (interfaces.hasMoreElements()) {
-                NetworkInterface iface = interfaces.nextElement();
-                String name = iface.getName();
-                // TODO 过滤掉 localhost 和虚拟网卡
-                if (name.startsWith("lo") || name.startsWith("docker") || name.startsWith("v")) {
-                    continue;
-                }
-
-                Enumeration<InetAddress> inetAddrs = iface.getInetAddresses();
-                while (inetAddrs.hasMoreElements()) {
-                    InetAddress address = inetAddrs.nextElement();
-                    if (!address.isLoopbackAddress()) {
-                        if (address instanceof Inet4Address) {
-                            ipv4List.add(address.getHostAddress());
-                        }
-                    }
-                }
-            }
-        } catch (SocketException e) {
-            e.printStackTrace();
-        }
-        return ipv4List.isEmpty() ? "127.0.0.1" : ipv4List.get(0);
-    }
-}

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

@@ -10,6 +10,7 @@ import cn.reghao.autodop.common.dagent.app.log.LogConfig;
 import cn.reghao.autodop.common.dagent.app.log.LogFile;
 import cn.reghao.autodop.common.docker.exception.DockerException;
 import cn.reghao.autodop.common.message.CallResult;
+import cn.reghao.jdkutil.MachineId;
 import cn.reghao.jdkutil.result.Result;
 import cn.reghao.jdkutil.result.ResultStatus;
 import cn.reghao.autodop.common.util.ExceptionUtil;
@@ -27,8 +28,8 @@ import java.util.List;
 @Slf4j
 @Component
 public class App {
-    private DockerAppServiceImpl dockerAppServiceImpl;
-    private ZipAppServiceImpl zipAppServiceImpl;
+    private final DockerAppServiceImpl dockerAppServiceImpl;
+    private final ZipAppServiceImpl zipAppServiceImpl;
 
     public App() {
         // TODO 对于托管给 Spring 的对象,这种创建对象的方式是否合理
@@ -42,8 +43,7 @@ public class App {
         String packType = deployParam.getPackType();
 
         AppStatus appStatus;
-        DeployResult deployResult = new DeployResult(buildLogId,
-                DagentLifecycle.MACHINE_ID, DagentLifecycle.MACHINE_IPV4);
+        DeployResult deployResult = new DeployResult(buildLogId, MachineId.id(), MachineId.ipv4());
         switch (PackType.valueOf(packType)) {
             case docker:
                 try {

+ 3 - 2
dagent/src/main/java/cn/reghao/autodop/dagent/app/DockerAppServiceImpl.java

@@ -13,6 +13,7 @@ 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.MachineId;
 import cn.reghao.jdkutil.converter.DateTimeConverter;
 import cn.reghao.jdkutil.serializer.JsonConverter;
 import cn.reghao.autodop.dagent.spring.DagentLifecycle;
@@ -55,8 +56,8 @@ public class DockerAppServiceImpl implements AppService {
 
     private AppStatus getAppStatus(String appId, ContainerInfo containerInfo) {
         AppStatus appStatus = new AppStatus();
-        appStatus.setMachineId(DagentLifecycle.MACHINE_ID);
-        appStatus.setMachineIpv4(DagentLifecycle.MACHINE_IPV4);
+        appStatus.setMachineId(MachineId.id());
+        appStatus.setMachineIpv4(MachineId.ipv4());
         appStatus.setAppId(appId);
         appStatus.setPackagePath(containerInfo.getConfig().getImage());
 

+ 79 - 0
dagent/src/main/java/cn/reghao/autodop/dagent/machine/NodeClazzPubImpl.java

@@ -0,0 +1,79 @@
+package cn.reghao.autodop.dagent.machine;
+
+import cn.reghao.autodop.common.machine.Machine;
+import cn.reghao.autodop.common.machine.MachineInfo;
+import cn.reghao.autodop.common.machine.MachineStat;
+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.util.thread.ThreadPoolWrapper;
+import cn.reghao.jdkutil.serializer.JsonConverter;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.MqttException;
+
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author reghao
+ * @date 2021-09-03 09:22:42
+ */
+@Slf4j
+public class NodeClazzPubImpl {
+    private final String topic;
+    private final ScheduledExecutorService scheduler;
+    private final DefaultMqttClient mqttClient;
+    private final Machine machine;
+    private final String pubClazz;
+    
+    public NodeClazzPubImpl(DefaultMqttClient mqttClient, Machine machine) {
+        this.topic = MsgQueue.dmasterTopic();
+        this.scheduler = ThreadPoolWrapper.scheduledThreadPool("heartbeat", 1);
+        this.mqttClient = mqttClient;
+        this.machine = machine;
+        this.pubClazz = NodePubClazz.class.getSimpleName();
+    }
+    
+    public void nodeStart() {
+        MachineInfo machineInfo = machine.info();
+        String jsonPayload = JsonConverter.objectToJson(machineInfo);
+        PubMsg pubMsg = PubMsg.pubMsg(pubClazz, NodePubClazz.start.name(), jsonPayload);
+        pub(pubMsg);
+    }
+
+    public void nodeShutdown() {
+        ThreadPoolWrapper.shutdownScheduler(scheduler);
+        MachineInfo machineInfo = machine.info();
+        String jsonPayload = JsonConverter.objectToJson(machineInfo);
+        PubMsg pubMsg = PubMsg.pubMsg(pubClazz, NodePubClazz.shutdown.name(), jsonPayload);
+        pub(pubMsg);
+    }
+
+    public void nodeHeartbeat() {
+        scheduler.scheduleAtFixedRate(new Heartbeat(), 3, 3, TimeUnit.SECONDS);
+    }
+
+    public void nodeLog() {
+    }
+    
+    private void pub(PubMsg pubMsg) {
+        Message message = Message.pubMessage("", "", pubMsg);
+        try {
+            mqttClient.pub(topic, 1, JsonConverter.objectToJson(message));
+        } catch (MqttException e) {
+            log.error("{}", e.getMessage());
+        }
+    }
+
+    class Heartbeat implements Runnable {
+        @Override
+        public void run() {
+            MachineStat machineStat = machine.stat();
+            String jsonPayload = JsonConverter.objectToJson(machineStat);
+            PubMsg pubMsg = PubMsg.pubMsg(pubClazz, NodePubClazz.heartbeat.name(), jsonPayload);
+            pub(pubMsg);
+        }
+    }
+}

+ 0 - 112
dagent/src/main/java/cn/reghao/autodop/dagent/machine/NodeOpsImpl.java

@@ -1,112 +0,0 @@
-package cn.reghao.autodop.dagent.machine;
-
-import cn.reghao.autodop.common.http.DefaultWebRequest;
-import cn.reghao.autodop.common.http.WebRequest;
-import cn.reghao.autodop.common.http.WebResponse;
-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.NodeClazz;
-import cn.reghao.autodop.common.msg.pub.dto.node.NodeDTO;
-import cn.reghao.autodop.common.msg.pub.dto.node.constant.AppId;
-import cn.reghao.autodop.common.msg.pub.dto.node.constant.AppStatus;
-import cn.reghao.autodop.common.util.thread.ThreadPoolWrapper;
-import cn.reghao.jdkutil.MachineId;
-import cn.reghao.jdkutil.serializer.JsonConverter;
-import com.google.gson.JsonObject;
-import lombok.extern.slf4j.Slf4j;
-import org.eclipse.paho.client.mqttv3.MqttException;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author reghao
- * @date 2021-09-03 09:22:42
- */
-@Slf4j
-@Component
-public class NodeOpsImpl {
-    private final String nodeId;
-    private final AppId appId;
-    private final String topic;
-    private final ScheduledExecutorService heartbeatScheduler;
-    private final WebRequest webRequest;
-    private final DefaultMqttClient mqttClient;
-    
-    public NodeOpsImpl(DefaultMqttClient mqttClient) throws IOException {
-        this.nodeId = MachineId.id();
-        this.appId = AppId.dagent;
-        this.topic = MsgQueue.dmasterTopic();
-        this.heartbeatScheduler = ThreadPoolWrapper.scheduledThreadPool("heartbeat", 1);
-        this.webRequest = new DefaultWebRequest();
-        this.mqttClient = mqttClient;
-    }
-    
-    public void nodeStart() {
-        NodeDTO nodeDTO = nodeAppDTO(AppStatus.online);
-        String jsonPayload = JsonConverter.objectToJson(nodeDTO);
-        PubMsg pubMsg = PubMsg.pubMsg(NodeClazz.class.getSimpleName(), NodeClazz.start.name(), jsonPayload);
-        Message message = Message.pubMessage("", "", pubMsg);
-        try {
-            mqttClient.pub(topic, 1, JsonConverter.objectToJson(message));
-        } catch (MqttException e) {
-            log.error("{}", e.getMessage());
-        }
-    }
-
-    public void nodeShutdown() {
-        ThreadPoolWrapper.shutdownScheduler(heartbeatScheduler);
-        NodeDTO nodeDTO = nodeAppDTO(AppStatus.offline);
-        String jsonPayload = JsonConverter.objectToJson(nodeDTO);
-        PubMsg pubMsg = PubMsg.pubMsg(NodeClazz.class.getSimpleName(), NodeClazz.shutdown.name(), jsonPayload);
-        Message message = Message.pubMessage("", "", pubMsg);
-        try {
-            mqttClient.pub(topic, 1, JsonConverter.objectToJson(message));
-        } catch (MqttException e) {
-            log.error("{}", e.getMessage());
-        }
-    }
-
-    public void nodeHeartbeat() {
-        // 每小时发送一次心跳
-        heartbeatScheduler.scheduleAtFixedRate(new Heartbeat(), 10, 10, TimeUnit.SECONDS);
-    }
-
-    public void nodeLog() {
-    }
-
-    private NodeDTO nodeAppDTO(AppStatus appStatus) {
-        String publicIp = getPublicIp();
-        String privateIp = MachineId.ipv4();
-        return new NodeDTO(nodeId, appId, publicIp, privateIp, appStatus);
-    }
-
-    private String getPublicIp() {
-        WebResponse webResponse = webRequest.get("http://ip.reghao.cn");
-        if (webResponse.getStatusCode() != 200) {
-            return "0.0.0.0";
-        }
-
-        JsonObject jsonObject = JsonConverter.jsonToJsonElement(webResponse.getBody()).getAsJsonObject();
-        return jsonObject.get("ip").getAsString();
-    }
-
-    class Heartbeat implements Runnable {
-        @Override
-        public void run() {
-            NodeDTO nodeDTO = nodeAppDTO(AppStatus.online);
-            String jsonPayload = JsonConverter.objectToJson(nodeDTO);
-            PubMsg pubMsg = PubMsg.pubMsg(NodeClazz.class.getSimpleName(), NodeClazz.heartbeat.name(), jsonPayload);
-            Message message = Message.pubMessage("", "", pubMsg);
-            try {
-                mqttClient.pub(topic, 1, JsonConverter.objectToJson(message));
-            } catch (MqttException e) {
-                log.error("{}", e.getMessage());
-            }
-        }
-    }
-}

+ 11 - 11
dagent/src/main/java/cn/reghao/autodop/dagent/rpc/RpcListener.java

@@ -6,9 +6,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.AppClazzImpl;
-import cn.reghao.autodop.dagent.rpc.impl.DockerClazzImpl;
-import cn.reghao.autodop.dagent.rpc.impl.MachineClazzImpl;
+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.jdkutil.serializer.JsonConverter;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
@@ -30,12 +30,12 @@ import java.lang.management.ManagementFactory;
 public class RpcListener implements MqttCallback {
     private final long startTime;
     private final DefaultMqttClient mqttClient;
-    private final AppClazzImpl appClazz;
-    private final MachineClazzImpl machineClazz;
-    private final DockerClazzImpl dockerClazz;
+    private final AppClazzRpcImpl appClazz;
+    private final MachineClazzRpcImpl machineClazz;
+    private final DockerClazzRpcImpl dockerClazz;
 
-    public RpcListener(DefaultMqttClient mqttClient, AppClazzImpl appClazz, MachineClazzImpl machineClazz,
-                       DockerClazzImpl dockerClazz) {
+    public RpcListener(DefaultMqttClient mqttClient, AppClazzRpcImpl appClazz, MachineClazzRpcImpl machineClazz,
+                       DockerClazzRpcImpl dockerClazz) {
         this.startTime = ManagementFactory.getRuntimeMXBean().getStartTime();
         this.mqttClient = mqttClient;
         this.appClazz = appClazz;
@@ -56,13 +56,13 @@ public class RpcListener implements MqttCallback {
             String clazz = rpcPayload.getClazz();
             RpcResult<?> rpcResult;
             switch (RpcClazz.valueOf(clazz)) {
-                case AppClazz:
+                case AppRpcClazz:
                     rpcResult = appClazz.process(rpcPayload);
                     break;
-                case MachineClazz:
+                case MachineRpcClazz:
                     rpcResult = machineClazz.process(rpcPayload);
                     break;
-                case DockerClazz:
+                case DockerRpcClazz:
                     rpcResult = dockerClazz.process(rpcPayload);
                     break;
                 default:

+ 6 - 6
dagent/src/main/java/cn/reghao/autodop/dagent/rpc/impl/AppClazzImpl.java → dagent/src/main/java/cn/reghao/autodop/dagent/rpc/impl/AppClazzRpcImpl.java

@@ -6,12 +6,12 @@ import cn.reghao.autodop.common.dagent.app.log.LogFile;
 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;
-import cn.reghao.autodop.common.msg.rpc.clazz.AppClazz;
+import cn.reghao.autodop.common.msg.rpc.clazz.AppRpcClazz;
 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.autodop.dagent.spring.DagentLifecycle;
+import cn.reghao.jdkutil.MachineId;
 import cn.reghao.jdkutil.result.Result;
 import cn.reghao.jdkutil.result.ResultStatus;
 import lombok.extern.slf4j.Slf4j;
@@ -25,11 +25,11 @@ import java.util.List;
  */
 @Slf4j
 @Component
-public class AppClazzImpl {
+public class AppClazzRpcImpl {
     private final AppService dockerAppServiceImpl;
     private final AppService zipAppServiceImpl;
     
-    public AppClazzImpl() {
+    public AppClazzRpcImpl() {
         this.dockerAppServiceImpl = new DockerAppServiceImpl();
         this.zipAppServiceImpl = new ZipAppServiceImpl();
     }
@@ -37,7 +37,7 @@ public class AppClazzImpl {
     public RpcResult<?> process(RpcPayload rpcPayload) {
         String method = rpcPayload.getMethod();
         Object param = rpcPayload.getParam();
-        switch (AppClazz.valueOf(method)) {
+        switch (AppRpcClazz.valueOf(method)) {
             case deploy:
                 if (!(param instanceof DeployParam)) {
                     return RpcResult.error("不是 DeployParam 对象");
@@ -75,7 +75,7 @@ public class AppClazzImpl {
         String packType = deployParam.getPackType();
 
         AppStatus appStatus;
-        DeployResult deployResult = new DeployResult(buildLogId, DagentLifecycle.MACHINE_ID, DagentLifecycle.MACHINE_IPV4);
+        DeployResult deployResult = new DeployResult(buildLogId, MachineId.id(), MachineId.ipv4());
         try {
             switch (PackType.valueOf(packType)) {
                 case docker:

+ 4 - 4
dagent/src/main/java/cn/reghao/autodop/dagent/rpc/impl/DockerClazzImpl.java → dagent/src/main/java/cn/reghao/autodop/dagent/rpc/impl/DockerClazzRpcImpl.java

@@ -3,7 +3,7 @@ package cn.reghao.autodop.dagent.rpc.impl;
 import cn.reghao.autodop.common.docker.Docker;
 import cn.reghao.autodop.common.msg.rpc.RpcPayload;
 import cn.reghao.autodop.common.msg.rpc.RpcResult;
-import cn.reghao.autodop.common.msg.rpc.clazz.DockerClazz;
+import cn.reghao.autodop.common.msg.rpc.clazz.DockerRpcClazz;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
@@ -13,17 +13,17 @@ import org.springframework.stereotype.Component;
  */
 @Slf4j
 @Component
-public class DockerClazzImpl {
+public class DockerClazzRpcImpl {
     private Docker docker;
 
-    public DockerClazzImpl() {
+    public DockerClazzRpcImpl() {
         //this.docker = new Docker();
     }
     
     public RpcResult<?> process(RpcPayload rpcPayload) {
         String method = rpcPayload.getMethod();
         Object param = rpcPayload.getParam();
-        switch (DockerClazz.valueOf(method)) {
+        switch (DockerRpcClazz.valueOf(method)) {
             case dockerImage:
             default:
         }

+ 5 - 5
dagent/src/main/java/cn/reghao/autodop/dagent/rpc/impl/MachineClazzImpl.java → dagent/src/main/java/cn/reghao/autodop/dagent/rpc/impl/MachineClazzRpcImpl.java

@@ -5,7 +5,7 @@ import cn.reghao.autodop.common.machine.MachineStat;
 import cn.reghao.autodop.common.machine.shell.MachineShell;
 import cn.reghao.autodop.common.msg.rpc.RpcPayload;
 import cn.reghao.autodop.common.msg.rpc.RpcResult;
-import cn.reghao.autodop.common.msg.rpc.clazz.MachineClazz;
+import cn.reghao.autodop.common.msg.rpc.clazz.MachineRpcClazz;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
@@ -15,17 +15,17 @@ import org.springframework.stereotype.Component;
  */
 @Slf4j
 @Component
-public class MachineClazzImpl {
+public class MachineClazzRpcImpl {
     private final Machine machine;
 
-    public MachineClazzImpl(Machine machine) {
+    public MachineClazzRpcImpl(Machine machine) {
         this.machine = machine;
     }
     
     public RpcResult<?> process(RpcPayload rpcPayload) {
         String method = rpcPayload.getMethod();
         Object param = rpcPayload.getParam();
-        switch (MachineClazz.valueOf(method)) {
+        switch (MachineRpcClazz.valueOf(method)) {
             case stat:
                 break;
             case shell:
@@ -37,7 +37,7 @@ public class MachineClazzImpl {
 
 
     public RpcResult<MachineStat> stat() {
-        return RpcResult.success(machine.heartbeat());
+        return RpcResult.success(machine.stat());
     }
 
     public RpcResult<MachineShell> shell(String script) {

+ 11 - 17
dagent/src/main/java/cn/reghao/autodop/dagent/spring/DagentLifecycle.java

@@ -3,13 +3,14 @@ package cn.reghao.autodop.dagent.spring;
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.core.Appender;
 import cn.reghao.autodop.common.log.Appenders;
+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.common.msg.pub.dto.node.constant.AppId;
-import cn.reghao.autodop.common.util.MachineId;
-import cn.reghao.autodop.dagent.machine.NodeOpsImpl;
+import cn.reghao.autodop.dagent.machine.NodeClazzPubImpl;
 import cn.reghao.autodop.dagent.rpc.RpcListener;
 import cn.reghao.autodop.common.log.LoggerConfig;
+import cn.reghao.jdkutil.MachineId;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.paho.client.mqttv3.MqttException;
 import org.springframework.beans.factory.DisposableBean;
@@ -17,7 +18,6 @@ import org.springframework.boot.ApplicationArguments;
 import org.springframework.boot.ApplicationRunner;
 import org.springframework.context.annotation.Configuration;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -30,26 +30,20 @@ import java.util.List;
 @Slf4j
 @Configuration
 public class DagentLifecycle implements ApplicationRunner, DisposableBean {
-    public static String MACHINE_ID;
-    public static String MACHINE_IPV4;
-
     private final DefaultMqttClient mqttClient;
-    private final NodeOpsImpl nodeOps;
     private final RpcListener rpcListener;
+    private final NodeClazzPubImpl nodeClazzPub;
 
-    public DagentLifecycle(DefaultMqttClient mqttClient, NodeOpsImpl nodeOps, RpcListener rpcListener)
-            throws IOException {
-        MACHINE_ID = MachineId.id();
-        MACHINE_IPV4 = MachineId.ipv4();
+    public DagentLifecycle(DefaultMqttClient mqttClient, RpcListener rpcListener, Machine machine) {
         this.mqttClient = mqttClient;
-        this.nodeOps = nodeOps;
         this.rpcListener = rpcListener;
+        this.nodeClazzPub = new NodeClazzPubImpl(mqttClient, machine);
         initLogger();
     }
 
     private void initLogger() {
         List<Appender<ILoggingEvent>> appenders = new ArrayList<>();
-        appenders.add(Appenders.mqttAppender(MACHINE_ID, AppId.dagent.name(), mqttClient));
+        appenders.add(Appenders.mqttAppender(AppId.dagent.name(), mqttClient));
         LoggerConfig.initLogger(appenders);
     }
 
@@ -66,20 +60,20 @@ public class DagentLifecycle implements ApplicationRunner, DisposableBean {
     }
 
     private void subTopic() throws MqttException {
-        String topic = MsgQueue.dagentTopic(MACHINE_ID);
+        String topic = MsgQueue.dagentTopic(MachineId.id());
         mqttClient.sub(topic, rpcListener);
     }
 
     private void pubDagentStart() {
-        nodeOps.nodeStart();
+        nodeClazzPub.nodeStart();
     }
 
     private void pubDagentHeartbeat() {
-        nodeOps.nodeHeartbeat();
+        nodeClazzPub.nodeHeartbeat();
     }
 
     private void pubDagentShutdown() {
-        nodeOps.nodeShutdown();
+        nodeClazzPub.nodeShutdown();
         log.info("Dagent 停止...");
     }
 }

+ 5 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/BuildConfigPageController.java

@@ -18,6 +18,7 @@ import cn.reghao.autodop.dmaster.machine.model.vo.DiskUsage;
 import cn.reghao.autodop.dmaster.util.db.PageList;
 import cn.reghao.autodop.dmaster.util.db.PageSort;
 import cn.reghao.autodop.dmaster.spring.DmasterLifecycle;
+import cn.reghao.jdkutil.MachineId;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -159,8 +160,8 @@ public class BuildConfigPageController {
             compileTypes.add(new KeyValue(compileType.name(), compileType.name()));
         }
         model.addAttribute("compileTypes", compileTypes);
-        model.addAttribute("machineId", DmasterLifecycle.MACHINE_ID);
-        model.addAttribute("machineIpv4", DmasterLifecycle.MACHINE_IPV4);
+        model.addAttribute("machineId", MachineId.id());
+        model.addAttribute("machineIpv4", MachineId.ipv4());
     }
 
     @GetMapping("/compiler/detail/{id}")
@@ -200,8 +201,8 @@ public class BuildConfigPageController {
             packTypes.add(new KeyValue(packType.name(), packType.name()));
         }
         model.addAttribute("packTypes", packTypes);
-        model.addAttribute("machineId", DmasterLifecycle.MACHINE_ID);
-        model.addAttribute("machineIpv4", DmasterLifecycle.MACHINE_IPV4);
+        model.addAttribute("machineId", MachineId.id());
+        model.addAttribute("machineIpv4", MachineId.ipv4());
     }
 
     @GetMapping("/packer/detail/{id}")

+ 3 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/po/config/build/BuildDirLocal.java

@@ -6,6 +6,7 @@ import cn.reghao.autodop.common.util.ByteConverter;
 import cn.reghao.autodop.common.util.ByteType;
 import cn.reghao.autodop.common.util.FileOps;
 import cn.reghao.autodop.dmaster.spring.DmasterLifecycle;
+import cn.reghao.jdkutil.MachineId;
 import lombok.extern.slf4j.Slf4j;
 
 import java.io.File;
@@ -35,8 +36,8 @@ public class BuildDirLocal {
     public static BuildDir setBuildDir(String dirPath) {
         DiskInfo diskInfo = disk.diskInfo(dirPath);
         BuildDir buildDir = new BuildDir();
-        buildDir.setMachineId(DmasterLifecycle.MACHINE_ID);
-        buildDir.setMachineIpv4(DmasterLifecycle.MACHINE_IPV4);
+        buildDir.setMachineId(MachineId.id());
+        buildDir.setMachineIpv4(MachineId.ipv4());
         buildDir.setDirPath(dirPath);
         buildDir.setMountedOn(diskInfo.getMountedOn());
         buildDir.setTotal(converter.convert(ByteType.Bytes, diskInfo.getSize()));

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

@@ -59,7 +59,7 @@ public class MachinePageController {
         this.receiverRepository = receiverRepository;
     }
 
-    @ApiOperation(value = "机器列表页面")
+    @ApiOperation(value = "机器节点页面")
     @GetMapping("/host")
     public String hostPage(@RequestParam(value = "env", required = false) String env,
                            @RequestParam(value = "machineIpv4", required = false) String machineIpv4,
@@ -190,56 +190,56 @@ public class MachinePageController {
     @ApiOperation(value = "系统负载页面")
     @GetMapping("/status/sys/{machineId}")
     public String hostStatusPage(@PathVariable("machineId") String machineId, Model model) {
-        MachineStat machineStat = statQuery.query(machineId);
-        LocalDateTime statTime = machineStat.getMachineTime();
+        MachineStat machineStat = statQuery.queryByMachineId(machineId, 1).get(0);
+        LocalDateTime statTime = DateTimeConverter.localDateTime(machineStat.getTimestamp());
 
         model.addAttribute("statTime", DateTimeConverter.format(statTime));
         model.addAttribute("sysload", machineStat.getOsStat());
-        return "/machine/sysload";
+        return "/machine/stat/sysload";
     }
 
     @ApiOperation(value = "网络状态页面")
     @GetMapping("/status/network/{machineId}")
     public String networkStatusPage(@PathVariable("machineId") String machineId, Model model) {
-        MachineStat machineStat = statQuery.query(machineId);
-        LocalDateTime statTime = machineStat.getMachineTime();
+        MachineStat machineStat = statQuery.queryByMachineId(machineId, 1).get(0);
+        LocalDateTime statTime = DateTimeConverter.localDateTime(machineStat.getTimestamp());
 
         model.addAttribute("statTime", DateTimeConverter.format(statTime));
         model.addAttribute("tcpConnNum", machineStat.getTcpConnNum());
         model.addAttribute("networkStat", machineStat.getNetworkStat());
-        return "/machine/networkstatus";
+        return "/machine/stat/network";
     }
 
     @ApiOperation(value = "CPU 使用率页面")
     @GetMapping("/status/cpu/{machineId}")
     public String cpuUsagePage(@PathVariable("machineId") String machineId, Model model) {
-        MachineStat machineStat = statQuery.query(machineId);
-        LocalDateTime statTime = machineStat.getMachineTime();
+        MachineStat machineStat = statQuery.queryByMachineId(machineId, 1).get(0);
+        LocalDateTime statTime = DateTimeConverter.localDateTime(machineStat.getTimestamp());
 
         model.addAttribute("statTime", DateTimeConverter.format(statTime));
         model.addAttribute("cpuUsage", machineStat.getCpuStat());
-        return "/machine/cpuusage";
+        return "/machine/stat/cpu";
     }
 
     @ApiOperation(value = "内存详情页面")
     @GetMapping("/status/mem/{machineId}")
     public String memUsagePage(@PathVariable("machineId") String machineId, Model model) {
-        MachineStat machineStat = statQuery.query(machineId);
-        LocalDateTime statTime = machineStat.getMachineTime();
+        MachineStat machineStat = statQuery.queryByMachineId(machineId, 1).get(0);
+        LocalDateTime statTime = DateTimeConverter.localDateTime(machineStat.getTimestamp());
 
         model.addAttribute("statTime", DateTimeConverter.format(statTime));
         model.addAttribute("memoryUsage", machineStat.getMemoryUsage());
-        return "/machine/memusage";
+        return "/machine/stat/mem";
     }
 
     @ApiOperation(value = "磁盘详情页面")
     @GetMapping("/status/disk/{machineId}")
     public String diskUsagePage(@PathVariable("machineId") String machineId, Model model) {
-        MachineStat machineStat = statQuery.query(machineId);
-        LocalDateTime statTime = machineStat.getMachineTime();
+        MachineStat machineStat = statQuery.queryByMachineId(machineId, 1).get(0);
+        LocalDateTime statTime = DateTimeConverter.localDateTime(machineStat.getTimestamp());
 
         model.addAttribute("statTime", DateTimeConverter.format(statTime));
         model.addAttribute("diskUsages", machineStat.getDiskUsages());
-        return "/machine/diskusage";
+        return "/machine/stat/disk";
     }
 }

+ 3 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/query/MachineStatQuery.java

@@ -3,10 +3,12 @@ package cn.reghao.autodop.dmaster.machine.db.query;
 import cn.reghao.autodop.dmaster.machine.model.po.MachineStat;
 import cn.reghao.jdkutil.db.BaseQuery;
 
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2021-06-17 22:52:32
  */
 public interface MachineStatQuery extends BaseQuery<MachineStat> {
-    MachineStat query(String machineId);
+    List<MachineStat> queryByMachineId(String machineId, int limit);
 }

+ 3 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/db/query/MachineStatQueryImpl.java

@@ -25,11 +25,10 @@ public class MachineStatQueryImpl implements MachineStatQuery {
     }
 
     @Override
-    public MachineStat query(String machineId) {
+    public List<MachineStat> queryByMachineId(String machineId, int limit) {
         Query query = new Query();
         query.addCriteria(Criteria.where("machineId").is(machineId));
-        query.with(Sort.by(Sort.Order.desc("createTime"))).limit(1);
-        List<MachineStat> list = mongoTemplate.find(query, MachineStat.class);
-        return list.isEmpty() ? null : list.get(0);
+        query.with(Sort.by(Sort.Order.desc("createTime"))).limit(limit);
+        return mongoTemplate.find(query, MachineStat.class);
     }
 }

+ 0 - 11
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/constant/MachineStatus.java

@@ -1,11 +0,0 @@
-package cn.reghao.autodop.dmaster.machine.model.constant;
-
-/**
- * 机器状态,可用/不可用
- *
- * @author reghao
- * @date 2021-06-16 15:18:17
- */
-public enum MachineStatus {
-    Online, Offline
-}

+ 12 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/po/MachineHost.java

@@ -1,7 +1,8 @@
 package cn.reghao.autodop.dmaster.machine.model.po;
 
+import cn.reghao.autodop.common.machine.network.NetworkInfo;
+import cn.reghao.autodop.common.msg.pub.dto.node.constant.AppStatus;
 import cn.reghao.autodop.dmaster.app.model.constant.EnvList;
-import cn.reghao.autodop.dmaster.machine.model.constant.MachineStatus;
 import cn.reghao.autodop.dmaster.util.db.BaseEntity;
 import cn.reghao.autodop.dmaster.notification.model.po.NotifyGroup;
 import lombok.Data;
@@ -40,11 +41,17 @@ public class MachineHost extends BaseEntity<Integer> {
     private List<NotifyGroup> notifyGroups;
 
     // TODO 根据机器所属的地区,机房等维度来分组
-    public MachineHost(String machineId, String machineIpv4) {
-        this.machineId = machineId;
-        this.machineIpv4 = machineIpv4;
+    public MachineHost(MachineInfo machineInfo) {
+        this.machineId = machineInfo.getMachineId();
+        List<NetworkInfo> list = machineInfo.getNetworkInfos();
+        if (!list.isEmpty()) {
+            this.machineIpv4 = list.get(0).getIpv4();
+        } else {
+            this.machineIpv4 = "127.0.0.1";
+        }
+
         this.env = EnvList.test.name();
-        this.status = MachineStatus.Online.name();
+        this.status = AppStatus.Online.name();
         this.lastCheck = LocalDateTime.now();
     }
 }

+ 1 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/model/po/MachineStat.java

@@ -17,7 +17,6 @@ import lombok.EqualsAndHashCode;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.mongodb.core.mapping.Document;
 
-import java.time.LocalDateTime;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -31,14 +30,12 @@ import java.util.stream.Collectors;
 @Document("MachineStat")
 public class MachineStat extends BaseDocument {
     private String machineId;
-    private LocalDateTime machineTime;
+    private long timestamp;
     private OsStat osStat;
     private NetworkStat networkStat;
     private CpuStat cpuStat;
     private MemoryInfo memoryInfo;
     private List<DiskInfo> diskInfos;
-    private String status;
-    private LocalDateTime lastCheck;
 
     public MemoryUsage getMemoryUsage() {
         long total = memoryInfo.getTotal();

+ 2 - 11
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/service/NodeService.java

@@ -5,7 +5,6 @@ import cn.reghao.autodop.dmaster.machine.db.crud.MachineInfoCrud;
 import cn.reghao.autodop.dmaster.machine.db.crud.MachineStatCrud;
 import cn.reghao.autodop.dmaster.machine.db.query.MachineHostQuery;
 import cn.reghao.autodop.dmaster.machine.db.query.MachineInfoQuery;
-import cn.reghao.autodop.dmaster.machine.db.query.MachineQuery;
 import cn.reghao.autodop.dmaster.machine.db.query.MachineStatQuery;
 import cn.reghao.autodop.dmaster.machine.model.po.MachineHost;
 import cn.reghao.autodop.dmaster.machine.model.po.MachineStat;
@@ -17,8 +16,6 @@ import cn.reghao.autodop.dmaster.monitor.model.po.MonitorJob;
 import cn.reghao.autodop.dmaster.monitor.service.MonitorJobData;
 import cn.reghao.autodop.dmaster.monitor.service.MonitorService;
 import cn.reghao.autodop.dmaster.notification.model.po.NotifyGroup;
-import cn.reghao.autodop.dmaster.sys.db.crud.NodeLogCrud;
-import cn.reghao.autodop.dmaster.sys.model.po.NodeLog;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
@@ -31,6 +28,7 @@ import java.util.List;
  * @author reghao
  * @date 2021-07-01 19:11:54
  */
+@Deprecated
 @Slf4j
 @Service
 public class NodeService {
@@ -41,7 +39,6 @@ public class NodeService {
     private MachineStatCrud statCrud;
     private MachineStatQuery statQuery;
 
-    private NodeLogCrud nodeLogCrud;
     private MonitorService monitorService;
     private MonitorJobData monitorJobData;
     private MonitorJobCrudService jobCrudService;
@@ -49,7 +46,7 @@ public class NodeService {
     public NodeService(MachineInfoCrud infoCrud, MachineInfoQuery infoQuery,
                        MachineHostCrud hostCrud, MachineHostQuery hostQuery,
                        MachineStatCrud statCrud, MachineStatQuery statQuery,
-                       NodeLogCrud nodeLogCrud, MonitorService monitorService,
+                       MonitorService monitorService,
                        MonitorJobData monitorJobData, MonitorJobCrudService jobCrudService) {
         this.infoCrud = infoCrud;
         this.infoQuery = infoQuery;
@@ -57,7 +54,6 @@ public class NodeService {
         this.hostQuery = hostQuery;
         this.statCrud = statCrud;
         this.statQuery = statQuery;
-        this.nodeLogCrud = nodeLogCrud;
         this.monitorService = monitorService;
         this.monitorJobData = monitorJobData;
         this.jobCrudService = jobCrudService;
@@ -101,7 +97,6 @@ public class NodeService {
         String machineId = machineStat.getMachineId();
         MachineHost machineHost = hostQuery.findByMachineId(machineId);
         if (machineHost != null) {
-            machineHost.setLastCheck(LocalDateTime.now());
             hostCrud.update(machineHost);
             statCrud.update(machineStat);
         } else {
@@ -115,8 +110,4 @@ public class NodeService {
         monitorService.pauseJob(jobId.getJobId());*/
         statCrud.save(machineStat);
     }
-
-    public void log(NodeLog nodeLog) {
-        nodeLogCrud.save(nodeLog);
-    }
 }

+ 1 - 27
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/job/MachineStatCheckJob.java

@@ -10,7 +10,6 @@ import cn.reghao.autodop.dmaster.machine.db.query.MachineQuery;
 import cn.reghao.autodop.dmaster.machine.db.query.MachineStatQuery;
 import cn.reghao.autodop.dmaster.machine.model.po.MachineHost;
 import cn.reghao.autodop.dmaster.machine.model.po.MachineStat;
-import cn.reghao.autodop.dmaster.machine.model.constant.MachineStatus;
 import cn.reghao.autodop.dmaster.monitor.db.MonitorJobCrudService;
 import cn.reghao.autodop.dmaster.monitor.model.po.MonitorJob;
 import cn.reghao.autodop.dmaster.notification.model.po.NotifyGroup;
@@ -59,32 +58,7 @@ public class MachineStatCheckJob implements Job {
             return;
         }
 
-        MachineStat machineStat = statQuery.query(machineId);
-        long lastCheck = DateTimeConverter.msTimestamp(machineStat.getLastCheck());
-        long now = System.currentTimeMillis();
-
-        long result = now - lastCheck;
-        if (result > 10_000) {
-            MonitorJob monitorJob = jobCrudService.selectByUk(jobId);
-            int maxCount = monitorJob.getMaxNotifyCount();
-            int currentCount = monitorJob.getNotifyCount();
-            if (currentCount >= maxCount) {
-                // TODO 通知三次后,停止心跳检测
-                return;
-            }
-
-            machineStat.setStatus(MachineStatus.Offline.name());
-            statCrudService.save(machineStat);
-            // TODO 检测 IP 是否能 ping 通
-            // TODO 检测 MQTT 服务器是否正常连接
-            String msg = String.format("距离上次接收到 %s 的心跳消息已过去 %ss", machineStat.getMachineId(), result/1000);
-            DingMsg dingMsg = new DingMsg("监控报警",msg);
-            notifyGroups.forEach(notifyGroup -> notifyService.notify(notifyGroup, dingMsg));
-
-            // 更新通知计数
-            monitorJob.setNotifyCount(currentCount+1);
-            jobCrudService.insertOrUpdate(monitorJob);
-        }
+        MachineStat machineStat = statQuery.queryByMachineId(machineId, 1).get(0);
     }
 
     private String heartbeatAlert() {

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

@@ -9,7 +9,7 @@ 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.AppClazzRpcResult;
-import cn.reghao.autodop.dmaster.mqttsub.impl.NodeClazzImpl;
+import cn.reghao.autodop.dmaster.mqttsub.impl.NodeClazzPubResult;
 import cn.reghao.autodop.dmaster.mqttsub.rpcresult.DockerClazzRpcResult;
 import cn.reghao.autodop.dmaster.mqttsub.rpcresult.MachineClazzRpcResult;
 import cn.reghao.jdkutil.serializer.JsonConverter;
@@ -28,16 +28,16 @@ import org.springframework.stereotype.Component;
 @Slf4j
 @Component
 public class MessageListener implements MqttCallback {
-    private final NodeClazzImpl nodeClazz;
+    private final NodeClazzPubResult nodeClazzPubResult;
     private final MachineClazzRpcResult machineClazzRpcResult;
     private final AppClazzRpcResult appClazzRpcResult;
     private final DockerClazzRpcResult dockerClazzRpcResult;
 
-    public MessageListener(NodeClazzImpl nodeClazz,
+    public MessageListener(NodeClazzPubResult nodeClazzPubResult,
                            MachineClazzRpcResult machineClazzRpcResult,
                            AppClazzRpcResult appClazzRpcResult,
                            DockerClazzRpcResult dockerClazzRpcResult) {
-        this.nodeClazz = nodeClazz;
+        this.nodeClazzPubResult = nodeClazzPubResult;
         this.machineClazzRpcResult = machineClazzRpcResult;
         this.appClazzRpcResult = appClazzRpcResult;
         this.dockerClazzRpcResult = dockerClazzRpcResult;
@@ -72,8 +72,8 @@ public class MessageListener implements MqttCallback {
         String method = pubMsg.getMethod();
         String jsonPayload = pubMsg.getJsonPayload();
         switch (PubClazz.valueOf(clazz)) {
-            case NodeClazz:
-                nodeClazz.process(method, jsonPayload);
+            case NodePubClazz:
+                nodeClazzPubResult.process(method, jsonPayload);
                 break;
             default:
                 ;
@@ -87,13 +87,13 @@ public class MessageListener implements MqttCallback {
         String method = rpcPayload.getMethod();
         RpcResult<?> rpcResult = rpcMsg.getRpcResult();
         switch (RpcClazz.valueOf(clazz)) {
-            case AppClazz:
+            case AppRpcClazz:
                 appClazzRpcResult.process(msgId, method, rpcResult);
                 break;
-            case MachineClazz:
+            case MachineRpcClazz:
                 machineClazzRpcResult.process(msgId, method, rpcResult);
                 break;
-            case DockerClazz:
+            case DockerRpcClazz:
                 dockerClazzRpcResult.process(msgId, method, rpcResult);
                 break;
             default:

+ 0 - 71
dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/NodeClazzImpl.java

@@ -1,71 +0,0 @@
-package cn.reghao.autodop.dmaster.mqttsub.impl;
-
-import cn.reghao.autodop.common.msg.pub.clazz.NodeClazz;
-import cn.reghao.autodop.common.msg.pub.dto.node.NodeLogDTO;
-import cn.reghao.autodop.dmaster.sys.model.po.NodeLog;
-import cn.reghao.jdkutil.serializer.JsonConverter;
-import cn.reghao.autodop.dmaster.machine.model.po.MachineStat;
-import cn.reghao.autodop.dmaster.machine.model.constant.MachineStatus;
-import cn.reghao.autodop.dmaster.machine.model.po.MachineInfo;
-import cn.reghao.autodop.dmaster.machine.service.NodeService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import java.time.LocalDateTime;
-
-/**
- * @author reghao
- * @date 2020-12-30 10:26:47
- */
-@Slf4j
-@Component
-public class NodeClazzImpl {
-    private final NodeService nodeService;
-
-    public NodeClazzImpl(NodeService nodeService) {
-        this.nodeService = nodeService;
-    }
-
-    public void process(String method, String jsonPayload) {
-        switch (NodeClazz.valueOf(method)) {
-            case start:
-                start(jsonPayload);
-                break;
-            case shutdown:
-                shutdown(jsonPayload);
-                break;
-            case heartbeat:
-                heartbeat(jsonPayload);
-                break;
-            case log:
-                log(jsonPayload);
-                break;
-            default:
-                ;
-        }
-    }
-
-    private void start(String payload) {
-        MachineInfo machineInfo = JsonConverter.jsonToObject(payload, MachineInfo.class);
-        nodeService.start(machineInfo);
-    }
-
-    private void shutdown(String payload) {
-        MachineStat machineStat = JsonConverter.jsonToObject(payload, MachineStat.class);
-        machineStat.setStatus(MachineStatus.Offline.name());
-        machineStat.setLastCheck(LocalDateTime.now());
-        nodeService.shutdown(machineStat);
-    }
-
-    private void heartbeat(String payload) {
-        MachineStat machineStat = JsonConverter.jsonToObject(payload, MachineStat.class);
-        machineStat.setStatus(MachineStatus.Online.name());
-        machineStat.setLastCheck(LocalDateTime.now());
-        nodeService.heartbeat(machineStat);
-    }
-
-    private void log(String payload) {
-        NodeLogDTO nodeLogDTO = JsonConverter.jsonToObject(payload, NodeLogDTO.class);
-        nodeService.log(new NodeLog(nodeLogDTO));
-    }
-}

+ 119 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/impl/NodeClazzPubResult.java

@@ -0,0 +1,119 @@
+package cn.reghao.autodop.dmaster.mqttsub.impl;
+
+import cn.reghao.autodop.common.msg.pub.clazz.NodePubClazz;
+import cn.reghao.autodop.common.msg.pub.dto.node.NodeLogDTO;
+import cn.reghao.autodop.common.msg.pub.dto.node.constant.AppStatus;
+import cn.reghao.autodop.dmaster.machine.db.crud.*;
+import cn.reghao.autodop.dmaster.machine.db.query.MachineHostQuery;
+import cn.reghao.autodop.dmaster.machine.db.query.MachineInfoQuery;
+import cn.reghao.autodop.dmaster.machine.model.po.*;
+import cn.reghao.autodop.dmaster.sys.db.crud.NodeLogCrud;
+import cn.reghao.autodop.dmaster.sys.model.po.NodeLog;
+import cn.reghao.jdkutil.serializer.JsonConverter;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author reghao
+ * @date 2020-12-30 10:26:47
+ */
+@Slf4j
+@Component
+public class NodeClazzPubResult {
+    private MachineHostQuery hostQuery;
+    private final MachineHostCrud hostCrud;
+    private final MachineInfoQuery infoQuery;
+    private final MachineInfoCrud infoCrud;
+    private final MachineStatCrud statCrud;
+    private final NodeLogCrud nodeLogCrud;
+
+    public NodeClazzPubResult(MachineHostQuery hostQuery, MachineHostCrud hostCrud,
+                              MachineInfoQuery infoQuery, MachineInfoCrud infoCrud,
+                              MachineStatCrud statCrud, NodeLogCrud nodeLogCrud) {
+        this.hostQuery = hostQuery;
+        this.infoCrud = infoCrud;
+        this.infoQuery = infoQuery;
+        this.statCrud = statCrud;
+        this.hostCrud = hostCrud;
+        this.nodeLogCrud = nodeLogCrud;
+    }
+
+    public void process(String method, String jsonPayload) {
+        switch (NodePubClazz.valueOf(method)) {
+            case start:
+                start(jsonPayload);
+                break;
+            case shutdown:
+                shutdown(jsonPayload);
+                break;
+            case heartbeat:
+                heartbeat(jsonPayload);
+                break;
+            case log:
+                log(jsonPayload);
+                break;
+            default:
+                ;
+        }
+    }
+
+    private void start(String payload) {
+        MachineInfo machineInfo = JsonConverter.jsonToObject(payload, MachineInfo.class);
+        String machineId = machineInfo.getMachineId();
+        MachineInfo machineInfo1 = infoQuery.findByMachineId(machineId);
+        if (machineInfo1 == null) {
+            infoCrud.save(machineInfo);
+        } else {
+            infoCrud.update(machineInfo1);
+        }
+
+        MachineHost machineHost = hostQuery.findByMachineId(machineId);
+        if (machineHost == null) {
+            machineHost = new MachineHost(machineInfo);
+            hostCrud.save(machineHost);
+        } else {
+            machineHost.setStatus(AppStatus.Online.name());
+            machineHost.setLastCheck(LocalDateTime.now());
+            hostCrud.save(machineHost);
+        }
+    }
+
+    private void shutdown(String payload) {
+        MachineInfo machineInfo = JsonConverter.jsonToObject(payload, MachineInfo.class);
+        String machineId = machineInfo.getMachineId();
+        MachineInfo machineInfo1 = infoQuery.findByMachineId(machineId);
+        if (machineInfo1 == null) {
+            infoCrud.save(machineInfo);
+        } else {
+            infoCrud.update(machineInfo1);
+        }
+
+        MachineHost machineHost = hostQuery.findByMachineId(machineId);
+        if (machineHost != null) {
+            machineHost.setStatus(AppStatus.Offline.name());
+            machineHost.setLastCheck(LocalDateTime.now());
+            hostCrud.save(machineHost);
+        }
+    }
+
+    // TODO 异步处理 MachineStat 中的信息,检查系统负载,CPU,内存,磁盘等使用情况
+    private void heartbeat(String payload) {
+        MachineStat machineStat = JsonConverter.jsonToObject(payload, MachineStat.class);
+        statCrud.save(machineStat);
+
+        String machineId = machineStat.getMachineId();
+        MachineHost machineHost = hostQuery.findByMachineId(machineId);
+        if (machineHost != null) {
+            machineHost.setStatus(AppStatus.Online.name());
+            machineHost.setLastCheck(LocalDateTime.now());
+            hostCrud.save(machineHost);
+        }
+    }
+
+    private void log(String payload) {
+        NodeLogDTO nodeLogDTO = JsonConverter.jsonToObject(payload, NodeLogDTO.class);
+        nodeLogCrud.save(new NodeLog(nodeLogDTO));
+    }
+}

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/rpcresult/AppClazzRpcResult.java

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.dmaster.mqttsub.rpcresult;
 
 import cn.reghao.autodop.common.msg.rpc.RpcResult;
-import cn.reghao.autodop.common.msg.rpc.clazz.AppClazz;
+import cn.reghao.autodop.common.msg.rpc.clazz.AppRpcClazz;
 import cn.reghao.autodop.common.msg.rpc.dto.app.AppStatus;
 import cn.reghao.autodop.common.msg.rpc.dto.app.DeployResult;
 import cn.reghao.autodop.common.message.CallResult;
@@ -33,7 +33,7 @@ public class AppClazzRpcResult {
 
     public void process(String msgId, String method, RpcResult<?> rpcResult) {
         mqttClient.removeRecord(msgId);
-        switch (AppClazz.valueOf(method)) {
+        switch (AppRpcClazz.valueOf(method)) {
             case deploy:
                 break;
             case start:

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/rpcresult/DockerClazzRpcResult.java

@@ -2,7 +2,7 @@ package cn.reghao.autodop.dmaster.mqttsub.rpcresult;
 
 import cn.reghao.autodop.common.mqtt.DefaultMqttClient;
 import cn.reghao.autodop.common.msg.rpc.RpcResult;
-import cn.reghao.autodop.common.msg.rpc.clazz.DockerClazz;
+import cn.reghao.autodop.common.msg.rpc.clazz.DockerRpcClazz;
 import org.springframework.stereotype.Component;
 
 /**
@@ -19,7 +19,7 @@ public class DockerClazzRpcResult {
 
     public void process(String msgId, String method, RpcResult<?> rpcResult) {
         mqttClient.removeRecord(msgId);
-        switch (DockerClazz.valueOf(method)) {
+        switch (DockerRpcClazz.valueOf(method)) {
             case dockerImage:
                 break;
             default:

+ 2 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/rpcresult/MachineClazzRpcResult.java

@@ -1,10 +1,8 @@
 package cn.reghao.autodop.dmaster.mqttsub.rpcresult;
 
-import cn.reghao.autodop.common.message.ops.MachineOps;
-import cn.reghao.autodop.common.message.ops.OpsProcessor;
 import cn.reghao.autodop.common.mqtt.DefaultMqttClient;
 import cn.reghao.autodop.common.msg.rpc.RpcResult;
-import cn.reghao.autodop.common.msg.rpc.clazz.MachineClazz;
+import cn.reghao.autodop.common.msg.rpc.clazz.MachineRpcClazz;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
@@ -23,7 +21,7 @@ public class MachineClazzRpcResult {
 
     public void process(String msgId, String method, RpcResult<?> rpcResult) {
         mqttClient.removeRecord(msgId);
-        switch (MachineClazz.valueOf(method)) {
+        switch (MachineRpcClazz.valueOf(method)) {
             case stat:
                 break;
             case shell:

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

@@ -5,14 +5,13 @@ import ch.qos.logback.core.Appender;
 import cn.reghao.autodop.common.log.LoggerConfig;
 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.common.util.MachineId;
 import cn.reghao.autodop.dmaster.app.db.crud.config.build.BuildDirCrudService;
 import cn.reghao.autodop.dmaster.app.model.po.config.build.BuildDir;
 import cn.reghao.autodop.dmaster.app.model.po.config.build.BuildDirLocal;
 import cn.reghao.autodop.dmaster.mqttsub.MessageListener;
 import cn.reghao.autodop.dmaster.sys.db.crud.NodeLogCrud;
 import cn.reghao.autodop.dmaster.util.log.Appenders;
+import cn.reghao.jdkutil.MachineId;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.paho.client.mqttv3.MqttException;
 import org.springframework.beans.factory.DisposableBean;
@@ -20,7 +19,6 @@ import org.springframework.boot.ApplicationArguments;
 import org.springframework.boot.ApplicationRunner;
 import org.springframework.stereotype.Component;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -31,22 +29,13 @@ import java.util.List;
 @Slf4j
 @Component
 public class DmasterLifecycle implements ApplicationRunner, DisposableBean {
-    public static String MACHINE_ID;
-    public static String MACHINE_IPV4;
-
-    private final AppId appId;
     private final String topic;
     private final MessageListener messageListener;
     private final DefaultMqttClient mqttClient;
     private final BuildDirCrudService buildDirCrudService;
 
-    public DmasterLifecycle(NodeLogCrud nodeLogCrud,
-                            MessageListener messageListener,
-                            BuildDirCrudService buildDirCrudService,
-                            DefaultMqttClient mqttClient) throws IOException {
-        MACHINE_ID = MachineId.id();
-        MACHINE_IPV4 = MachineId.ipv4();
-        this.appId = AppId.dmaster;
+    public DmasterLifecycle(NodeLogCrud nodeLogCrud, MessageListener messageListener,
+                            BuildDirCrudService buildDirCrudService, DefaultMqttClient mqttClient) {
         this.topic = MsgQueue.dmasterTopic();
         this.messageListener = messageListener;
         this.mqttClient = mqttClient;
@@ -78,7 +67,7 @@ public class DmasterLifecycle implements ApplicationRunner, DisposableBean {
 
     private void initBuildDir() {
         log.info("初始化构建目录...");
-        BuildDir buildDir = buildDirCrudService.selectByUniqueKey(MACHINE_ID);
+        BuildDir buildDir = buildDirCrudService.selectByUniqueKey(MachineId.id());
         if (buildDir == null) {
             buildDir = BuildDirLocal.setDefaultBuildDir();
         } else {

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/model/vo/AppRuntimeLogVO.java

@@ -7,6 +7,7 @@ import lombok.Data;
  * @author reghao
  * @date 2021-06-22 11:00:07
  */
+@Deprecated
 @AllArgsConstructor
 @Data
 public class AppRuntimeLogVO {

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/model/vo/RuntimeLogVO.java

@@ -7,6 +7,7 @@ import lombok.Data;
  * @author reghao
  * @date 2021-06-22 11:00:07
  */
+@Deprecated
 @AllArgsConstructor
 @Data
 public class RuntimeLogVO {

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

@@ -5,6 +5,7 @@ import ch.qos.logback.core.UnsynchronizedAppenderBase;
 import cn.reghao.autodop.common.msg.pub.dto.node.constant.AppId;
 import cn.reghao.autodop.dmaster.sys.db.crud.NodeLogCrud;
 import cn.reghao.autodop.dmaster.sys.model.po.NodeLog;
+import cn.reghao.jdkutil.MachineId;
 
 /**
  * @author reghao
@@ -36,14 +37,14 @@ public class MongoAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
     }
 
     private NodeLog nodeLog(ILoggingEvent event) {
-        NodeLog nodeLog = new NodeLog();
-        nodeLog.setMachineId("machineId");
-        nodeLog.setAppId(appId);
-        nodeLog.setTimestamp(event.getTimeStamp());
-        nodeLog.setLevel(event.getLevel().toString());
-        nodeLog.setThreadName(event.getThreadName());
-        nodeLog.setLoggerName(event.getLoggerName());
-        nodeLog.setMessage(event.getFormattedMessage());
-        return nodeLog;
+        NodeLog machineNodeLog = new NodeLog();
+        machineNodeLog.setMachineId(MachineId.id());
+        machineNodeLog.setAppId(appId);
+        machineNodeLog.setTimestamp(event.getTimeStamp());
+        machineNodeLog.setLevel(event.getLevel().toString());
+        machineNodeLog.setThreadName(event.getThreadName());
+        machineNodeLog.setLoggerName(event.getLoggerName());
+        machineNodeLog.setMessage(event.getFormattedMessage());
+        return machineNodeLog;
     }
 }

+ 5 - 7
dmaster/src/main/resources/templates/machine/host.html

@@ -70,24 +70,22 @@
                     <td th:text="${item.osVersion}">系统版本</td>
                     <td>
                         <a class="open-popup" data-title="设置通知组"
-                           th:attr="data-url=@{'/machine/notify/'+${item.machineId}}" data-size="800,600"
-                           href="#">设置</a>
+                           th:attr="data-url=@{'/machine/notify/'+${item.machineId}}" href="#">设置</a>
                     </td>
                     <td>
                         <a class="open-popup" data-title="设置 SSH 帐号"
-                           th:attr="data-url=@{'/machine/sshauth/'+${item.machineId}}" data-size="800,600"
-                           href="#">设置</a>
+                           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}}" data-size="1200,600"
+                           th:attr="data-url=@{'/machine/webssh/'+${item.machineId}}"
                            href="#">SSH</a>
                     </td>
                     <td>
                         <a class="open-popup" data-title="机器详细信息" th:attr="data-url=@{'/machine/host/detail/'+${item.machineId}}"
-                           data-size="1200,600" href="#">详细</a>
+                           data-size="960,480" href="#">详细</a>
                         <a class="open-popup" data-title="编辑" th:attr="data-url=@{'/machine/host/edit/'+${item.machineId}}"
-                           data-size="800,600" href="#">编辑</a>
+                           href="#">编辑</a>
                         <a class="ajax-delete" th:attr="data-msg='确定要删除 '+ ${item.machineId} + ' 机器?'"
                            th:href="@{'/api/machine/host/' + ${item.machineId}}">删除</a>
                     </td>

+ 111 - 0
dmaster/src/main/resources/templates/machine/node.html

@@ -0,0 +1,111 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+      xmlns:mo="https://gitee.com/aun/Timo">
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})"></head>
+
+<body class="timo-layout-page">
+<div class="layui-card">
+    <div class="layui-card-header timo-card-header">
+        <span><i class="fa fa-bars"></i> 机器列表</span>
+        <i class="layui-icon layui-icon-refresh refresh-btn"></i>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-row timo-card-screen put-row">
+            <div class="layui-row timo-card-screen put-row">
+                <div class="pull-left layui-form-pane">
+                    <div class="layui-inline">
+                        <label class="layui-form-label">环境</label>
+                        <div class="layui-input-block timo-search-status">
+                            <select id="getPageByEnv" class="timo-search-select" name="env" onchange="getPageByEnv()"
+                                    mo:dict="ENVIRONMENT" mo-selected="${env}"></select>
+                        </div>
+                    </div>
+                    <div class="layui-inline timo-search-box">
+                        <label class="layui-form-label">机器地址</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="machineIpv4" th:value="${param.machineIpv4}" placeholder="请输入机器地址"
+                                   autocomplete="off" class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <button class="layui-btn timo-search-btn">
+                            <i class="fa fa-search"></i>
+                        </button>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="timo-table-wrap">
+            <table class="layui-table timo-table">
+                <thead>
+                <tr>
+                    <!-- TODO 使用 checkbox 批量设置环境 -->
+                    <th class="timo-table-checkbox">
+                        <label class="timo-checkbox"><input type="checkbox">
+                            <i class="layui-icon layui-icon-ok"></i></label>
+                    </th>
+                    <th data-field="machineIpv4">机器地址</th>
+                    <th data-field="bootTime">启动时间</th>
+                    <th data-field="status">当前状态</th>
+                    <th data-field="lastCheck">上次心跳时间</th>
+                    <th data-field="osArch">系统架构</th>
+                    <th data-field="osName">系统名字</th>
+                    <th data-field="osVersion">系统版本</th>
+                    <th>通知组</th>
+                    <th>SSH 认证</th>
+                    <th>SSH 控制台</th>
+                    <th>操作</th>
+                </tr>
+                </thead>
+                <tbody>
+                <tr th:each="item:${list}">
+                    <td><label class="timo-checkbox"><input type="checkbox" th:value="${item.machineId}">
+                        <i class="layui-icon layui-icon-ok"></i></label></td>
+                    <td th:text="${item.machineIpv4}">机器地址</td>
+                    <td th:text="${item.bootTime}">启动时间</td>
+                    <td th:text="${item.status}">当前状态</td>
+                    <td th:text="${item.lastCheck}">上次心跳时间</td>
+                    <td th:text="${item.osArch}">系统架构</td>
+                    <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>
+                    </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>
+                    </td>
+                    <td>
+                        <a class="open-popup" data-title="机器详细信息" th:attr="data-url=@{'/machine/host/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>
+                </tr>
+                </tbody>
+            </table>
+        </div>
+        <div th:replace="/common/fragment :: page"></div>
+    </div>
+</div>
+
+<script th:replace="/common/template :: script"></script>
+<script type="text/javascript" th:src="@{/js/plugins/jquery-2.2.4.min.js}"></script>
+<script type="text/javascript">
+    function getPageByEnv() {
+        var selectedOption = $("#getPageByEnv option:selected")
+        var param = selectedOption.text()
+        url = '?env=' + param
+        window.location.href = window.location.pathname + url;
+    }
+</script>
+</body>
+</html>

+ 0 - 0
dmaster/src/main/resources/templates/machine/cpuusage.html → dmaster/src/main/resources/templates/machine/stat/cpu.html


+ 0 - 0
dmaster/src/main/resources/templates/machine/diskusage.html → dmaster/src/main/resources/templates/machine/stat/disk.html


+ 0 - 0
dmaster/src/main/resources/templates/machine/memusage.html → dmaster/src/main/resources/templates/machine/stat/mem.html


+ 0 - 0
dmaster/src/main/resources/templates/machine/networkstatus.html → dmaster/src/main/resources/templates/machine/stat/network.html


+ 0 - 0
dmaster/src/main/resources/templates/machine/sysload.html → dmaster/src/main/resources/templates/machine/stat/sysload.html


+ 4 - 7
dmaster/src/main/resources/templates/machine/status.html

@@ -54,7 +54,7 @@
                         <td th:text="${item.status}">当前状态</td>
                         <td>
                             <a class="open-popup" data-title="系统负载"
-                               th:attr="data-url=@{'/machine/status/sys/'+${item.machineId}}" data-size="800,600"
+                               th:attr="data-url=@{'/machine/status/sys/'+${item.machineId}}"
                                href="#">查看</a>
                         </td>
                         <td>
@@ -64,18 +64,15 @@
                         </td>
                         <td>
                             <a class="open-popup" data-title="CPU 使用率"
-                               th:attr="data-url=@{'/machine/status/cpu/'+${item.machineId}}" data-size="800,600"
-                               href="#">查看</a>
+                               th:attr="data-url=@{'/machine/status/cpu/'+${item.machineId}}" href="#">查看</a>
                         </td>
                         <td>
                             <a class="open-popup" data-title="内存详情"
-                               th:attr="data-url=@{'/machine/status/mem/'+${item.machineId}}" data-size="800,600"
-                               href="#">查看</a>
+                               th:attr="data-url=@{'/machine/status/mem/'+${item.machineId}}" href="#">查看</a>
                         </td>
                         <td>
                             <a class="open-popup" data-title="磁盘详情"
-                               th:attr="data-url=@{'/machine/status/disk/'+${item.machineId}}" data-size="1200,600"
-                               href="#">查看</a>
+                               th:attr="data-url=@{'/machine/status/disk/'+${item.machineId}}" href="#">查看</a>
                         </td>
                     </tr>
                 </tbody>

+ 3 - 3
dmaster/src/main/resources/templates/sys/log/runtime.html

@@ -14,17 +14,17 @@
                 <thead>
                 <tr>
                     <th class="sortable" data-field="machineIpv4">机器地址</th>
-                    <th class="sortable" data-field="appId">应用</th>
+                    <th class="sortable" data-field="nodeId">应用</th>
                     <th>查看</th>
                 </tr>
                 </thead>
                 <tbody>
                 <tr th:each="item:${list}">
                     <td th:text="${item.machineIpv4}">机器地址</td>
-                    <td th:text="${item.appId}">应用</td>
+                    <td th:text="${item.nodeId}">应用</td>
                     <td>
                         <a class="open-popup" data-title="日志"
-                           th:attr="data-url=@{'/sys/log/runtime/detail/'+${item.machineId}+'/'+${item.appId}}"
+                           th:attr="data-url=@{'/sys/log/runtime/detail/'+${item.machineId}+'/'+${item.nodeId}}"
                            data-size="1200,600" href="#">查看</a>
                     </td>
                 </tr>

+ 1 - 1
dmaster/src/main/resources/templates/sys/log/runtimeinfo.html

@@ -20,7 +20,7 @@
                     <td th:text="${item.total}">总数</td>
                     <td>
                         <a class="open-popup" data-title="日志"
-                           th:attr="data-url=@{'/sys/log/runtime/detail/'+${item.machineId}+'/'+${item.appId}+'/'+${item.yearMonthDay}}" data-size="1000,500"
+                           th:attr="data-url=@{'/sys/log/runtime/detail/'+${item.machineId}+'/'+${item.nodeId}+'/'+${item.yearMonthDay}}" data-size="1000,500"
                            href="#">查看</a>
                     </td>
                 </tr>