Bläddra i källkod

dmaster 和 dagent 都已部署到测试环境

reghao 5 år sedan
förälder
incheckning
50d20aacb1
89 ändrade filer med 765 tillägg och 1136 borttagningar
  1. 2 2
      common/src/main/java/cn/reghao/autodop/common/dagent/machine/hardware/disk/Disk.java
  2. 1 1
      common/src/main/java/cn/reghao/autodop/common/dagent/machine/hardware/disk/DiskInfo.java
  3. 1 1
      common/src/main/java/cn/reghao/autodop/common/log/LoggerConfig.java
  4. 1 1
      dagent/src/main/java/cn/reghao/autodop/dagent/machine/HeartbeatJob.java
  5. 1 1
      dagent/src/main/java/cn/reghao/autodop/dagent/machine/MachineScheduler.java
  6. 1 2
      dagent/src/main/java/cn/reghao/autodop/dagent/mqttsub/AppOpsDispatcher.java
  7. 1 1
      dagent/src/main/java/cn/reghao/autodop/dagent/mqttsub/DmasterMessageDispatcher.java
  8. 1 1
      dagent/src/main/java/cn/reghao/autodop/dagent/mqttsub/MachineOpsDispatcher.java
  9. 4 4
      dagent/src/main/java/cn/reghao/autodop/dagent/utils/DagentLifecycle.java
  10. 3 7
      dagent/src/main/resources/application-test.yml
  11. 32 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/crud/AppConfigController.java
  12. 0 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/BuildConfig.java
  13. 0 44
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/status/BuildDeployApp.java
  14. 57 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppBakService.java
  15. 4 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/AppIntegrate.java
  16. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/BuilderUtil.java
  17. 23 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/BuildConfig.java
  18. 0 112
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/controller/App3CrudController.java
  19. 0 53
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/controller/App3OpsController.java
  20. 0 29
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/entity/App3.java
  21. 0 24
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/entity/App3Bak.java
  22. 0 22
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/entity/App3BakLog.java
  23. 0 13
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/repository/App3BakLogRepository.java
  24. 0 19
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/repository/App3BakRepository.java
  25. 0 19
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/repository/App3Repository.java
  26. 0 65
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/scheduler/BackupScheduler.java
  27. 0 57
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/scheduler/ScriptBakJob.java
  28. 0 29
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/service/App3OpsService.java
  29. 0 30
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/service/backup/BakRestore.java
  30. 0 30
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/service/backup/BakRestoreImpl.java
  31. 0 73
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/service/crud/App3BakCrudService.java
  32. 0 45
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/service/crud/App3BakLogCrudService.java
  33. 0 67
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/service/crud/App3CrudService.java
  34. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/config/CachingConfig.java
  35. 24 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/config/LocalBuildDir.java
  36. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/config/OssProperties.java
  37. 0 16
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/config/SysConfig.java
  38. 0 14
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/config/WebMvcConfig.java
  39. 0 37
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/db/MongoCrud.java
  40. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/orm/BaseEntity.java
  41. 21 13
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/controller/MachinePageController.java
  42. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/controller/crud/MachineCrudController.java
  43. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/entity/CpuInfo.java
  44. 5 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/entity/MachineInfo.java
  45. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/entity/OsInfo.java
  46. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/repository/MachineInfoRepository.java
  47. 2 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/controller/MonitorController.java
  48. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/EngToChn.java
  49. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/HealthCheck.java
  50. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/HealthCheckJob.java
  51. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/HealthCheckScheduler.java
  52. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MonitorScheduler.java
  53. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MonitorService.java
  54. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/AppOpsDispatcher.java
  55. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/DagentMessageDispatcher.java
  56. 3 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/MachineOpsDispatcher.java
  57. 0 59
      dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/FileController.java
  58. 76 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/controller/SysPageController.java
  59. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/controller/TestController.java
  60. 68 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/service/BakService.java
  61. 21 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/service/SysConfig.java
  62. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/AliOss.java
  63. 52 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/UploadDownload.java
  64. 14 21
      dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/lifecycle/AfterAppStart.java
  65. 0 35
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/AppPagesController.java
  66. 0 82
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/SystemPageController.java
  67. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/controller/GuestController.java
  68. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/controller/StorageController.java
  69. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/entity/GuestInfo.java
  70. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/entity/PoolInfo.java
  71. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/entity/VolumeInfo.java
  72. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/service/kvm/Guest.java
  73. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/service/kvm/Network.java
  74. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/service/kvm/Storage.java
  75. 8 2
      dmaster/src/main/resources/application-dev.yml
  76. 7 1
      dmaster/src/main/resources/application-prod.yml
  77. 7 1
      dmaster/src/main/resources/application-test.yml
  78. 2 8
      dmaster/src/main/resources/application.yml
  79. 5 3
      dmaster/src/main/resources/static/js/main.js
  80. 6 1
      dmaster/src/main/resources/templates/app/config/app/index.html
  81. 7 6
      dmaster/src/main/resources/templates/home/index.html
  82. 107 0
      dmaster/src/main/resources/templates/machine/detail.html
  83. 76 0
      dmaster/src/main/resources/templates/machine/host.bak.html
  84. 38 18
      dmaster/src/main/resources/templates/machine/host.html
  85. 1 1
      dmaster/src/main/resources/templates/main.html
  86. 7 7
      dmaster/src/main/resources/templates/sys/bak.html
  87. 39 0
      dmaster/src/test/java/cn/reghao/autodop/common/amqp/Test.java
  88. 1 0
      scripts/build.sh
  89. 2 2
      scripts/svn_post_commit

+ 2 - 2
common/src/main/java/cn/reghao/autodop/common/dagent/machine/hardware/disk/Disk.java

@@ -37,13 +37,13 @@ public class Disk {
                     String fsType = fileStore.type();
 
                     DiskInfo diskInfo = new DiskInfo();
+                    diskInfo.setMountedOn(mountedOn);
                     // TODO 尚未实现
-                    diskInfo.setDiskPath("");
+                    diskInfo.setDiskPath("/dev/sda1");
                     diskInfo.setFsType(fsType);
                     diskInfo.setSize(size);
                     diskInfo.setUsed(used);
                     diskInfo.setAvail(avail);
-                    diskInfo.setMountedOn(mountedOn);
                     diskInfo.setInodeTotal(0);
                     diskInfo.setInodeFree(0);
                     list.add(diskInfo);

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

@@ -11,11 +11,11 @@ import lombok.Data;
 @Data
 public class DiskInfo {
     private String diskPath;
+    private String mountedOn;
     private String fsType;
     private String size;
     private String used;
     private String avail;
-    private String mountedOn;
     private int inodeTotal;
     private int inodeFree;
 }

+ 1 - 1
dagent/src/main/java/cn/reghao/autodop/dagent/utils/log/LoggerConfig.java → common/src/main/java/cn/reghao/autodop/common/log/LoggerConfig.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dagent.utils.log;
+package cn.reghao.autodop.common.log;
 
 import ch.qos.logback.classic.Level;
 import ch.qos.logback.classic.Logger;

+ 1 - 1
dagent/src/main/java/cn/reghao/autodop/dagent/machine/timer/HeartbeatJob.java → dagent/src/main/java/cn/reghao/autodop/dagent/machine/HeartbeatJob.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dagent.machine.timer;
+package cn.reghao.autodop.dagent.machine;
 
 import cn.reghao.autodop.common.message.AsyncMsg;
 import cn.reghao.autodop.common.message.MessageType;

+ 1 - 1
dagent/src/main/java/cn/reghao/autodop/dagent/machine/timer/MachineScheduler.java → dagent/src/main/java/cn/reghao/autodop/dagent/machine/MachineScheduler.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dagent.machine.timer;
+package cn.reghao.autodop.dagent.machine;
 
 import cn.reghao.autodop.common.dagent.machine.Machine;
 import cn.reghao.autodop.common.mqtt.MqttPub;

+ 1 - 2
dagent/src/main/java/cn/reghao/autodop/dagent/dispatcher/AppOpsDispatcher.java → dagent/src/main/java/cn/reghao/autodop/dagent/mqttsub/AppOpsDispatcher.java

@@ -1,11 +1,10 @@
-package cn.reghao.autodop.dagent.dispatcher;
+package cn.reghao.autodop.dagent.mqttsub;
 
 import cn.reghao.autodop.common.message.AsyncMsg;
 import cn.reghao.autodop.common.message.CallResult;
 import cn.reghao.autodop.common.message.MessageType;
 import cn.reghao.autodop.common.message.AppOps;
 import cn.reghao.autodop.common.mqtt.MqttPub;
-import cn.reghao.autodop.common.utils.MachineId;
 import cn.reghao.autodop.common.utils.serializer.JsonConverter;
 import cn.reghao.autodop.dagent.app.App;
 import lombok.extern.slf4j.Slf4j;

+ 1 - 1
dagent/src/main/java/cn/reghao/autodop/dagent/dispatcher/DmasterMessageDispatcher.java → dagent/src/main/java/cn/reghao/autodop/dagent/mqttsub/DmasterMessageDispatcher.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dagent.dispatcher;
+package cn.reghao.autodop.dagent.mqttsub;
 
 import cn.reghao.autodop.common.message.AsyncMsg;
 import cn.reghao.autodop.common.message.MessageType;

+ 1 - 1
dagent/src/main/java/cn/reghao/autodop/dagent/dispatcher/MachineOpsDispatcher.java → dagent/src/main/java/cn/reghao/autodop/dagent/mqttsub/MachineOpsDispatcher.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dagent.dispatcher;
+package cn.reghao.autodop.dagent.mqttsub;
 
 import cn.reghao.autodop.common.dagent.machine.Machine;
 import cn.reghao.autodop.common.message.*;

+ 4 - 4
dagent/src/main/java/cn/reghao/autodop/dagent/utils/DagentLifecycle.java

@@ -7,10 +7,10 @@ import cn.reghao.autodop.common.message.MachineOps;
 import cn.reghao.autodop.common.mqtt.MqttPub;
 import cn.reghao.autodop.common.mqtt.MqttSub;
 import cn.reghao.autodop.common.utils.serializer.JsonConverter;
-import cn.reghao.autodop.dagent.dispatcher.DmasterMessageDispatcher;
-import cn.reghao.autodop.dagent.machine.timer.HeartbeatJob;
-import cn.reghao.autodop.dagent.machine.timer.MachineScheduler;
-import cn.reghao.autodop.dagent.utils.log.LoggerConfig;
+import cn.reghao.autodop.dagent.mqttsub.DmasterMessageDispatcher;
+import cn.reghao.autodop.dagent.machine.HeartbeatJob;
+import cn.reghao.autodop.dagent.machine.MachineScheduler;
+import cn.reghao.autodop.common.log.LoggerConfig;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.paho.client.mqttv3.MqttException;
 import org.quartz.SchedulerException;

+ 3 - 7
dagent/src/main/resources/application-test.yml

@@ -1,8 +1,4 @@
-#mosquitto:
-#  broker: tcp://192.168.0.220:1883
-#  username: test
-#  password: Test@123456
 mosquitto:
-  broker: tcp://localhost:1883
-  username: dev
-  password: Dev@123456
+  broker: tcp://192.168.0.220:1883
+  username: test
+  password: Test@123456

+ 32 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/crud/AppConfigController.java

@@ -1,10 +1,12 @@
 package cn.reghao.autodop.dmaster.app.controller.crud;
 
+import cn.reghao.autodop.common.utils.serializer.JsonConverter;
 import cn.reghao.autodop.dmaster.app.entity.NewApp;
 import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.entity.config.ProjOrchestration;
 import cn.reghao.autodop.dmaster.app.validator.AppOrchestrationValidator;
 import cn.reghao.autodop.dmaster.app.validator.NewAppValidator;
+import cn.reghao.autodop.dmaster.utils.UploadDownload;
 import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.dmaster.app.db.config.AppCrudService;
 import cn.reghao.autodop.dmaster.app.db.config.ProjCrudService;
@@ -15,8 +17,13 @@ import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
-import java.util.ArrayList;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 
 /**
@@ -30,10 +37,14 @@ import java.util.List;
 public class AppConfigController {
     private AppCrudService appCrudService;
     private ProjCrudService projCrudService;
+    private UploadDownload uploadDownload;
 
-    public AppConfigController(AppCrudService appCrudService, ProjCrudService projCrudService) {
+    public AppConfigController(AppCrudService appCrudService,
+                               ProjCrudService projCrudService,
+                               UploadDownload uploadDownload) {
         this.appCrudService = appCrudService;
         this.projCrudService = projCrudService;
+        this.uploadDownload = uploadDownload;
     }
 
     /* 应用编排 */
@@ -44,6 +55,25 @@ public class AppConfigController {
         return ResponseEntity.ok().body(WebBody.success());
     }
 
+    @ApiOperation(value = "导出 JSON 数据")
+    @GetMapping("/export")
+    @ResponseBody
+    public void dataBackup(HttpServletResponse response) throws IOException {
+        String json = "";
+        ByteArrayInputStream bytesIn = new ByteArrayInputStream(json.getBytes());
+        BufferedInputStream bis = new BufferedInputStream(bytesIn);
+        uploadDownload.download(bis, response);
+    }
+
+    @ApiOperation(value = "导入 JSON 数据")
+    @PostMapping("/import")
+    public String dataRestore(@RequestParam("file") MultipartFile file) throws IOException {
+        byte[] bytes = file.getBytes();
+        String json = new String(bytes, StandardCharsets.UTF_8);
+        AppOrchestration app = JsonConverter.jsonToObject(json, AppOrchestration.class);
+        return WebBody.success();
+    }
+
     @ApiOperation(value = "复制应用编排")
     @PostMapping(value = "/app/copy/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
     public ResponseEntity<String> copyAppOrchestration(@PathVariable("id") AppOrchestration app,

+ 0 - 9
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/BuildConfig.java

@@ -1,9 +0,0 @@
-package cn.reghao.autodop.dmaster.app.entity.config.build;
-
-/**
- * @author reghao
- * @date 2020-05-13 16:40:22
- */
-@Deprecated
-public class BuildConfig {
-}

+ 0 - 44
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/status/BuildDeployApp.java

@@ -1,44 +0,0 @@
-package cn.reghao.autodop.dmaster.app.entity.status;
-
-import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import javax.persistence.*;
-import java.time.LocalDateTime;
-
-/**
- * 需要构建部署的应用,是 AppOrchestration 的一个镜像,跟随 AppOrchestration 的变化而改变
- *
- * @author reghao
- * @date 2020-05-20 22:09:53
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-@Entity
-@Deprecated
-public class BuildDeployApp extends BaseEntity<Integer> {
-    @Column(nullable = false, unique = true)
-    private String appId;
-    @Column(nullable = false)
-    private String appType;
-    @Column(nullable = false)
-    private String env;
-    @Column(nullable = false)
-    private boolean enable;
-    private String commitId;
-    private LocalDateTime commitTime;
-    private String bdType;
-    private LocalDateTime bdTime;
-    // 0 - 成功 1 - 失败 2 - 尚未构建
-    private Integer statusCode;
-    private String result;
-
-    public BuildDeployApp vo() {
-        this.setId(null);
-        this.setIsDelete(null);
-        this.setCreateTime(null);
-        this.setUpdateTime(null);
-        return this;
-    }
-}

+ 57 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppBakService.java

@@ -0,0 +1,57 @@
+package cn.reghao.autodop.dmaster.app.service;
+
+import cn.reghao.autodop.common.utils.serializer.JsonConverter;
+import cn.reghao.autodop.dmaster.app.entity.config.build.BuildDir;
+import cn.reghao.autodop.dmaster.app.entity.config.build.CompilerConfig;
+import cn.reghao.autodop.dmaster.app.entity.config.build.PackerConfig;
+import cn.reghao.autodop.dmaster.app.entity.config.build.RepoAuthConfig;
+import cn.reghao.autodop.dmaster.app.repository.config.AppOrchestrationRepository;
+import cn.reghao.autodop.dmaster.app.repository.config.ProjOrchestrationRepository;
+import cn.reghao.autodop.dmaster.app.repository.config.build.BuildDirRepository;
+import cn.reghao.autodop.dmaster.app.repository.config.build.CompilerConfigRepository;
+import cn.reghao.autodop.dmaster.app.repository.config.build.PackerConfigRepository;
+import cn.reghao.autodop.dmaster.app.repository.config.build.RepoAuthConfigRepository;
+import cn.reghao.autodop.dmaster.app.vo.BuildConfig;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2021-06-04 10:01:41
+ */
+@Service
+public class AppBakService {
+    private BuildDirRepository buildDirRepository;
+    private RepoAuthConfigRepository repoAuthRepository;
+    private CompilerConfigRepository compilerRepository;
+    private PackerConfigRepository packerRepository;
+    private AppOrchestrationRepository appRepository;
+    private ProjOrchestrationRepository projRepository;
+
+    public AppBakService(BuildDirRepository buildDirRepository,
+                         RepoAuthConfigRepository repoAuthRepository,
+                         CompilerConfigRepository compilerRepository,
+                         PackerConfigRepository packerRepository,
+                         AppOrchestrationRepository appRepository,
+                         ProjOrchestrationRepository projRepository) {
+        this.buildDirRepository = buildDirRepository;
+        this.repoAuthRepository = repoAuthRepository;
+        this.compilerRepository = compilerRepository;
+        this.packerRepository = packerRepository;
+        this.appRepository = appRepository;
+        this.projRepository = projRepository;
+    }
+
+    public String bakBuildConfig() {
+        List<BuildDir> buildDirs = buildDirRepository.findAll();
+        List<RepoAuthConfig> repoAuths = repoAuthRepository.findAll();
+        List<CompilerConfig> compilers = compilerRepository.findAll();
+        List<PackerConfig> packers = packerRepository.findAll();
+        BuildConfig buildConfig = new BuildConfig(buildDirs, repoAuths, compilers, packers);
+        return JsonConverter.objectToJson(buildConfig);
+    }
+
+    public void bakAppConfig() {
+    }
+}

+ 4 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/bd/AppIntegrate.java

@@ -19,7 +19,7 @@ import cn.reghao.autodop.dmaster.app.service.bd.tools.repo.CodeUpdater;
 import cn.reghao.autodop.dmaster.app.service.bd.tools.repo.CommitInfo;
 import cn.reghao.autodop.dmaster.app.service.bd.tools.repo.GitImpl;
 import cn.reghao.autodop.dmaster.app.service.bd.tools.repo.SvnImpl;
-import cn.reghao.autodop.dmaster.common.config.SysConfig;
+import cn.reghao.autodop.dmaster.common.config.LocalBuildDir;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
@@ -72,9 +72,9 @@ public class AppIntegrate {
     }
 
     private void initLocalDir() {
-        appLocalRepo = SysConfig.localRepo + "/" + app.getAppId();
-        appCompileDir = SysConfig.compileDir + "/" + app.getAppId();
-        appPackDir = SysConfig.packDir + "/" + app.getAppId();
+        appLocalRepo = LocalBuildDir.localRepo + "/" + app.getAppId();
+        appCompileDir = LocalBuildDir.compileDir + "/" + app.getAppId();
+        appPackDir = LocalBuildDir.packDir + "/" + app.getAppId();
     }
 
     /**

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

@@ -5,7 +5,7 @@ import cn.reghao.autodop.common.utils.text.ReplaceCharacter;
 import cn.reghao.autodop.dmaster.app.constant.AppType;
 import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.entity.config.ProjOrchestration;
-import cn.reghao.autodop.dmaster.common.config.SysConfig;
+import cn.reghao.autodop.dmaster.common.config.LocalBuildDir;
 import lombok.extern.slf4j.Slf4j;
 
 import java.io.File;
@@ -24,7 +24,7 @@ public class BuilderUtil {
      * @date 2019-12-03 上午9:55
      */
     public static void copyToCompileDir(String appLocalRepo, AppOrchestration app) throws IOException {
-        String appCompileDir = SysConfig.compileDir + "/" + app.getAppId();
+        String appCompileDir = LocalBuildDir.compileDir + "/" + app.getAppId();
         File compileDir = new File(appCompileDir);
         if (!compileDir.exists() && !FileOps.mkdirs(compileDir)) {
             throw new IOException(compileDir + "不存在");

+ 23 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/BuildConfig.java

@@ -0,0 +1,23 @@
+package cn.reghao.autodop.dmaster.app.vo;
+
+import cn.reghao.autodop.dmaster.app.entity.config.build.BuildDir;
+import cn.reghao.autodop.dmaster.app.entity.config.build.CompilerConfig;
+import cn.reghao.autodop.dmaster.app.entity.config.build.PackerConfig;
+import cn.reghao.autodop.dmaster.app.entity.config.build.RepoAuthConfig;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2020-05-13 16:40:22
+ */
+@AllArgsConstructor
+@Data
+public class BuildConfig {
+    private List<BuildDir> buildDirs;
+    private List<RepoAuthConfig> repoAuths;
+    private List<CompilerConfig> compilers;
+    private List<PackerConfig> packers;
+}

+ 0 - 112
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/controller/App3CrudController.java

@@ -1,112 +0,0 @@
-package cn.reghao.autodop.dmaster.app3.controller;
-
-import cn.reghao.autodop.dmaster.utils.WebBody;
-import cn.reghao.autodop.dmaster.app3.entity.App3;
-import cn.reghao.autodop.dmaster.app3.entity.App3Bak;
-import cn.reghao.autodop.dmaster.app3.service.crud.App3BakCrudService;
-import cn.reghao.autodop.dmaster.app3.service.crud.App3CrudService;
-import cn.reghao.autodop.common.utils.serializer.JsonConverter;
-import cn.reghao.autodop.dmaster.utils.db.PageList;
-import io.swagger.annotations.Api;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * @author reghao
- * @date 2019-11-15 08:44:50
- */
-@Api(tags = "第三方应用 CRUD 接口")
-@RestController
-@RequestMapping("/api/app3")
-public class App3CrudController {
-    private App3CrudService app3CrudService;
-    private App3BakCrudService app3BakCrudService;
-
-    public App3CrudController(App3CrudService app3CrudService, App3BakCrudService app3BakCrudService) {
-        this.app3CrudService = app3CrudService;
-        this.app3BakCrudService = app3BakCrudService;
-    }
-
-    @PostMapping
-    public String addApp3(@RequestBody String jsonData) {
-        App3 app3 = JsonConverter.jsonToObject(jsonData, App3.class);
-        if (isApp3Valid(app3)) {
-            app3CrudService.insert(app3);
-            return WebBody.success("add done...");
-        }
-
-        return WebBody.fail("add failed...");
-    }
-
-    @GetMapping
-    public String getApp3ByPage(@RequestParam("page") int page, @RequestParam("size") int size) {
-        if (page < 0 || size <0) {
-            return WebBody.fail("get failed...");
-        }
-
-        PageList<App3> list = app3CrudService.getByPage(page, size, "");
-        return WebBody.success(list);
-    }
-
-    @PutMapping
-    public String modifyApp3(@RequestBody String jsonData) {
-        App3 app3 = JsonConverter.jsonToObject(jsonData, App3.class);
-        if (isApp3Valid(app3)) {
-            app3CrudService.insert(app3);
-            return WebBody.success("put done...");
-        }
-
-        return WebBody.fail("modify failed...");
-    }
-
-    @DeleteMapping("/{app3Name}")
-    public String deleteApp3(@PathVariable("app3Name") String app3Name) throws Exception {
-        app3CrudService.delete(app3Name);
-        return WebBody.success("delete done...");
-    }
-
-    private boolean isApp3Valid(App3 app3) {
-        return app3.getApp3Name() != null && app3.getExecPath() != null;
-    }
-
-    @PostMapping("/bak")
-    public String addApp3Bak(@RequestBody String jsonData) throws Exception {
-        App3Bak app3Bak = JsonConverter.jsonToObject(jsonData, App3Bak.class);
-        if (isApp3BakValid(app3Bak)) {
-            app3BakCrudService.insert(app3Bak);
-            return WebBody.success("add done...");
-        }
-
-        return WebBody.fail("add failed...");
-    }
-
-    @GetMapping("/bak")
-    public String getApp3BakByPage(@RequestParam("page") int page, @RequestParam("size") int size) {
-        if (page < 0 || size <0) {
-            return WebBody.fail("get failed...");
-        }
-
-        PageList<App3Bak> list = app3BakCrudService.getByPage(page, size, "");
-        return WebBody.success(list);
-    }
-
-    @PutMapping("/bak")
-    public String modifyApp3Bak(@RequestBody String jsonData) throws Exception {
-        App3Bak app3Bak = JsonConverter.jsonToObject(jsonData, App3Bak.class);
-        if (isApp3BakValid(app3Bak)) {
-            app3BakCrudService.insert(app3Bak);
-            return WebBody.success("put done...");
-        }
-
-        return WebBody.fail("modify failed...");
-    }
-
-    @DeleteMapping("/bak/{app3BakName}")
-    public String deleteApp3Bak(@PathVariable("app3BakName") String app3BakName) throws Exception {
-        app3BakCrudService.delete(app3BakName);
-        return WebBody.success("delete done...");
-    }
-
-    private boolean isApp3BakValid(App3Bak app3Bak) {
-        return app3Bak.getApp3Name() != null && app3Bak.getBakScript() != null && app3Bak.getCronExp() != null;
-    }
-}

+ 0 - 53
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/controller/App3OpsController.java

@@ -1,53 +0,0 @@
-package cn.reghao.autodop.dmaster.app3.controller;
-
-import cn.reghao.autodop.dmaster.utils.WebBody;
-import cn.reghao.autodop.dmaster.app3.service.App3OpsService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * @author reghao
- * @date 2019-11-15 08:44:50
- */
-@Api(tags = "第三方应用备份还原接口")
-@RestController
-@RequestMapping("/api/app3")
-public class App3OpsController {
-    private App3OpsService app3OpsService;
-
-    public App3OpsController(App3OpsService app3OpsService) {
-        this.app3OpsService = app3OpsService;
-    }
-
-    @ApiOperation(value = "启用备份")
-    @PostMapping("/backup/activate/{app3Name}")
-    public String activateBackup(@PathVariable("app3Name") String app3Name) throws Exception {
-        app3OpsService.backup(app3Name);
-        return WebBody.success();
-    }
-
-    @ApiOperation(value = "停用备份")
-    @PostMapping("/backup/deactivate/{app3Name}")
-    public String deactivateBackup(@PathVariable("app3Name") String app3Name) throws Exception {
-        return WebBody.success();
-    }
-
-    @ApiOperation(value = "备份日志")
-    @GetMapping("/log/backup/{serviceName}")
-    public String bakLog(@PathVariable("serviceName") String serviceName) {
-        return WebBody.success();
-    }
-
-    @ApiOperation(value = "还原备份")
-    @PostMapping("/restore/{app3Name}")
-    public String restore(@PathVariable("app3Name") String app3Name) throws Exception {
-        return WebBody.success();
-    }
-
-    @ApiOperation(value = "还原日志")
-    @GetMapping("/log/restore/{serviceName}")
-    public String restoreLog(@PathVariable("serviceName") String serviceName) {
-        return WebBody.success();
-    }
-}

+ 0 - 29
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/entity/App3.java

@@ -1,29 +0,0 @@
-package cn.reghao.autodop.dmaster.app3.entity;
-
-import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
-import lombok.Data;
-
-import javax.persistence.Column;
-import javax.persistence.ElementCollection;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import java.util.Set;
-
-/**
- * @author reghao
- * @date 2020-11-10 22:05:40
- */
-@Data
-@Entity
-public class App3 extends BaseEntity<Integer> {
-    @Column(nullable = false, unique = true)
-    private String app3Name;
-    private String ip;
-    private int port;
-    private String execPath;
-    private String configDir;
-    @ElementCollection(fetch = FetchType.EAGER)
-    private Set<String> configFile;
-    private String logDir;
-    private String logFile;
-}

+ 0 - 24
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/entity/App3Bak.java

@@ -1,24 +0,0 @@
-package cn.reghao.autodop.dmaster.app3.entity;
-
-import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
-import lombok.Data;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-
-/**
- * 第三方应用备份配置
- *
- * @author reghao
- * @date 2020-11-09 20:42:38
- */
-@Data
-@Entity
-public class App3Bak extends BaseEntity<Integer> {
-    @Column(nullable = false, unique = true)
-    private String app3Name;
-    private String bakScript;
-    private String bakScriptPath;
-    private String bakDir;
-    private String cronExp;
-}

+ 0 - 22
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/entity/App3BakLog.java

@@ -1,22 +0,0 @@
-package cn.reghao.autodop.dmaster.app3.entity;
-
-import cn.reghao.autodop.dmaster.common.orm.BaseDocument;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.springframework.data.mongodb.core.mapping.Document;
-
-/**
- * 备份日志
- *
- * @author reghao
- * @date 2020-11-10 17:15:59
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-@Document("App3BakLog")
-public class App3BakLog extends BaseDocument {
-    private String app3name;
-    private String bakTime;
-    private boolean isSuccess;
-    private String result;
-}

+ 0 - 13
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/repository/App3BakLogRepository.java

@@ -1,13 +0,0 @@
-package cn.reghao.autodop.dmaster.app3.repository;
-
-import cn.reghao.autodop.dmaster.app3.entity.App3BakLog;
-import org.springframework.data.mongodb.repository.MongoRepository;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2020-01-21 14:53:03
- */
-public interface App3BakLogRepository extends MongoRepository<App3BakLog, Long> {
-}

+ 0 - 19
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/repository/App3BakRepository.java

@@ -1,19 +0,0 @@
-package cn.reghao.autodop.dmaster.app3.repository;
-
-import cn.reghao.autodop.dmaster.app3.entity.App3Bak;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-
-import javax.transaction.Transactional;
-
-/**
- * @author reghao
- * @date 2020-01-21 14:53:03
- */
-public interface App3BakRepository extends JpaRepository<App3Bak, Long> {
-    App3Bak findByIsDeleteFalseAndApp3Name(String app3Name);
-
-    @Modifying
-    @Transactional
-    void deleteByApp3Name(String app3Name);
-}

+ 0 - 19
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/repository/App3Repository.java

@@ -1,19 +0,0 @@
-package cn.reghao.autodop.dmaster.app3.repository;
-
-import cn.reghao.autodop.dmaster.app3.entity.App3;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-
-import javax.transaction.Transactional;
-
-/**
- * @author reghao
- * @date 2020-01-21 14:53:03
- */
-public interface App3Repository extends JpaRepository<App3, Long> {
-    App3 findByIsDeleteFalseAndApp3Name(String app3Name);
-
-    @Modifying
-    @Transactional
-    void deleteByApp3Name(String app3Name);
-}

+ 0 - 65
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/scheduler/BackupScheduler.java

@@ -1,65 +0,0 @@
-package cn.reghao.autodop.dmaster.app3.scheduler;
-
-import cn.reghao.autodop.common.shell.ShellExecutor;
-import cn.reghao.autodop.dmaster.app3.entity.App3Bak;
-import cn.reghao.autodop.dmaster.app3.entity.App3BakLog;
-import cn.reghao.autodop.dmaster.common.db.MongoCrud;
-import lombok.extern.slf4j.Slf4j;
-import org.quartz.*;
-import org.quartz.impl.StdSchedulerFactory;
-import org.springframework.stereotype.Component;
-
-/**
- * 备份调度器
- *
- * @author reghao
- * @date 2020-11-10 13:41:11
- */
-@Slf4j
-@Component
-public class BackupScheduler {
-    private Scheduler scheduler;
-    private ShellExecutor executor;
-    private MongoCrud<App3BakLog> mongoCrud;
-
-    public BackupScheduler(MongoCrud<App3BakLog> mongoCrud) throws SchedulerException {
-        this.scheduler = StdSchedulerFactory.getDefaultScheduler();
-        this.executor = new ShellExecutor();
-        this.mongoCrud = mongoCrud;
-    }
-
-    public void add(App3Bak app3Bak) throws SchedulerException {
-        JobDataMap jobDataMap = new JobDataMap();
-        // 只传入一组 KV
-        jobDataMap.put(app3Bak.getBakScriptPath(), executor);
-        jobDataMap.put("mongo", mongoCrud);
-        JobDetail jobDetail = JobBuilder.newJob(ScriptBakJob.class)
-                .withIdentity(app3Bak.getApp3Name())
-                .usingJobData(jobDataMap)
-                .build();
-
-        TriggerBuilder<CronTrigger> triggerBuilder = TriggerBuilder
-                .newTrigger()
-                .withIdentity(app3Bak.getApp3Name() + "@trigger")
-                .withSchedule(CronScheduleBuilder.cronSchedule(app3Bak.getCronExp()));
-        CronTrigger cronTrigger = triggerBuilder.build();
-
-        scheduler.scheduleJob(jobDetail, cronTrigger);
-        log.info("添加新定时任务 {}...", app3Bak.getApp3Name());
-    }
-
-    public void remove() {
-    }
-
-    public void start() throws SchedulerException {
-        if (!scheduler.isShutdown()) {
-            scheduler.start();
-        }
-    }
-
-    public void pause() throws SchedulerException {
-        if (!scheduler.isShutdown()) {
-            scheduler.pauseAll();
-        }
-    }
-}

+ 0 - 57
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/scheduler/ScriptBakJob.java

@@ -1,57 +0,0 @@
-package cn.reghao.autodop.dmaster.app3.scheduler;
-
-import cn.reghao.autodop.common.shell.ShellExecutor;
-import cn.reghao.autodop.common.shell.ShellResult;
-import cn.reghao.autodop.common.utils.DateTimeConverter;
-import cn.reghao.autodop.dmaster.app3.entity.App3BakLog;
-import cn.reghao.autodop.dmaster.common.db.MongoCrud;
-import lombok.extern.slf4j.Slf4j;
-import org.quartz.*;
-
-import java.util.Map;
-
-/**
- * 脚本备份任务
- *
- * @author reghao
- * @date 2020-11-10 13:43:55
- */
-@Slf4j
-public class ScriptBakJob implements Job {
-    @Override
-    public void execute(JobExecutionContext context) throws JobExecutionException {
-        JobKey jobKey = context.getJobDetail().getKey();
-        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
-        MongoCrud<App3BakLog> mongoCrud = null;
-        String script = "";
-        ShellExecutor executor = null;
-        for (Map.Entry<String, Object> entry : jobDataMap.entrySet()) {
-            String key = entry.getKey();
-            if ("mongo".equals(key)) {
-                mongoCrud = (MongoCrud<App3BakLog>) entry.getValue();
-            } else {
-                script = key;
-                executor = (ShellExecutor) entry.getValue();
-            }
-        }
-
-        App3BakLog app3BakLog = new App3BakLog();
-        app3BakLog.setApp3name(jobKey.getName());
-        app3BakLog.setBakTime(DateTimeConverter.now());
-        log.info("执行 {} 定时任务...", jobKey.getName());
-        /*try {
-            ShellResult shellResult = executor.exec(script);
-            if (shellResult.isSuccess()) {
-                app3BakLog.setSuccess(true);
-                app3BakLog.setResult(shellResult.getOutput());
-            } else {
-                app3BakLog.setSuccess(false);
-                app3BakLog.setResult(shellResult.getOutput());
-            }
-            mongoCrud.insert(app3BakLog);
-        } catch (Exception e) {
-            app3BakLog.setSuccess(false);
-            app3BakLog.setResult(e.getMessage());
-        }*/
-    }
-}

+ 0 - 29
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/service/App3OpsService.java

@@ -1,29 +0,0 @@
-package cn.reghao.autodop.dmaster.app3.service;
-
-import cn.reghao.autodop.dmaster.app3.entity.App3Bak;
-import cn.reghao.autodop.dmaster.app3.repository.App3BakRepository;
-import cn.reghao.autodop.dmaster.app3.service.backup.BakRestore;
-import org.springframework.stereotype.Service;
-
-/**
- * @author reghao
- * @date 2020-11-12 13:49:09
- */
-@Service
-public class App3OpsService {
-    private App3BakRepository app3BakRepository;
-    private BakRestore bakRestore;
-
-    public App3OpsService(App3BakRepository app3BakRepository, BakRestore bakRestore) {
-        this.app3BakRepository = app3BakRepository;
-        this.bakRestore = bakRestore;
-    }
-
-    public void backup(String app3Name) throws Exception {
-        App3Bak app3Bak = app3BakRepository.findByIsDeleteFalseAndApp3Name(app3Name);
-        bakRestore.backup(app3Bak);
-    }
-
-    public void restore(String app3Name) {
-    }
-}

+ 0 - 30
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/service/backup/BakRestore.java

@@ -1,30 +0,0 @@
-package cn.reghao.autodop.dmaster.app3.service.backup;
-
-import cn.reghao.autodop.dmaster.app3.entity.App3Bak;
-
-/**
- * 备份还原接口
- *
- * @author reghao
- * @date 2020-10-22 17:51:56
- */
-public interface BakRestore {
-    /**
-     * 备份数据
-     *
-     * @param app3Bak 需要备份的服务
-     * @return 备份的 ID
-     * @date 2020-11-09 下午8:53
-     */
-    String backup(App3Bak app3Bak) throws Exception;
-
-    /**
-     * 还原数据
-     *
-     * @param app3Name 需要还原的第三方服务名字
-     * @param bakId 备份 ID
-     * @return
-     * @date 2020-11-09 下午8:53
-     */
-    void restore(String app3Name, String bakId);
-}

+ 0 - 30
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/service/backup/BakRestoreImpl.java

@@ -1,30 +0,0 @@
-package cn.reghao.autodop.dmaster.app3.service.backup;
-
-import cn.reghao.autodop.dmaster.app3.entity.App3Bak;
-import cn.reghao.autodop.dmaster.app3.scheduler.BackupScheduler;
-import org.quartz.SchedulerException;
-import org.springframework.stereotype.Service;
-
-/**
- * @author reghao
- * @date 2020-11-10 15:20:04
- */
-@Service
-public class BakRestoreImpl implements BakRestore {
-    private BackupScheduler backupScheduler;
-
-    public BakRestoreImpl(BackupScheduler backupScheduler) {
-        this.backupScheduler = backupScheduler;
-    }
-
-    @Override
-    public String backup(App3Bak app3Bak) throws SchedulerException {
-        backupScheduler.add(app3Bak);
-        backupScheduler.start();
-        return null;
-    }
-
-    @Override
-    public void restore(String serviceName, String bakId) {
-    }
-}

+ 0 - 73
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/service/crud/App3BakCrudService.java

@@ -1,73 +0,0 @@
-package cn.reghao.autodop.dmaster.app3.service.crud;
-
-import cn.reghao.autodop.dmaster.common.db.CrudOps;
-import cn.reghao.autodop.dmaster.utils.db.PageList;
-import cn.reghao.autodop.dmaster.app3.entity.App3;
-import cn.reghao.autodop.dmaster.app3.entity.App3Bak;
-import cn.reghao.autodop.dmaster.app3.repository.App3BakRepository;
-import cn.reghao.autodop.dmaster.app3.repository.App3Repository;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Sort;
-import org.springframework.stereotype.Service;
-
-import java.time.LocalDateTime;
-
-/**
- * @author reghao
- * @date 2020-11-10 21:58:00
- */
-@Service
-public class App3BakCrudService implements CrudOps<App3Bak> {
-    private App3BakRepository app3BakRepository;
-    private App3Repository app3Repository;
-
-    public App3BakCrudService(App3BakRepository app3BakRepository, App3Repository app3Repository) {
-        this.app3BakRepository = app3BakRepository;
-        this.app3Repository = app3Repository;
-    }
-
-    @Override
-    public void insert(App3Bak app3Bak) throws Exception {
-        String app3Name = app3Bak.getApp3Name();
-        App3 app3 = app3Repository.findByIsDeleteFalseAndApp3Name(app3Name);
-        if (app3 == null) {
-            throw new Exception(app3Name + " 不存在...");
-        }
-
-        App3Bak app3BakEntity = app3BakRepository.findByIsDeleteFalseAndApp3Name(app3Name);
-        if (app3BakEntity != null) {
-            // 若是新增,这三项值数据库会自动生成
-            app3Bak.setId(app3BakEntity.getId());
-            app3Bak.setCreateTime(app3BakEntity.getCreateTime());
-            app3Bak.setUpdateTime(LocalDateTime.now());
-        }
-
-        app3Bak.setIsDelete(false);
-        app3BakRepository.save(app3Bak);
-    }
-
-    @Override
-    public PageList<App3Bak> getByPage(int page, int size, String uk) {
-        // 默认按更新时间倒序
-        PageRequest pageRequest =
-                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
-        Page<App3Bak> app3BakPage = app3BakRepository.findAll(pageRequest);
-
-        PageList<App3Bak> pageList = new PageList<>();
-        pageList.setTotalSize(app3BakPage.getTotalElements());
-        pageList.setTotalPages(app3BakPage.getTotalPages());
-        pageList.setList(app3BakPage.getContent());
-
-        return pageList;
-    }
-
-    @Override
-    public void delete(String uniqueKey) throws Exception {
-        /*app3BakEntity.setUpdateTime(LocalDateTime.now());
-        app3BakEntity.setIsDelete(true);
-        app3BakRepository.save(app3BakEntity);*/
-
-        app3BakRepository.deleteByApp3Name(uniqueKey);
-    }
-}

+ 0 - 45
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/service/crud/App3BakLogCrudService.java

@@ -1,45 +0,0 @@
-package cn.reghao.autodop.dmaster.app3.service.crud;
-
-import cn.reghao.autodop.dmaster.common.db.CrudOps;
-import cn.reghao.autodop.dmaster.utils.db.PageList;
-import cn.reghao.autodop.dmaster.app3.entity.App3BakLog;
-import cn.reghao.autodop.dmaster.app3.repository.App3BakLogRepository;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Sort;
-import org.springframework.stereotype.Service;
-
-/**
- * @author reghao
- * @date 2020-11-10 21:58:00
- */
-@Service
-public class App3BakLogCrudService implements CrudOps<App3BakLog> {
-    private App3BakLogRepository app3BakLogRepository;
-
-    public App3BakLogCrudService(App3BakLogRepository app3BakLogRepository) {
-        this.app3BakLogRepository = app3BakLogRepository;
-    }
-
-    @Override
-    public void insert(App3BakLog app3BakLog) {
-        app3BakLogRepository.save(app3BakLog);
-    }
-
-    @Override
-    public PageList<App3BakLog> getByPage(int page, int size, String uk) {
-        PageRequest pageRequest =
-                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
-        Page<App3BakLog> app3BakLogPage = app3BakLogRepository.findAll(pageRequest);
-
-        PageList<App3BakLog> pageList = new PageList<>();
-        pageList.setTotalSize(app3BakLogPage.getTotalElements());
-        pageList.setTotalPages(app3BakLogPage.getTotalPages());
-        pageList.setList(app3BakLogPage.getContent());
-        return pageList;
-    }
-
-    @Override
-    public void delete(String uniqueKey) throws Exception {
-    }
-}

+ 0 - 67
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/service/crud/App3CrudService.java

@@ -1,67 +0,0 @@
-package cn.reghao.autodop.dmaster.app3.service.crud;
-
-import cn.reghao.autodop.dmaster.app3.entity.App3;
-import cn.reghao.autodop.dmaster.app3.repository.App3Repository;
-import cn.reghao.autodop.dmaster.common.db.CrudOps;
-import cn.reghao.autodop.dmaster.utils.db.PageList;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Sort;
-import org.springframework.stereotype.Service;
-
-import java.time.LocalDateTime;
-
-/**
- * @author reghao
- * @date 2020-11-10 21:58:00
- */
-@Service
-public class App3CrudService implements CrudOps<App3> {
-    private App3Repository app3Repository;
-
-    public App3CrudService(App3Repository app3Repository) {
-        this.app3Repository = app3Repository;
-    }
-
-    @Override
-    public void insert(App3 app3) {
-        App3 app3Entity = app3Repository.findByIsDeleteFalseAndApp3Name(app3.getApp3Name());
-        if (app3Entity != null) {
-            // 若是新增,这三项值数据库会自动生成
-            app3.setId(app3Entity.getId());
-            app3.setCreateTime(app3Entity.getCreateTime());
-            app3.setUpdateTime(LocalDateTime.now());
-        }
-
-        app3.setIsDelete(false);
-        app3Repository.save(app3);
-    }
-
-    @Override
-    public PageList<App3> getByPage(int page, int size, String uk) {
-        // 默认按更新时间倒序
-        PageRequest pageRequest =
-                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
-        Page<App3> app3Page = app3Repository.findAll(pageRequest);
-
-        PageList<App3> pageList = new PageList<>();
-        pageList.setTotalSize(app3Page.getTotalElements());
-        pageList.setTotalPages(app3Page.getTotalPages());
-        pageList.setList(app3Page.getContent());
-
-        return pageList;
-    }
-
-    @Override
-    public void delete(String uniqueKey) throws Exception {
-        App3 app3Entity = app3Repository.findByIsDeleteFalseAndApp3Name(uniqueKey);
-        if (app3Entity == null) {
-            throw new Exception(uniqueKey + " 不存在...");
-        }
-        // TODO 只做逻辑删除,但如何复用 unique key?
-        /*app3Entity.setUpdateTime(LocalDateTime.now());
-        app3Entity.setIsDelete(true);
-        app3Repository.save(app3Entity);*/
-        app3Repository.deleteByApp3Name(uniqueKey);
-    }
-}

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/config/CachingConfig.java

@@ -16,10 +16,10 @@ import java.util.List;
  * @author reghao
  * @date 2020-03-06 10:58:04
  */
-@Configuration
-@EnableCaching
+//@Configuration
+//@EnableCaching
 public class CachingConfig {
-    @Bean(name = "caffeine")
+    //@Bean(name = "caffeine")
     public CacheManager cacheManager() {
         Caffeine caffeine = Caffeine.newBuilder()
                 .recordStats()

+ 24 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/config/LocalBuildDir.java

@@ -0,0 +1,24 @@
+package cn.reghao.autodop.dmaster.common.config;
+
+import cn.reghao.autodop.dmaster.app.entity.config.build.BuildDir;
+
+/**
+ * TODO 使用缓存替代
+ *
+ * @author reghao
+ * @date 2020-03-09 14:36:41
+ */
+public class LocalBuildDir {
+    // 本地仓库
+    public static String localRepo;
+    // 编译目录
+    public static String compileDir;
+    // 应用打包后存放的目录
+    public static String packDir;
+
+    public static void set(BuildDir buildDir) {
+        LocalBuildDir.localRepo = buildDir.getDirPath() + "/local-repo";
+        LocalBuildDir.compileDir = buildDir.getDirPath() + "/compile-dir";
+        LocalBuildDir.packDir = buildDir.getDirPath() + "/pack-dir";
+    }
+}

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/config/OssProperties.java

@@ -13,8 +13,8 @@ import org.springframework.stereotype.Component;
 @Component
 @ConfigurationProperties(prefix = "oss")
 public class OssProperties {
-    @Value("${oss.endpoint}")
-    private String endpoint;
+    @Value("${oss.host}")
+    private String host;
     @Value("${oss.key}")
     private String key;
     @Value("${oss.secret}")

+ 0 - 16
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/config/SysConfig.java

@@ -1,16 +0,0 @@
-package cn.reghao.autodop.dmaster.common.config;
-
-/**
- * TODO 使用缓存替代
- *
- * @author reghao
- * @date 2020-03-09 14:36:41
- */
-public class SysConfig {
-    // 本地仓库
-    public static String localRepo;
-    // 编译目录
-    public static String compileDir;
-    // 应用打包后存放的目录
-    public static String packDir;
-}

+ 0 - 14
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/config/WebMvcConfig.java

@@ -1,14 +0,0 @@
-package cn.reghao.autodop.dmaster.common.config;
-
-import org.springframework.web.servlet.config.annotation.*;
-
-/**
- * mvc 配置
- *
- * @author reghao
- * @date 2019-05-20 11:08:53
- */
-/*@Configuration
-@EnableWebMvc*/
-public class WebMvcConfig implements WebMvcConfigurer {
-}

+ 0 - 37
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/db/MongoCrud.java

@@ -1,37 +0,0 @@
-package cn.reghao.autodop.dmaster.common.db;
-
-import cn.reghao.autodop.dmaster.utils.db.PageList;
-import cn.reghao.autodop.dmaster.app3.entity.App3BakLog;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.query.Criteria;
-import org.springframework.data.mongodb.core.query.Query;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2020-11-10 18:10:22
- */
-@Component
-public class MongoCrud<T> implements CrudOps<T> {
-    private MongoTemplate mongoTemplate;
-
-    public MongoCrud(MongoTemplate mongoTemplate) {
-        this.mongoTemplate = mongoTemplate;
-    }
-
-    @Override
-    public void insert(T t) {
-    }
-
-    @Override
-    public PageList<T> getByPage(int page, int size, String uk) {
-        return null;
-    }
-
-    public List<App3BakLog> query(String serviceName) {
-        Query query = Query.query(Criteria.where("service_name").is(serviceName));
-        return mongoTemplate.find(query, App3BakLog.class);
-    }
-}

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/orm/BaseEntity.java

@@ -17,6 +17,7 @@ public class BaseEntity<T extends Serializable> implements Serializable {
     private static final long serialVersionUID = 1L;
     @Id
     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqGen")
+    // seq 表
     @SequenceGenerator(name = "seqGen", sequenceName = "seq")
     protected T id;
     // 逻辑删除

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

@@ -1,19 +1,21 @@
 package cn.reghao.autodop.dmaster.machine.controller;
 
+import cn.reghao.autodop.dmaster.machine.vo.MachineInfoVO;
 import cn.reghao.autodop.dmaster.utils.db.PageList;
 import cn.reghao.autodop.dmaster.machine.entity.MachineInfo;
 import cn.reghao.autodop.dmaster.machine.repository.MachineInfoRepository;
-import cn.reghao.autodop.dmaster.machine.vo.MachineInfoVO;
+import cn.reghao.autodop.dmaster.utils.db.PageSort;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 
 /**
  * @author reghao
@@ -32,19 +34,25 @@ public class MachinePageController {
 
     @ApiOperation(value = "机器列表页面")
     @GetMapping("/host")
-    public String hostPage(Model model) {
-        int page = 1;
-        int size = 10;
-        PageRequest pageRequest =
-                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
-
-        Page<MachineInfo> machineInfoPage = machineInfoRepository.findAll(pageRequest);
-        Page<MachineInfoVO> machineInfoVOPage = machineInfoPage.map(machineInfo -> MachineInfoVO.from(machineInfo));
+    public String hostPage(@RequestParam(value = "env", required = false) String env,
+                           @RequestParam(value = "machineIpv4", required = false) String machineIpv4,
+                           Model model) {
+        PageRequest pageRequest = PageSort.pageRequest();
+        Page<MachineInfo> page = machineInfoRepository.findByIsDeleteFalse(pageRequest);
+        Page<MachineInfoVO> voPage = page.map(MachineInfoVO::from);
+        PageList<MachineInfoVO> pageList = PageList.pageList(voPage);
 
-        PageList<MachineInfoVO> pageList = PageList.pageList(machineInfoVOPage);
-
-        model.addAttribute("page", machineInfoVOPage);
+        //model.addAttribute("env", env);
+        model.addAttribute("page", page);
         model.addAttribute("list", pageList.getList());
         return "/machine/host";
     }
+
+    @ApiOperation(value = "机器信息详情页面")
+    @GetMapping("/host/detail/{machineId}")
+    public String appConfigPage(@PathVariable("machineId") String machineId, Model model) {
+        MachineInfo machineInfo = machineInfoRepository.findByMachineId(machineId);
+        model.addAttribute("machine", machineInfo);
+        return "/machine/detail";
+    }
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/controller/crud/MachineCrudController.java

@@ -5,7 +5,7 @@ import cn.reghao.autodop.dmaster.machine.entity.MachineInfo;
 import cn.reghao.autodop.dmaster.machine.vo.MachineInfoVO;
 import cn.reghao.autodop.dmaster.utils.db.PageList;
 import cn.reghao.autodop.dmaster.machine.service.crud.MachineCrudService;
-import cn.reghao.autodop.dmaster.utils.dispatcher.MachineOpsDispatcher;
+import cn.reghao.autodop.dmaster.mqttsub.MachineOpsDispatcher;
 import io.swagger.annotations.Api;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/entity/CPUInfo.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/entity/CpuInfo.java

@@ -10,7 +10,7 @@ import javax.persistence.Embeddable;
  */
 @Data
 @Embeddable
-public class CPUInfo {
+public class CpuInfo {
     private int cpuCores;
     private int cpus;
     private String vendorId;

+ 5 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/entity/MachineInfo.java

@@ -23,13 +23,13 @@ import javax.persistence.Entity;
 public class MachineInfo extends BaseEntity<Integer> {
     @Column(nullable = false, unique = true)
     private String machineId;
-    private CPUInfo cpuInfo;
+    private OsInfo osInfo;
+    @ElementCollection(targetClass = NetworkInfo.class)
+    @LazyCollection(LazyCollectionOption.FALSE)
+    private List<NetworkInfo> networkInfo;
+    private CpuInfo cpuInfo;
     private MemoryInfo memoryInfo;
     @ElementCollection(targetClass = DiskInfo.class)
     @LazyCollection(LazyCollectionOption.FALSE)
     private List<DiskInfo> diskInfo;
-    @ElementCollection(targetClass = NetworkInfo.class)
-    @LazyCollection(LazyCollectionOption.FALSE)
-    private List<NetworkInfo> networkInfo;
-    private OSInfo osInfo;
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/entity/OSInfo.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/entity/OsInfo.java

@@ -10,7 +10,7 @@ import javax.persistence.Embeddable;
  */
 @Data
 @Embeddable
-public class OSInfo {
+public class OsInfo {
     private String name;
     private String arch;
     private String version;

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/repository/MachineInfoRepository.java

@@ -14,6 +14,7 @@ import java.util.List;
  * @date 2020-01-21 14:53:03
  */
 public interface MachineInfoRepository extends JpaRepository<MachineInfo, Long> {
+    Page<MachineInfo> findAllByIsDeleteFalse(Pageable pageable);
     Page<MachineInfo> findByIsDeleteFalse(Pageable pageable);
     MachineInfo findByMachineId(String machineId);
     List<MachineInfo> findAllByIsDeleteFalse();

+ 2 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/MonitorController.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/controller/MonitorController.java

@@ -1,5 +1,6 @@
-package cn.reghao.autodop.dmaster.sys;
+package cn.reghao.autodop.dmaster.monitor.controller;
 
+import cn.reghao.autodop.dmaster.monitor.service.MonitorService;
 import cn.reghao.autodop.dmaster.utils.WebBody;
 import io.swagger.annotations.Api;
 import org.springframework.web.bind.annotation.*;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/EngToChn.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/EngToChn.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.monitor;
+package cn.reghao.autodop.dmaster.monitor.service;
 
 /**
  * @author reghao

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/HealthCheck.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/HealthCheck.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.monitor;
+package cn.reghao.autodop.dmaster.monitor.service;
 
 /**
  * 健康检查

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/HealthCheckJob.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/HealthCheckJob.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.monitor;
+package cn.reghao.autodop.dmaster.monitor.service;
 
 import cn.reghao.autodop.common.http.DefaultWebRequest;
 import cn.reghao.autodop.common.http.WebRequest;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/HealthCheckScheduler.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/HealthCheckScheduler.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.monitor;
+package cn.reghao.autodop.dmaster.monitor.service;
 
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/MonitorScheduler.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MonitorScheduler.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.monitor;
+package cn.reghao.autodop.dmaster.monitor.service;
 
 import cn.reghao.autodop.dmaster.app.constant.EnvType;
 import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/MonitorService.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MonitorService.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.sys;
+package cn.reghao.autodop.dmaster.monitor.service;
 
 import cn.reghao.autodop.common.jvm.JVM;
 import cn.reghao.autodop.common.jvm.pojo.JVMInfo;

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/dispatcher/AppOpsDispatcher.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/AppOpsDispatcher.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.utils.dispatcher;
+package cn.reghao.autodop.dmaster.mqttsub;
 
 import cn.reghao.autodop.common.dagent.app.api.data.AppStatus;
 import cn.reghao.autodop.common.dagent.app.api.data.DeployResult;
@@ -27,7 +27,7 @@ import java.util.List;
 import java.util.Optional;
 
 /**
- * 分发对 App 的操作
+ * 分发 App 相关的消息
  *
  * @author reghao
  * @date 2020-12-30 10:26:47

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/dispatcher/DagentMessageDispatcher.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/DagentMessageDispatcher.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.utils.dispatcher;
+package cn.reghao.autodop.dmaster.mqttsub;
 
 import cn.reghao.autodop.common.message.MessageType;
 import cn.reghao.autodop.common.message.AsyncMsg;

+ 3 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/dispatcher/MachineOpsDispatcher.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/mqttsub/MachineOpsDispatcher.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.utils.dispatcher;
+package cn.reghao.autodop.dmaster.mqttsub;
 
 import cn.reghao.autodop.common.message.MachineOps;
 import cn.reghao.autodop.common.utils.DateTimeConverter;
@@ -15,7 +15,7 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
- * 分发对 Machine 的操作
+ * 分发 Machine 相关的消息
  *
  * @author reghao
  * @date 2020-12-30 10:26:47
@@ -46,7 +46,6 @@ public class MachineOpsDispatcher {
                     // TODO 做一些逻辑处理,判断内存和磁盘的使用量,然后存入数据库,更新数据
                     // TODO 存到 MongoDB
                     MachineHeartbeat machineHeartbeat = JsonConverter.jsonToObject(payload, MachineHeartbeat.class);
-                    setMachineStatus(machineHeartbeat);
                     break;
                 case machineLog:
                     MachineLog machineLog = JsonConverter.jsonToObject(payload, MachineLog.class);
@@ -59,7 +58,7 @@ public class MachineOpsDispatcher {
                     log.info("机器状态消息...");
                     break;
                 default:
-                    log.info("来自机器的消息...");
+                    log.info("未知类型的机器消息...");
             }
         } catch (Exception e) {
             e.printStackTrace();

+ 0 - 59
dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/FileController.java

@@ -1,59 +0,0 @@
-package cn.reghao.autodop.dmaster.sys;
-
-import cn.reghao.autodop.dmaster.common.config.SysConfig;
-import cn.reghao.autodop.dmaster.utils.SpringBootUtil;
-import cn.reghao.autodop.dmaster.utils.WebBody;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.*;
-import java.net.URLEncoder;
-
-/**
- * @author reghao
- * @date 2020-03-11 16:10:16
- */
-@Slf4j
-@Api(tags = "文件上传/下载接口")
-@RestController
-@RequestMapping("/api/file")
-public class FileController {
-    @ApiOperation(value = "下载文件")
-    @GetMapping("/dl/{filename}")
-    public String download(@PathVariable("filename") String filename, HttpServletResponse response)
-            throws IOException {
-        String filepath = SysConfig.packDir + "/" + filename;
-        File file = new File(filepath);
-        if (file.exists()) {
-            response.setHeader("content-type", "application/octet-stream");
-            response.setContentType("application/octet-stream");
-            response.setHeader("Content-Disposition",
-                    "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
-
-            byte[] buffer = new byte[1024];
-            FileInputStream fis = new FileInputStream(file);
-            BufferedInputStream bis = new BufferedInputStream(fis);
-            OutputStream os = response.getOutputStream();
-            int i = bis.read(buffer);
-            while (i != -1) {
-                os.write(buffer, 0, i);
-                i = bis.read(buffer);
-            }
-            return WebBody.success("文件已下载");
-        }
-
-        return WebBody.success("文件不存在");
-    }
-
-    @ApiOperation(value = "上传文件")
-    @PostMapping("/upload")
-    public String upload(@RequestParam("file") MultipartFile file) {
-        String filename = file.getOriginalFilename();
-        String filePath = SpringBootUtil.saveFile(file, "/tmp");
-        return WebBody.success(filePath);
-    }
-}

+ 76 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/controller/SysPageController.java

@@ -0,0 +1,76 @@
+package cn.reghao.autodop.dmaster.sys.controller;
+
+import cn.reghao.autodop.common.utils.serializer.JsonConverter;
+import cn.reghao.autodop.dmaster.auth.entity.Role;
+import cn.reghao.autodop.dmaster.auth.repository.RoleRepository;
+import cn.reghao.autodop.dmaster.sys.service.BakService;
+import cn.reghao.autodop.dmaster.sys.service.SysConfig;
+import cn.reghao.autodop.dmaster.utils.UploadDownload;
+import cn.reghao.autodop.dmaster.utils.WebBody;
+import cn.reghao.autodop.dmaster.utils.db.PageList;
+import cn.reghao.autodop.dmaster.utils.db.PageSort;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * @author reghao
+ * @date 2021-04-04 21:24:18
+ */
+@Api(tags = "用户页面")
+@RequestMapping("/sys")
+@Controller
+public class SysPageController {
+    private BakService bakService;
+    private UploadDownload uploadDownload;
+    private RoleRepository roleRepository;
+
+    public SysPageController(BakService bakService,
+                             UploadDownload uploadDownload,
+                             RoleRepository roleRepository) {
+        this.bakService = bakService;
+        this.uploadDownload = uploadDownload;
+        this.roleRepository = roleRepository;
+    }
+
+    @ApiOperation(value = "系统备份还原页面")
+    @GetMapping("/bak")
+    public String sysBakPage(Model model) {
+        PageRequest pageRequest = PageSort.pageRequest();
+        Page<Role> rolePage = roleRepository.findAll(pageRequest);
+        PageList<Role> pageList = PageList.pageList(rolePage);
+
+        model.addAttribute("page", rolePage);
+        model.addAttribute("list", pageList.getList());
+        return "/sys/bak";
+    }
+
+    @ApiOperation(value = "数据备份")
+    @GetMapping("/bak/export")
+    @ResponseBody
+    public void dataBackup(HttpServletResponse response) throws IOException {
+        String json = bakService.bakSysConfig();
+        ByteArrayInputStream bytesIn = new ByteArrayInputStream(json.getBytes());
+        BufferedInputStream bis = new BufferedInputStream(bytesIn);
+        uploadDownload.download(bis, response);
+    }
+
+    @ApiOperation(value = "数据还原")
+    @PostMapping("/bak/import")
+    @ResponseBody
+    public String dataRestore(@RequestParam("file") MultipartFile file) throws IOException {
+        byte[] bytes = file.getBytes();
+        String json = new String(bytes, StandardCharsets.UTF_8);
+        SysConfig sysConfig = JsonConverter.jsonToObject(json, SysConfig.class);
+        return WebBody.success();
+    }
+}

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/TestController.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/controller/TestController.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.view.controller;
+package cn.reghao.autodop.dmaster.sys.controller;
 
 import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.common.utils.security.Cryptor;

+ 68 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/service/BakService.java

@@ -0,0 +1,68 @@
+package cn.reghao.autodop.dmaster.sys.service;
+
+import cn.reghao.autodop.common.utils.serializer.JsonConverter;
+import cn.reghao.autodop.dmaster.auth.entity.Menu;
+import cn.reghao.autodop.dmaster.auth.entity.Role;
+import cn.reghao.autodop.dmaster.auth.entity.User;
+import cn.reghao.autodop.dmaster.auth.repository.MenuRepository;
+import cn.reghao.autodop.dmaster.auth.repository.RoleRepository;
+import cn.reghao.autodop.dmaster.auth.repository.UserRepository;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2021-06-04 10:01:41
+ */
+@Service
+public class BakService {
+    private MenuRepository menuRepository;
+    private RoleRepository roleRepository;
+    private UserRepository userRepository;
+
+    public BakService(MenuRepository menuRepository,
+                      RoleRepository roleRepository,
+                      UserRepository userRepository) {
+        this.menuRepository = menuRepository;
+        this.roleRepository = roleRepository;
+        this.userRepository = userRepository;
+    }
+
+    public String bakSysConfig() {
+        List<Menu> menus = menuRepository.findAll().stream()
+                .peek(menu -> {
+                    menu.setRoles(null);
+                    menu.setId(null);
+                    menu.setIsDelete(null);
+                    menu.setCreateTime(null);
+                    menu.setUpdateTime(null);
+                })
+                .collect(Collectors.toList());
+
+        List<Role> roles = roleRepository.findAll().stream()
+                .filter(role -> "ROLE_ADMIN".equals(role.getTitle()))
+                .peek(role -> {
+                    role.setMenus(null);
+                    role.setId(null);
+                    role.setIsDelete(null);
+                    role.setCreateTime(null);
+                    role.setUpdateTime(null);
+                })
+                .collect(Collectors.toList());
+
+        List<User> users = userRepository.findAll().stream()
+                .filter(user -> "admin".equals(user.getUsername()))
+                .peek(user -> {
+                    user.setId(null);
+                    user.setIsDelete(null);
+                    user.setCreateTime(null);
+                    user.setUpdateTime(null);
+                })
+                .collect(Collectors.toList());
+
+        SysConfig sysConfig = new SysConfig(menus, roles, users);
+        return JsonConverter.objectToJson(sysConfig);
+    }
+}

+ 21 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/service/SysConfig.java

@@ -0,0 +1,21 @@
+package cn.reghao.autodop.dmaster.sys.service;
+
+import cn.reghao.autodop.dmaster.auth.entity.Menu;
+import cn.reghao.autodop.dmaster.auth.entity.Role;
+import cn.reghao.autodop.dmaster.auth.entity.User;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2020-05-13 16:40:22
+ */
+@AllArgsConstructor
+@Data
+public class SysConfig {
+    private List<Menu> menus;
+    private List<Role> roles;
+    private List<User> users;
+}

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/AliOss.java

@@ -29,7 +29,7 @@ public class AliOss {
     // TODO 使用工厂方法获取实例
     public AliOss(OssProperties ossProperties) {
         this.ossProperties = ossProperties;
-        client = new OSSClient(ossProperties.getEndpoint(), ossProperties.getKey(), ossProperties.getSecret());
+        client = new OSSClient(ossProperties.getHost(), ossProperties.getKey(), ossProperties.getSecret());
     }
 
     /**

+ 52 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/UploadDownload.java

@@ -0,0 +1,52 @@
+package cn.reghao.autodop.dmaster.utils;
+
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * @author reghao
+ * @date 2021-06-04 10:18:11
+ */
+@Service
+public class UploadDownload {
+    public void upload() {
+    }
+
+    public void download(File file, HttpServletResponse response) throws IOException {
+        String filename = file.getName();
+        prepareResponse(filename, response);
+
+        FileInputStream fis = new FileInputStream(file);
+        BufferedInputStream bis = new BufferedInputStream(fis);
+        OutputStream os = response.getOutputStream();
+        download(bis, os);
+    }
+
+    public void download(InputStream in, HttpServletResponse response) throws IOException {
+        String filename = "data.json";
+        prepareResponse(filename, response);
+        download(in, response.getOutputStream());
+    }
+
+    private void prepareResponse(String filename, HttpServletResponse response) throws UnsupportedEncodingException {
+        response.setHeader("content-type", "application/octet-stream");
+        response.setContentType("application/octet-stream");
+        response.setHeader("Content-Disposition",
+                "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8.toString()));
+    }
+
+    private void download(InputStream in, OutputStream out) throws IOException {
+        byte[] buffer = new byte[1024];
+        int i = in.read(buffer);
+        while (i != -1) {
+            out.write(buffer, 0, i);
+            i = in.read(buffer);
+        }
+        in.close();
+        out.close();
+    }
+}

+ 14 - 21
dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/lifecycle/AfterAppStart.java

@@ -7,13 +7,12 @@ import cn.reghao.autodop.common.utils.FileOps;
 import cn.reghao.autodop.common.utils.MachineId;
 import cn.reghao.autodop.dmaster.app.entity.config.build.BuildDir;
 import cn.reghao.autodop.dmaster.app.repository.config.build.BuildDirRepository;
-import cn.reghao.autodop.dmaster.auth.service.UserService;
-import cn.reghao.autodop.dmaster.common.config.SysConfig;
-import cn.reghao.autodop.dmaster.monitor.HealthCheckJob;
-import cn.reghao.autodop.dmaster.monitor.MonitorScheduler;
-import cn.reghao.autodop.dmaster.utils.dispatcher.AppOpsDispatcher;
-import cn.reghao.autodop.dmaster.utils.dispatcher.DagentMessageDispatcher;
-import cn.reghao.autodop.dmaster.utils.dispatcher.MachineOpsDispatcher;
+import cn.reghao.autodop.dmaster.common.config.LocalBuildDir;
+import cn.reghao.autodop.dmaster.monitor.service.HealthCheckJob;
+import cn.reghao.autodop.dmaster.monitor.service.MonitorScheduler;
+import cn.reghao.autodop.dmaster.mqttsub.AppOpsDispatcher;
+import cn.reghao.autodop.dmaster.mqttsub.DagentMessageDispatcher;
+import cn.reghao.autodop.dmaster.mqttsub.MachineOpsDispatcher;
 import lombok.extern.slf4j.Slf4j;
 import org.eclipse.paho.client.mqttv3.MqttException;
 import org.quartz.SchedulerException;
@@ -39,20 +38,17 @@ public class AfterAppStart implements ApplicationRunner {
     private MqttSub mqttSub;
     private MonitorScheduler monitorScheduler;
     private BuildDirRepository buildDirRepository;
-    private UserService userService;
 
     public AfterAppStart(MachineOpsDispatcher machineOpsDispatcher,
                          AppOpsDispatcher appOpsDispatcher,
                          MqttSub mqttSub,
                          MonitorScheduler monitorScheduler,
-                         BuildDirRepository buildDirRepository,
-                         UserService userService) {
+                         BuildDirRepository buildDirRepository) {
         this.machineOpsDispatcher = machineOpsDispatcher;
         this.appOpsDispatcher = appOpsDispatcher;
         this.mqttSub = mqttSub;
         this.monitorScheduler = monitorScheduler;
         this.buildDirRepository = buildDirRepository;
-        this.userService = userService;
     }
 
     @Override
@@ -87,33 +83,30 @@ public class AfterAppStart implements ApplicationRunner {
 
     public void initialize(BuildDir buildDir) throws MqttException {
         // TODO 放入缓存
-        SysConfig.localRepo = buildDir.getDirPath() + "/local-repo";
-        SysConfig.compileDir = buildDir.getDirPath() + "/compile-dir";
-        SysConfig.packDir = buildDir.getDirPath() + "/pack-dir";
-        checkAndSetLocalDir();
-        //userService.checkOrSetAdmin();
+        LocalBuildDir.set(buildDir);
+        checkOrCreateLocalDir();
         sub();
     }
 
     /**
-     * 检测本地目录
+     * 检测本地目录,不存在则创建
      *
      * @date 2019-11-17 上午11:38
      */
-    private void checkAndSetLocalDir() {
-        File localRepo = new File(SysConfig.localRepo);
+    private void checkOrCreateLocalDir() {
+        File localRepo = new File(LocalBuildDir.localRepo);
         if (!localRepo.exists() && !FileOps.mkdirs(localRepo)) {
             log.error("{} 不存在且创建失败...", localRepo.getAbsolutePath());
             throw new IllegalArgumentException(localRepo.getAbsolutePath() + " 不存在且创建失败...");
         }
 
-        File compileDir = new File(SysConfig.compileDir);
+        File compileDir = new File(LocalBuildDir.compileDir);
         if (!compileDir.exists() && !FileOps.mkdirs(compileDir)) {
             log.error("{} 不存在且创建失败...", compileDir.getAbsolutePath());
             throw new IllegalArgumentException(compileDir.getAbsolutePath() + " 不存在且创建失败...");
         }
 
-        File packDir = new File(SysConfig.packDir);
+        File packDir = new File(LocalBuildDir.packDir);
         if (!packDir.exists() && !FileOps.mkdirs(packDir)) {
             log.error("{} 不存在且创建失败...", packDir.getAbsolutePath());
             throw new IllegalArgumentException(packDir.getAbsolutePath() + " 不存在且创建失败...");

+ 0 - 35
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/AppPagesController.java

@@ -1,35 +0,0 @@
-package cn.reghao.autodop.dmaster.view.controller;
-
-import cn.reghao.autodop.dmaster.auth.entity.User;
-import cn.reghao.autodop.dmaster.auth.service.UserService;
-import cn.reghao.autodop.dmaster.utils.db.PageList;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * @author reghao
- * @date 2021-04-04 21:24:18
- */
-@Deprecated
-@RequestMapping("/app")
-@Controller
-public class AppPagesController {
-    private final UserService userService;
-
-    public AppPagesController(UserService userService) {
-        this.userService = userService;
-    }
-
-    @GetMapping("/bd")
-    public String userPage(Model model) {
-        int page = 1;
-        int size = 10;
-        PageList<User> pageList = userService.findByPage(page, size);
-        model.addAttribute("list", pageList.getList());
-        model.addAttribute("page", pageList);
-        return "build";
-    }
-}

+ 0 - 82
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/SystemPageController.java

@@ -1,82 +0,0 @@
-package cn.reghao.autodop.dmaster.view.controller;
-
-import cn.reghao.autodop.dmaster.auth.entity.Role;
-import cn.reghao.autodop.dmaster.auth.repository.RoleRepository;
-import cn.reghao.autodop.dmaster.common.config.SysConfig;
-import cn.reghao.autodop.dmaster.utils.SpringBootUtil;
-import cn.reghao.autodop.dmaster.utils.WebBody;
-import cn.reghao.autodop.dmaster.utils.db.PageList;
-import cn.reghao.autodop.dmaster.utils.db.PageSort;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.*;
-import java.net.URLEncoder;
-
-/**
- * @author reghao
- * @date 2021-04-04 21:24:18
- */
-@Api(tags = "用户页面")
-@RequestMapping("/sys")
-@Controller
-public class SystemPageController {
-    private RoleRepository roleRepository;
-
-    public SystemPageController(RoleRepository roleRepository) {
-        this.roleRepository = roleRepository;
-    }
-
-    @ApiOperation(value = "系统备份还原页面")
-    @GetMapping("/bak")
-    public String sysBakPage(Model model) {
-        PageRequest pageRequest = PageSort.pageRequest();
-        Page<Role> rolePage = roleRepository.findAll(pageRequest);
-        PageList<Role> pageList = PageList.pageList(rolePage);
-
-        model.addAttribute("page", rolePage);
-        model.addAttribute("list", pageList.getList());
-        return "/sys/bak";
-    }
-
-    @ApiOperation(value = "数据备份")
-    @GetMapping("/bak/export/{filename}")
-    public String download(@PathVariable("filename") String filename, HttpServletResponse response) throws IOException {
-        String filepath = SysConfig.packDir + "/" + filename;
-        File file = new File(filepath);
-        if (file.exists()) {
-            response.setHeader("content-type", "application/octet-stream");
-            response.setContentType("application/octet-stream");
-            response.setHeader("Content-Disposition",
-                    "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
-
-            byte[] buffer = new byte[1024];
-            FileInputStream fis = new FileInputStream(file);
-            BufferedInputStream bis = new BufferedInputStream(fis);
-            OutputStream os = response.getOutputStream();
-            int i = bis.read(buffer);
-            while (i != -1) {
-                os.write(buffer, 0, i);
-                i = bis.read(buffer);
-            }
-            return WebBody.success("文件已下载");
-        }
-
-        return WebBody.success("文件不存在");
-    }
-
-    @ApiOperation(value = "数据还原")
-    @PostMapping("/bak/import")
-    public String upload(@RequestParam("file") MultipartFile file) {
-        String filename = file.getOriginalFilename();
-        String filePath = SpringBootUtil.saveFile(file, "/tmp");
-        return WebBody.success(filePath);
-    }
-}

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/controller/GuestController.java

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.dmaster.vm.controller;
 
 import cn.reghao.autodop.dmaster.utils.WebBody;
-import cn.reghao.autodop.dmaster.vm.kvm.Guest;
+import cn.reghao.autodop.dmaster.vm.service.kvm.Guest;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.web.bind.annotation.*;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/controller/StorageController.java

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.dmaster.vm.controller;
 
 import cn.reghao.autodop.dmaster.utils.WebBody;
-import cn.reghao.autodop.dmaster.vm.kvm.Storage;
+import cn.reghao.autodop.dmaster.vm.service.kvm.Storage;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.web.bind.annotation.*;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/pojo/GuestInfo.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/entity/GuestInfo.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.vm.pojo;
+package cn.reghao.autodop.dmaster.vm.entity;
 
 import lombok.Data;
 import org.libvirt.Domain;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/pojo/PoolInfo.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/entity/PoolInfo.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.vm.pojo;
+package cn.reghao.autodop.dmaster.vm.entity;
 
 import lombok.Data;
 import org.libvirt.LibvirtException;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/pojo/VolumeInfo.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/entity/VolumeInfo.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.vm.pojo;
+package cn.reghao.autodop.dmaster.vm.entity;
 
 import lombok.Data;
 import org.libvirt.LibvirtException;

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/kvm/Guest.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/service/kvm/Guest.java

@@ -1,6 +1,6 @@
-package cn.reghao.autodop.dmaster.vm.kvm;
+package cn.reghao.autodop.dmaster.vm.service.kvm;
 
-import cn.reghao.autodop.dmaster.vm.pojo.GuestInfo;
+import cn.reghao.autodop.dmaster.vm.entity.GuestInfo;
 import org.dom4j.Document;
 import org.dom4j.io.SAXReader;
 import org.libvirt.Connect;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/kvm/Network.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/service/kvm/Network.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.vm.kvm;
+package cn.reghao.autodop.dmaster.vm.service.kvm;
 
 import org.libvirt.Connect;
 

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/kvm/Storage.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/service/kvm/Storage.java

@@ -1,7 +1,7 @@
-package cn.reghao.autodop.dmaster.vm.kvm;
+package cn.reghao.autodop.dmaster.vm.service.kvm;
 
-import cn.reghao.autodop.dmaster.vm.pojo.PoolInfo;
-import cn.reghao.autodop.dmaster.vm.pojo.VolumeInfo;
+import cn.reghao.autodop.dmaster.vm.entity.PoolInfo;
+import cn.reghao.autodop.dmaster.vm.entity.VolumeInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.dom4j.Document;
 import org.dom4j.io.SAXReader;

+ 8 - 2
dmaster/src/main/resources/application-dev.yml

@@ -1,6 +1,6 @@
 spring:
   datasource:
-    url: jdbc:mysql://localhost/reghao_devops_rdb1?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
+    url: jdbc:mysql://localhost/reghao_devops_rdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2b8
     username: dev
     password: Dev@123456
   data:
@@ -13,4 +13,10 @@ mosquitto:
 #mosquitto:
 #  broker: tcp://192.168.0.220:1883
 #  username: test
-#  password: Test@123456
+#  password: Test@123456
+oss:
+  host: http://static.reghao.icu
+  key: minioadmin
+  secret: minioadmin
+  bucket: autodop
+  folder: dev/1/2/3

+ 7 - 1
dmaster/src/main/resources/application-prod.yml

@@ -9,4 +9,10 @@ spring:
 mosquitto:
   broker: tcp://localhost:1883
   username: dev
-  password: Dev@123456
+  password: Dev@123456
+oss:
+  host: http://static.reghao.icu
+  key: minioadmin
+  secret: minioadmin
+  bucket: autodop
+  folder: prod/1/2/3

+ 7 - 1
dmaster/src/main/resources/application-test.yml

@@ -9,4 +9,10 @@ spring:
 mosquitto:
   broker: tcp://192.168.0.220:1883
   username: test
-  password: Test@123456
+  password: Test@123456
+oss:
+  host: http://static.reghao.icu
+  key: minioadmin
+  secret: minioadmin
+  bucket: autodop
+  folder: test/1/2/3

+ 2 - 8
dmaster/src/main/resources/application.yml

@@ -15,7 +15,7 @@ spring:
   banner:
     location: classpath:banner.txt
 #  cache:
-#    cache-names: buildDeployApp
+#    cache-names: test
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
     type: com.zaxxer.hikari.HikariDataSource
@@ -47,10 +47,4 @@ spring:
     encoding: utf-8
     servlet:
       content-type: text/html
-    cache: false
-oss:
-  endpoint: http://oss-cn-hangzhou.aliyuncs.com
-  key: jYk8lOKwSCorFEz7
-  secret: hzSrcew08V5zk58kVVgInV7OqbHyVc
-  bucket: iquizoo
-  folder: eval3.x/alpha/eval_exercises/
+    cache: false

+ 5 - 3
dmaster/src/main/resources/static/js/main.js

@@ -394,9 +394,11 @@ layui.use(['element', 'form', 'layer', 'upload'], function () {
     upload.render({
         elem: '.upload-image' //绑定元素
         ,url: $('.upload-image').attr('up-url') //上传接口
-        ,field: 'image' //文件域的字段名
-        ,acceptMime: 'image/*' //选择文件类型
-        ,exts: 'jpg|jpeg|png|gif' //支持的图片格式
+        ,field: 'file' //文件域的字段名
+        ,accept: 'file'
+        //,field: 'image' //文件域的字段名
+        //,acceptMime: 'image/*' //选择文件类型
+        //,exts: 'jpg|jpeg|png|gif' //支持的图片格式
         ,multiple: true //开启多文件选择
         ,choose: function (obj) {
             obj.preview(function (index, file, result) {

+ 6 - 1
dmaster/src/main/resources/templates/app/config/app/index.html

@@ -4,12 +4,13 @@
 <head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
     <link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
 </head>
+
 <body class="timo-layout-page">
 <div class="layui-card">
     <div class="layui-card-header timo-card-header">
         <span><i class="fa fa-bars"></i> 应用配置</span>
         <i class="layui-icon layui-icon-refresh refresh-btn"></i>
-        <a th:href="@{/app/config/app/export}"><i class="fa fa-download"></i></a>
+        <a th:href="@{/api/app/config/export}"><i class="fa fa-download"></i></a>
     </div>
     <div class="layui-card-body">
         <div class="layui-row timo-card-screen put-row">
@@ -38,6 +39,10 @@
             </div>
             <div class="pull-right screen-btn-group">
                 <div class="btn-group-right">
+                    <button type="button" class="layui-btn upload-image" name="file[]"
+                            th:attr="up-url=@{/api/app/config/import}" up-field="path">
+                        <i class="fa fa-upload"></i> 导入
+                    </button>
                     <button class="layui-btn open-popup" data-title="添加应用" th:attr="data-url=@{/app/config/app/add}"
                             data-size="1200,600">
                         <i class="fa fa-plus"></i> 添加

+ 7 - 6
dmaster/src/main/resources/templates/home/index.html

@@ -69,14 +69,15 @@
         }
     </style>
 </head>
+
 <body class="timo-layout-page">
 <div class="layui-row layui-col-space15">
     <div class="layui-col-md3 layui-col-sm6 layui-col-xs12">
         <div class="widget-small widget-user">
             <i class="icon fa fa-users fa-3x"></i>
             <div class="widget-small-info">
-                <h4>用户</h4>
-                <span>12</span>
+                <h4>机器</h4>
+                <span>10</span>
             </div>
         </div>
     </div>
@@ -84,8 +85,8 @@
         <div class="widget-small widget-visit">
             <i class="icon fa fa-line-chart fa-3x"></i>
             <div class="widget-small-info">
-                <h4>访问</h4>
-                <span>1,200</span>
+                <h4>应用</h4>
+                <span>18</span>
             </div>
         </div>
     </div>
@@ -93,8 +94,8 @@
         <div class="widget-small widget-message">
             <i class="icon fa fa-comments-o fa-3x"></i>
             <div class="widget-small-info">
-                <h4>信息</h4>
-                <span>41</span>
+                <h4>第三方应用</h4>
+                <span>10</span>
             </div>
         </div>
     </div>

+ 107 - 0
dmaster/src/main/resources/templates/machine/detail.html

@@ -0,0 +1,107 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org">
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})"></head>
+
+<body>
+    <div class="timo-detail-page">
+        <div class="timo-detail-title">操作系统信息</div>
+        <table class="layui-table timo-detail-table">
+            <tbody>
+            <tr>
+                <th>系统名字</th>
+                <td th:text="${machine.osInfo.name}"></td>
+                <th>系统架构</th>
+                <td th:text="${machine.osInfo.arch}"></td>
+                <th>系统版本</th>
+                <td th:text="${machine.osInfo.version}"></td>
+            </tr>
+            <tr>
+                <th>系统字节序</th>
+                <td th:text="${machine.osInfo.byteOrder}"></td>
+                <th>系统启动时间</th>
+                <td th:text="${machine.osInfo.bootTime}"></td>
+            </tr>
+            </tbody>
+        </table>
+        <div class="timo-detail-title">网络信息</div>
+        <table class="layui-table timo-detail-table">
+            <tbody>
+            <tr th:each="item:${machine.networkInfo}">
+                <th>网卡接口</th>
+                <td th:text="${item.iface}"></td>
+                <th>MAC 地址</th>
+                <td th:text="${item.mac}"></td>
+                <th>IPv4 地址</th>
+                <td th:text="${item.ipv4}"></td>
+                <th>IPv6 地址</th>
+                <td th:text="${item.ipv6}"></td>
+            </tr>
+            </tbody>
+        </table>
+        <div class="timo-detail-title">处理器信息</div>
+        <table class="layui-table timo-detail-table">
+            <tbody>
+            <tr>
+                <th>处理器核心数量</th>
+                <td th:text="${machine.cpuInfo.cpuCores}"></td>
+                <th>逻辑处理器数量</th>
+                <td th:text="${machine.cpuInfo.cpus}"></td>
+            </tr>
+            <tr>
+                <th>处理器品牌</th>
+                <td th:text="${machine.cpuInfo.vendorId}"></td>
+                <th>处理器型号</th>
+                <td th:text="${machine.cpuInfo.modelName}"></td>
+                <th>bogoMips</th>
+                <td th:text="${machine.cpuInfo.bogoMips}"></td>
+            </tr>
+            </tbody>
+        </table>
+        <div class="timo-detail-title">内存信息</div>
+        <table class="layui-table timo-detail-table">
+            <tbody>
+            <tr>
+                <th>内存总量</th>
+                <td th:text="${machine.memoryInfo.total}"></td>
+                <th>已用内存</th>
+                <td th:text="${machine.memoryInfo.used}"></td>
+                <th>可用内存</th>
+                <td th:text="${machine.memoryInfo.available}"></td>
+            </tr>
+            <tr>
+                <th>交换分区总量</th>
+                <td th:text="${machine.memoryInfo.swapTotal}"></td>
+                <th>已使用交换分区</th>
+                <td th:text="${machine.memoryInfo.swapUsed}"></td>
+                <th>可用交换分区</th>
+                <td th:text="${machine.memoryInfo.swapFree}"></td>
+            </tr>
+            </tbody>
+        </table>
+        <div class="timo-detail-title">磁盘信息</div>
+        <table class="layui-table timo-detail-table">
+            <tbody>
+            <tr th:each="item:${machine.diskInfo}">
+                <th>分区路径</th>
+                <td th:text="${item.diskPath}"></td>
+                <th>分区挂载路径</th>
+                <td th:text="${item.mountedOn}"></td>
+                <th>分区类型</th>
+                <td th:text="${item.fsType}"></td>
+                <th>总容量</th>
+                <td th:text="${item.size}"></td>
+                <th>已使用</th>
+                <td th:text="${item.used}"></td>
+                <th>可用</th>
+                <td th:text="${item.avail}"></td>
+                <th>inode 总量</th>
+                <td th:text="${item.inodeTotal}"></td>
+                <th>inode 可用量</th>
+                <td th:text="${item.inodeFree}"></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+<script th:replace="/common/template :: script"></script>
+</body>
+</html>

+ 76 - 0
dmaster/src/main/resources/templates/machine/host.bak.html

@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+      xmlns:mo="https://gitee.com/aun/Timo">
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})"></head>
+<body class="timo-layout-page">
+<div class="layui-card">
+    <div class="layui-card-header timo-card-header">
+        <span><i class="fa fa-bars"></i> 主机列表</span>
+        <i class="layui-icon layui-icon-refresh refresh-btn"></i>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-row timo-card-screen put-row">
+            <div class="pull-left layui-form-pane timo-search-box">
+                <div class="layui-inline">
+                    <label class="layui-form-label">环境</label>
+                    <div class="layui-input-block timo-search-status">
+                        <select class="timo-search-select" name="status" mo:dict="SEARCH_STATUS"
+                                mo-selected="${param.env}"></select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">机器地址</label>
+                    <div class="layui-input-block">
+                        <input type="text" name="machineIpv4" th:value="${param.machineIpv4}" placeholder="机器地址"
+                               autocomplete="off" class="layui-input">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <button class="layui-btn timo-search-btn">
+                        <i class="fa fa-search"></i>
+                    </button>
+                </div>
+            </div>
+        </div>
+        <div class="timo-table-wrap">
+            <table class="layui-table timo-table">
+                <thead>
+                <tr>
+                    <th class="timo-table-checkbox">
+                        <label class="timo-checkbox"><input type="checkbox">
+                            <i class="layui-icon layui-icon-ok"></i></label>
+                    </th>
+                    <th class="sortable" data-field="machineIpv4">机器地址</th>
+                    <th class="sortable" data-field="bootTime">启动时间</th>
+                    <th class="sortable" data-field="osArch">系统架构</th>
+                    <th class="sortable" data-field="osName">系统名</th>
+                    <th class="sortable" data-field="osVersion">内核版本</th>
+                    <th class="sortable" data-field="cpus">CPU 数量</th>
+                    <th class="sortable" data-field="totalMem">内存容量</th>
+                    <th class="sortable" data-field="lastCheckedTime">最近检查时间</th>
+                </tr>
+                </thead>
+                <tbody>
+                <tr th:each="item:${list}">
+                    <td><label class="timo-checkbox"><input type="checkbox" th:value="${item.machineId}">
+                        <i class="layui-icon layui-icon-ok"></i></label></td>
+                    <td th:text="${item.machineIpv4}">机器地址</td>
+                    <td th:text="${item.bootTime}">启动时间</td>
+                    <td th:text="${item.osArch}">系统架构</td>
+                    <td th:text="${item.osName}">系统名</td>
+                    <td th:text="${item.osVersion}">内核版本</td>
+                    <td th:text="${item.cpus}">CPU 数量</td>
+                    <td th:text="${item.totalMem}">内存容量</td>
+                    <td th:text="${item.lastCheckedTime}">最近检查时间</td>
+                </tr>
+                </tbody>
+            </table>
+        </div>
+        <div th:replace="/common/fragment :: page"></div>
+    </div>
+</div>
+<script th:replace="/common/template :: script"></script>
+<script type="text/javascript">
+</script>
+</body>
+</html>

+ 38 - 18
dmaster/src/main/resources/templates/machine/host.html

@@ -2,33 +2,36 @@
 <html xmlns:th="http://www.thymeleaf.org"
       xmlns:mo="https://gitee.com/aun/Timo">
 <head th:replace="/common/template :: header(~{::title},~{::link},~{::style})"></head>
+
 <body class="timo-layout-page">
 <div class="layui-card">
     <div class="layui-card-header timo-card-header">
-        <span><i class="fa fa-bars"></i> 机列表</span>
+        <span><i class="fa fa-bars"></i> 机列表</span>
         <i class="layui-icon layui-icon-refresh refresh-btn"></i>
     </div>
     <div class="layui-card-body">
         <div class="layui-row timo-card-screen put-row">
-            <div class="pull-left layui-form-pane timo-search-box">
-                <div class="layui-inline">
-                    <label class="layui-form-label">环境</label>
-                    <div class="layui-input-block timo-search-status">
-                        <select class="timo-search-select" name="status" mo:dict="SEARCH_STATUS"
-                                mo-selected="${param.env}"></select>
+            <div class="layui-row timo-card-screen put-row">
+                <div class="pull-left layui-form-pane">
+                    <div class="layui-inline">
+                        <label class="layui-form-label">环境</label>
+                        <div class="layui-input-block timo-search-status">
+                            <select id="getPageByEnv" class="timo-search-select" name="env" onchange="getPageByEnv()"
+                                    mo:dict="ENVIRONMENT" mo-selected="${env}"></select>
+                        </div>
                     </div>
-                </div>
-                <div class="layui-inline">
-                    <label class="layui-form-label">机器地址</label>
-                    <div class="layui-input-block">
-                        <input type="text" name="machineIpv4" th:value="${param.machineIpv4}" placeholder="机器地址"
-                               autocomplete="off" class="layui-input">
+                    <div class="layui-inline timo-search-box">
+                        <label class="layui-form-label">机器地址</label>
+                        <div class="layui-input-block">
+                            <input type="text" name="machineIpv4" th:value="${param.machineIpv4}" placeholder="请输入机器地址"
+                                   autocomplete="off" class="layui-input">
+                        </div>
+                    </div>
+                    <div class="layui-inline">
+                        <button class="layui-btn timo-search-btn">
+                            <i class="fa fa-search"></i>
+                        </button>
                     </div>
-                </div>
-                <div class="layui-inline">
-                    <button class="layui-btn timo-search-btn">
-                        <i class="fa fa-search"></i>
-                    </button>
                 </div>
             </div>
         </div>
@@ -48,6 +51,7 @@
                     <th class="sortable" data-field="cpus">CPU 数量</th>
                     <th class="sortable" data-field="totalMem">内存容量</th>
                     <th class="sortable" data-field="lastCheckedTime">最近检查时间</th>
+                    <th>操作</th>
                 </tr>
                 </thead>
                 <tbody>
@@ -62,6 +66,14 @@
                     <td th:text="${item.cpus}">CPU 数量</td>
                     <td th:text="${item.totalMem}">内存容量</td>
                     <td th:text="${item.lastCheckedTime}">最近检查时间</td>
+                    <td>
+                        <a class="open-popup" data-title="机器详细信息" th:attr="data-url=@{'/machine/host/detail/'+${item.machineId}}"
+                           data-size="1200,600" href="#">详细</a>
+                        <a class="open-popup" data-title="拷贝" th:attr="data-url=@{'/machine/host/'+${item.machineId}}"
+                           data-size="640,480" href="#">拷贝</a>
+                        <a class="open-popup" data-title="编辑" th:attr="data-url=@{'//machine/host/'+${item.machineId}}"
+                           data-size="1200,600" href="#">编辑</a>
+                    </td>
                 </tr>
                 </tbody>
             </table>
@@ -69,8 +81,16 @@
         <div th:replace="/common/fragment :: page"></div>
     </div>
 </div>
+
 <script th:replace="/common/template :: script"></script>
+<script type="text/javascript" th:src="@{/js/plugins/jquery-2.2.4.min.js}"></script>
 <script type="text/javascript">
+    function getPageByEnv() {
+        var selectedOption = $("#getPageByEnv option:selected")
+        var param = selectedOption.text()
+        url = '?env=' + param
+        window.location.href = window.location.pathname + url;
+    }
 </script>
 </body>
 </html>

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

@@ -55,7 +55,7 @@
                      th:src="@{${user.avatarUrl}}" alt="头像">
                 <div>
                     <p class="layui-side-user-name" th:text="${user.nickname}">DevOps</p>
-                    <p class="layui-side-user-designation">在线</p>
+                    <p class="layui-side-user-designation">管理员</p>
                 </div>
             </div>
             <!-- 导航区域 -->

+ 7 - 7
dmaster/src/main/resources/templates/sys/bak.html

@@ -17,10 +17,10 @@
                         <label class="timo-checkbox"><input type="checkbox">
                             <i class="layui-icon layui-icon-ok"></i></label>
                     </th>
-                    <th class="sortable" data-field="title">角色</th>
+                    <th class="sortable" data-field="title">数据源</th>
                     <th class="sortable" data-field="name">角色名</th>
-                    <th class="sortable" data-field="createTime">创建时间</th>
-                    <th class="sortable" data-field="updateTime">更新时间</th>
+                    <th class="sortable" data-field="createTime">最近一次备份</th>
+                    <th class="sortable" data-field="updateTime">最近一次还原</th>
                     <th>备份</th>
                     <th>还原</th>
                 </tr>
@@ -29,15 +29,15 @@
                 <tr th:each="item:${list}">
                     <td><label class="timo-checkbox"><input type="checkbox" th:value="${item.id}">
                         <i class="layui-icon layui-icon-ok"></i></label></td>
-                    <td th:text="${item.title}">角色</td>
+                    <td th:text="${item.title}">数据源</td>
                     <td th:text="${item.name}">角色名</td>
-                    <td th:text="${item.createTime}">创建时间</td>
-                    <td th:text="${item.updateTime}">更新时间</td>
+                    <td th:text="${item.createTime}">最近一次备份</td>
+                    <td th:text="${item.updateTime}">最近一次还原</td>
                     <td>
                         <a th:href="@{/sys/bak/export}"><i class="fa fa-download"></i></a>
                     </td>
                     <td>
-                        <button type="button" class="layui-btn upload-image" name="image[]"
+                        <button type="button" class="layui-btn upload-image" name="file[]"
                                 th:attr="up-url=@{/sys/bak/import}" up-field="path">
                             <i class="fa fa-upload"></i>
                         </button>

+ 39 - 0
dmaster/src/test/java/cn/reghao/autodop/common/amqp/Test.java

@@ -0,0 +1,39 @@
+package cn.reghao.autodop.common.amqp;
+
+import javax.mail.Address;
+import javax.mail.BodyPart;
+import javax.mail.MessagingException;
+import javax.mail.Session;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+import java.io.*;
+import java.util.Properties;
+
+/**
+ * @author reghao
+ * @date 2021-06-04 12:05:07
+ */
+public class Test {
+    public static void main(String[] args) throws IOException, MessagingException {
+        Properties props = System.getProperties();
+        props.put("mail.host", "smtp.dummydomain.com");
+        props.put("mail.transport.protocol", "smtp");
+
+        String filePath = "/home/reghao/data/dl/章贡区网宣部/1/东外街道上报舆情信息.eml";
+        File file = new File(filePath);
+        Session mailSession = Session.getDefaultInstance(props, null);
+        InputStream source = new FileInputStream(file);
+        MimeMessage message = new MimeMessage(mailSession, source);
+        String subject = message.getSubject();
+        Address[] address = message.getFrom();
+        Object content = message.getContent();
+        if (content instanceof MimeMultipart) {
+            MimeMultipart multipart = (MimeMultipart) content;
+            int count = multipart.getCount();
+            for (int i = 0; i < count; i++) {
+                BodyPart bodyPart = multipart.getBodyPart(i);
+                System.out.println("--------------");
+            }
+        }
+    }
+}

+ 1 - 0
scripts/build.sh

@@ -35,6 +35,7 @@ rm -rf ${app_name}
 cd ${proj_home}
 mvn clean
 
+#mvn clean package -am -Dmaven.test.skip=true -Ptest
 #mvn clean package -am -Dmaven.test.skip=true -pl dmaster -Pdev
 #mvn clean package -am -Dmaven.test.skip=true -pl dmaster -Ptest
 #mvn clean package -am -Dmaven.test.skip=true -pl dagent -Ptest

+ 2 - 2
scripts/svn_post_commit

@@ -16,7 +16,7 @@ do
 	grep ${KEY} ${LOGFILE} > /dev/null
 	if [ `echo $?` -eq 0 ]; then
 	  echo ${FE_MAP[${KEY}]} >> ${LOGFILE}
-		#curl -X POST http://192.168.0.50:4000/api/buildDeployApp/build/${FE_MAP[${KEY}]} &
+		#curl -X POST http://192.168.0.50:4000/api/bd/build/${FE_MAP[${KEY}]} &
 	fi
 done
 
@@ -25,6 +25,6 @@ do
 	grep ${KEY} ${LOGFILE} > /dev/null
 	if [ `echo $?` -eq 0 ]; then
 	  echo ${BE_MAP[${KEY}]} >> ${LOGFILE}
-		#curl -X POST http://192.168.0.50:4000/api/buildDeployApp/build/${BE_MAP[${KEY}]} &
+		#curl -X POST http://192.168.0.50:4000/api/bd/build/${BE_MAP[${KEY}]} &
 	fi
 done