package space_worker import ( "fmt" "os" "os/exec" "playbookctl/internal/utils" "strings" "time" ) func (app *SpaceWorker) Backup(generateOnly bool, targetHost string, roles ...string) error { app.log.Debug(fmt.Sprintf("workDir: %s", app.workDir)) var host string if targetHost != "" { host = targetHost } else { var err error host, err = app.GetDefaultHost() if err != nil { return err } } postBackupFile := fmt.Sprintf("/tmp/%s", time.Now().Format("20060102_150405")) ansibleArgs, err := app.setupBackupAnsibleArgs(app.AnsibleVerbose, host, roles, postBackupFile) if err != nil { return err } command := exec.Command(app.AnsibleBin, ansibleArgs...) command.Dir = app.workDir command.Stdin = os.Stdin command.Stdout = os.Stdout command.Stderr = os.Stderr app.log.Info(fmt.Sprintf("Target Host: %s", host)) if generateOnly { fmt.Println(strings.Join(command.Args, " ")) return nil } app.log.Debug(fmt.Sprintf("ansible command line: %s", command.Args)) err = command.Run() if err != nil { return err } app.log.Info("Download Files") command = exec.Command("/bin/bash", "-c", postBackupFile) command.Dir = app.workDir command.Stdin = os.Stdin command.Stdout = os.Stdout command.Stderr = os.Stderr _ = command.Run() if err = utils.RemoveFile(postBackupFile); err != nil { return err } command = exec.Command("/bin/bash", "-c", postBackupFile+"_clean") command.Dir = app.workDir command.Stdin = os.Stdin command.Stdout = os.Stdout command.Stderr = os.Stderr _ = command.Run() if err = utils.RemoveFile(postBackupFile + "_clean"); err != nil { return err } return nil } func (app *SpaceWorker) setupBackupAnsibleArgs(verbose uint8, targetHost string, roles []string, postBackupFile string) ([]string, error) { var ansibleArgs []string switch verbose { case 1: ansibleArgs = append(ansibleArgs, "-v") case 2: ansibleArgs = append(ansibleArgs, "-vv") case 3: ansibleArgs = append(ansibleArgs, "-vvv") } ansibleArgs = append(ansibleArgs, "-i", "hosts.yml") ansibleArgs = append(ansibleArgs, "-l", targetHost) if len(roles) > 0 { for _, role := range roles { ansibleArgs = append(ansibleArgs, "--extra-vars", fmt.Sprintf("dd_backup_%s=true", role)) } } else { ansibleArgs = append(ansibleArgs, "--extra-vars", "dd_backup=true") } ansibleArgs = append(ansibleArgs, "--extra-vars", "dd_postbackup=true") ansibleArgs = append(ansibleArgs, "--extra-vars", fmt.Sprintf("dd_postbackup_file=%s", postBackupFile)) return append(ansibleArgs, "playbook.yml"), nil }