Browse Source

feat: 支持密码变量 (#20)

jeessy2 3 years ago
parent
commit
5cc11cc960
4 changed files with 41 additions and 7 deletions
  1. 15 2
      client/backup.go
  2. 3 2
      entity/config_backup.go
  3. 14 1
      web/save.go
  4. 9 2
      web/writing.html

+ 15 - 2
client/backup.go

@@ -95,7 +95,7 @@ func run(conf entity.Config, backupConf entity.BackupConfig) {
 			return
 		}
 		// backup
-		outFileName, err := backup(backupConf)
+		outFileName, err := backup(backupConf, conf.EncryptKey)
 		result := entity.BackupResult{ProjectName: backupConf.ProjectName, Result: "失败"}
 		if err == nil {
 			// webhook
@@ -121,13 +121,26 @@ func prepare(backupConf entity.BackupConfig) (err error) {
 	return
 }
 
-func backup(backupConf entity.BackupConfig) (outFileName os.FileInfo, err error) {
+func backup(backupConf entity.BackupConfig, encryptKey string) (outFileName os.FileInfo, err error) {
 	projectName := backupConf.ProjectName
 	log.Printf("正在备份项目: %s ...", projectName)
 
 	todayString := time.Now().Format("2006-01-02_15_04")
 	shellString := strings.ReplaceAll(backupConf.Command, "#{DATE}", todayString)
 
+	// 解密pwd
+	pwd := ""
+	if backupConf.Pwd != "" {
+		pwd, err = util.DecryptByEncryptKey(encryptKey, backupConf.Pwd)
+		if err != nil {
+			err = fmt.Errorf("解密失败")
+			log.Println(err)
+			return nil, err
+		}
+	}
+
+	shellString = strings.ReplaceAll(shellString, "#{PWD}", pwd)
+
 	// create shell file
 	var shellName string
 	if runtime.GOOS == "windows" {

+ 3 - 2
entity/config_backup.go

@@ -5,8 +5,9 @@ type BackupConfig struct {
 	ProjectName string // 项目名称
 	Command     string // 命令
 	SaveDays    int
-	StartTime   int // 开始时间(0-23)
-	Period      int // 间隔周期(分钟)
+	StartTime   int    // 开始时间(0-23)
+	Period      int    // 间隔周期(分钟)
+	Pwd         string // 密码
 }
 
 // GetProjectPath 获得项目路径

+ 14 - 1
web/save.go

@@ -54,10 +54,23 @@ func Save(writer http.ResponseWriter, request *http.Request) {
 				SaveDays:    saveDays,
 				StartTime:   startTime,
 				Period:      period,
+				Pwd:         forms["Pwd"][index],
 			},
 		)
 	}
 
+	for i := 0; i < len(conf.BackupConfig); i++ {
+		if conf.BackupConfig[i].Pwd != "" &&
+			(len(oldConf.BackupConfig) == 0 || conf.BackupConfig[i].Pwd != oldConf.BackupConfig[i].Pwd) {
+			encryptPwd, err := util.EncryptByEncryptKey(conf.EncryptKey, conf.BackupConfig[i].Pwd)
+			if err != nil {
+				writer.Write([]byte("加密失败"))
+				return
+			}
+			conf.BackupConfig[i].Pwd = encryptPwd
+		}
+	}
+
 	// Webhook
 	conf.WebhookURL = strings.TrimSpace(request.FormValue("WebhookURL"))
 	conf.WebhookRequestBody = strings.TrimSpace(request.FormValue("WebhookRequestBody"))
@@ -68,7 +81,7 @@ func Save(writer http.ResponseWriter, request *http.Request) {
 	conf.SecretKey = strings.TrimSpace(request.FormValue("SecretKey"))
 	conf.BucketName = strings.TrimSpace(request.FormValue("BucketName"))
 
-	if conf.SecretKey != oldConf.SecretKey {
+	if conf.SecretKey != "" && conf.SecretKey != oldConf.SecretKey {
 		secretKey, err := util.EncryptByEncryptKey(conf.EncryptKey, conf.SecretKey)
 		if err != nil {
 			writer.Write([]byte("加密失败"))

+ 9 - 2
web/writing.html

@@ -69,12 +69,19 @@
                     <div class="col-sm-10">
                       <textarea class="form-control" name="Command" id="Command_{{$i}}" rows="3" aria-describedby="Command_help">{{$v.Command}}</textarea>
                       <small id="Command_help" class="form-text text-muted">
-                        须包含#{DATE}变量 <a target="blank" href="https://github.com/jeessy2/backup-x#备份脚本参考">备份脚本参考</a> 
-                        <br/>例:mysqldump -h192.168.1.11 -uroot -p123456 db-name > #{DATE}.sql
+                        须包含#{DATE}变量, #{PWD}为下方的密码变量 <a target="blank" href="https://github.com/jeessy2/backup-x#备份脚本参考">备份脚本参考</a> 
+                        <br/>例:mysqldump -h192.168.1.11 -uroot -p#{PWD} db-name > #{DATE}.sql
                       </small>
                     </div>
                   </div>
 
+                  <div class="form-group row">
+                    <label for="Pwd_{{$i}}" class="col-sm-2 col-form-label">密码变量</label>
+                    <div class="col-sm-10">
+                      <input type="password" class="form-control" name="Pwd" id="Pwd_{{$i}}" value="{{$v.Pwd}}">
+                    </div>
+                  </div>
+
                   <div class="form-group row">
                     <label for="SaveDays_{{$i}}" class="col-sm-2 col-form-label">保存天数</label>
                     <div class="col-sm-10">