瀏覽代碼

完成定时备份功能 demo, 还原功能还未实现

reghao 5 年之前
父節點
當前提交
285219f66e

+ 9 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/backup/BackupController.java

@@ -1,6 +1,7 @@
 package cn.reghao.autodop.dmaster.backup;
 
 import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.common.utils.text.TextFile;
 import cn.reghao.autodop.dmaster.backup.entity.BakService;
 import io.swagger.annotations.Api;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -8,6 +9,8 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.io.File;
+
 /**
  * @author reghao
  * @date 2019-11-15 08:44:50
@@ -23,7 +26,12 @@ public class BackupController {
     }
 
     @PostMapping("/service")
-    public String addService(BakService bakService) {
+    public String addService(BakService bakService) throws Exception {
+        String scriptPath = "/tmp/test.sh";
+        TextFile.write(new File(scriptPath), bakService.getBakScript());
+        bakService.setBakScriptPath(scriptPath);
+        backupService.backup(bakService);
+
         return WebResult.success("ok");
     }
 

+ 2 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/backup/BackupServiceImpl.java

@@ -1,6 +1,7 @@
 package cn.reghao.autodop.dmaster.backup;
 
 import cn.reghao.autodop.dmaster.backup.entity.BakService;
+import cn.reghao.autodop.dmaster.backup.scheduler.BackupScheduler;
 import org.quartz.SchedulerException;
 import org.springframework.stereotype.Service;
 
@@ -19,6 +20,7 @@ public class BackupServiceImpl implements BackupService {
     @Override
     public String backup(BakService bakService) throws SchedulerException {
         backupScheduler.add(bakService);
+        backupScheduler.start();
         return null;
     }
 

+ 10 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/backup/entity/BakLog.java

@@ -1,6 +1,9 @@
 package cn.reghao.autodop.dmaster.backup.entity;
 
 import lombok.Data;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
 
 /**
  * 备份日志
@@ -8,10 +11,17 @@ import lombok.Data;
  * @author reghao
  * @date 2020-11-10 17:15:59
  */
+@Document(collection = "bak_log")
 @Data
 public class BakLog {
+    @Id
+    private String id;
+    @Field("service_name")
     private String serviceName;
+    @Field("bak_time")
     private String bakTime;
+    @Field("is_success")
     private boolean isSuccess;
+    @Field("result")
     private String result;
 }

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/backup/entity/BakService.java

@@ -20,6 +20,7 @@ public class BakService extends BaseEntity {
     private String ip;
     private int port;
     private String bakScript;
+    private String bakScriptPath;
     private String bakDir;
     private String cronExp;
 }

+ 12 - 27
dmaster/src/main/java/cn/reghao/autodop/dmaster/backup/BackupScheduler.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/backup/scheduler/BackupScheduler.java

@@ -1,10 +1,12 @@
-package cn.reghao.autodop.dmaster.backup;
+package cn.reghao.autodop.dmaster.backup.scheduler;
 
 import cn.reghao.autodop.common.shell.ShellExecutor;
 import cn.reghao.autodop.dmaster.backup.entity.BakService;
+import cn.reghao.autodop.dmaster.common.mongo.MongoManager;
+import lombok.extern.slf4j.Slf4j;
 import org.quartz.*;
 import org.quartz.impl.StdSchedulerFactory;
-import org.springframework.stereotype.Service;
+import org.springframework.stereotype.Component;
 
 /**
  * 备份调度器
@@ -12,20 +14,24 @@ import org.springframework.stereotype.Service;
  * @author reghao
  * @date 2020-11-10 13:41:11
  */
-@Service
+@Slf4j
+@Component
 public class BackupScheduler {
     private Scheduler scheduler;
     private ShellExecutor executor;
+    private MongoManager mongoManager;
 
-    public BackupScheduler() throws SchedulerException {
+    public BackupScheduler(MongoManager mongoManager) throws SchedulerException {
         this.scheduler = StdSchedulerFactory.getDefaultScheduler();
         this.executor = new ShellExecutor();
+        this.mongoManager = mongoManager;
     }
 
     public void add(BakService bakService) throws SchedulerException {
         JobDataMap jobDataMap = new JobDataMap();
         // 只传入一组 KV
-        jobDataMap.put(bakService.getBakScript(), executor);
+        jobDataMap.put(bakService.getBakScriptPath(), executor);
+        jobDataMap.put("mongo", mongoManager);
         JobDetail jobDetail = JobBuilder.newJob(ScriptBakJob.class)
                 .withIdentity(bakService.getServiceName())
                 .usingJobData(jobDataMap)
@@ -38,6 +44,7 @@ public class BackupScheduler {
         CronTrigger cronTrigger = triggerBuilder.build();
 
         scheduler.scheduleJob(jobDetail, cronTrigger);
+        log.info("添加新定时任务 {}...", bakService.getServiceName());
     }
 
     public void remove() {
@@ -54,26 +61,4 @@ public class BackupScheduler {
             scheduler.pauseAll();
         }
     }
-
-    public static void main(String[] args) throws SchedulerException {
-        BakService bakService = new BakService();
-        bakService.setServiceName("nexus");
-        bakService.setIp("192.168.0.50");
-        String bakScript = "logfile=$1\n" +
-                "\n" +
-                "cat > rsyncd_secret << EOF\n" +
-                "123456\n" +
-                "EOF\n" +
-                "chmod 600 rsyncd_secret\n" +
-                "\n" +
-                "rsync -avzP --delete --password-file=./rsyncd_secret azy@192.168.0.50::nexus /home/reghao/opt/data/backup/nexus > ${logfile} 2>&1";
-        bakScript = "/home/reghao/work/azy/svn/test/4-运维管理/备份还原/rsync_nexus.sh";
-        bakService.setBakScript(bakScript);
-        String cronExp = "0 */1 * * * ?";
-        bakService.setCronExp(cronExp);
-
-        BackupScheduler scheduler = new BackupScheduler();
-        scheduler.add(bakService);
-        scheduler.start();
-    }
 }

+ 21 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/backup/ScriptBakJob.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/backup/scheduler/ScriptBakJob.java

@@ -1,12 +1,15 @@
-package cn.reghao.autodop.dmaster.backup;
+package cn.reghao.autodop.dmaster.backup.scheduler;
 
 import cn.reghao.autodop.common.shell.ShellExecutor;
 import cn.reghao.autodop.common.shell.ShellResult;
 import cn.reghao.autodop.common.utils.DateTimeUtil;
 import cn.reghao.autodop.dmaster.backup.entity.BakLog;
+import cn.reghao.autodop.dmaster.common.mongo.MongoManager;
 import lombok.extern.slf4j.Slf4j;
 import org.quartz.*;
 
+import java.util.Map;
+
 /**
  * 脚本备份任务
  *
@@ -19,12 +22,26 @@ public class ScriptBakJob implements Job {
     public void execute(JobExecutionContext context) throws JobExecutionException {
         JobKey jobKey = context.getJobDetail().getKey();
         JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
+        MongoManager mongoManager = null;
+        String script = "";
+        ShellExecutor executor = null;
+        for (Map.Entry<String, Object> entry : jobDataMap.entrySet()) {
+            String key = entry.getKey();
+            if ("mongo".equals(key)) {
+                mongoManager = (MongoManager) entry.getValue();
+            } else {
+                script = key;
+                executor = (ShellExecutor) entry.getValue();
+            }
+        }
+
+        /*MongoManager mongoManager = (MongoManager) jobDataMap.get("mongo");
         String script = jobDataMap.getKeys()[0];
+        ShellExecutor executor = (ShellExecutor) jobDataMap.get(script);*/
+
         BakLog bakLog = new BakLog();
         bakLog.setServiceName(jobKey.getName());
         bakLog.setBakTime(DateTimeUtil.now());
-
-        ShellExecutor executor = (ShellExecutor) jobDataMap.get(script);
         log.info("执行 {} 定时任务...", jobKey.getName());
         try {
             ShellResult shellResult = executor.execScript(script);
@@ -35,10 +52,10 @@ public class ScriptBakJob implements Job {
                 bakLog.setSuccess(false);
                 bakLog.setResult(shellResult.getStderr());
             }
+            mongoManager.insert(bakLog);
         } catch (Exception e) {
             bakLog.setSuccess(false);
             bakLog.setResult(e.getMessage());
         }
-        log.info("bakLog -> {}", bakLog);
     }
 }

+ 33 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/mongo/MongoManager.java

@@ -0,0 +1,33 @@
+package cn.reghao.autodop.dmaster.common.mongo;
+
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author reghao
+ * @date 2020-11-10 18:10:22
+ */
+@Component
+public class MongoManager {
+    private MongoTemplate mongoTemplate;
+
+    public MongoManager(MongoTemplate mongoTemplate) {
+        this.mongoTemplate = mongoTemplate;
+    }
+
+    public void insert(Object object) {
+        mongoTemplate.save(object);
+    }
+
+    public void query() {
+
+    }
+
+    public void update() {
+
+    }
+
+    public void delete() {
+
+    }
+}

+ 0 - 1
rsyncd_secret

@@ -1 +0,0 @@
-123456