Explorar el Código

修改项目和模块名

reghao hace 4 años
padre
commit
9f3b55a5a9
Se han modificado 100 ficheros con 1097 adiciones y 3063 borrados
  1. 2 2
      README.md
  2. 7 0
      agent/Dockerfile
  3. 0 0
      agent/bin/mqtt.json
  4. 5 0
      agent/bin/shutdown.sh
  5. 5 0
      agent/bin/start.sh
  6. 58 0
      agent/pom.xml
  7. 80 0
      agent/src/main/java/cn/reghao/devops/agent/AgentApp.java
  8. 53 0
      agent/src/main/java/cn/reghao/devops/agent/ConfigFile.java
  9. 17 0
      agent/src/main/java/cn/reghao/devops/agent/app/AppService.java
  10. 124 0
      agent/src/main/java/cn/reghao/devops/agent/app/DockerAppServiceImpl.java
  11. 39 0
      agent/src/main/java/cn/reghao/devops/agent/app/ZipAppServiceImpl.java
  12. 79 0
      agent/src/main/java/cn/reghao/devops/agent/machine/NodeEventClazzPubImpl.java
  13. 52 0
      agent/src/main/java/cn/reghao/devops/agent/mqttsub/AgentConnActionListener.java
  14. 66 0
      agent/src/main/java/cn/reghao/devops/agent/mqttsub/AgentTopicListener.java
  15. 64 0
      agent/src/main/java/cn/reghao/devops/agent/mqttsub/impl/AppRpcClazzDispatcher.java
  16. 121 0
      agent/src/main/java/cn/reghao/devops/agent/mqttsub/impl/AppRpcClazzImpl.java
  17. 0 0
      agent/src/main/resources/banner.txt
  18. 1 1
      common/Dockerfile
  19. 2 2
      common/pom.xml
  20. 0 25
      common/src/main/java/cn/reghao/autodop/common/docker/Docker.java
  21. 0 11
      common/src/main/java/cn/reghao/autodop/common/docker/DockerException.java
  22. 0 213
      common/src/main/java/cn/reghao/autodop/common/docker/DockerImpl.java
  23. 0 46
      common/src/main/java/cn/reghao/autodop/common/docker/po/Config.java
  24. 0 18
      common/src/main/java/cn/reghao/autodop/common/docker/po/Data.java
  25. 0 11
      common/src/main/java/cn/reghao/autodop/common/docker/po/ExposedPorts.java
  26. 0 16
      common/src/main/java/cn/reghao/autodop/common/docker/po/GraphDriver.java
  27. 0 17
      common/src/main/java/cn/reghao/autodop/common/docker/po/Health.java
  28. 0 15
      common/src/main/java/cn/reghao/autodop/common/docker/po/Healthcheck.java
  29. 0 23
      common/src/main/java/cn/reghao/autodop/common/docker/po/HostConfig.java
  30. 0 14
      common/src/main/java/cn/reghao/autodop/common/docker/po/Labels.java
  31. 0 16
      common/src/main/java/cn/reghao/autodop/common/docker/po/Log.java
  32. 0 11
      common/src/main/java/cn/reghao/autodop/common/docker/po/NetworkingConfig.java
  33. 0 21
      common/src/main/java/cn/reghao/autodop/common/docker/po/RestartPolicy.java
  34. 0 24
      common/src/main/java/cn/reghao/autodop/common/docker/po/State.java
  35. 0 14
      common/src/main/java/cn/reghao/autodop/common/docker/po/Volumes.java
  36. 0 21
      common/src/main/java/cn/reghao/autodop/common/docker/po/result/Bridge.java
  37. 0 32
      common/src/main/java/cn/reghao/autodop/common/docker/po/result/Container.java
  38. 0 47
      common/src/main/java/cn/reghao/autodop/common/docker/po/result/ContainerInfo.java
  39. 0 19
      common/src/main/java/cn/reghao/autodop/common/docker/po/result/Mount.java
  40. 0 13
      common/src/main/java/cn/reghao/autodop/common/docker/po/result/NetworkSettings.java
  41. 0 13
      common/src/main/java/cn/reghao/autodop/common/docker/po/result/Networks.java
  42. 0 15
      common/src/main/java/cn/reghao/autodop/common/docker/po/result/Port.java
  43. 0 55
      common/src/main/java/cn/reghao/autodop/common/log/Appenders.java
  44. 0 38
      common/src/main/java/cn/reghao/autodop/common/log/LogCache.java
  45. 0 32
      common/src/main/java/cn/reghao/autodop/common/log/LoggerConfig.java
  46. 0 67
      common/src/main/java/cn/reghao/autodop/common/log/MqttAppender.java
  47. 0 33
      common/src/main/java/cn/reghao/autodop/common/machine/Cpu.java
  48. 0 86
      common/src/main/java/cn/reghao/autodop/common/machine/Disk.java
  49. 0 72
      common/src/main/java/cn/reghao/autodop/common/machine/Machine.java
  50. 0 53
      common/src/main/java/cn/reghao/autodop/common/machine/Memory.java
  51. 0 73
      common/src/main/java/cn/reghao/autodop/common/machine/Network.java
  52. 0 30
      common/src/main/java/cn/reghao/autodop/common/machine/Os.java
  53. 0 189
      common/src/main/java/cn/reghao/autodop/common/mqtt/AsyncMqttClient.java
  54. 0 156
      common/src/main/java/cn/reghao/autodop/common/mqtt/DefaultMqttClient.java
  55. 0 15
      common/src/main/java/cn/reghao/autodop/common/mqtt/MqttProperties.java
  56. 0 9
      common/src/main/java/cn/reghao/autodop/common/msg/ClazzDispatcher.java
  57. 0 54
      common/src/main/java/cn/reghao/autodop/common/msg/Message.java
  58. 0 21
      common/src/main/java/cn/reghao/autodop/common/msg/MsgQueue.java
  59. 0 9
      common/src/main/java/cn/reghao/autodop/common/msg/MsgType.java
  60. 0 26
      common/src/main/java/cn/reghao/autodop/common/msg/pub/PubMsg.java
  61. 0 18
      common/src/main/java/cn/reghao/autodop/common/msg/pub/clazz/INodeEventPubClazz.java
  62. 0 9
      common/src/main/java/cn/reghao/autodop/common/msg/pub/constant/NodeEventPubClazz.java
  63. 0 9
      common/src/main/java/cn/reghao/autodop/common/msg/pub/constant/PubClazz.java
  64. 0 22
      common/src/main/java/cn/reghao/autodop/common/msg/pub/dto/node/NodeLogDTO.java
  65. 0 9
      common/src/main/java/cn/reghao/autodop/common/msg/pub/dto/node/constant/AppId.java
  66. 0 9
      common/src/main/java/cn/reghao/autodop/common/msg/pub/dto/node/constant/NodeStatus.java
  67. 0 64
      common/src/main/java/cn/reghao/autodop/common/msg/rpc/RpcMsg.java
  68. 0 19
      common/src/main/java/cn/reghao/autodop/common/msg/rpc/clazz/IAppRpcClazz.java
  69. 0 9
      common/src/main/java/cn/reghao/autodop/common/msg/rpc/constant/AppRpcClazz.java
  70. 0 9
      common/src/main/java/cn/reghao/autodop/common/msg/rpc/constant/RpcClazz.java
  71. 0 23
      common/src/main/java/cn/reghao/autodop/common/msg/rpc/dto/app/DeployParam.java
  72. 0 27
      common/src/main/java/cn/reghao/autodop/common/msg/rpc/dto/app/DeployResult.java
  73. 0 15
      common/src/main/java/cn/reghao/autodop/common/msg/rpc/dto/app/PackType.java
  74. 0 21
      common/src/main/java/cn/reghao/autodop/common/msg/rpc/dto/app/StatusParam.java
  75. 0 24
      common/src/main/java/cn/reghao/autodop/common/msg/rpc/dto/app/StatusResult.java
  76. 0 34
      common/src/main/java/cn/reghao/autodop/common/util/ExceptionUtil.java
  77. 0 164
      common/src/main/java/cn/reghao/autodop/common/util/FileOps.java
  78. 0 45
      common/src/main/java/cn/reghao/autodop/common/util/IpAddressConverter.java
  79. 0 19
      common/src/main/java/cn/reghao/autodop/common/util/NotAvailable.java
  80. 0 26
      common/src/main/java/cn/reghao/autodop/common/util/PercentCalculator.java
  81. 0 76
      common/src/main/java/cn/reghao/autodop/common/util/compression/TarFiles.java
  82. 0 175
      common/src/main/java/cn/reghao/autodop/common/util/compression/ZipFiles.java
  83. 0 110
      common/src/main/java/cn/reghao/autodop/common/util/jvm/JVM.java
  84. 0 27
      common/src/main/java/cn/reghao/autodop/common/util/jvm/po/BufferPoolStat.java
  85. 0 28
      common/src/main/java/cn/reghao/autodop/common/util/jvm/po/GarbageCollectorStat.java
  86. 0 24
      common/src/main/java/cn/reghao/autodop/common/util/jvm/po/JvmInfo.java
  87. 0 39
      common/src/main/java/cn/reghao/autodop/common/util/jvm/po/JvmStat.java
  88. 0 32
      common/src/main/java/cn/reghao/autodop/common/util/jvm/po/MemoryPoolStat.java
  89. 0 27
      common/src/main/java/cn/reghao/autodop/common/util/jvm/po/MemoryStat.java
  90. 0 36
      common/src/main/java/cn/reghao/autodop/common/util/jvm/po/ThreadStat.java
  91. 0 13
      common/src/main/java/cn/reghao/autodop/common/util/text/FileProcessor.java
  92. 0 35
      common/src/main/java/cn/reghao/autodop/common/util/text/ReplaceCharacter.java
  93. 0 140
      common/src/main/java/cn/reghao/autodop/common/util/thread/ThreadFactoryBuilder.java
  94. 0 48
      common/src/main/java/cn/reghao/autodop/common/util/thread/ThreadPoolWrapper.java
  95. 23 0
      common/src/main/java/cn/reghao/devops/common/docker/Docker.java
  96. 11 0
      common/src/main/java/cn/reghao/devops/common/docker/DockerException.java
  97. 213 0
      common/src/main/java/cn/reghao/devops/common/docker/DockerImpl.java
  98. 46 0
      common/src/main/java/cn/reghao/devops/common/docker/po/Config.java
  99. 18 0
      common/src/main/java/cn/reghao/devops/common/docker/po/Data.java
  100. 11 0
      common/src/main/java/cn/reghao/devops/common/docker/po/ExposedPorts.java

+ 2 - 2
README.md

@@ -1,2 +1,2 @@
-# autodop
-autodop 是一个 DevOps 自动化系统,分为 dmaster 和 dagent 两个应用。
+# devops
+一个 DevOps 自动化系统,分为 manager 和 agent 两个应用。

+ 7 - 0
agent/Dockerfile

@@ -0,0 +1,7 @@
+FROM debian10/openjdk11
+
+WORKDIR /app
+RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
+COPY target/devops-agent.jar /app/devops-agent.jar
+
+ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/devops-agent.jar"]

+ 0 - 0
dagent/bin/mqtt.json → agent/bin/mqtt.json


+ 5 - 0
agent/bin/shutdown.sh

@@ -0,0 +1,5 @@
+#!/bin/bash
+
+app='devops-agent.jar'
+pid=`jps | grep ${app} | awk '{print $1}'`
+kill -15 ${pid}

+ 5 - 0
agent/bin/start.sh

@@ -0,0 +1,5 @@
+#!/bin/bash
+
+app_dir=`pwd`
+app_name='devops-agent.jar'
+nohup java -jar ${app_dir}"/"${app_name} ${app_dir}/mqtt.json > console.log 2>&1 &

+ 58 - 0
agent/pom.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>devops</artifactId>
+        <groupId>cn.reghao.devops</groupId>
+        <version>1.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>agent</artifactId>
+
+    <properties>
+        <project.build.outputDir>${project.basedir}/bin</project.build.outputDir>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.reghao.devops</groupId>
+            <artifactId>common</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>devops-agent</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <version>3.2.0</version>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <mainClass>cn.reghao.devops.agent.AgentApp</mainClass>
+                        </manifest>
+                    </archive>
+                    <descriptorRefs>
+                        <descriptorRef>jar-with-dependencies</descriptorRef>
+                    </descriptorRefs>
+                    <!-- 不设置此属性则生成的 jar 包名字会带有 jar-with-dependencies -->
+                    <appendAssemblyId>false</appendAssemblyId>
+                    <outputDirectory>${project.build.outputDir}</outputDirectory>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 80 - 0
agent/src/main/java/cn/reghao/devops/agent/AgentApp.java

@@ -0,0 +1,80 @@
+package cn.reghao.devops.agent;
+
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.Appender;
+import cn.reghao.devops.common.log.Appenders;
+import cn.reghao.devops.common.log.LoggerConfig;
+import cn.reghao.devops.common.machine.Machine;
+import cn.reghao.devops.common.mqtt.AsyncMqttClient;
+import cn.reghao.devops.common.mqtt.MqttProperties;
+import cn.reghao.devops.common.msg.MsgQueue;
+import cn.reghao.devops.common.msg.pub.dto.node.constant.AppId;
+import cn.reghao.devops.common.msg.rpc.clazz.IAppRpcClazz;
+import cn.reghao.devops.agent.machine.NodeEventClazzPubImpl;
+import cn.reghao.devops.agent.mqttsub.AgentConnActionListener;
+import cn.reghao.devops.agent.mqttsub.AgentTopicListener;
+import cn.reghao.devops.agent.mqttsub.impl.AppRpcClazzDispatcher;
+import cn.reghao.devops.agent.mqttsub.impl.AppRpcClazzImpl;
+import cn.reghao.jutil.jdk.http.WebClient;
+import cn.reghao.jutil.jdk.serializer.JsonConverter;
+import cn.reghao.jutil.jdk.text.TextFile;
+import lombok.extern.slf4j.Slf4j;
+import oshi.SystemInfo;
+
+import java.util.List;
+
+@Slf4j
+public class AgentApp {
+	static AsyncMqttClient mqttClient;
+	static AgentTopicListener agentTopicListener;
+	static NodeEventClazzPubImpl nodeEventClazzPub;
+
+	static void pubagentShutdown() {
+		nodeEventClazzPub.nodeShutdown();
+		log.info("agent 停止");
+	}
+
+	static void shutdownGracefully() {
+		Runtime.getRuntime().addShutdownHook(new Thread(new ShutdownHook(), "main-shutdown-hook"));
+	}
+
+	static class ShutdownHook implements Runnable {
+		@Override
+		public void run() {
+			log.info("清理资源后关闭应用...");
+			stop();
+		}
+	}
+
+	static void stop() {
+		pubagentShutdown();
+		log.info("资源清理完成,结束 devops-agent...");
+	}
+
+	public static void main(String[] args) throws Exception {
+		if (args.length != 1) {
+			log.error("必须指定配置文件...");
+			return;
+		}
+		String configFilePath = ConfigFile.configFilePath(args[0], AgentApp.class);
+		String json = new TextFile().readFile(configFilePath);
+		MqttProperties mqttProperties = JsonConverter.jsonToObject(json, MqttProperties.class);
+		mqttProperties.setClientId(AppId.agent.name());
+		mqttClient = new AsyncMqttClient(mqttProperties);
+
+		IAppRpcClazz appRpcClazz = new AppRpcClazzImpl();
+		AppRpcClazzDispatcher appRpcClazzDispatcher = new AppRpcClazzDispatcher(appRpcClazz);
+		agentTopicListener = new AgentTopicListener(mqttClient, appRpcClazzDispatcher);
+		mqttClient.add(MsgQueue.agentTopic(Machine.ID), agentTopicListener);
+
+		Machine machine = new Machine(new WebClient(), new SystemInfo());
+		nodeEventClazzPub = new NodeEventClazzPubImpl(mqttClient, machine);
+		AgentConnActionListener connActionListener = new AgentConnActionListener(mqttClient, nodeEventClazzPub);
+
+		mqttClient.connect(connActionListener);
+		shutdownGracefully();
+
+		//Appender<ILoggingEvent> appender = Appenders.fileAppender();
+		//LoggerConfig.initLogger(List.of(appender));
+	}
+}

+ 53 - 0
agent/src/main/java/cn/reghao/devops/agent/ConfigFile.java

@@ -0,0 +1,53 @@
+package cn.reghao.devops.agent;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.File;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * @author reghao
+ * @date 2021-03-03 18:47:01
+ */
+@Slf4j
+public class ConfigFile {
+    public static String configFilePath(String arg, Class<?> clazz) {
+        String configFilePath = null;
+        File configFile = new File(arg);
+        if (!configFile.exists()) {
+            if (arg.startsWith("./")) {
+                String filename = arg.replace(".", "")
+                        .replace("/", "");
+                configFilePath = runningHome(clazz) + "/" + filename;
+            } else if (!arg.contains("/")) {
+                configFilePath = runningHome(clazz) + "/" + arg;
+            } else {
+                log.error("相对路径的配置文件必须以 ./configFile 或 configFile 形式指定...");
+            }
+        } else {
+            // 绝对路径
+            configFilePath = arg;
+        }
+        return configFilePath;
+    }
+    
+    /**
+     * jar 文件运行目录
+     *
+     * @param
+     * @return
+     * @date 2021-03-03 下午6:33
+     */
+    public static String runningHome(Class<?> clazz) {
+        URL url = clazz.getProtectionDomain().getCodeSource().getLocation();
+        String jarFilePath = URLDecoder.decode(url.getPath(), StandardCharsets.UTF_8);
+        if (jarFilePath.endsWith(".jar")) {
+            jarFilePath = jarFilePath.substring(0, jarFilePath.lastIndexOf("/") + 1);
+        }
+
+        File file = new File(jarFilePath);
+        return file.getAbsolutePath();
+    }
+}

+ 17 - 0
agent/src/main/java/cn/reghao/devops/agent/app/AppService.java

@@ -0,0 +1,17 @@
+package cn.reghao.devops.agent.app;
+
+import cn.reghao.devops.common.msg.rpc.dto.app.StatusResult;
+import cn.reghao.devops.common.msg.rpc.dto.app.DeployParam;
+import cn.reghao.devops.common.docker.DockerException;
+
+/**
+ * @author reghao
+ * @date 2021-02-22 16:21:28
+ */
+public interface AppService {
+    StatusResult deploy(DeployParam deployParam) throws DockerException;
+    StatusResult status(String appId) throws DockerException;
+    StatusResult restart(String appId) throws DockerException;
+    StatusResult stop(String appId) throws DockerException;
+    StatusResult start(String appId) throws DockerException;
+}

+ 124 - 0
agent/src/main/java/cn/reghao/devops/agent/app/DockerAppServiceImpl.java

@@ -0,0 +1,124 @@
+package cn.reghao.devops.agent.app;
+
+import cn.reghao.devops.common.docker.DockerImpl;
+import cn.reghao.devops.common.machine.Machine;
+import cn.reghao.devops.common.msg.pub.dto.node.constant.NodeStatus;
+import cn.reghao.devops.common.msg.rpc.dto.app.StatusResult;
+import cn.reghao.devops.common.msg.rpc.dto.app.DeployParam;
+import cn.reghao.devops.common.docker.Docker;
+import cn.reghao.devops.common.docker.DockerException;
+import cn.reghao.devops.common.docker.po.Config;
+import cn.reghao.devops.common.docker.po.HostConfig;
+import cn.reghao.devops.common.util.ExceptionUtil;
+import cn.reghao.devops.common.util.NotAvailable;
+import cn.reghao.jutil.jdk.converter.DateTimeConverter;
+import cn.reghao.jutil.jdk.serializer.JsonConverter;
+import com.github.dockerjava.api.command.InspectContainerResponse;
+
+/**
+ * @author reghao
+ * @date 2021-02-22 16:21:37
+ */
+public class DockerAppServiceImpl implements AppService {
+    private final long sleep = 10_000;
+    private final Docker docker = new DockerImpl();
+
+    @Override
+    public StatusResult deploy(DeployParam deployParam) throws DockerException {
+        String appId = deployParam.getAppId();
+        String packagePath = deployParam.getPackagePath();
+        Config dockerConfig = JsonConverter.jsonToObject(deployParam.getStartScript(), Config.class);
+        if (dockerConfig == null) {
+            dockerConfig = new Config(packagePath);
+        } else {
+            dockerConfig.setImage(packagePath);
+            if (dockerConfig.getHostConfig() == null) {
+                dockerConfig.setHostConfig(new HostConfig());
+            }
+        }
+
+        docker.pull(packagePath);
+        String containerId = docker.createAndRun(appId, dockerConfig);
+        try {
+            Thread.sleep(sleep);
+        } catch (InterruptedException e) {
+            throw new DockerException(ExceptionUtil.errorMsg(e));
+        }
+
+        InspectContainerResponse containerInfo = docker.inspectContainer(containerId);
+        return getAppStatus(appId, containerInfo);
+    }
+
+    private StatusResult getAppStatus(String appId, InspectContainerResponse containerInfo) {
+        StatusResult appStatus = new StatusResult();
+        appStatus.setMachineId(Machine.ID);
+        appStatus.setAppId(appId);
+        String image = containerInfo.getConfig().getImage();
+        if (image != null) {
+            appStatus.setCommitId(image.split(":")[1]);
+        } else {
+            appStatus.setCommitId(NotAvailable.na.getDesc());
+        }
+
+        InspectContainerResponse.ContainerState state = containerInfo.getState();
+        boolean isRunning = state.getRunning() != null ? state.getRunning() : false;
+        String startedAt = state.getStartedAt();
+        if (isRunning && startedAt != null) {
+            appStatus.setStatus(NodeStatus.Online.name());
+            appStatus.setStartTime(DateTimeConverter.localDateTime(startedAt));
+            appStatus.setPid(state.getPidLong().intValue());
+        } else {
+            appStatus.setStatus(NodeStatus.Offline.name());
+            appStatus.setStartTime(null);
+            appStatus.setPid(-1);
+        }
+        return appStatus;
+    }
+
+    @Override
+    public StatusResult status(String appId) throws DockerException {
+        String containerId = docker.getContainerIdByName(appId);
+        if (containerId == null) {
+            throw new DockerException("没有和 " + appId + " 应用 ID关联的容器");
+        }
+        InspectContainerResponse containerInfo = docker.inspectContainer(containerId);
+        return getAppStatus(appId, containerInfo);
+    }
+
+    @Override
+    public StatusResult restart(String appId) throws DockerException {
+        String containerId = docker.getContainerIdByName(appId);
+        docker.restart(containerId);
+        try {
+            Thread.sleep(sleep);
+        } catch (InterruptedException e) {
+            throw new DockerException(ExceptionUtil.errorMsg(e));
+        }
+
+        InspectContainerResponse containerInfo = docker.inspectContainer(containerId);
+        return getAppStatus(appId, containerInfo);
+    }
+
+    @Override
+    public StatusResult stop(String appId) throws DockerException {
+        String containerId = docker.getContainerIdByName(appId);
+        docker.stop(containerId);
+
+        InspectContainerResponse containerInfo = docker.inspectContainer(containerId);
+        return getAppStatus(appId, containerInfo);
+    }
+
+    @Override
+    public StatusResult start(String appId) throws DockerException {
+        String containerId = docker.getContainerIdByName(appId);
+        docker.start(containerId);
+        try {
+            Thread.sleep(sleep);
+        } catch (InterruptedException e) {
+            throw new DockerException(ExceptionUtil.errorMsg(e));
+        }
+
+        InspectContainerResponse containerInfo = docker.inspectContainer(containerId);
+        return getAppStatus(appId, containerInfo);
+    }
+}

+ 39 - 0
agent/src/main/java/cn/reghao/devops/agent/app/ZipAppServiceImpl.java

@@ -0,0 +1,39 @@
+package cn.reghao.devops.agent.app;
+
+import cn.reghao.devops.common.msg.rpc.dto.app.StatusResult;
+import cn.reghao.devops.common.msg.rpc.dto.app.DeployParam;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * TODO 待实现
+ *
+ * @author reghao
+ * @date 2021-02-22 16:21:37
+ */
+@Slf4j
+public class ZipAppServiceImpl implements AppService {
+    @Override
+    public StatusResult deploy(DeployParam deployParam) {
+        return null;
+    }
+
+    @Override
+    public StatusResult status(String appId) {
+        return null;
+    }
+
+    @Override
+    public StatusResult restart(String appId)  {
+        return null;
+    }
+
+    @Override
+    public StatusResult stop(String appId)  {
+        return null;
+    }
+
+    @Override
+    public StatusResult start(String appId) {
+        return null;
+    }
+}

+ 79 - 0
agent/src/main/java/cn/reghao/devops/agent/machine/NodeEventClazzPubImpl.java

@@ -0,0 +1,79 @@
+package cn.reghao.devops.agent.machine;
+
+import cn.reghao.devops.common.machine.Machine;
+import cn.reghao.devops.common.mqtt.AsyncMqttClient;
+import cn.reghao.devops.common.msg.Message;
+import cn.reghao.devops.common.msg.MsgQueue;
+import cn.reghao.devops.common.msg.pub.PubMsg;
+import cn.reghao.devops.common.msg.pub.constant.NodeEventPubClazz;
+import cn.reghao.devops.common.util.thread.ThreadPoolWrapper;
+import cn.reghao.jutil.jdk.machine.data.detail.MachineDetail;
+import cn.reghao.jutil.jdk.machine.data.stat.MachineStat;
+import cn.reghao.jutil.jdk.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 NodeEventClazzPubImpl {
+    private final ScheduledExecutorService scheduler;
+    private final AsyncMqttClient mqttClient;
+    private final Machine machine;
+    private final String pubClazz;
+    
+    public NodeEventClazzPubImpl(AsyncMqttClient mqttClient, Machine machine) {
+        this.scheduler = ThreadPoolWrapper.scheduledThreadPool("heartbeat", 1);
+        this.mqttClient = mqttClient;
+        this.machine = machine;
+        this.pubClazz = NodeEventPubClazz.class.getSimpleName();
+    }
+    
+    public void nodeStart() {
+        MachineDetail machineDetail = machine.detail();
+        String jsonPayload = JsonConverter.objectToJson(machineDetail);
+        PubMsg pubMsg = PubMsg.pubMsg(pubClazz, NodeEventPubClazz.start.name(), jsonPayload);
+        pub(pubMsg);
+    }
+
+    public void nodeShutdown() {
+        ThreadPoolWrapper.shutdownScheduler(scheduler);
+        MachineStat machineStat = machine.stat();
+        String jsonPayload = JsonConverter.objectToJson(machineStat);
+        PubMsg pubMsg = PubMsg.pubMsg(pubClazz, NodeEventPubClazz.shutdown.name(), jsonPayload);
+        pub(pubMsg);
+    }
+
+    public void nodeHeartbeat() {
+        scheduler.scheduleAtFixedRate(new Heartbeat(), 3, 3, TimeUnit.SECONDS);
+    }
+
+    public void nodeLog() {
+        // 使用 MqttAppender 发送日志
+    }
+    
+    private void pub(PubMsg pubMsg) {
+        Message message = Message.pubMsg(pubMsg);
+        try {
+            String topic = MsgQueue.managerTopic();
+            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, NodeEventPubClazz.heartbeat.name(), jsonPayload);
+            pub(pubMsg);
+        }
+    }
+}

+ 52 - 0
agent/src/main/java/cn/reghao/devops/agent/mqttsub/AgentConnActionListener.java

@@ -0,0 +1,52 @@
+package cn.reghao.devops.agent.mqttsub;
+
+import cn.reghao.devops.common.mqtt.AsyncMqttClient;
+import cn.reghao.devops.common.util.ExceptionUtil;
+import cn.reghao.devops.agent.machine.NodeEventClazzPubImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.IMqttActionListener;
+import org.eclipse.paho.client.mqttv3.IMqttToken;
+import org.eclipse.paho.client.mqttv3.MqttException;
+
+/**
+ * MQTT 建立连接时的状态监听器
+ *
+ * @author reghao
+ * @date 2021-10-29 16:36:49
+ */
+@Slf4j
+public class AgentConnActionListener implements IMqttActionListener {
+    private final AsyncMqttClient mqttClient;
+    private final NodeEventClazzPubImpl nodeEventClazzPub;
+
+    public AgentConnActionListener(AsyncMqttClient mqttClient, NodeEventClazzPubImpl nodeEventClazzPub) {
+        this.mqttClient = mqttClient;
+        this.nodeEventClazzPub = nodeEventClazzPub;
+    }
+
+    @Override
+    public void onSuccess(IMqttToken asyncActionToken) {
+        /*Appender<ILoggingEvent> appender = Appenders.mqttAppender1(AppId.agent.name(), mqttClient);
+        LoggerConfig.initLogger(List.of(appender));*/
+        nodeEventClazzPub.nodeStart();
+        nodeEventClazzPub.nodeHeartbeat();
+
+        log.info("MQTT 连接建立成功,开始订阅 topic");
+        mqttClient.getMsgListeners().forEach((topic, msgListener) -> {
+            try {
+                // 确保能订阅到离线消息的设置:
+                // - qos=1
+                // - clientId 确定且唯一,不能使用随机的 UUID
+                // - CleanSession=false
+                mqttClient.sub(topic, msgListener);
+            } catch (MqttException e) {
+                log.error("topic {} 订阅失败, 原因 {}", topic, ExceptionUtil.errorMsg(e));
+            }
+        });
+    }
+
+    @Override
+    public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
+        log.error("MQTT 连接建立失败,原因 {}", exception.getMessage());
+    }
+}

+ 66 - 0
agent/src/main/java/cn/reghao/devops/agent/mqttsub/AgentTopicListener.java

@@ -0,0 +1,66 @@
+package cn.reghao.devops.agent.mqttsub;
+
+import cn.reghao.devops.common.mqtt.AsyncMqttClient;
+import cn.reghao.devops.common.msg.Message;
+import cn.reghao.devops.common.msg.MsgQueue;
+import cn.reghao.devops.common.msg.rpc.RpcMsg;
+import cn.reghao.devops.common.msg.rpc.constant.RpcClazz;
+import cn.reghao.devops.agent.mqttsub.impl.AppRpcClazzDispatcher;
+import cn.reghao.jutil.jdk.serializer.JsonConverter;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.*;
+
+import java.lang.management.ManagementFactory;
+
+/**
+ * 处理 sub.{nodeId}.agent topic 中的消息
+ *
+ * @author reghao
+ * @date 2021-05-24 09:24:03
+ */
+@Slf4j
+public class AgentTopicListener implements IMqttMessageListener {
+    private final long startTime;
+    private final AsyncMqttClient mqttClient;
+    private final AppRpcClazzDispatcher appRpcClazzDispatcher;
+
+    public AgentTopicListener(AsyncMqttClient mqttClient, AppRpcClazzDispatcher appRpcClazzDispatcher) {
+        this.startTime = ManagementFactory.getRuntimeMXBean().getStartTime();
+        this.mqttClient = mqttClient;
+        this.appRpcClazzDispatcher = appRpcClazzDispatcher;
+    }
+
+    @Override
+    public void messageArrived(String topic, MqttMessage message) {
+        try {
+            Message msg = JsonConverter.jsonToObject(message.toString(), Message.class);
+            String msgId = msg.getMsgId();
+            long sendTime = msg.getSendTime();
+            if (sendTime < startTime) {
+                log.info("忽略 devops-agent 启动前发布的消息");
+                return;
+            }
+
+            RpcMsg rpcMsg = msg.getRpcMsg();
+            String clazz = rpcMsg.getClazz();
+            switch (RpcClazz.valueOf(clazz)) {
+                case AppRpcClazz:
+                    rpcMsg = appRpcClazzDispatcher.dispatch(rpcMsg);
+                    break;
+                default:
+                    String err = String.format("找不到 %s 类型", clazz);
+                    rpcMsg.error(err);
+            }
+
+            Message message1 = Message.rpcResultMsg(msgId, rpcMsg);
+            rpcReply(message1);
+        } catch (Exception e) {
+            log.error("MQTT message exception -> {}", e.getMessage());
+        }
+    }
+
+    private void rpcReply(Message message) throws MqttException {
+        String topic = MsgQueue.managerTopic();
+        mqttClient.pub(topic, 1, JsonConverter.objectToJson(message));
+    }
+}

+ 64 - 0
agent/src/main/java/cn/reghao/devops/agent/mqttsub/impl/AppRpcClazzDispatcher.java

@@ -0,0 +1,64 @@
+package cn.reghao.devops.agent.mqttsub.impl;
+
+import cn.reghao.devops.common.msg.ClazzDispatcher;
+import cn.reghao.devops.common.msg.rpc.clazz.IAppRpcClazz;
+import cn.reghao.devops.common.msg.rpc.constant.AppRpcClazz;
+import cn.reghao.devops.common.msg.rpc.RpcMsg;
+import cn.reghao.devops.common.msg.rpc.dto.app.DeployParam;
+import cn.reghao.devops.common.msg.rpc.dto.app.DeployResult;
+import cn.reghao.devops.common.msg.rpc.dto.app.StatusParam;
+import cn.reghao.devops.common.msg.rpc.dto.app.StatusResult;
+import cn.reghao.jutil.jdk.serializer.JsonConverter;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @author reghao
+ * @date 2020-12-30 10:26:47
+ */
+@Slf4j
+public class AppRpcClazzDispatcher implements ClazzDispatcher<RpcMsg, RpcMsg> {
+    private final IAppRpcClazz appRpcClazz;
+
+    public AppRpcClazzDispatcher(IAppRpcClazz appRpcClazz) {
+        this.appRpcClazz = appRpcClazz;
+    }
+
+    @Override
+    public RpcMsg dispatch(RpcMsg rpcMsg) {
+        String method = rpcMsg.getMethod();
+        String jsonParam = rpcMsg.getJsonParam();
+        StatusParam statusParam;
+        StatusResult statusResult;
+        try {
+            switch (AppRpcClazz.valueOf(method)) {
+                case deploy:
+                    DeployParam deployParam = JsonConverter.jsonToObject(jsonParam, DeployParam.class);
+                    DeployResult deployResult = appRpcClazz.deploy(deployParam);
+                    return rpcMsg.success(JsonConverter.objectToJson(deployResult));
+                case status:
+                    statusParam = JsonConverter.jsonToObject(jsonParam, StatusParam.class);
+                    statusResult = appRpcClazz.status(statusParam);
+                    return rpcMsg.success(JsonConverter.objectToJson(statusResult));
+                case restart:
+                    statusParam = JsonConverter.jsonToObject(jsonParam, StatusParam.class);
+                    statusResult = appRpcClazz.restart(statusParam);
+                    return rpcMsg.success(JsonConverter.objectToJson(statusResult));
+                case stop:
+                    statusParam = JsonConverter.jsonToObject(jsonParam, StatusParam.class);
+                    statusResult = appRpcClazz.stop(statusParam);
+                    return rpcMsg.success(JsonConverter.objectToJson(statusResult));
+                case start:
+                    statusParam = JsonConverter.jsonToObject(jsonParam, StatusParam.class);
+                    statusResult = appRpcClazz.start(statusParam);
+                    return rpcMsg.success(JsonConverter.objectToJson(statusResult));
+                case log:
+                    // TODO 待实现
+                default:
+                    String err = String.format("AppRpcClazz 中找不到 %s 方法", method);
+                    return rpcMsg.error(err);
+            }
+        } catch (Exception e) {
+            return rpcMsg.error(e.getMessage());
+        }
+    }
+}

+ 121 - 0
agent/src/main/java/cn/reghao/devops/agent/mqttsub/impl/AppRpcClazzImpl.java

@@ -0,0 +1,121 @@
+package cn.reghao.devops.agent.mqttsub.impl;
+
+import cn.reghao.devops.common.machine.Machine;
+import cn.reghao.devops.common.msg.rpc.clazz.IAppRpcClazz;
+import cn.reghao.devops.common.msg.rpc.constant.AppRpcClazz;
+import cn.reghao.devops.common.msg.rpc.dto.app.*;
+import cn.reghao.devops.common.util.ExceptionUtil;
+import cn.reghao.devops.agent.app.AppService;
+import cn.reghao.devops.agent.app.DockerAppServiceImpl;
+import cn.reghao.devops.agent.app.ZipAppServiceImpl;
+import cn.reghao.jutil.jdk.result.Result;
+import cn.reghao.jutil.jdk.result.ResultStatus;
+import cn.reghao.jutil.jdk.serializer.JsonConverter;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @author reghao
+ * @date 2020-12-30 10:26:47
+ */
+@Slf4j
+public class AppRpcClazzImpl implements IAppRpcClazz {
+    private final AppService dockerAppServiceImpl;
+    private final AppService zipAppServiceImpl;
+
+    public AppRpcClazzImpl() {
+        this.dockerAppServiceImpl = new DockerAppServiceImpl();
+        this.zipAppServiceImpl = new ZipAppServiceImpl();
+    }
+
+    @Override
+    public DeployResult deploy(DeployParam deployParam) {
+        String buildLogId = deployParam.getBuildLogId();
+        String packType = deployParam.getPackType();
+
+        StatusResult appStatus;
+        DeployResult deployResult = new DeployResult(buildLogId, Machine.ID);
+        try {
+            switch (PackType.valueOf(packType)) {
+                case docker:
+                    appStatus = dockerAppServiceImpl.deploy(deployParam);
+                    deployResult.setResult(Result.result(ResultStatus.SUCCESS, JsonConverter.objectToJson(appStatus)));
+                    break;
+                case zip:
+                    appStatus = zipAppServiceImpl.deploy(deployParam);
+                    deployResult.setResult(Result.result(ResultStatus.SUCCESS, JsonConverter.objectToJson(appStatus)));
+                    break;
+                default:
+                    String msg = String.format("应用包类型 %s 不存在", deployParam.getPackType());
+                    deployResult.setResult(Result.result(ResultStatus.ERROR, msg));
+            }
+        } catch (Exception e) {
+            deployResult.setResult(Result.result(ResultStatus.FAIL, ExceptionUtil.errorMsg(e)));
+        }
+        return deployResult;
+    }
+
+    @Override
+    public StatusResult restart(StatusParam statusParam) throws Exception {
+        String appId = statusParam.getAppId();
+        String packType = statusParam.getPackType();
+        return appOps(appId, AppRpcClazz.restart.name(), packType);
+    }
+
+    @Override
+    public StatusResult stop(StatusParam statusParam) throws Exception {
+        String appId = statusParam.getAppId();
+        String packType = statusParam.getPackType();
+        return appOps(appId, AppRpcClazz.stop.name(), packType);
+    }
+
+    @Override
+    public StatusResult start(StatusParam statusParam) throws Exception {
+        String appId = statusParam.getAppId();
+        String packType = statusParam.getPackType();
+        return appOps(appId, AppRpcClazz.start.name(), packType);
+    }
+
+    @Override
+    public StatusResult status(StatusParam statusParam) throws Exception {
+        String appId = statusParam.getAppId();
+        String packType = statusParam.getPackType();
+        return appOps(appId, AppRpcClazz.status.name(), packType);
+    }
+
+    private StatusResult appOps(String appId, String ops, String packType) throws Exception {
+        switch (AppRpcClazz.valueOf(ops)) {
+            case restart:
+                if (packType.equals(PackType.docker.name())) {
+                    return dockerAppServiceImpl.restart(appId);
+                } else {
+                    return zipAppServiceImpl.restart(appId);
+                }
+            case stop:
+                if (packType.equals(PackType.docker.name())) {
+                    return dockerAppServiceImpl.stop(appId);
+                } else {
+                    return zipAppServiceImpl.stop(appId);
+                }
+            case start:
+                if (packType.equals(PackType.docker.name())) {
+                    return dockerAppServiceImpl.start(appId);
+                } else {
+                    return zipAppServiceImpl.start(appId);
+                }
+            case status:
+                if (packType.equals(PackType.docker.name())) {
+                    return dockerAppServiceImpl.status(appId);
+                } else {
+                    return zipAppServiceImpl.status(appId);
+                }
+            default:
+                String msg = String.format("应用状态操作类型 %s 不存在", ops);
+                throw new Exception(msg);
+        }
+    }
+
+    @Override
+    public void log() {
+        // TODO 应用日志待实现
+    }
+}

+ 0 - 0
dagent/src/main/resources/banner.txt → agent/src/main/resources/banner.txt


+ 1 - 1
common/Dockerfile

@@ -11,6 +11,6 @@ RUN mvn clean package -Dmaven.test.skip=true
 From alpine/openjdk:11
 
 WORKDIR /app
-COPY target/autodop-dmaster.jar /app/app.jar
+COPY target/devops-manager.jar /app/app.jar
 #RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]

+ 2 - 2
common/pom.xml

@@ -3,8 +3,8 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>autodop</artifactId>
-        <groupId>cn.reghao.autodop</groupId>
+        <artifactId>devops</artifactId>
+        <groupId>cn.reghao.devops</groupId>
         <version>1.0.0</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>

+ 0 - 25
common/src/main/java/cn/reghao/autodop/common/docker/Docker.java

@@ -1,25 +0,0 @@
-package cn.reghao.autodop.common.docker;
-
-import cn.reghao.autodop.common.docker.DockerException;
-import cn.reghao.autodop.common.docker.po.Config;
-import cn.reghao.autodop.common.docker.po.result.ContainerInfo;
-import com.github.dockerjava.api.command.InspectContainerResponse;
-
-/**
- * Docker 客户端
- *
- * @author reghao
- * @date 2021-10-27 04:17:38
- */
-public interface Docker {
-    void build(String repoTag, String compileHome, String dockerfileContent) throws DockerException;
-    void push(String image) throws DockerException;
-    void pull(String repoTag) throws DockerException;
-    String getContainerIdByName(String containerName) throws DockerException;
-    void stopAndDelete(String containerName) throws DockerException;
-    String createAndRun(String containerName, Config config) throws DockerException;
-    void start(String containerId);
-    void restart(String containerId);
-    void stop(String containerId);
-    InspectContainerResponse inspectContainer(String containerId);
-}

+ 0 - 11
common/src/main/java/cn/reghao/autodop/common/docker/DockerException.java

@@ -1,11 +0,0 @@
-package cn.reghao.autodop.common.docker;
-
-/**
- * @author reghao
- * @date 2020-01-19 14:53:34
- */
-public class DockerException extends Exception {
-    public DockerException(String msg) {
-        super(msg);
-    }
-}

+ 0 - 213
common/src/main/java/cn/reghao/autodop/common/docker/DockerImpl.java

@@ -1,213 +0,0 @@
-package cn.reghao.autodop.common.docker;
-
-import cn.reghao.autodop.common.docker.po.Config;
-import cn.reghao.autodop.common.util.ExceptionUtil;
-import cn.reghao.jutil.jdk.text.TextFile;
-import com.github.dockerjava.api.DockerClient;
-import com.github.dockerjava.api.command.*;
-import com.github.dockerjava.api.model.Container;
-import com.github.dockerjava.api.model.HostConfig;
-import com.github.dockerjava.api.model.RestartPolicy;
-import com.github.dockerjava.core.DefaultDockerClientConfig;
-import com.github.dockerjava.core.DockerClientConfig;
-import com.github.dockerjava.core.DockerClientImpl;
-import com.github.dockerjava.core.command.PushImageResultCallback;
-import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
-import com.github.dockerjava.transport.DockerHttpClient;
-
-import java.io.File;
-import java.io.IOException;
-import java.time.Duration;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * Docker 客户端
- *
- * @author reghao
- * @date 2021-10-27 03:41:38
- */
-public class DockerImpl implements Docker {
-    private final DockerClient dockerClient;
-    private final TextFile textFile = new TextFile();
-
-    public DockerImpl() {
-        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
-                .withDockerHost("unix:///var/run/docker.sock")
-                .withDockerTlsVerify(false)
-                //.withDockerCertPath("/home/user/.docker")
-                //.withRegistryUsername(registryUser)
-                //.withRegistryPassword(registryPass)
-                //.withRegistryEmail(registryMail)
-                //.withRegistryUrl(registryUrl)
-                .build();
-
-        DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
-                .dockerHost(config.getDockerHost())
-                .sslConfig(config.getSSLConfig())
-                .maxConnections(100)
-                .connectionTimeout(Duration.ofSeconds(30))
-                .responseTimeout(Duration.ofSeconds(45))
-                .build();
-
-        this.dockerClient = DockerClientImpl.getInstance(config, httpClient);
-    }
-
-    @Override
-    public void build(String repoTag, String compileHome, String dockerfileContent) throws DockerException {
-        File dockerfile = new File(compileHome + "/Dockerfile.tmp");
-        String[] arr = repoTag.split(":");
-        try {
-            textFile.write(dockerfile, dockerfileContent);
-            // TODO 需要判断构建成功与否,FROM 中的镜像不存在时并不会抛出异常
-            dockerClient.buildImageCmd()
-                    .withDockerfile(dockerfile)
-                    // 格式为 docker.reghao.cn/autodop/dmaster:12345678
-                    .withTags(Set.of(repoTag))
-                    .exec(new BuildImageResultCallback()).awaitCompletion();
-        } catch (IOException | InterruptedException e) {
-            throw new DockerException(ExceptionUtil.errorMsg(e));
-        }
-    }
-
-    @Override
-    public void push(String image) throws DockerException {
-        try {
-            dockerClient.pushImageCmd(image).exec(new PushImageResultCallback()).awaitCompletion();
-        } catch (InterruptedException e) {
-            throw new DockerException(ExceptionUtil.errorMsg(e));
-        }
-        /*dockerClient.pushImageCmd(image).exec(new ResultCallback<PushResponseItem>() {
-            @Override
-            public void onStart(Closeable closeable) {
-
-            }
-
-            @Override
-            public void onNext(PushResponseItem object) {
-                System.out.println(object.getStatus());
-            }
-
-            @Override
-            public void onError(Throwable throwable) {
-
-            }
-
-            @Override
-            public void onComplete() {
-
-            }
-
-            @Override
-            public void close() throws IOException {
-
-            }
-        }).onComplete();*/
-    }
-
-    @Override
-    public void pull(String image) throws DockerException {
-        try {
-            dockerClient.pullImageCmd(image).exec(new PullImageResultCallback()).awaitCompletion();
-        } catch (InterruptedException e) {
-            throw new DockerException(ExceptionUtil.errorMsg(e));
-        }
-        /*dockerClient.pullImageCmd(image).exec(new ResultCallback<PullResponseItem>() {
-            public void onStart(Closeable closeable) {
-                System.out.println("开始下载!");
-            }
-
-            public void onNext(PullResponseItem object) {
-                // 实时显示出下载信息
-                System.out.println(object.getStatus());
-            }
-
-            public void onError(Throwable throwable) {
-                throwable.printStackTrace();
-            }
-
-            public void onComplete() {
-                System.out.println("下载完毕!");
-            }
-
-            public void close() throws IOException {
-                System.out.println("下载完毕...");
-            }
-        }).onComplete();*/
-    }
-
-    @Override
-    public String getContainerIdByName(String containerName) {
-        List<Container> list = dockerClient.listContainersCmd()
-                .withShowAll(true)
-                .withNameFilter(List.of(containerName))
-                .exec();
-
-        for (Container container : list) {
-            if (Arrays.stream(container.getNames()).collect(Collectors.toSet()).contains("/"+containerName)) {
-                return container.getId();
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public void stopAndDelete(String containerName) {
-        String containerId = getContainerIdByName(containerName);
-        if (containerId != null) {
-            InspectContainerResponse containerInfo = inspectContainer(containerId);
-            InspectContainerResponse.ContainerState state = containerInfo.getState();
-            boolean isRunning = state.getRunning() != null ? state.getRunning() : false;
-            if (isRunning) {
-                dockerClient.stopContainerCmd(containerId).exec();
-            }
-            dockerClient.removeContainerCmd(containerId).exec();
-        }
-    }
-
-    @Override
-    public String createAndRun(String containerName, Config config) throws DockerException {
-        stopAndDelete(containerName);
-
-        HostConfig hostConfig = HostConfig.newHostConfig()
-                .withNetworkMode("host")
-                .withRestartPolicy(RestartPolicy.onFailureRestart(3));
-        String image = config.getImage();
-        CreateContainerCmd createContainerCmd = dockerClient.createContainerCmd(image)
-                .withName(containerName)
-                .withHostConfig(hostConfig);
-
-        List<String> env = config.getEnv();
-        if (env != null) {
-            createContainerCmd.withEnv(env);
-        }
-
-        CreateContainerResponse response = createContainerCmd.exec();
-        String containerId1 = response.getId();
-        dockerClient.startContainerCmd(containerId1).exec();
-        return containerId1;
-    }
-
-    @Override
-    public InspectContainerResponse inspectContainer(String containerId) {
-        return dockerClient.inspectContainerCmd(containerId).exec();
-    }
-
-    @Override
-    public void restart(String containerId) {
-        dockerClient.restartContainerCmd(containerId).exec();
-    }
-
-    @Override
-    public void stop(String containerId) {
-        dockerClient.stopContainerCmd(containerId).exec();
-    }
-
-    @Override
-    public void start(String containerId) {
-        dockerClient.startContainerCmd(containerId).exec();
-    }
-}

+ 0 - 46
common/src/main/java/cn/reghao/autodop/common/docker/po/Config.java

@@ -1,46 +0,0 @@
-package cn.reghao.autodop.common.docker.po;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * docker 容器创建时的配置
- *
- * @author reghao
- * @date 2020-01-14 23:11:21
- */
-@Data
-public class Config {
-    @SerializedName("AttachStderr") private boolean attachStderr;
-    @SerializedName("AttachStdin") private boolean attachStdin;
-    @SerializedName("AttachStdout") private boolean attachStdout;
-    @SerializedName("Cmd") private List<String> cmd;
-    @SerializedName("Domainname") private String domainname;
-    @SerializedName("Env") private List<String> env;
-    @SerializedName("Healthcheck") private Healthcheck healthcheck;
-    @SerializedName("Hostname") private String hostname;
-    @SerializedName("Image") private String image;
-    @SerializedName("Labels") private Labels labels;
-    @SerializedName("MacAddress") private String macAddress;
-    @SerializedName("NetworkDisabled") private boolean networkDisabled;
-    @SerializedName("OpenStdin") private boolean openStdin;
-    @SerializedName("StdinOnce") private boolean stdinOnce;
-    @SerializedName("Tty") private boolean tty;
-    @SerializedName("User") private String user;
-    @SerializedName("Volumes") private Volumes volumes;
-    @SerializedName("WorkingDir") private String workingDir;
-    @SerializedName("StopSignal") private String stopSignal;
-    @SerializedName("StopTimeout") private int stopTimeout;
-
-    @SerializedName("Entrypoint") private String entrypoint;
-    @SerializedName("ExposedPorts") private ExposedPorts exposedPorts;
-    @SerializedName("HostConfig") private HostConfig hostConfig;
-    @SerializedName("NetworkingConfig") private NetworkingConfig networkingConfig;
-
-    public Config(String image) {
-        this.image = image;
-        this.hostConfig = new HostConfig();
-    }
-}

+ 0 - 18
common/src/main/java/cn/reghao/autodop/common/docker/po/Data.java

@@ -1,18 +0,0 @@
-package cn.reghao.autodop.common.docker.po;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * @author reghao
- * @date 2020-05-19 20:50:24
- */
-@Getter
-@Setter
-public class Data {
-    @SerializedName("LowerDir") private String lowerDir;
-    @SerializedName("MergedDir") private String mergedDir;
-    @SerializedName("UpperDir") private String upperDir;
-    @SerializedName("WorkDir") private String workDir;
-}

+ 0 - 11
common/src/main/java/cn/reghao/autodop/common/docker/po/ExposedPorts.java

@@ -1,11 +0,0 @@
-package cn.reghao.autodop.common.docker.po;
-
-import lombok.Data;
-
-/**
- * @author reghao
- * @date 2021-02-10 01:30:17
- */
-@Data
-public class ExposedPorts {
-}

+ 0 - 16
common/src/main/java/cn/reghao/autodop/common/docker/po/GraphDriver.java

@@ -1,16 +0,0 @@
-package cn.reghao.autodop.common.docker.po;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * @author reghao
- * @date 2020-05-19 20:51:13
- */
-@Getter
-@Setter
-public class GraphDriver {
-    @SerializedName("Data") private Data data;
-    @SerializedName("Name") private String name;
-}

+ 0 - 17
common/src/main/java/cn/reghao/autodop/common/docker/po/Health.java

@@ -1,17 +0,0 @@
-package cn.reghao.autodop.common.docker.po;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2021-02-25 10:16:50
- */
-@Data
-public class Health {
-    @SerializedName("Status") private String status;
-    @SerializedName("FailingStreak") private int failingStreak;
-    @SerializedName("Log") private List<Log> log;
-}

+ 0 - 15
common/src/main/java/cn/reghao/autodop/common/docker/po/Healthcheck.java

@@ -1,15 +0,0 @@
-package cn.reghao.autodop.common.docker.po;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2021-02-25 10:02:59
- */
-@Data
-public class Healthcheck {
-    @SerializedName("Test") private List<String> test;
-}

+ 0 - 23
common/src/main/java/cn/reghao/autodop/common/docker/po/HostConfig.java

@@ -1,23 +0,0 @@
-package cn.reghao.autodop.common.docker.po;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-/**
- * TODO 部分
- *
- * @author reghao
- * @date 2020-01-14 23:16:52
- */
-@AllArgsConstructor
-@Data
-public class HostConfig {
-    @SerializedName("NetworkMode") private String networkMode;
-    @SerializedName("RestartPolicy") private RestartPolicy restartPolicy;
-
-    public HostConfig() {
-        this.networkMode = "host";
-        this.restartPolicy = new RestartPolicy();
-    }
-}

+ 0 - 14
common/src/main/java/cn/reghao/autodop/common/docker/po/Labels.java

@@ -1,14 +0,0 @@
-package cn.reghao.autodop.common.docker.po;
-
-import lombok.Data;
-
-import java.util.Map;
-
-/**
- * @author reghao
- * @date 2021-02-10 01:28:38
- */
-@Data
-public class Labels {
-    private Map<String, String> map;
-}

+ 0 - 16
common/src/main/java/cn/reghao/autodop/common/docker/po/Log.java

@@ -1,16 +0,0 @@
-package cn.reghao.autodop.common.docker.po;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-
-/**
- * @author reghao
- * @date 2021-02-25 10:19:45
- */
-@Data
-public class Log {
-    @SerializedName("Start") private String start;
-    @SerializedName("End") private String end;
-    @SerializedName("ExitCode") private int exitCode;
-    @SerializedName("Output") private String output;
-}

+ 0 - 11
common/src/main/java/cn/reghao/autodop/common/docker/po/NetworkingConfig.java

@@ -1,11 +0,0 @@
-package cn.reghao.autodop.common.docker.po;
-
-import lombok.Data;
-
-/**
- * @author reghao
- * @date 2021-02-10 01:33:05
- */
-@Data
-public class NetworkingConfig {
-}

+ 0 - 21
common/src/main/java/cn/reghao/autodop/common/docker/po/RestartPolicy.java

@@ -1,21 +0,0 @@
-package cn.reghao.autodop.common.docker.po;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-/**
- * @author reghao
- * @date 2020-05-19 15:00:50
- */
-@AllArgsConstructor
-@Data
-public class RestartPolicy {
-    @SerializedName("Name") private String name;
-    @SerializedName("MaximumRetryCount") private int maximumRetryCount;
-
-    public RestartPolicy() {
-        this.name = "on-failure";
-        this.maximumRetryCount = 3;
-    }
-}

+ 0 - 24
common/src/main/java/cn/reghao/autodop/common/docker/po/State.java

@@ -1,24 +0,0 @@
-package cn.reghao.autodop.common.docker.po;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-
-/**
- * @author reghao
- * @date 2020-05-19 21:04:06
- */
-@Data
-public class State {
-    @SerializedName("Error") private String error;
-    @SerializedName("ExitCode") private int exitCode;
-    @SerializedName("FinishedAt") private String finishedAt;
-    @SerializedName("Health") private Health health;
-    @SerializedName("OOMKilled") private boolean oomKilled;
-    @SerializedName("Dead") private boolean dead;
-    @SerializedName("Paused") private boolean paused;
-    @SerializedName("Pid") private int pid;
-    @SerializedName("Running") private boolean running;
-    @SerializedName("Restarting") private boolean restarting;
-    @SerializedName("StartedAt") private String startedAt;
-    @SerializedName("Status") private String status;
-}

+ 0 - 14
common/src/main/java/cn/reghao/autodop/common/docker/po/Volumes.java

@@ -1,14 +0,0 @@
-package cn.reghao.autodop.common.docker.po;
-
-import lombok.Data;
-
-import java.util.Map;
-
-/**
- * @author reghao
- * @date 2021-02-10 01:29:10
- */
-@Data
-public class Volumes {
-    private Map<String, Object> map;
-}

+ 0 - 21
common/src/main/java/cn/reghao/autodop/common/docker/po/result/Bridge.java

@@ -1,21 +0,0 @@
-package cn.reghao.autodop.common.docker.po.result;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-
-/**
- * @author reghao
- * @date 2021-02-25 09:37:50
- */
-@Data
-public class Bridge {
-    @SerializedName("NetworkID") private String networkId;
-    @SerializedName("EndpointID") private String endpointId;
-    @SerializedName("Gateway") private String gateway;
-    @SerializedName("IPAddress") private String ipAddress;
-    @SerializedName("IPPrefixLen") private String ipPrefixLen;
-    @SerializedName("IPv6Gateway") private String ipv6Gateway;
-    @SerializedName("GlobalIPv6Address") private String globalIpv6Address;
-    @SerializedName("GlobalIPv6PrefixLen") private String globalIpv6PrefixLen;
-    @SerializedName("MacAddress") private String macAddress;
-}

+ 0 - 32
common/src/main/java/cn/reghao/autodop/common/docker/po/result/Container.java

@@ -1,32 +0,0 @@
-package cn.reghao.autodop.common.docker.po.result;
-
-import cn.reghao.autodop.common.docker.po.*;
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * docker ps 返回值
- *
- * @author reghao
- * @date 2019-12-10 18:30:02
- */
-@Data
-public class Container {
-    @SerializedName("Id") private String id;
-    @SerializedName("Names") private List<String> names;
-    @SerializedName("Image") private String image;
-    @SerializedName("ImageID") private String imageId;
-    @SerializedName("Command") private String command;
-    @SerializedName("Created") private long created;
-    @SerializedName("State") private String state;
-    @SerializedName("Status") private String status;
-    @SerializedName("Ports") private List<Port> ports;
-    @SerializedName("Labels") private Labels labels;
-    @SerializedName("SizeRw") private int sizeRw;
-    @SerializedName("SizeRootFs") private int sizeRootFs;
-    @SerializedName("HostConfig") private HostConfig hostConfig;
-    @SerializedName("NetworkSettings") private NetworkSettings networkSettings;
-    @SerializedName("Mounts") private List<Mount> mounts;
-}

+ 0 - 47
common/src/main/java/cn/reghao/autodop/common/docker/po/result/ContainerInfo.java

@@ -1,47 +0,0 @@
-package cn.reghao.autodop.common.docker.po.result;
-
-import cn.reghao.autodop.common.docker.po.GraphDriver;
-import cn.reghao.autodop.common.docker.po.HostConfig;
-import cn.reghao.autodop.common.docker.po.State;
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * docker inspect 返回值
- *
- * @author reghao
- * @date 2019-12-10 18:30:02
- */
-@Data
-public class ContainerInfo {
-    @SerializedName("AppArmorProfile") private String appArmorProfile;
-    @SerializedName("Args") private List<String> args;
-    @SerializedName("Config") private Config config;
-    @SerializedName("Created") private String created;
-    @SerializedName("Driver") private String driver;
-    @SerializedName("ExecIDs") private List<String> execIds;
-    @SerializedName("GraphDriver") private GraphDriver graphDriver;
-    @SerializedName("HostConfig") private HostConfig hostConfig;
-    @SerializedName("HostnamePath") private String hostnamePath;
-    @SerializedName("HostsPath") private String hostsPath;
-    @SerializedName("LogPath") private String logPath;
-    @SerializedName("Id") private String id;
-    @SerializedName("Image") private String image;
-    @SerializedName("MountLabel") private String mountLabel;
-    @SerializedName("Name") private String name;
-    @SerializedName("NetworkSettings") private NetworkSettings networkSettings;
-    @SerializedName("Path") private String path;
-    @SerializedName("ProcessLabel") private String processLabel;
-    @SerializedName("ResolvConfPath") private String resolvConfPath;
-    @SerializedName("RestartCount") private int restartCount;
-    @SerializedName("State") private State state;
-    @SerializedName("Mounts") private List<Mount> mounts;
-
-    @Data
-    static public class Config {
-        @SerializedName("Image") private String image;
-        @SerializedName("StopSignal") private String stopSignal;
-    }
-}

+ 0 - 19
common/src/main/java/cn/reghao/autodop/common/docker/po/result/Mount.java

@@ -1,19 +0,0 @@
-package cn.reghao.autodop.common.docker.po.result;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-
-/**
- * @author reghao
- * @date 2021-02-25 09:43:58
- */
-@Data
-public class Mount {
-    @SerializedName("Name") private String name;
-    @SerializedName("Source") private String source;
-    @SerializedName("Destination") private String destination;
-    @SerializedName("Driver") private String driver;
-    @SerializedName("Mode") private String mode;
-    @SerializedName("RW") private boolean rw;
-    @SerializedName("Propagation") private String propagation;
-}

+ 0 - 13
common/src/main/java/cn/reghao/autodop/common/docker/po/result/NetworkSettings.java

@@ -1,13 +0,0 @@
-package cn.reghao.autodop.common.docker.po.result;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-
-/**
- * @author reghao
- * @date 2021-02-25 09:41:50
- */
-@Data
-public class NetworkSettings {
-    @SerializedName("Networks") private Networks networks;
-}

+ 0 - 13
common/src/main/java/cn/reghao/autodop/common/docker/po/result/Networks.java

@@ -1,13 +0,0 @@
-package cn.reghao.autodop.common.docker.po.result;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-
-/**
- * @author reghao
- * @date 2021-02-25 09:41:10
- */
-@Data
-public class Networks {
-    @SerializedName("bridge") private Bridge bridge;
-}

+ 0 - 15
common/src/main/java/cn/reghao/autodop/common/docker/po/result/Port.java

@@ -1,15 +0,0 @@
-package cn.reghao.autodop.common.docker.po.result;
-
-import com.google.gson.annotations.SerializedName;
-import lombok.Data;
-
-/**
- * @author reghao
- * @date 2021-02-25 09:33:19
- */
-@Data
-public class Port {
-    @SerializedName("PrivatePort") private int privatePort;
-    @SerializedName("PublicPort") private int publicPort;
-    @SerializedName("Type") private String type;
-}

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

@@ -1,55 +0,0 @@
-package cn.reghao.autodop.common.log;
-
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.Appender;
-import ch.qos.logback.core.ConsoleAppender;
-import ch.qos.logback.core.FileAppender;
-import cn.reghao.autodop.common.mqtt.AsyncMqttClient;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author reghao
- * @date 2021-06-11 13:31:20
- */
-public class Appenders {
-    private static final LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
-
-    public static Appender<ILoggingEvent> mqttAppender1(String appId, AsyncMqttClient 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(appId, mqttClient);
-        mqttAppender.setContext(loggerContext);
-        mqttAppender.start();
-        return mqttAppender;
-    }
-
-    public static Appender<ILoggingEvent> fileAppender() {
-        PatternLayoutEncoder layoutEncoder = new PatternLayoutEncoder();
-        layoutEncoder.setPattern("%date %level [%thread] %logger{10} [%file:%line] %msg%n");
-        layoutEncoder.setContext(loggerContext);
-        layoutEncoder.start();
-
-        FileAppender<ILoggingEvent> fileAppender = new FileAppender<ILoggingEvent>();
-        fileAppender.setFile("file");
-        fileAppender.setEncoder(layoutEncoder);
-        fileAppender.setContext(loggerContext);
-        fileAppender.start();
-        return fileAppender;
-    }
-
-    public static Appender<ILoggingEvent> consoleAppender(LoggerContext loggerContext) {
-        PatternLayoutEncoder layoutEncoder = new PatternLayoutEncoder();
-        layoutEncoder.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %c %M %L - %msg%n");
-        layoutEncoder.setContext(loggerContext);
-        layoutEncoder.start();
-
-        ConsoleAppender<ILoggingEvent> consoleAppender = new ConsoleAppender<>();
-        consoleAppender.start();
-        return consoleAppender;
-    }
-}

+ 0 - 38
common/src/main/java/cn/reghao/autodop/common/log/LogCache.java

@@ -1,38 +0,0 @@
-package cn.reghao.autodop.common.log;
-
-import cn.reghao.autodop.common.msg.Message;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * MQTT 连接断开时, MqttAppender 不可用, 此时将日志消息缓存起来, 等连接可用时全部发送出去
- *
- * logs 作为共享变量, 会出现多个线程同时访问, 应避免出现数据冲突
- *
- * @author reghao
- * @date 2021-10-29 14:23:59
- */
-public class LogCache {
-    private static final Object lock = new Object();
-    private static Map<Long, Message> logs = new HashMap<>();
-
-    public static void put(Message message) {
-        synchronized (lock) {
-            logs.put(System.currentTimeMillis(), message);
-        }
-    }
-
-    public static Map<Long, Message> getAll() {
-        synchronized (lock) {
-            // TODO 需要按时间对日志进行排序
-            return logs;
-        }
-    }
-
-    public static void clear() {
-        synchronized (lock) {
-            logs.clear();
-        }
-    }
-}

+ 0 - 32
common/src/main/java/cn/reghao/autodop/common/log/LoggerConfig.java

@@ -1,32 +0,0 @@
-package cn.reghao.autodop.common.log;
-
-import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.Logger;
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.Appender;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * 编程方式配置 logback,相当于 logback-spring-bak.xml 配置
- *
- * @author reghao
- * @date 2021-02-23 23:53:35
- */
-public class LoggerConfig {
-    private static LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
-
-    public static void initLogger(List<Appender<ILoggingEvent>> appenders) {
-        String env = System.getProperty("spring.profiles.active");
-        if (!"dev".equals(env)) {
-            // TODO 非 dev 环境则禁止日志写入 console
-        }
-
-        Logger rootLogger = loggerContext.getLogger("ROOT");
-        rootLogger.setAdditive(false);
-        rootLogger.setLevel(Level.INFO);
-        appenders.forEach(rootLogger::addAppender);
-    }
-}

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

@@ -1,67 +0,0 @@
-package cn.reghao.autodop.common.log;
-
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.UnsynchronizedAppenderBase;
-import cn.reghao.autodop.common.machine.Machine;
-import cn.reghao.autodop.common.mqtt.AsyncMqttClient;
-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.constant.NodeEventPubClazz;
-import cn.reghao.autodop.common.msg.pub.dto.node.NodeLogDTO;
-import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import org.eclipse.paho.client.mqttv3.MqttException;
-
-/**
- * 日志写到 MQTT broker
- *
- * @author reghao
- * @date 2021-06-08 19:37:21
- */
-public class MqttAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
-    private final String appId;
-    private final String topic;
-    private final AsyncMqttClient mqttClient;
-
-    public MqttAppender(String appId, AsyncMqttClient mqttClient) {
-        this.appId = appId;
-        this.topic = MsgQueue.dmasterTopic();
-        this.mqttClient = mqttClient;
-    }
-
-    @Override
-    public void start() {
-        super.start();
-    }
-
-    @Override
-    public void stop() {
-        super.stop();
-    }
-
-    @Override
-    protected void append(ILoggingEvent event) {
-        NodeLogDTO nodeLogDTO = nodeLogDTO(event);
-        String jsonPayload = JsonConverter.objectToJson(nodeLogDTO);
-        PubMsg pubMsg = PubMsg.pubMsg(NodeEventPubClazz.class.getSimpleName(), NodeEventPubClazz.log.name(), jsonPayload);
-        Message message = Message.pubMsg(pubMsg);
-        try {
-            mqttClient.pub(topic, 1, JsonConverter.objectToJson(message));
-        } catch (MqttException e) {
-            e.printStackTrace();
-            LogCache.put(message);
-        }
-    }
-
-    private NodeLogDTO nodeLogDTO(ILoggingEvent event) {
-        NodeLogDTO nodeLogDTO = new NodeLogDTO();
-        nodeLogDTO.setMachineId(Machine.ID);
-        nodeLogDTO.setAppId(appId);
-        nodeLogDTO.setTimestamp(event.getTimeStamp());
-        nodeLogDTO.setLevel(event.getLevel().toString());
-        nodeLogDTO.setThreadName(event.getThreadName());
-        nodeLogDTO.setLoggerName(event.getLoggerName());
-        nodeLogDTO.setMessage(event.getFormattedMessage());
-        return nodeLogDTO;
-    }
-}

+ 0 - 33
common/src/main/java/cn/reghao/autodop/common/machine/Cpu.java

@@ -1,33 +0,0 @@
-package cn.reghao.autodop.common.machine;
-
-import cn.reghao.jutil.jdk.machine.data.MachineData;
-import cn.reghao.jutil.jdk.machine.data.detail.CpuDetail;
-import cn.reghao.jutil.jdk.machine.data.stat.CpuStat;
-import oshi.hardware.CentralProcessor;
-
-/**
- * @author reghao
- * @date 2019-10-25 13:12:36
- */
-public class Cpu implements MachineData<CpuDetail, CpuStat> {
-    private CentralProcessor processor;
-
-    public Cpu(CentralProcessor processor) {
-        this.processor = processor;
-    }
-
-    @Override
-    public CpuDetail detail() {
-        CentralProcessor.ProcessorIdentifier processorIdentifier = processor.getProcessorIdentifier();
-        String vendor = processorIdentifier.getVendor();
-        String name = processorIdentifier.getName();
-        int physicalCore = processor.getPhysicalProcessorCount();
-        int logicalCore = processor.getLogicalProcessorCount();
-        return new CpuDetail(vendor, name, physicalCore, logicalCore);
-    }
-
-    @Override
-    public CpuStat stat() {
-        return null;
-    }
-}

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

@@ -1,86 +0,0 @@
-package cn.reghao.autodop.common.machine;
-
-import cn.reghao.jutil.jdk.machine.data.MachineData;
-import cn.reghao.jutil.jdk.machine.data.detail.DiskDetail;
-import cn.reghao.jutil.jdk.machine.data.stat.DiskStat;
-import oshi.SystemInfo;
-import oshi.software.os.OperatingSystem;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author reghao
- * @date 2019-10-25 13:21:25
- */
-public class Disk implements MachineData<List<DiskDetail>, List<DiskStat>> {
-    private final OperatingSystem os;
-
-    public Disk(SystemInfo si) {
-        this.os = si.getOperatingSystem();
-        //this.os = new SystemInfo().getOperatingSystem();
-    }
-
-    @Override
-    public List<DiskDetail> detail() {
-        return os.getFileSystem().getFileStores().stream()
-                .map(osFileStore -> {
-                    String vol = osFileStore.getVolume();
-                    String mount = osFileStore.getMount();
-                    String fsType = osFileStore.getType();
-
-                    long total = osFileStore.getTotalSpace();
-                    // non-root 用户可用的磁盘空间
-                    long userAvail = osFileStore.getUsableSpace();
-                    // root 用户可用的磁盘空间
-                    long rootAvail = osFileStore.getFreeSpace();
-
-                    long inodeTotal = osFileStore.getTotalInodes();
-                    long inodeFree = osFileStore.getFreeInodes();
-
-                    return new DiskDetail(vol, mount, fsType, total, userAvail, total-userAvail, inodeTotal, inodeFree);
-                })
-                .collect(Collectors.toList());
-    }
-
-    @Override
-    public List<DiskStat> stat() {
-        return null;
-    }
-
-    /**
-     * 根据一个路径确定它所在的分区
-     *
-     * @param
-     * @return
-     * @date 2021-02-06 下午11:25
-     */
-    public DiskDetail diskDetail(String path) {
-        List<DiskDetail> diskInfos = detail();
-        // 根据挂载路径的长度降序
-        diskInfos.sort((o1, o2) -> o2.getMountedOn().length() - o1.getMountedOn().length());
-
-        List<DiskDetail> candidates = new ArrayList<>();
-        for (DiskDetail diskInfo : diskInfos) {
-            String mountedOn = diskInfo.getMountedOn();
-            String[] array = path.split(mountedOn);
-            if (array.length == 0) {
-                return diskInfo;
-            } else if (array.length == 2) {
-                if (array[1].startsWith("/") || "/".equals(mountedOn)) {
-                    candidates.add(diskInfo);
-                }
-            } else if (array.length > 2) {
-                candidates.add(diskInfo);
-            }
-        }
-
-        if (!candidates.isEmpty()) {
-            // TODO 如果 candidates 大于 0 则判断准确的那个
-            return candidates.get(0);
-        } else {
-            return null;
-        }
-    }
-}

+ 0 - 72
common/src/main/java/cn/reghao/autodop/common/machine/Machine.java

@@ -1,72 +0,0 @@
-package cn.reghao.autodop.common.machine;
-
-import cn.reghao.jutil.jdk.http.WebRequest;
-import cn.reghao.jutil.jdk.http.WebResponse;
-import cn.reghao.jutil.jdk.machine.data.detail.*;
-import cn.reghao.jutil.jdk.machine.id.MachineId;
-import cn.reghao.jutil.jdk.machine.id.MachineIdLinux;
-import cn.reghao.jutil.jdk.machine.data.stat.MachineStat;
-import oshi.SystemInfo;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author reghao
- * @date 2020-10-22 15:47:58
- */
-public class Machine {
-    public final static String ID;
-    public final static String IPV4;
-    static {
-        MachineId machineId = new MachineIdLinux();
-        ID = machineId.id();
-        // TODO ip 发生变化时会引发数据不一致
-        IPV4 = machineId.ipv4();
-    }
-
-    private final WebRequest webRequest;
-    private final Os os;
-    private final Network network;
-    private final Cpu cpu;
-    private final Memory memory;
-    private final Disk disk;
-
-    public Machine(WebRequest webRequest, SystemInfo si) {
-        this.webRequest = webRequest;
-        this.os = new Os(si.getOperatingSystem());
-        this.network = new Network();
-        this.cpu = new Cpu(si.getHardware().getProcessor());
-        this.memory = new Memory(si.getHardware().getMemory());
-        this.disk = new Disk(si);
-    }
-
-    public MachineDetail detail() {
-        MachineDetail machineDetail = new MachineDetail();
-        machineDetail.setMachineId(Machine.ID);
-        machineDetail.setOsDetail(os.detail());
-
-        List<NetworkDetail> list = network.detail().stream()
-                .peek(networkDetail -> {
-                    WebResponse webResponse = webRequest.get("http://ip.iquizoo.com");
-                    if (webResponse.getStatusCode() == 200) {
-                        networkDetail.setPubicIpv4(webResponse.getBody());
-                    }
-                })
-                .collect(Collectors.toList());
-        machineDetail.setNetworkDetails(list);
-
-        machineDetail.setCpuDetail(cpu.detail());
-        machineDetail.setMemoryDetail(memory.detail());
-        machineDetail.setDiskDetails(disk.detail());
-        return machineDetail;
-    }
-
-    public MachineStat stat() {
-        MachineStat machineStat = new MachineStat();
-        machineStat.setMachineId(Machine.ID);
-        machineStat.setMemoryDetail(memory.detail());
-        machineStat.setDiskDetails(disk.detail());
-        return machineStat;
-    }
-}

+ 0 - 53
common/src/main/java/cn/reghao/autodop/common/machine/Memory.java

@@ -1,53 +0,0 @@
-package cn.reghao.autodop.common.machine;
-
-import cn.reghao.autodop.common.util.jvm.po.MemoryStat;
-import cn.reghao.jutil.jdk.machine.data.MachineData;
-import cn.reghao.jutil.jdk.machine.data.detail.MemoryDetail;
-import oshi.hardware.GlobalMemory;
-import oshi.hardware.VirtualMemory;
-
-/**
- * @author reghao
- * @date 2019-10-25 13:21:25
- */
-public class Memory implements MachineData<MemoryDetail, MemoryStat> {
-    private final GlobalMemory globalMemory;
-    private final VirtualMemory virtualMemory;
-    private MemoryDetail memoryDetail;
-
-    public Memory(GlobalMemory globalMemory) {
-        this.globalMemory = globalMemory;
-        this.virtualMemory = globalMemory.getVirtualMemory();
-    }
-
-    @Override
-    public MemoryDetail detail() {
-        long total = globalMemory.getTotal();
-        long avail = globalMemory.getAvailable();
-        long swapTotal = virtualMemory.getSwapTotal();
-        long swapUsed = virtualMemory.getSwapUsed();
-
-        if (memoryDetail == null) {
-            memoryDetail = new MemoryDetail(total, avail, total-avail, swapTotal, swapTotal-swapUsed);
-        }
-
-        return memoryDetail;
-    }
-
-    @Override
-    public MemoryStat stat() {
-        if (memoryDetail == null) {
-            memoryDetail = detail();
-        }
-
-        long total = globalMemory.getTotal();
-        long avail = globalMemory.getAvailable();
-        memoryDetail.setAvail(avail);
-        memoryDetail.setUsed(total-avail);
-
-        long swapTotal = virtualMemory.getSwapTotal();
-        long swapUsed = virtualMemory.getSwapUsed();
-        memoryDetail.setAvail(swapTotal-swapUsed);
-        return null;
-    }
-}

+ 0 - 73
common/src/main/java/cn/reghao/autodop/common/machine/Network.java

@@ -1,73 +0,0 @@
-package cn.reghao.autodop.common.machine;
-
-import cn.reghao.jutil.jdk.machine.data.MachineData;
-import cn.reghao.jutil.jdk.machine.data.detail.NetworkDetail;
-import cn.reghao.jutil.jdk.machine.data.stat.NetworkStat;
-
-import java.net.*;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2021-10-16 18:45:39
- */
-public class Network implements MachineData<List<NetworkDetail>, NetworkStat> {
-    @Override
-    public List<NetworkDetail> detail() {
-        List<NetworkDetail> list = new ArrayList<>();
-        try {
-            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
-            // 遍历主机的网络接口
-            while (interfaces.hasMoreElements()) {
-                NetworkInterface iface = interfaces.nextElement();
-                String ifaceName = iface.getName();
-                // 过滤掉 localhost 和虚拟网卡
-                if (ifaceName.startsWith("lo") || ifaceName.startsWith("docker")
-                        || ifaceName.startsWith("v") || ifaceName.startsWith("br")) {
-                    continue;
-                }
-                String ifaceMac = macAddr(iface.getHardwareAddress());
-                NetworkDetail networkDetail = new NetworkDetail(ifaceName, ifaceMac);
-
-                Enumeration<InetAddress> inetAddrs = iface.getInetAddresses();
-                while (inetAddrs.hasMoreElements()) {
-                    InetAddress address = inetAddrs.nextElement();
-                    if (!address.isLoopbackAddress()) {
-                        if (address instanceof Inet4Address) {
-                            networkDetail.setIpv4(address.getHostAddress());
-                        } else if (address instanceof Inet6Address) {
-                            networkDetail.setIpv6(address.getHostAddress());
-                        }
-                    }
-                }
-
-                list.add(networkDetail);
-            }
-        } catch (SocketException e) {
-            e.printStackTrace();
-        }
-        return list;
-    }
-
-    /**
-     * 返回 52-54-00-bf-ab-2d 格式的 MAC 地址
-     *
-     * @param
-     * @return
-     * @date 2020-10-14 下午1:53
-     */
-    private static String macAddr(byte[] addr) {
-        String[] hexadecimal = new String[addr.length];
-        for (int i = 0; i < addr.length; i++) {
-            hexadecimal[i] = String.format("%02x", addr[i]);
-        }
-        return String.join("-", hexadecimal);
-    }
-
-    @Override
-    public NetworkStat stat() {
-        return null;
-    }
-}

+ 0 - 30
common/src/main/java/cn/reghao/autodop/common/machine/Os.java

@@ -1,30 +0,0 @@
-package cn.reghao.autodop.common.machine;
-
-import cn.reghao.jutil.jdk.machine.data.MachineData;
-import cn.reghao.jutil.jdk.machine.data.detail.OsDetail;
-import cn.reghao.jutil.jdk.machine.data.stat.OsStat;
-import oshi.software.os.OperatingSystem;
-
-/**
- * @author reghao
- * @date 2020-10-20 23:17:30
- */
-public class Os implements MachineData<OsDetail, OsStat> {
-    private OperatingSystem os;
-
-    public Os(OperatingSystem os) {
-        this.os = os;
-    }
-
-    @Override
-    public OsDetail detail() {
-        OsDetail osDetail = new OsDetail();
-        osDetail.setBootTime(os.getSystemBootTime());
-        return osDetail;
-    }
-
-    @Override
-    public OsStat stat() {
-        return null;
-    }
-}

+ 0 - 189
common/src/main/java/cn/reghao/autodop/common/mqtt/AsyncMqttClient.java

@@ -1,189 +0,0 @@
-package cn.reghao.autodop.common.mqtt;
-
-import cn.reghao.autodop.common.log.LogCache;
-import cn.reghao.autodop.common.machine.Machine;
-import cn.reghao.autodop.common.msg.Message;
-import cn.reghao.autodop.common.msg.MsgQueue;
-import cn.reghao.autodop.common.msg.pub.PubMsg;
-import cn.reghao.autodop.common.msg.pub.constant.NodeEventPubClazz;
-import cn.reghao.autodop.common.msg.rpc.RpcMsg;
-import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import lombok.extern.slf4j.Slf4j;
-import org.eclipse.paho.client.mqttv3.*;
-import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
-
-import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * TODO 采用 Builder 模式初始化参数
- *
- * @author reghao
- * @date 2021-10-28 20:52:17
- */
-@Slf4j
-public class AsyncMqttClient {
-    private final MqttProperties properties;
-    private final MqttAsyncClient mqttClient;
-    private final Map<String, IMqttMessageListener> msgListeners = new HashMap<>();
-    private final Map<String, RpcMsg> rpcRecorder = new ConcurrentHashMap<>();
-
-    public AsyncMqttClient(MqttProperties properties) throws MqttException {
-        this.properties = properties;
-        String clientId = properties.getClientId() + Machine.ID;
-        mqttClient = new MqttAsyncClient(properties.getBroker(), clientId, new MemoryPersistence());
-    }
-
-    private MqttConnectOptions connectOptions() {
-        MqttConnectOptions options = new MqttConnectOptions();
-        options.setUserName(properties.getUsername());
-        options.setPassword(properties.getPassword().toCharArray());
-        // 在服务端保存状态
-        options.setCleanSession(false);
-        // 自动重连
-        options.setAutomaticReconnect(true);
-        // 避免 Timed out as no activity, keepAlive=60,000 lastOutboundActivity=1,635,408,462,211 错误
-        options.setConnectionTimeout(0);
-        // 设置 last will message
-        options.setWill(MsgQueue.dmasterTopic(), lastWillMessage(), 1, false);
-        return options;
-    }
-
-    /**
-     * LWT 消息
-     *
-     * @param
-     * @return
-     * @date 2021-11-04 下午3:57
-     */
-    private byte[] lastWillMessage() {
-        String jsonPayload = String.format("{\"machineId\":\"%s\"}", Machine.ID);
-        PubMsg pubMsg = PubMsg.pubMsg(NodeEventPubClazz.class.getSimpleName(),
-                NodeEventPubClazz.unavail.name(), jsonPayload);
-        Message message = Message.pubMsg(pubMsg);
-        return JsonConverter.objectToJson(message).getBytes(StandardCharsets.UTF_8);
-    }
-
-    public void add(String topic, IMqttMessageListener messageListener) {
-        msgListeners.putIfAbsent(topic, messageListener);
-    }
-
-    public Map<String, IMqttMessageListener> getMsgListeners() {
-        return msgListeners;
-    }
-
-    public RpcMsg getAndRemoveRecord(String msgId) {
-        return rpcRecorder.remove(msgId);
-    }
-
-    /**
-     * 没有返回结果的 RPC 调用
-     *
-     * @param
-     * @return
-     * @date 2021-11-04 上午11:33
-     */
-    public Map<String, RpcMsg> unreturnedRpc() {
-        return rpcRecorder;
-    }
-
-    public void connect(IMqttActionListener actionListener) throws MqttException {
-        mqttClient.setCallback(new ConnectionCallback());
-        mqttClient.connect(connectOptions(), null, actionListener);
-    }
-
-    public boolean isConnected() {
-        return mqttClient.isConnected();
-    }
-
-    /**
-     * qos=0 的消息不能离线
-     *
-     * @param
-     * @return
-     * @date 2021-06-16 下午8:40
-     */
-    public void pub(String topic, int qos, String payload) throws MqttException {
-        MqttMessage message = new MqttMessage();
-        message.setQos(qos);
-        //message.setRetained(true);
-        message.setPayload(payload.getBytes());
-        mqttClient.publish(topic, message);
-    }
-
-    /**
-     * pub 消息后,等 sub 端处理后在 pub 结果
-     *
-     * @param
-     * @return
-     * @date 2021-06-30 上午11:22
-     */
-    public void pubWithResult(String topic, int qos, Message message) throws MqttException {
-        MqttMessage mqttMessage = new MqttMessage();
-        mqttMessage.setQos(qos);
-        mqttMessage.setPayload(JsonConverter.objectToJson(message).getBytes());
-
-        mqttClient.publish(topic, mqttMessage);
-        rpcRecorder.put(message.getMsgId(), message.getRpcMsg());
-    }
-
-    public void sub(String topic, IMqttMessageListener messageListener) throws MqttException {
-        mqttClient.subscribe(topic, 2, messageListener);
-    }
-
-    /**
-     * MQTT 连接回调
-     *
-     * @param
-     * @return
-     * @date 2021-10-28 下午8:31
-     */
-    class ConnectionCallback implements MqttCallbackExtended {
-        @Override
-        public void connectComplete(boolean reconnect, String serverUri) {
-            if (reconnect) {
-                log.info("MQTT 重新连接成功");
-                log.info("发布之前未发送成功的日志");
-                LogCache.getAll().forEach((timestamp, message) -> {
-                    try {
-                        pub(MsgQueue.dmasterTopic(), 1, JsonConverter.objectToJson(message));
-                    } catch (MqttException e) {
-                        e.printStackTrace();
-                        LogCache.put(message);
-                    }
-                });
-
-                log.info("重新订阅 topic");
-                // 重连完成后自动订阅 topic
-                msgListeners.forEach((topic, listener) -> {
-                    try {
-                        sub(topic, listener);
-                    } catch (MqttException e) {
-                        log.error("重新订阅 {} 失败,原因: {}", topic, e.getMessage());
-                    }
-                });
-            }
-        }
-
-        @Override
-        public void connectionLost(Throwable cause) {
-            log.error("MQTT 连接断开, 准备重新连接 {}", cause.getMessage());
-            try {
-                mqttClient.reconnect();
-            } catch (MqttException e) {
-                e.printStackTrace();
-                log.error("MQTT 重连失败 {}", cause.getMessage());
-            }
-        }
-
-        @Override
-        public void messageArrived(String topic, MqttMessage message) {
-        }
-
-        @Override
-        public void deliveryComplete(IMqttDeliveryToken token) {
-        }
-    }
-}

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

@@ -1,156 +0,0 @@
-package cn.reghao.autodop.common.mqtt;
-
-import cn.reghao.autodop.common.machine.Machine;
-import cn.reghao.autodop.common.msg.Message;
-import cn.reghao.autodop.common.msg.rpc.RpcMsg;
-import cn.reghao.jutil.jdk.serializer.JsonConverter;
-import lombok.extern.slf4j.Slf4j;
-import org.eclipse.paho.client.mqttv3.*;
-import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author reghao
- * @date 2021-05-21 08:27:41
- */
-@Deprecated
-@Slf4j
-public class DefaultMqttClient implements AutoCloseable {
-    private final MqttProperties properties;
-    private final MqttClient client;
-    // 记录 RPC 调用, size 为 0 时表示所有 pub 消息的结果都已 sub
-    private final Map<String, RpcMsg> rpcRecorder = new HashMap<>();
-    private final Map<String, IMqttMessageListener> subMap = new HashMap<>();
-    private final MqttCallback connCallback = new ConnectionCallback();
-
-    public DefaultMqttClient(MqttProperties properties) throws MqttException {
-        this.properties = properties;
-        String clientId = properties.getClientId() + Machine.ID;
-        this.client = new MqttClient(properties.getBroker(), clientId, new MemoryPersistence());
-    }
-
-    private MqttConnectOptions connectOptions() {
-        MqttConnectOptions options = new MqttConnectOptions();
-        options.setUserName(properties.getUsername());
-        options.setPassword(properties.getPassword().toCharArray());
-        // 在服务端保存状态
-        options.setCleanSession(false);
-        // 自动重连
-        options.setAutomaticReconnect(true);
-        return options;
-    }
-
-    @Override
-    public void close() throws MqttException {
-        if (client.isConnected()) {
-            client.disconnect();
-        }
-        client.close();
-    }
-
-    public void putRecord(String msgId, RpcMsg rpcMsg) {
-        rpcRecorder.put(msgId, rpcMsg);
-    }
-
-    public RpcMsg getRecord(String msgId) {
-        return rpcRecorder.get(msgId);
-    }
-
-    public void removeRecord(String msgId) {
-        rpcRecorder.remove(msgId);
-    }
-
-    public boolean isConnected() {
-        return client.isConnected();
-    }
-
-    // TODO 处理系统启动时没有成功连接的情况
-    private void connect() throws MqttException {
-        if (!client.isConnected()) {
-            client.setCallback(connCallback);
-            client.connect(connectOptions());
-        }
-    }
-
-    /**
-     * 确保能订阅到离线消息的设置:
-     * - qos=1
-     * - clientId 确定且唯一,不能使用随机的 UUID
-     * - CleanSession=false
-     *
-     * @param
-     * @return
-     * @date 2021-06-16 下午8:39
-     */
-    public void sub(String topic, IMqttMessageListener messageListener) throws MqttException {
-        connect();
-        client.subscribe(topic, 1, messageListener);
-    }
-
-    private void resub(String topic, IMqttMessageListener messageListener) throws MqttException {
-        client.subscribe(topic, 1, messageListener);
-        log.info("重新订阅 {} 成功", topic);
-    }
-
-    /**
-     * qos=0 的消息不能离线
-     *
-     * @param
-     * @return
-     * @date 2021-06-16 下午8:40
-     */
-    public void pub(String topic, int qos, String payload) throws MqttException {
-        MqttMessage message = new MqttMessage();
-        message.setQos(qos);
-        message.setPayload(payload.getBytes());
-
-        connect();
-        client.publish(topic, message);
-    }
-
-    /**
-     * pub 消息后,等 sub 端处理后在 pub 结果
-     *
-     * @param
-     * @return
-     * @date 2021-06-30 上午11:22
-     */
-    public void pubWithResult(String topic, int qos, Message message) throws MqttException {
-        MqttMessage mqttMessage = new MqttMessage();
-        mqttMessage.setQos(qos);
-        mqttMessage.setPayload(JsonConverter.objectToJson(message).getBytes());
-
-        connect();
-        client.publish(topic, mqttMessage);
-        rpcRecorder.put(message.getMsgId(), message.getRpcMsg());
-    }
-
-    class ConnectionCallback implements MqttCallbackExtended {
-        @Override
-        public void connectComplete(boolean reconnect, String serverUri) {
-            // 重连完成后自动订阅 topic
-            subMap.forEach((topic, listener) -> {
-                try {
-                    resub(topic, listener);
-                } catch (MqttException e) {
-                    log.error("重新订阅 {} 失败,原因: {}", topic, e.getMessage());
-                }
-            });
-        }
-
-        @Override
-        public void connectionLost(Throwable cause) {
-            log.error("MQTT connection lost {}", cause.getMessage());
-        }
-
-        @Override
-        public void messageArrived(String topic, MqttMessage message) throws Exception {
-        }
-
-        @Override
-        public void deliveryComplete(IMqttDeliveryToken token) {
-        }
-    }
-}

+ 0 - 15
common/src/main/java/cn/reghao/autodop/common/mqtt/MqttProperties.java

@@ -1,15 +0,0 @@
-package cn.reghao.autodop.common.mqtt;
-
-import lombok.Data;
-
-/**
- * @author reghao
- * @date 2019-08-27 00:17:55
- */
-@Data
-public class MqttProperties {
-    private String broker;
-    private String username;
-    private String password;
-    private String clientId;
-}

+ 0 - 9
common/src/main/java/cn/reghao/autodop/common/msg/ClazzDispatcher.java

@@ -1,9 +0,0 @@
-package cn.reghao.autodop.common.msg;
-
-/**
- * @author reghao
- * @date 2021-10-19 16:00:12
- */
-public interface ClazzDispatcher<K, V> {
-    V dispatch(K k);
-}

+ 0 - 54
common/src/main/java/cn/reghao/autodop/common/msg/Message.java

@@ -1,54 +0,0 @@
-package cn.reghao.autodop.common.msg;
-
-import cn.reghao.autodop.common.msg.pub.PubMsg;
-import cn.reghao.autodop.common.msg.rpc.RpcMsg;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.UUID;
-
-/**
- * @author reghao
- * @date 2021-08-25 17:19:41
- */
-@Data
-public class Message implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private String msgId;
-    private long sendTime;
-    private String msgType;
-    private PubMsg pubMsg;
-    private RpcMsg rpcMsg;
-
-    private Message() {
-        this.msgId = UUID.randomUUID().toString();
-        this.sendTime = System.currentTimeMillis();
-    }
-
-    private Message(String msgId) {
-        this.msgId = msgId;
-        this.sendTime = System.currentTimeMillis();
-    }
-
-    public static Message pubMsg(PubMsg pubMsg) {
-        Message message = new Message();
-        message.setMsgType(MsgType.pub.name());
-        message.setPubMsg(pubMsg);
-        return message;
-    }
-
-    public static Message rpcParamMsg(RpcMsg rpcMsg) {
-        Message message = new Message();
-        message.setMsgType(MsgType.rpcParam.name());
-        message.setRpcMsg(rpcMsg);
-        return message;
-    }
-
-    public static Message rpcResultMsg(String msgId, RpcMsg rpcMsg) {
-        Message message = new Message(msgId);
-        message.setMsgType(MsgType.rpcResult.name());
-        message.setRpcMsg(rpcMsg);
-        return message;
-    }
-}

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

@@ -1,21 +0,0 @@
-package cn.reghao.autodop.common.msg;
-
-import cn.reghao.autodop.common.msg.pub.dto.node.constant.AppId;
-
-/**
- * @author reghao
- * @date 2021-09-14 17:10:31
- */
-public class MsgQueue {
-    public static String dmasterTopic() {
-        return AppId.dmaster.name();
-    }
-
-    public static String dagentTopic(String nodeId) {
-        return String.format("%s/%s", AppId.dagent.name(), nodeId);
-    }
-
-    public static String sysTopic() {
-        return "SYS/broker/clients/#";
-    }
-}

+ 0 - 9
common/src/main/java/cn/reghao/autodop/common/msg/MsgType.java

@@ -1,9 +0,0 @@
-package cn.reghao.autodop.common.msg;
-
-/**
- * @author reghao
- * @date 2021-09-15 09:01:17
- */
-public enum MsgType {
-    pub, rpcParam, rpcResult
-}

+ 0 - 26
common/src/main/java/cn/reghao/autodop/common/msg/pub/PubMsg.java

@@ -1,26 +0,0 @@
-package cn.reghao.autodop.common.msg.pub;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * @author reghao
- * @date 2021-09-15 08:57:55
- */
-@Data
-public class PubMsg implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private String clazz;
-    private String method;
-    private String jsonPayload;
-
-    public static PubMsg pubMsg(String clazz, String method, String jsonPayload) {
-        PubMsg pubMsg = new PubMsg();
-        pubMsg.setClazz(clazz);
-        pubMsg.setMethod(method);
-        pubMsg.setJsonPayload(jsonPayload);
-        return pubMsg;
-    }
-}

+ 0 - 18
common/src/main/java/cn/reghao/autodop/common/msg/pub/clazz/INodeEventPubClazz.java

@@ -1,18 +0,0 @@
-package cn.reghao.autodop.common.msg.pub.clazz;
-
-import cn.reghao.autodop.common.msg.pub.dto.node.NodeLogDTO;
-import cn.reghao.jutil.jdk.machine.data.detail.MachineDetail;
-import cn.reghao.jutil.jdk.machine.data.stat.MachineStat;
-
-/**
- * 节点事件
- *
- * @author reghao
- * @date 2021-09-15 09:19:14
- */
-public interface INodeEventPubClazz {
-    void start(MachineDetail machineDetail);
-    void heartbeat(MachineStat machineStat);
-    void shutdown(MachineStat machineStat);
-    void log(NodeLogDTO nodeLogDTO);
-}

+ 0 - 9
common/src/main/java/cn/reghao/autodop/common/msg/pub/constant/NodeEventPubClazz.java

@@ -1,9 +0,0 @@
-package cn.reghao.autodop.common.msg.pub.constant;
-
-/**
- * @author reghao
- * @date 2021-09-15 09:19:14
- */
-public enum NodeEventPubClazz {
-    start, heartbeat, shutdown, unavail, log
-}

+ 0 - 9
common/src/main/java/cn/reghao/autodop/common/msg/pub/constant/PubClazz.java

@@ -1,9 +0,0 @@
-package cn.reghao.autodop.common.msg.pub.constant;
-
-/**
- * @author reghao
- * @date 2021-09-15 11:51:17
- */
-public enum PubClazz {
-    NodeEventPubClazz,
-}

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

@@ -1,22 +0,0 @@
-package cn.reghao.autodop.common.msg.pub.dto.node;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * @author reghao
- * @date 2021-06-11 09:48:14
- */
-@Data
-public class NodeLogDTO implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private String machineId;
-    private String appId;
-    private long timestamp;
-    private String level;
-    private String threadName;
-    private String loggerName;
-    private String message;
-}

+ 0 - 9
common/src/main/java/cn/reghao/autodop/common/msg/pub/dto/node/constant/AppId.java

@@ -1,9 +0,0 @@
-package cn.reghao.autodop.common.msg.pub.dto.node.constant;
-
-/**
- * @author reghao
- * @date 2021-08-27 17:32:08
- */
-public enum AppId {
-    dmaster, dagent
-}

+ 0 - 9
common/src/main/java/cn/reghao/autodop/common/msg/pub/dto/node/constant/NodeStatus.java

@@ -1,9 +0,0 @@
-package cn.reghao.autodop.common.msg.pub.dto.node.constant;
-
-/**
- * @author reghao
- * @date 2021-08-27 17:33:20
- */
-public enum NodeStatus {
-    Online, Offline
-}

+ 0 - 64
common/src/main/java/cn/reghao/autodop/common/msg/rpc/RpcMsg.java

@@ -1,64 +0,0 @@
-package cn.reghao.autodop.common.msg.rpc;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-import static cn.reghao.jutil.jdk.result.ResultStatus.*;
-
-/**
- * @author reghao
- * @date 2021-08-25 17:19:41
- */
-@Data
-public class RpcMsg implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    // 调用参数
-    private String clazz;
-    private String method;
-    private String jsonParam;
-
-    // 返回结果
-    // 0 - 成功 1 - 失败
-    private int code;
-    private String msg;
-    private String jsonData;
-
-    private RpcMsg() {
-    }
-
-    public static RpcMsg paramMsg(String clazz, String method) {
-        RpcMsg paramMsg = new RpcMsg();
-        paramMsg.setClazz(clazz);
-        paramMsg.setMethod(method);
-        return paramMsg;
-    }
-
-    public static RpcMsg paramMsg(String clazz, String method, String jsonParam) {
-        RpcMsg paramMsg = new RpcMsg();
-        paramMsg.setClazz(clazz);
-        paramMsg.setMethod(method);
-        paramMsg.setJsonParam(jsonParam);
-        return paramMsg;
-    }
-
-    public RpcMsg success(String jsonData) {
-        this.setCode(SUCCESS.getCode());
-        this.setMsg(SUCCESS.getMsg());
-        this.setJsonData(jsonData);
-        return this;
-    }
-
-    public RpcMsg fail(String msg) {
-        this.setCode(FAIL.getCode());
-        this.setMsg(msg);
-        return this;
-    }
-
-    public RpcMsg error(String msg) {
-        this.setCode(ERROR.getCode());
-        this.setMsg(msg);
-        return this;
-    }
-}

+ 0 - 19
common/src/main/java/cn/reghao/autodop/common/msg/rpc/clazz/IAppRpcClazz.java

@@ -1,19 +0,0 @@
-package cn.reghao.autodop.common.msg.rpc.clazz;
-
-import cn.reghao.autodop.common.msg.rpc.dto.app.DeployParam;
-import cn.reghao.autodop.common.msg.rpc.dto.app.DeployResult;
-import cn.reghao.autodop.common.msg.rpc.dto.app.StatusParam;
-import cn.reghao.autodop.common.msg.rpc.dto.app.StatusResult;
-
-/**
- * @author reghao
- * @date 2020-12-25 19:15:00
- */
-public interface IAppRpcClazz {
-    DeployResult deploy(DeployParam deployParam);
-    StatusResult restart(StatusParam statusParam) throws Exception;
-    StatusResult stop(StatusParam statusParam) throws Exception;
-    StatusResult start(StatusParam statusParam) throws Exception;
-    StatusResult status(StatusParam statusParam) throws Exception;
-    void log();
-}

+ 0 - 9
common/src/main/java/cn/reghao/autodop/common/msg/rpc/constant/AppRpcClazz.java

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

+ 0 - 9
common/src/main/java/cn/reghao/autodop/common/msg/rpc/constant/RpcClazz.java

@@ -1,9 +0,0 @@
-package cn.reghao.autodop.common.msg.rpc.constant;
-
-/**
- * @author reghao
- * @date 2021-09-14 18:15:05
- */
-public enum RpcClazz {
-    AppRpcClazz
-}

+ 0 - 23
common/src/main/java/cn/reghao/autodop/common/msg/rpc/dto/app/DeployParam.java

@@ -1,23 +0,0 @@
-package cn.reghao.autodop.common.msg.rpc.dto.app;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * 应用部署参数
- *
- * @author reghao
- * @date 2020-12-25 19:00:54
- */
-@Data
-public class DeployParam implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private String buildLogId;
-    private String packType;
-    private String appId;
-    private String packagePath;
-    private String startScript;
-    private String startHome;
-}

+ 0 - 27
common/src/main/java/cn/reghao/autodop/common/msg/rpc/dto/app/DeployResult.java

@@ -1,27 +0,0 @@
-package cn.reghao.autodop.common.msg.rpc.dto.app;
-
-import cn.reghao.jutil.jdk.result.Result;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.time.LocalDateTime;
-
-/**
- * @author reghao
- * @date 2021-05-28 13:48:01
- */
-@Data
-public class DeployResult implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private String buildLogId;
-    private String machineId;
-    private LocalDateTime deployTime;
-    private Result result;
-
-    public DeployResult(String buildLogId, String machineId) {
-        this.buildLogId = buildLogId;
-        this.machineId = machineId;
-        this.deployTime = LocalDateTime.now();
-    }
-}

+ 0 - 15
common/src/main/java/cn/reghao/autodop/common/msg/rpc/dto/app/PackType.java

@@ -1,15 +0,0 @@
-package cn.reghao.autodop.common.msg.rpc.dto.app;
-
-/**
- * 打包方式类型
- *
- * @author reghao
- * @date 2019-11-15 21:59:35
- */
-public enum PackType {
-    docker, zip, zipHttp;
-
-    public String getName() {
-        return this.name();
-    }
-}

+ 0 - 21
common/src/main/java/cn/reghao/autodop/common/msg/rpc/dto/app/StatusParam.java

@@ -1,21 +0,0 @@
-package cn.reghao.autodop.common.msg.rpc.dto.app;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * 单个 appId 参数,在调用 appStatusOps, appStartOps, appStopOps 以及 appRestartOps 等操作时传入的参数
- *
- * @author reghao
- * @date 2020-12-25 19:01:15
- */
-@AllArgsConstructor
-@Data
-public class StatusParam implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private String packType;
-    private String appId;
-}

+ 0 - 24
common/src/main/java/cn/reghao/autodop/common/msg/rpc/dto/app/StatusResult.java

@@ -1,24 +0,0 @@
-package cn.reghao.autodop.common.msg.rpc.dto.app;
-
-import lombok.Data;
-
-import java.io.Serializable;
-import java.time.LocalDateTime;
-
-/**
- * 应用运行状态
- *
- * @author reghao
- * @date 2021-02-22 16:24:08
- */
-@Data
-public class StatusResult implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    private String machineId;
-    private String appId;
-    private String commitId;
-    private String status;
-    private LocalDateTime startTime;
-    private Integer pid;
-}

+ 0 - 34
common/src/main/java/cn/reghao/autodop/common/util/ExceptionUtil.java

@@ -1,34 +0,0 @@
-package cn.reghao.autodop.common.util;
-
-/**
- * @author reghao
- * @date 2020-08-10 13:52:13
- */
-public class ExceptionUtil {
-    public static String errorMsg(Exception e) {
-        // TODO 记录栈跟踪
-        // TODO 记录 Hibernate 异常
-        String stackTrace = stackTrace(e);
-
-        StringBuilder sb = new StringBuilder();
-        sb.append(e.getMessage());
-        Throwable throwable = e.getCause();
-        if (throwable != null) {
-            sb.append(System.lineSeparator()).append(throwable.getMessage());
-        }
-
-        return sb.toString();
-    }
-
-    public static String stackTrace(Exception e) {
-        StringBuilder sb = new StringBuilder();
-        sb.append(e.toString()).append(System.lineSeparator());
-
-        StackTraceElement[] elements = e.getStackTrace();
-        for (StackTraceElement ele : elements) {
-            sb.append("\t").append(ele.toString()).append(System.lineSeparator());
-        }
-
-        return sb.toString();
-    }
-}

+ 0 - 164
common/src/main/java/cn/reghao/autodop/common/util/FileOps.java

@@ -1,164 +0,0 @@
-package cn.reghao.autodop.common.util;
-
-import cn.reghao.autodop.common.util.text.FileProcessor;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.io.FileUtils;
-
-import java.io.*;
-import java.nio.file.*;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.Objects;
-
-/**
- * 文件,目录操作类(新建,删除,复制,移动,清空)
- *
- * @author reghao
- * @date 2019-08-27 21:45:08
- */
-@Slf4j
-public class FileOps {
-    /**
-     * 将目录内的文件和子目录复制到另一个目录(非当前目录或其子目录)
-     *
-     * @param src 要复制的目录
-     * @param dst 目的目录(若不存在则新建)
-     * @return
-     * @date 2019-09-09 下午6:11
-     */
-    public static void copyDirContentToDir(String src, String dst) throws IOException {
-        File srcDir = new File(src);
-        if (!srcDir.exists() || srcDir.isFile()) {
-            log.error("{} -> 源目录不存在", src);
-            return;
-        }
-
-        File dstDir = new File(dst);
-        for (File file : Objects.requireNonNull(srcDir.listFiles())) {
-            if (file.isDirectory()) {
-                String dirname = file.getName();
-                File dstdir = new File(dst + File.separator + dirname);
-                FileUtils.copyDirectory(file, dstdir);
-            } else {
-                FileUtils.copyFileToDirectory(file, dstDir);
-            }
-        }
-    }
-
-    /**
-     * 将目录复制到另一个目录
-     *
-     * @param
-     * @return
-     * @date 2020-01-20 下午4:24
-     */
-    public static void copyDirToDir(String src, String dst) throws IOException {
-        File srcDir = new File(src);
-        if (!srcDir.exists() || srcDir.isFile()) {
-            log.error("{} -> 目录不存在", src);
-            return;
-        }
-
-        String dirname = srcDir.getName();
-        File dstDir = new File(dst + File.separator + dirname);
-        FileUtils.copyDirectory(srcDir, dstDir);
-    }
-
-    /**
-     * 创建目录,若目录存在则返回
-     *
-     * @param src 目录绝对路径
-     * @return true 创建空目录成功
-     * @date 2019-08-27 下午9:52
-     */
-    public static boolean mkdir(String src) {
-        File file = new File(src);
-        if (!file.exists() && file.mkdirs()) {
-            return true;
-        }
-
-        if (file.exists() && file.isDirectory()) {
-            return true;
-        }
-
-        return false;
-    }
-
-    public static boolean mkdirs(File dir) {
-        if (!dir.exists() && dir.mkdirs()) {
-            return true;
-        }
-
-        return dir.exists() && dir.isDirectory();
-    }
-
-    /**
-     * 提取一个绝对路径中的目录部分
-     *
-     * @param
-     * @return
-     * @date 2019-08-28 上午10:50
-     */
-    public static String dirPath(String path) {
-        int index = path.lastIndexOf(File.separator);
-        return path.substring(0, index);
-    }
-
-    /**
-     * 遍历并处理文本文件
-     *
-     * @param
-     * @return
-     * @date 2019-09-06 下午5:12
-     */
-    public static void traversal(String dirPath, FileProcessor processor) {
-        Path path = Paths.get(dirPath);
-        try {
-            Files.walkFileTree(path, new FileVisitor<Path>() {
-                @Override
-                public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
-                    return FileVisitResult.CONTINUE;
-                }
-
-                // 处理目录中的文件
-                @Override
-                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
-                    processor.process(file.toFile());
-
-                    return FileVisitResult.CONTINUE;
-                }
-
-                @Override
-                public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
-                    log.info("无法查看 {} ", file.toString());
-                    return FileVisitResult.CONTINUE;
-                }
-
-                @Override
-                public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
-                    return FileVisitResult.CONTINUE;
-                }
-            });
-        } catch (IOException ioe) {
-            ioe.printStackTrace();
-        }
-    }
-
-    public static void eraseDir(File dir) throws IOException {
-        if (!dir.exists() || dir.isFile()) {
-            log.info("{} -> 目录不存在", dir.getPath());
-            return;
-        }
-        FileUtils.cleanDirectory(dir);
-    }
-
-    /**
-     * 删除文件或目录
-     *
-     * @param
-     * @return
-     * @date 2021-06-17 下午9:14
-     */
-    public static boolean delete(File file) {
-        return FileUtils.deleteQuietly(file);
-    }
-}

+ 0 - 45
common/src/main/java/cn/reghao/autodop/common/util/IpAddressConverter.java

@@ -1,45 +0,0 @@
-package cn.reghao.autodop.common.util;
-
-/**
- * IP 地址转换
- *
- * @author reghao
- * @date 2019-10-26 22:44:16
- */
-public class IpAddressConverter {
-    /**
-     * 十六进制转换为点分十进制格式
-     *
-     * @param
-     * @return
-     * @date 2019-10-26 下午11:43
-     */
-    public String hex2dotDecimal(String hex) {
-        long decimal = Long.parseLong(hex, 16);
-        String binary = Long.toBinaryString(decimal);
-        int len = binary.length();
-        int size = 32;
-        if (len != size) {
-            StringBuilder sb = new StringBuilder();
-
-            int minus = size - len;
-            for (int i = 0; i < minus; i++) {
-                sb.append(0);
-            }
-            sb.append(binary);
-            binary = sb.toString();
-        }
-
-        String a = binary.substring(0, 8);
-        String b = binary.substring(8, 16);
-        String c = binary.substring(16, 24);
-        String d = binary.substring(24);
-
-        int a1 = Integer.parseInt(a, 2);
-        int b1 = Integer.parseInt(b, 2);
-        int c1 = Integer.parseInt(c, 2);
-        int d1 = Integer.parseInt(d, 2);
-
-        return d1 + ":" + c1 + ":" + b1 + ":"  + a1;
-    }
-}

+ 0 - 19
common/src/main/java/cn/reghao/autodop/common/util/NotAvailable.java

@@ -1,19 +0,0 @@
-package cn.reghao.autodop.common.util;
-
-/**
- * @author reghao
- * @date 2021-11-08 16:53:59
- */
-public enum NotAvailable {
-    na("N/A");
-
-    private String desc;
-
-    NotAvailable(String desc) {
-        this.desc = desc;
-    }
-
-    public String getDesc() {
-        return desc;
-    }
-}

+ 0 - 26
common/src/main/java/cn/reghao/autodop/common/util/PercentCalculator.java

@@ -1,26 +0,0 @@
-package cn.reghao.autodop.common.util;
-
-import java.text.DecimalFormat;
-
-/**
- * 百分比计算器
- *
- * @author reghao
- * @date 2019-10-29 12:54:28
- */
-public class PercentCalculator {
-    private static DecimalFormat df = new DecimalFormat("0.00");
-
-    public static double percentValue(long small, long big) {
-        return ((double)small / (double)big);
-    }
-
-    public static String percent(long small, long big) {
-        double value = ((double)small / (double)big);
-        return df.format(value * 100) + "%";
-    }
-
-    public static String percent(double value) {
-        return df.format(value * 100) + "%";
-    }
-}

+ 0 - 76
common/src/main/java/cn/reghao/autodop/common/util/compression/TarFiles.java

@@ -1,76 +0,0 @@
-package cn.reghao.autodop.common.util.compression;
-
-import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
-import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
-
-import java.io.*;
-
-/**
- * 归档
- *
- * @author reghao
- * @date 2020-01-14 10:51:48
- */
-public class TarFiles {
-    private static final int BUFSIZE = 1024;
-    private static String basePath = "";
-
-    public static void tar(String srcPath, String dstPath) throws IOException {
-        File srcFile = new File(srcPath);
-        File dstFile = new File(dstPath);
-
-        // 归档文件解开后不是一个目录
-        if (srcFile.isDirectory()) {
-            basePath = srcFile.getAbsolutePath();
-        }
-
-        TarArchiveOutputStream taos = new TarArchiveOutputStream(new FileOutputStream(dstFile));
-        taos.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX);
-        archive(basePath, srcFile, taos);
-        taos.flush();
-        taos.close();
-    }
-
-    /**
-     * @param
-     * @return
-     * @date 2020-01-14 上午10:53
-     */
-    public static void archive(String basePath, File srcFile, TarArchiveOutputStream taos) throws IOException {
-        if (srcFile.isDirectory()) {
-            archiveDir(basePath, srcFile, taos);
-        } else {
-            archiveFile(basePath, srcFile, taos);
-        }
-    }
-
-    public static void archiveDir(String basePath, File srcFile, TarArchiveOutputStream taos) throws IOException {
-        File[] files = srcFile.listFiles();
-        assert files != null;
-        if (files.length == 0) {
-            // 空目录
-            TarArchiveEntry entry = new TarArchiveEntry(srcFile.getAbsolutePath().split(basePath)[1] + "/");
-            taos.putArchiveEntry(entry);
-            taos.closeArchiveEntry();
-        }
-
-        for (File file : files) {
-            archive(basePath, file, taos);
-        }
-    }
-
-    public static void archiveFile(String basePath, File srcFile, TarArchiveOutputStream taos) throws IOException {
-        TarArchiveEntry entry = new TarArchiveEntry(srcFile.getAbsolutePath().split(basePath)[1]);
-        entry.setSize(srcFile.length());
-        taos.putArchiveEntry(entry);
-
-        BufferedInputStream in = new BufferedInputStream(new FileInputStream(srcFile));
-        int cnt;
-        byte[] data = new byte[BUFSIZE];
-        while ((cnt = in.read(data, 0, BUFSIZE)) != -1) {
-            taos.write(data, 0, cnt);
-        }
-        in.close();
-        taos.closeArchiveEntry();
-    }
-}

+ 0 - 175
common/src/main/java/cn/reghao/autodop/common/util/compression/ZipFiles.java

@@ -1,175 +0,0 @@
-package cn.reghao.autodop.common.util.compression;
-
-import cn.reghao.autodop.common.util.FileOps;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.*;
-import java.util.Arrays;
-import java.util.Objects;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-import java.util.zip.ZipOutputStream;
-
-/**
- * TODO: 提升压缩和解压性能
- *
- * @author reghao
- * @date 2019-08-27 17:47:36
- */
-@Slf4j
-public class ZipFiles {
-    /**
-     * 将目录压缩为一个文件
-     *
-     * @param
-     * @date 2019-08-28 上午12:42
-     */
-    public static void zip(String src, String dst) throws IOException {
-        // TODO: 判断 dst 是否为 src 的子目录
-        File srcFile = new File(src);
-        if (!srcFile.exists()) {
-            log.info("{} 不存在", src);
-            return;
-        }
-
-        String filePath;
-        if (dst.endsWith(".zip")) {
-            filePath = dst;
-        } else {
-            filePath = dst + ".zip";
-        }
-
-        File dstFile = new File(filePath);
-        if (dstFile.exists() && !dstFile.delete()) {
-            log.info("删除 {} 失败", dst);
-            return;
-        }
-
-        ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(dstFile));
-        zipFile(null, srcFile, zipOut);
-        zipOut.close();
-    }
-
-    /**
-     * 将目录中的文件压缩为一个文件
-     *
-     * @param
-     * @return
-     * @date 2020-03-11 下午11:12
-     */
-    public static void zip(File src, String dst) throws IOException {
-        // TODO: 判断 dst 是否为 src 的子目录
-        String filePath;
-        if (dst.endsWith(".zip")) {
-            filePath = dst;
-        } else {
-            filePath = dst + ".zip";
-        }
-
-        File dstFile = new File(filePath);
-        if (dstFile.exists() && !dstFile.delete()) {
-            log.info("删除 {} 失败", dst);
-            return;
-        }
-
-        ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(dstFile));
-        for (File file : Objects.requireNonNull(src.listFiles())) {
-            zipFile(null, file, zipOut);
-        }
-
-        zipOut.close();
-    }
-
-    /**
-     * 压缩
-     *
-     * @param
-     * @return
-     * @date 2019-08-28 上午12:42
-     */
-    private static void zipFile(String srcRoot, File file, ZipOutputStream zipOut) {
-        if (file == null || !file.exists()) {
-            return;
-        }
-
-        InputStream in;
-        try {
-            if (file.isFile()) {
-                if (srcRoot == null) {
-                    zipOut.putNextEntry(new ZipEntry(file.getName()));
-                } else {
-                    zipOut.putNextEntry(new ZipEntry(srcRoot + File.separator + file.getName()));
-                }
-
-                in = new FileInputStream(file);
-                int tmp;
-                while ((tmp = in.read()) != -1) {
-                    zipOut.write(tmp);
-                }
-                in.close();
-            } else if (file.isDirectory() && Objects.requireNonNull(file.listFiles()).length == 0) {
-                if (srcRoot == null) {
-                    zipOut.putNextEntry(new ZipEntry(file.getName() + File.separator));
-                } else {
-                    zipOut.putNextEntry(new ZipEntry(srcRoot + File.separator + file.getName() + File.separator));
-                }
-            } else {
-                File[] files = file.listFiles();
-                assert files != null;
-                Arrays.asList(files).forEach(file1 -> {
-                    if (srcRoot == null) {
-                        zipFile(file.getName(), file1, zipOut);
-                    } else {
-                        zipFile(srcRoot + File.separator + file.getName(), file1, zipOut);
-                    }
-                });
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * 解压到指定目录
-     *
-     * @param
-     * @return
-     * @date 2019-08-28 上午12:41
-     */
-    public static void unzip(String src, String dst) throws IOException {
-        File file = new File(src);
-        if (!file.exists()) {
-            log.info("{} 不存在", src);
-            return;
-        }
-
-        File dstFile = new File(dst);
-        if (!dstFile.exists()) {
-            FileOps.mkdir(dst);
-        }
-
-        java.util.zip.ZipFile zipFile = new java.util.zip.ZipFile(file);
-        ZipInputStream zipIn = new ZipInputStream(new FileInputStream(file));
-        ZipEntry entry;
-        while ((entry = zipIn.getNextEntry()) != null) {
-            String filePath = dst + File.separator + entry.getName();
-            String dir = FileOps.dirPath(filePath);
-            if (!new File(dir).exists()) {
-                FileOps.mkdir(dir);
-            }
-
-            File unzipFile = new File(filePath);
-            if (!unzipFile.isDirectory()) {
-                InputStream in = zipFile.getInputStream(entry);
-                OutputStream out = new FileOutputStream(unzipFile);
-
-                int tmp;
-                while ((tmp = in.read()) != -1) {
-                    out.write(tmp);
-                }
-                in.close();
-                out.close();
-            }
-        }
-    }
-}

+ 0 - 110
common/src/main/java/cn/reghao/autodop/common/util/jvm/JVM.java

@@ -1,110 +0,0 @@
-package cn.reghao.autodop.common.util.jvm;
-
-import cn.reghao.autodop.common.util.jvm.po.*;
-import cn.reghao.jutil.jdk.converter.DateTimeConverter;
-
-import java.lang.management.*;
-import java.util.*;
-
-/**
- * JVM 信息和状态
- *
- * @author reghao
- * @date 2020-09-10 18:31:16
- */
-public class JVM {
-    private final RuntimeMXBean rtBean;
-    private final ClassLoadingMXBean classLoadingBean;
-    private final ThreadMXBean threadBean;
-    private final MemoryMXBean memoryBean;
-    private final List<MemoryPoolMXBean> memoryPoolBeans;
-    private final List<BufferPoolMXBean> bufferPoolBeans;
-    private final List<GarbageCollectorMXBean> gcBeans;
-
-    public JVM() {
-        this.rtBean = ManagementFactory.getRuntimeMXBean();
-        this.classLoadingBean = ManagementFactory.getClassLoadingMXBean();
-        this.threadBean = ManagementFactory.getThreadMXBean();
-        this.memoryBean = ManagementFactory.getMemoryMXBean();
-        this.memoryPoolBeans = ManagementFactory.getMemoryPoolMXBeans();
-        this.bufferPoolBeans = ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class);
-        this.gcBeans = ManagementFactory.getGarbageCollectorMXBeans();
-    }
-
-    public JvmInfo info() {
-        JvmInfo jvmInfo = new JvmInfo();
-        jvmInfo.setOsName(System.getProperty("os.name"));
-        jvmInfo.setOsArch(System.getProperty("os.arch"));
-        jvmInfo.setOsVersion(System.getProperty("os.version"));
-
-        jvmInfo.setJavaRuntimeName(System.getProperty("java.runtime.name"));
-        jvmInfo.setJavaRuntimeVersion(System.getProperty("java.runtime.version"));
-        jvmInfo.setJavaClassVersion(System.getProperty("java.class.version"));
-
-        jvmInfo.setJvmName(System.getProperty("java.vm.name"));
-        jvmInfo.setJvmVersion(System.getProperty("java.vm.version"));
-        jvmInfo.setJvmVendor(System.getProperty("java.vm.vendor"));
-
-        // TODO pid 不一定准确
-        jvmInfo.setJvmPid(Integer.parseInt(rtBean.getName().split("@")[0]));
-        jvmInfo.setJvmStartTime(DateTimeConverter.msTimestampFormat(rtBean.getStartTime()));
-
-        return jvmInfo;
-    }
-
-    public JvmStat stat() {
-        JvmStat jvmStat = new JvmStat();
-        jvmStat.setJvmClassesLoaded(classLoadingBean.getLoadedClassCount());
-        jvmStat.setJvmClassesUnloaded(classLoadingBean.getUnloadedClassCount());
-        jvmStat.setJvmClassesTotal(classLoadingBean.getTotalLoadedClassCount());
-
-        MemoryStat heap = new MemoryStat(memoryBean.getHeapMemoryUsage());
-        jvmStat.setJvmMemoryHeapInit(heap.getInit());
-        jvmStat.setJvmMemoryHeapMax(heap.getMax());
-        jvmStat.setJvmMemoryHeapUsed(heap.getUsed());
-        jvmStat.setJvmMemoryHeapCommitted(heap.getCommitted());
-
-        MemoryStat nonheap = new MemoryStat(memoryBean.getNonHeapMemoryUsage());
-        jvmStat.setJvmMemoryNonheapInit(nonheap.getInit());
-        jvmStat.setJvmMemoryNonheapMax(nonheap.getMax());
-        jvmStat.setJvmMemoryNonheapUsed(nonheap.getUsed());
-        jvmStat.setJvmMemoryNonheapCommitted(nonheap.getCommitted());
-
-        jvmStat.setJvmBufferPools(bufferPoolStat());
-        jvmStat.setJvmMemoryPools(memoryPoolStat());
-        jvmStat.setJvmGarbageCollectors(gcStat());
-
-        jvmStat.setJvmThreadsLive(threadBean.getThreadCount());
-        jvmStat.setJvmThreadsDaemon(threadBean.getDaemonThreadCount());
-        jvmStat.setJvmThreadsPeak(threadBean.getPeakThreadCount());
-        jvmStat.setJvmThreads(threadStat());
-        return jvmStat;
-    }
-
-    private List<BufferPoolStat> bufferPoolStat() {
-        List<BufferPoolStat> list = new ArrayList<>();
-        bufferPoolBeans.forEach(bufferPoolBean -> list.add(new BufferPoolStat(bufferPoolBean)));
-        return list;
-    }
-
-    private Map<String, MemoryPoolStat> memoryPoolStat() {
-        Map<String, MemoryPoolStat> map = new HashMap<>();
-        memoryPoolBeans.forEach(
-                // TODO name 是否唯一?
-                memoryPoolBean -> map.put(memoryPoolBean.getName(), new MemoryPoolStat(memoryPoolBean)));
-        return map;
-    }
-
-    private List<GarbageCollectorStat> gcStat() {
-        List<GarbageCollectorStat> list = new ArrayList<>();
-        gcBeans.forEach(gcBean -> list.add(new GarbageCollectorStat(gcBean)));
-        return list;
-    }
-
-    private List<ThreadStat> threadStat() {
-        List<ThreadStat> list = new ArrayList<>();
-        Arrays.stream(threadBean.getThreadInfo(threadBean.getAllThreadIds()))
-                .forEach(threadInfo -> list.add(new ThreadStat(threadInfo)));
-        return list;
-    }
-}

+ 0 - 27
common/src/main/java/cn/reghao/autodop/common/util/jvm/po/BufferPoolStat.java

@@ -1,27 +0,0 @@
-package cn.reghao.autodop.common.util.jvm.po;
-
-import cn.reghao.jutil.jdk.converter.ByteConverter;
-import cn.reghao.jutil.jdk.converter.ByteType;
-import lombok.Data;
-
-import java.lang.management.BufferPoolMXBean;
-
-/**
- * @author reghao
- * @date 2020-10-21 15:49:56
- */
-@Data
-public class BufferPoolStat {
-    private String poolName;
-    private long bufferCount;
-    private String totalMemory;
-    private String usedMemory;
-
-    public BufferPoolStat(BufferPoolMXBean bufferPoolBean) {
-        ByteConverter converter = new ByteConverter();
-        this.poolName = bufferPoolBean.getName();
-        this.bufferCount = bufferPoolBean.getCount();
-        this.totalMemory = converter.convert(ByteType.Bytes, bufferPoolBean.getTotalCapacity());
-        this.usedMemory = converter.convert(ByteType.Bytes, bufferPoolBean.getMemoryUsed());
-    }
-}

+ 0 - 28
common/src/main/java/cn/reghao/autodop/common/util/jvm/po/GarbageCollectorStat.java

@@ -1,28 +0,0 @@
-package cn.reghao.autodop.common.util.jvm.po;
-
-import lombok.Data;
-
-import java.lang.management.GarbageCollectorMXBean;
-import java.util.Arrays;
-
-/**
- * @author reghao
- * @date 2020-10-21 15:49:56
- */
-@Data
-public class GarbageCollectorStat {
-    private String gcName;
-    // GC 管理的内存池
-    private String memoryPools;
-    // 自 JVM 启动后总共发生的 GC 次数
-    private long gcCount;
-    // 自 JVM 启动后 GC 总共耗费的时间
-    private long gcTime;
-
-    public GarbageCollectorStat(GarbageCollectorMXBean gcBean) {
-        this.gcName = gcBean.getName();
-        this.memoryPools = Arrays.toString(gcBean.getMemoryPoolNames()).replace("[", "").replace("]", "");
-        this.gcCount = gcBean.getCollectionCount();
-        this.gcTime = gcBean.getCollectionCount();
-    }
-}

+ 0 - 24
common/src/main/java/cn/reghao/autodop/common/util/jvm/po/JvmInfo.java

@@ -1,24 +0,0 @@
-package cn.reghao.autodop.common.util.jvm.po;
-
-import lombok.Data;
-
-/**
- * @author reghao
- * @date 2020-10-21 10:43:37
- */
-@Data
-public class JvmInfo {
-    private String osName;
-    private String osArch;
-    private String osVersion;
-
-    private String javaRuntimeName;
-    private String javaRuntimeVersion;
-    private String javaClassVersion;
-
-    private String jvmName;
-    private String jvmVersion;
-    private String jvmVendor;
-    private int jvmPid;
-    private String jvmStartTime;
-}

+ 0 - 39
common/src/main/java/cn/reghao/autodop/common/util/jvm/po/JvmStat.java

@@ -1,39 +0,0 @@
-package cn.reghao.autodop.common.util.jvm.po;
-
-import lombok.Data;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author reghao
- * @date 2020-10-22 15:06:29
- */
-@Data
-public class JvmStat {
-    /* 类加载情况 */
-    private long jvmClassesLoaded;
-    private long jvmClassesUnloaded;
-    private long jvmClassesTotal;
-
-    /* 堆区和非堆区总体内存使用情况 */
-    private String jvmMemoryHeapInit;
-    private String jvmMemoryHeapMax;
-    private String jvmMemoryHeapUsed;
-    private String jvmMemoryHeapCommitted;
-
-    private String jvmMemoryNonheapInit;
-    private String jvmMemoryNonheapMax;
-    private String jvmMemoryNonheapUsed;
-    private String jvmMemoryNonheapCommitted;
-
-    private List<BufferPoolStat> jvmBufferPools;
-    private Map<String, MemoryPoolStat> jvmMemoryPools;
-    private List<GarbageCollectorStat> jvmGarbageCollectors;
-
-    /* 线程使用情况 */
-    private int jvmThreadsLive;
-    private int jvmThreadsDaemon;
-    private int jvmThreadsPeak;
-    private List<ThreadStat> jvmThreads;
-}

+ 0 - 32
common/src/main/java/cn/reghao/autodop/common/util/jvm/po/MemoryPoolStat.java

@@ -1,32 +0,0 @@
-package cn.reghao.autodop.common.util.jvm.po;
-
-import lombok.Data;
-
-import java.lang.management.MemoryPoolMXBean;
-import java.lang.management.MemoryUsage;
-
-/**
- * @author reghao
- * @date 2020-10-21 15:49:56
- */
-@Data
-public class MemoryPoolStat {
-    private String poolName;
-    private String memoryType;
-    private MemoryStat poolUsage;
-    // 内存池峰值时的使用情况
-    private MemoryStat poolPeakUsage;
-    // 最近一次 GC 后的内存池的使用情况
-    private MemoryStat afterGcUsage;
-
-    public MemoryPoolStat(MemoryPoolMXBean memoryPoolBean) {
-        this.poolName = memoryPoolBean.getName();
-        this.memoryType = memoryPoolBean.getType().name();
-        this.poolUsage = new MemoryStat(memoryPoolBean.getUsage());
-        this.poolPeakUsage = new MemoryStat(memoryPoolBean.getPeakUsage());
-        MemoryUsage collectionMemoryUsage = memoryPoolBean.getCollectionUsage();
-        if (collectionMemoryUsage != null) {
-            this.afterGcUsage = new MemoryStat(collectionMemoryUsage);
-        }
-    }
-}

+ 0 - 27
common/src/main/java/cn/reghao/autodop/common/util/jvm/po/MemoryStat.java

@@ -1,27 +0,0 @@
-package cn.reghao.autodop.common.util.jvm.po;
-
-import cn.reghao.jutil.jdk.converter.ByteConverter;
-import cn.reghao.jutil.jdk.converter.ByteType;
-import lombok.Data;
-
-import java.lang.management.MemoryUsage;
-
-/**
- * @author reghao
- * @date 2020-10-21 15:49:56
- */
-@Data
-public class MemoryStat {
-    private String init;
-    private String max;
-    private String used;
-    private String committed;
-
-    public MemoryStat(MemoryUsage memoryUsage) {
-        ByteConverter convert = new ByteConverter();
-        this.init = convert.convertStr(ByteType.Bytes, ByteType.MiB, memoryUsage.getInit());
-        this.max = convert.convertStr(ByteType.Bytes, ByteType.MiB, memoryUsage.getMax());
-        this.used = convert.convertStr(ByteType.Bytes, ByteType.MiB, memoryUsage.getUsed());
-        this.committed = convert.convertStr(ByteType.Bytes, ByteType.MiB, memoryUsage.getCommitted());
-    }
-}

+ 0 - 36
common/src/main/java/cn/reghao/autodop/common/util/jvm/po/ThreadStat.java

@@ -1,36 +0,0 @@
-package cn.reghao.autodop.common.util.jvm.po;
-
-import lombok.Data;
-
-import java.lang.management.ThreadInfo;
-
-/**
- * @author reghao
- * @date 2020-10-21 17:31:47
- */
-@Data
-public class ThreadStat {
-    private String threadName;
-    private String threadState;
-    private long blockedTime;
-    private long blockedCount;
-    private long waitedTime;
-    private long waitedCount;
-    private String lockName;
-    private String lockOwnerName;
-    private int lockedMonitorCount;
-    private int lockedSynchronizerCount;
-
-    public ThreadStat(ThreadInfo threadInfo) {
-        this.threadName = threadInfo.getThreadName();
-        this.threadState = threadInfo.getThreadState().name();
-        this.blockedTime = threadInfo.getBlockedTime();
-        this.blockedCount = threadInfo.getBlockedCount();
-        this.waitedTime = threadInfo.getWaitedTime();
-        this.waitedCount = threadInfo.getWaitedCount();
-        this.lockName = threadInfo.getLockName();
-        this.lockOwnerName = threadInfo.getLockOwnerName();
-        this.lockedMonitorCount = threadInfo.getLockedMonitors().length;
-        this.lockedSynchronizerCount = threadInfo.getLockedSynchronizers().length;
-    }
-}

+ 0 - 13
common/src/main/java/cn/reghao/autodop/common/util/text/FileProcessor.java

@@ -1,13 +0,0 @@
-package cn.reghao.autodop.common.util.text;
-
-import java.io.File;
-
-/**
- * 文本处理器
- *
- * @author reghao
- * @date 2019-09-06 17:14:04
- */
-public interface FileProcessor {
-    void process(File file);
-}

+ 0 - 35
common/src/main/java/cn/reghao/autodop/common/util/text/ReplaceCharacter.java

@@ -1,35 +0,0 @@
-package cn.reghao.autodop.common.util.text;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import cn.reghao.jutil.jdk.text.TextFile;
-
-/**
- * 将 Windows 中的 \ 字符替换为 Linux 中的 / 字符
- *
- * @author reghao
- * @date 2019-09-06 17:16:23
- */
-public class ReplaceCharacter implements FileProcessor {
-    @Override
-    public void process(File file) {
-        String absolutePath = file.getPath();
-        if (!absolutePath.endsWith("csproj")) {
-            return;
-        }
-
-        TextFile textFile = new TextFile();
-        List<String> content = textFile.read(absolutePath);
-        List<String> tmp = new ArrayList<>();
-        content.forEach(line -> {
-            if (line.contains("\\")) {
-                tmp.add(line.replace("\\", "/"));
-            } else {
-                tmp.add(line);
-            }
-        });
-
-        textFile.write(absolutePath, tmp);
-    }
-}

+ 0 - 140
common/src/main/java/cn/reghao/autodop/common/util/thread/ThreadFactoryBuilder.java

@@ -1,140 +0,0 @@
-package cn.reghao.autodop.common.util.thread;
-
-import java.util.Locale;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * com.google.common.util.concurrent.ThreadFactoryBuilder
- *
- * @author reghao
- * @date 2021-09-15 10:57:44
- */
-public class ThreadFactoryBuilder {
-    private String nameFormat = null;
-    private Boolean daemon = null;
-    private Integer priority = null;
-    private Thread.UncaughtExceptionHandler uncaughtExceptionHandler = null;
-    private ThreadFactory backingThreadFactory = null;
-
-    /**
-     * Creates a new {@link ThreadFactory} builder.
-     */
-    public ThreadFactoryBuilder() {}
-
-    /**
-     * Sets the naming format to use when naming threads ({@link Thread#setName}) which are created
-     * with this ThreadFactory.
-     *
-     * @param nameFormat a {@link String#format(String, Object)}-compatible format String, to which
-     *     a unique integer (0, 1, etc.) will be supplied as the single parameter. This integer will
-     *     be unique to the built instance of the ThreadFactory and will be assigned sequentially. For
-     *     example, {@code "rpc-pool-%d"} will generate thread names like {@code "rpc-pool-0"},
-     *     {@code "rpc-pool-1"}, {@code "rpc-pool-2"}, etc.
-     * @return this for the builder pattern
-     */
-    public ThreadFactoryBuilder setNameFormat(String nameFormat) {
-        String unused = format(nameFormat, 0); // fail fast if the format is bad or null
-        this.nameFormat = nameFormat;
-        return this;
-    }
-
-    /**
-     * Sets daemon or not for new threads created with this ThreadFactory.
-     *
-     * @param daemon whether or not new Threads created with this ThreadFactory will be daemon threads
-     * @return this for the builder pattern
-     */
-    public ThreadFactoryBuilder setDaemon(boolean daemon) {
-        this.daemon = daemon;
-        return this;
-    }
-
-    /**
-     * Sets the priority for new threads created with this ThreadFactory.
-     *
-     * @param priority the priority for new Threads created with this ThreadFactory
-     * @return this for the builder pattern
-     */
-    public ThreadFactoryBuilder setPriority(int priority) {
-        // Thread#setPriority() already checks for validity. These error messages
-        // are nicer though and will fail-fast.
-        this.priority = priority;
-        return this;
-    }
-
-    /**
-     * Sets the {@link Thread.UncaughtExceptionHandler} for new threads created with this ThreadFactory.
-     *
-     * @param uncaughtExceptionHandler the uncaught exception handler for new Threads created with
-     *     this ThreadFactory
-     * @return this for the builder pattern
-     */
-    public ThreadFactoryBuilder setUncaughtExceptionHandler(
-            Thread.UncaughtExceptionHandler uncaughtExceptionHandler) {
-        this.uncaughtExceptionHandler = uncaughtExceptionHandler;
-        return this;
-    }
-
-    /**
-     * Sets the backing {@link ThreadFactory} for new threads created with this ThreadFactory. Threads
-     * will be created by invoking #newThread(Runnable) on this backing {@link ThreadFactory}.
-     *
-     * @param backingThreadFactory the backing {@link ThreadFactory} which will be delegated to during
-     *     thread creation.
-     * @return this for the builder pattern
-     *
-     *
-     */
-    public ThreadFactoryBuilder setThreadFactory(ThreadFactory backingThreadFactory) {
-        this.backingThreadFactory = backingThreadFactory;
-        return this;
-    }
-
-    /**
-     * Returns a new thread factory using the options supplied during the building process. After
-     * building, it is still possible to change the options used to build the ThreadFactory and/or
-     * build again. State is not shared amongst built instances.
-     *
-     * @return the fully constructed {@link ThreadFactory}
-     */
-    public ThreadFactory build() {
-        return build(this);
-    }
-
-    private static ThreadFactory build(ThreadFactoryBuilder builder) {
-        final String nameFormat = builder.nameFormat;
-        final Boolean daemon = builder.daemon;
-        final Integer priority = builder.priority;
-        final Thread.UncaughtExceptionHandler uncaughtExceptionHandler = builder.uncaughtExceptionHandler;
-        final ThreadFactory backingThreadFactory =
-                (builder.backingThreadFactory != null)
-                        ? builder.backingThreadFactory
-                        : Executors.defaultThreadFactory();
-        final AtomicLong count = (nameFormat != null) ? new AtomicLong(0) : null;
-        return new ThreadFactory() {
-            @Override
-            public Thread newThread(Runnable runnable) {
-                Thread thread = backingThreadFactory.newThread(runnable);
-                if (nameFormat != null) {
-                    thread.setName(format(nameFormat, count.getAndIncrement()));
-                }
-                if (daemon != null) {
-                    thread.setDaemon(daemon);
-                }
-                if (priority != null) {
-                    thread.setPriority(priority);
-                }
-                if (uncaughtExceptionHandler != null) {
-                    thread.setUncaughtExceptionHandler(uncaughtExceptionHandler);
-                }
-                return thread;
-            }
-        };
-    }
-
-    private static String format(String format, Object args) {
-        return String.format(Locale.ROOT, format, args);
-    }
-}

+ 0 - 48
common/src/main/java/cn/reghao/autodop/common/util/thread/ThreadPoolWrapper.java

@@ -1,48 +0,0 @@
-package cn.reghao.autodop.common.util.thread;
-
-import java.util.concurrent.*;
-
-/**
- * 线程池包装类
- *
- * @author reghao
- * @date 2019-11-12 16:39:45
- */
-public class ThreadPoolWrapper {
-    /**
-     * 获取一个线程池
-     *
-     * @param name 线程池名字
-     * @return 线程池
-     * @date 2019-11-12 下午4:42
-     */
-    public static ExecutorService threadPool(String name) {
-        ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat(name + "-pool-%d").build();
-
-        return new ThreadPoolExecutor(16, 32, 200L,
-                TimeUnit.MILLISECONDS,
-                new LinkedBlockingQueue<>(32),
-                namedThreadFactory,
-                new ThreadPoolExecutor.AbortPolicy());
-    }
-
-    public static ScheduledExecutorService scheduledThreadPool(String name, int size) {
-        ThreadFactory namedThreadFactory =
-                new ThreadFactoryBuilder().setNameFormat(name + "-scheduled-pool-%d").build();
-        return new ScheduledThreadPoolExecutor(size, namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
-    }
-
-    public static void shutdownScheduler(ScheduledExecutorService scheduler) {
-        scheduler.shutdown();
-        int count = 1;
-        int max = 30;
-        while (count < max && !scheduler.isTerminated()) {
-            try {
-                Thread.sleep(1_000);
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            }
-            count++;
-        }
-    }
-}

+ 23 - 0
common/src/main/java/cn/reghao/devops/common/docker/Docker.java

@@ -0,0 +1,23 @@
+package cn.reghao.devops.common.docker;
+
+import cn.reghao.devops.common.docker.po.Config;
+import com.github.dockerjava.api.command.InspectContainerResponse;
+
+/**
+ * Docker 客户端
+ *
+ * @author reghao
+ * @date 2021-10-27 04:17:38
+ */
+public interface Docker {
+    void build(String repoTag, String compileHome, String dockerfileContent) throws DockerException;
+    void push(String image) throws DockerException;
+    void pull(String repoTag) throws DockerException;
+    String getContainerIdByName(String containerName) throws DockerException;
+    void stopAndDelete(String containerName) throws DockerException;
+    String createAndRun(String containerName, Config config) throws DockerException;
+    void start(String containerId);
+    void restart(String containerId);
+    void stop(String containerId);
+    InspectContainerResponse inspectContainer(String containerId);
+}

+ 11 - 0
common/src/main/java/cn/reghao/devops/common/docker/DockerException.java

@@ -0,0 +1,11 @@
+package cn.reghao.devops.common.docker;
+
+/**
+ * @author reghao
+ * @date 2020-01-19 14:53:34
+ */
+public class DockerException extends Exception {
+    public DockerException(String msg) {
+        super(msg);
+    }
+}

+ 213 - 0
common/src/main/java/cn/reghao/devops/common/docker/DockerImpl.java

@@ -0,0 +1,213 @@
+package cn.reghao.devops.common.docker;
+
+import cn.reghao.devops.common.docker.po.Config;
+import cn.reghao.devops.common.util.ExceptionUtil;
+import cn.reghao.jutil.jdk.text.TextFile;
+import com.github.dockerjava.api.DockerClient;
+import com.github.dockerjava.api.command.*;
+import com.github.dockerjava.api.model.Container;
+import com.github.dockerjava.api.model.HostConfig;
+import com.github.dockerjava.api.model.RestartPolicy;
+import com.github.dockerjava.core.DefaultDockerClientConfig;
+import com.github.dockerjava.core.DockerClientConfig;
+import com.github.dockerjava.core.DockerClientImpl;
+import com.github.dockerjava.core.command.PushImageResultCallback;
+import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
+import com.github.dockerjava.transport.DockerHttpClient;
+
+import java.io.File;
+import java.io.IOException;
+import java.time.Duration;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * Docker 客户端
+ *
+ * @author reghao
+ * @date 2021-10-27 03:41:38
+ */
+public class DockerImpl implements Docker {
+    private final DockerClient dockerClient;
+    private final TextFile textFile = new TextFile();
+
+    public DockerImpl() {
+        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
+                .withDockerHost("unix:///var/run/docker.sock")
+                .withDockerTlsVerify(false)
+                //.withDockerCertPath("/home/user/.docker")
+                //.withRegistryUsername(registryUser)
+                //.withRegistryPassword(registryPass)
+                //.withRegistryEmail(registryMail)
+                //.withRegistryUrl(registryUrl)
+                .build();
+
+        DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
+                .dockerHost(config.getDockerHost())
+                .sslConfig(config.getSSLConfig())
+                .maxConnections(100)
+                .connectionTimeout(Duration.ofSeconds(30))
+                .responseTimeout(Duration.ofSeconds(45))
+                .build();
+
+        this.dockerClient = DockerClientImpl.getInstance(config, httpClient);
+    }
+
+    @Override
+    public void build(String repoTag, String compileHome, String dockerfileContent) throws DockerException {
+        File dockerfile = new File(compileHome + "/Dockerfile.tmp");
+        String[] arr = repoTag.split(":");
+        try {
+            textFile.write(dockerfile, dockerfileContent);
+            // TODO 需要判断构建成功与否,FROM 中的镜像不存在时并不会抛出异常
+            dockerClient.buildImageCmd()
+                    .withDockerfile(dockerfile)
+                    // 格式为 docker.reghao.cn/devops/manager:12345678
+                    .withTags(Set.of(repoTag))
+                    .exec(new BuildImageResultCallback()).awaitCompletion();
+        } catch (IOException | InterruptedException e) {
+            throw new DockerException(ExceptionUtil.errorMsg(e));
+        }
+    }
+
+    @Override
+    public void push(String image) throws DockerException {
+        try {
+            dockerClient.pushImageCmd(image).exec(new PushImageResultCallback()).awaitCompletion();
+        } catch (InterruptedException e) {
+            throw new DockerException(ExceptionUtil.errorMsg(e));
+        }
+        /*dockerClient.pushImageCmd(image).exec(new ResultCallback<PushResponseItem>() {
+            @Override
+            public void onStart(Closeable closeable) {
+
+            }
+
+            @Override
+            public void onNext(PushResponseItem object) {
+                System.out.println(object.getStatus());
+            }
+
+            @Override
+            public void onError(Throwable throwable) {
+
+            }
+
+            @Override
+            public void onComplete() {
+
+            }
+
+            @Override
+            public void close() throws IOException {
+
+            }
+        }).onComplete();*/
+    }
+
+    @Override
+    public void pull(String image) throws DockerException {
+        try {
+            dockerClient.pullImageCmd(image).exec(new PullImageResultCallback()).awaitCompletion();
+        } catch (InterruptedException e) {
+            throw new DockerException(ExceptionUtil.errorMsg(e));
+        }
+        /*dockerClient.pullImageCmd(image).exec(new ResultCallback<PullResponseItem>() {
+            public void onStart(Closeable closeable) {
+                System.out.println("开始下载!");
+            }
+
+            public void onNext(PullResponseItem object) {
+                // 实时显示出下载信息
+                System.out.println(object.getStatus());
+            }
+
+            public void onError(Throwable throwable) {
+                throwable.printStackTrace();
+            }
+
+            public void onComplete() {
+                System.out.println("下载完毕!");
+            }
+
+            public void close() throws IOException {
+                System.out.println("下载完毕...");
+            }
+        }).onComplete();*/
+    }
+
+    @Override
+    public String getContainerIdByName(String containerName) {
+        List<Container> list = dockerClient.listContainersCmd()
+                .withShowAll(true)
+                .withNameFilter(List.of(containerName))
+                .exec();
+
+        for (Container container : list) {
+            if (Arrays.stream(container.getNames()).collect(Collectors.toSet()).contains("/"+containerName)) {
+                return container.getId();
+            }
+        }
+
+        return null;
+    }
+
+    @Override
+    public void stopAndDelete(String containerName) {
+        String containerId = getContainerIdByName(containerName);
+        if (containerId != null) {
+            InspectContainerResponse containerInfo = inspectContainer(containerId);
+            InspectContainerResponse.ContainerState state = containerInfo.getState();
+            boolean isRunning = state.getRunning() != null ? state.getRunning() : false;
+            if (isRunning) {
+                dockerClient.stopContainerCmd(containerId).exec();
+            }
+            dockerClient.removeContainerCmd(containerId).exec();
+        }
+    }
+
+    @Override
+    public String createAndRun(String containerName, Config config) throws DockerException {
+        stopAndDelete(containerName);
+
+        HostConfig hostConfig = HostConfig.newHostConfig()
+                .withNetworkMode("host")
+                .withRestartPolicy(RestartPolicy.onFailureRestart(3));
+        String image = config.getImage();
+        CreateContainerCmd createContainerCmd = dockerClient.createContainerCmd(image)
+                .withName(containerName)
+                .withHostConfig(hostConfig);
+
+        List<String> env = config.getEnv();
+        if (env != null) {
+            createContainerCmd.withEnv(env);
+        }
+
+        CreateContainerResponse response = createContainerCmd.exec();
+        String containerId1 = response.getId();
+        dockerClient.startContainerCmd(containerId1).exec();
+        return containerId1;
+    }
+
+    @Override
+    public InspectContainerResponse inspectContainer(String containerId) {
+        return dockerClient.inspectContainerCmd(containerId).exec();
+    }
+
+    @Override
+    public void restart(String containerId) {
+        dockerClient.restartContainerCmd(containerId).exec();
+    }
+
+    @Override
+    public void stop(String containerId) {
+        dockerClient.stopContainerCmd(containerId).exec();
+    }
+
+    @Override
+    public void start(String containerId) {
+        dockerClient.startContainerCmd(containerId).exec();
+    }
+}

+ 46 - 0
common/src/main/java/cn/reghao/devops/common/docker/po/Config.java

@@ -0,0 +1,46 @@
+package cn.reghao.devops.common.docker.po;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * docker 容器创建时的配置
+ *
+ * @author reghao
+ * @date 2020-01-14 23:11:21
+ */
+@Data
+public class Config {
+    @SerializedName("AttachStderr") private boolean attachStderr;
+    @SerializedName("AttachStdin") private boolean attachStdin;
+    @SerializedName("AttachStdout") private boolean attachStdout;
+    @SerializedName("Cmd") private List<String> cmd;
+    @SerializedName("Domainname") private String domainname;
+    @SerializedName("Env") private List<String> env;
+    @SerializedName("Healthcheck") private Healthcheck healthcheck;
+    @SerializedName("Hostname") private String hostname;
+    @SerializedName("Image") private String image;
+    @SerializedName("Labels") private Labels labels;
+    @SerializedName("MacAddress") private String macAddress;
+    @SerializedName("NetworkDisabled") private boolean networkDisabled;
+    @SerializedName("OpenStdin") private boolean openStdin;
+    @SerializedName("StdinOnce") private boolean stdinOnce;
+    @SerializedName("Tty") private boolean tty;
+    @SerializedName("User") private String user;
+    @SerializedName("Volumes") private Volumes volumes;
+    @SerializedName("WorkingDir") private String workingDir;
+    @SerializedName("StopSignal") private String stopSignal;
+    @SerializedName("StopTimeout") private int stopTimeout;
+
+    @SerializedName("Entrypoint") private String entrypoint;
+    @SerializedName("ExposedPorts") private ExposedPorts exposedPorts;
+    @SerializedName("HostConfig") private HostConfig hostConfig;
+    @SerializedName("NetworkingConfig") private NetworkingConfig networkingConfig;
+
+    public Config(String image) {
+        this.image = image;
+        this.hostConfig = new HostConfig();
+    }
+}

+ 18 - 0
common/src/main/java/cn/reghao/devops/common/docker/po/Data.java

@@ -0,0 +1,18 @@
+package cn.reghao.devops.common.docker.po;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2020-05-19 20:50:24
+ */
+@Getter
+@Setter
+public class Data {
+    @SerializedName("LowerDir") private String lowerDir;
+    @SerializedName("MergedDir") private String mergedDir;
+    @SerializedName("UpperDir") private String upperDir;
+    @SerializedName("WorkDir") private String workDir;
+}

+ 11 - 0
common/src/main/java/cn/reghao/devops/common/docker/po/ExposedPorts.java

@@ -0,0 +1,11 @@
+package cn.reghao.devops.common.docker.po;
+
+import lombok.Data;
+
+/**
+ * @author reghao
+ * @date 2021-02-10 01:30:17
+ */
+@Data
+public class ExposedPorts {
+}

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio