diff --git a/backend/app/service/cronjob_helper.go b/backend/app/service/cronjob_helper.go index 267c6309e..6cdb7b81b 100644 --- a/backend/app/service/cronjob_helper.go +++ b/backend/app/service/cronjob_helper.go @@ -5,7 +5,6 @@ import ( "fmt" "io/ioutil" "os" - "os/exec" "strings" "time" @@ -208,29 +207,25 @@ func handleTar(sourceDir, targetDir, name, exclusionRules string) error { return err } } - exStr := []string{} - exStr = append(exStr, "zcvf") - exStr = append(exStr, targetDir+"/"+name) + excludes := strings.Split(exclusionRules, ";") + excludeRules := "" for _, exclude := range excludes { if len(exclude) == 0 { continue } - exStr = append(exStr, "--exclude") - exStr = append(exStr, exclude) + excludeRules += (" --exclude" + exclude) } + path := "" if len(strings.Split(sourceDir, "/")) > 3 { - exStr = append(exStr, "-C") itemDir := strings.ReplaceAll(sourceDir[strings.LastIndex(sourceDir, "/"):], "/", "") aheadDir := strings.ReplaceAll(sourceDir, itemDir, "") - exStr = append(exStr, aheadDir) - exStr = append(exStr, itemDir) + path += fmt.Sprintf("-C %s %s", aheadDir, itemDir) } else { - exStr = append(exStr, sourceDir) + path = sourceDir } - cmd := exec.Command("tar", exStr...) - stdout, err := cmd.CombinedOutput() - fmt.Println(string(stdout)) + + stdout, err := cmd.Execf("tar zcvf %s %s %s", targetDir+"/"+name, excludeRules, path) if err != nil { return errors.New(string(stdout)) } @@ -244,8 +239,7 @@ func handleUnTar(sourceFile, targetDir string) error { } } - cmd := exec.Command("tar", "zxvfC", sourceFile, targetDir) - stdout, err := cmd.CombinedOutput() + stdout, err := cmd.Execf("tar zxvfC %s %s", sourceFile, targetDir) if err != nil { return errors.New(string(stdout)) } diff --git a/backend/app/service/database_mysql.go b/backend/app/service/database_mysql.go index 7fc75a077..387eb9811 100644 --- a/backend/app/service/database_mysql.go +++ b/backend/app/service/database_mysql.go @@ -19,6 +19,7 @@ import ( "github.com/1Panel-dev/1Panel/backend/app/model" "github.com/1Panel-dev/1Panel/backend/constant" "github.com/1Panel-dev/1Panel/backend/global" + "github.com/1Panel-dev/1Panel/backend/utils/cmd" "github.com/1Panel-dev/1Panel/backend/utils/common" "github.com/1Panel-dev/1Panel/backend/utils/compose" "github.com/1Panel-dev/1Panel/backend/utils/files" @@ -588,8 +589,7 @@ func (u *MysqlService) LoadStatus() (*dto.MysqlStatus, error) { } func excuteSqlForMaps(containerName, password, command string) (map[string]string, error) { - cmd := exec.Command("docker", "exec", containerName, "mysql", "-uroot", "-p"+password, "-e", command) - stdout, err := cmd.CombinedOutput() + stdout, err := cmd.Execf("docker exec %s mysql -uroot -p%s -e %s", containerName, password, command) stdStr := strings.ReplaceAll(string(stdout), "mysql: [Warning] Using a password on the command line interface can be insecure.\n", "") if err != nil || strings.HasPrefix(string(stdStr), "ERROR ") { return nil, errors.New(stdStr) @@ -607,8 +607,7 @@ func excuteSqlForMaps(containerName, password, command string) (map[string]strin } func excuteSqlForRows(containerName, password, command string) ([]string, error) { - cmd := exec.Command("docker", "exec", containerName, "mysql", "-uroot", "-p"+password, "-e", command) - stdout, err := cmd.CombinedOutput() + stdout, err := cmd.Execf("docker exec %s mysql -uroot -p%s -e %s", containerName, password, command) stdStr := strings.ReplaceAll(string(stdout), "mysql: [Warning] Using a password on the command line interface can be insecure.\n", "") if err != nil || strings.HasPrefix(string(stdStr), "ERROR ") { return nil, errors.New(stdStr) @@ -617,8 +616,7 @@ func excuteSqlForRows(containerName, password, command string) ([]string, error) } func excuteSql(containerName, password, command string) error { - cmd := exec.Command("docker", "exec", containerName, "mysql", "-uroot", "-p"+password, "-e", command) - stdout, err := cmd.CombinedOutput() + stdout, err := cmd.Execf("docker exec %s mysql -uroot -p%s -e %s", containerName, password, command) stdStr := strings.ReplaceAll(string(stdout), "mysql: [Warning] Using a password on the command line interface can be insecure.\n", "") if err != nil || strings.HasPrefix(string(stdStr), "ERROR ") { return errors.New(stdStr) diff --git a/backend/app/service/database_redis.go b/backend/app/service/database_redis.go index d1a2b563a..eae86b278 100644 --- a/backend/app/service/database_redis.go +++ b/backend/app/service/database_redis.go @@ -14,6 +14,7 @@ import ( "github.com/1Panel-dev/1Panel/backend/app/dto" "github.com/1Panel-dev/1Panel/backend/constant" "github.com/1Panel-dev/1Panel/backend/global" + "github.com/1Panel-dev/1Panel/backend/utils/cmd" "github.com/1Panel-dev/1Panel/backend/utils/compose" _ "github.com/go-sql-driver/mysql" ) @@ -160,9 +161,8 @@ func (u *RedisService) Backup() error { if err != nil { return err } - commands := append(redisExec(redisInfo.ContainerName, redisInfo.Password), "save") - cmd := exec.Command("docker", commands...) - if stdout, err := cmd.CombinedOutput(); err != nil { + stdout, err := cmd.Execf("docker exec %s redis-cli -a %s --no-auth-warning save", redisInfo.ContainerName, redisInfo.Password) + if err != nil { return errors.New(string(stdout)) } localDir, err := loadLocalDir() @@ -195,9 +195,9 @@ func (u *RedisService) Backup() error { } name := fmt.Sprintf("%s.rdb", time.Now().Format("20060102150405")) - cmd2 := exec.Command("docker", "cp", fmt.Sprintf("%s:/data/dump.rdb", redisInfo.ContainerName), fmt.Sprintf("%s/%s", fullDir, name)) - if stdout, err := cmd2.CombinedOutput(); err != nil { - return errors.New(string(stdout)) + stdout1, err1 := cmd.Execf("docker cp %s:/data/dump.rdb %s/%s", redisInfo.ContainerName, fullDir, name) + if err1 != nil { + return errors.New(string(stdout1)) } return nil } diff --git a/backend/app/service/docker.go b/backend/app/service/docker.go index 4b3fbdade..36f83a448 100644 --- a/backend/app/service/docker.go +++ b/backend/app/service/docker.go @@ -6,12 +6,12 @@ import ( "encoding/json" "io/ioutil" "os" - "os/exec" "path" "strings" "github.com/1Panel-dev/1Panel/backend/app/dto" "github.com/1Panel-dev/1Panel/backend/constant" + "github.com/1Panel-dev/1Panel/backend/utils/cmd" "github.com/1Panel-dev/1Panel/backend/utils/docker" "github.com/pkg/errors" ) @@ -50,8 +50,7 @@ func (u *DockerService) LoadDockerStatus() string { func (u *DockerService) LoadDockerConf() *dto.DaemonJsonConf { status := constant.StatusRunning - cmd := exec.Command("systemctl", "is-active", "docker") - stdout, err := cmd.CombinedOutput() + stdout, err := cmd.Exec("systemctl is-active docker") if string(stdout) != "active\n" || err != nil { status = constant.Stopped } @@ -158,8 +157,7 @@ func (u *DockerService) UpdateConf(req dto.DaemonJsonConf) error { return err } - cmd := exec.Command("systemctl", "restart", "docker") - stdout, err := cmd.CombinedOutput() + stdout, err := cmd.Exec("systemctl restart docker") if err != nil { return errors.New(string(stdout)) } @@ -176,8 +174,7 @@ func (u *DockerService) UpdateConfByFile(req dto.DaemonJsonUpdateByFile) error { _, _ = write.WriteString(req.File) write.Flush() - cmd := exec.Command("systemctl", "restart", "docker") - stdout, err := cmd.CombinedOutput() + stdout, err := cmd.Exec("systemctl restart docker") if err != nil { return errors.New(string(stdout)) } @@ -185,8 +182,7 @@ func (u *DockerService) UpdateConfByFile(req dto.DaemonJsonUpdateByFile) error { } func (u *DockerService) OperateDocker(req dto.DockerOperation) error { - cmd := exec.Command("systemctl", req.Operation, "docker") - stdout, err := cmd.CombinedOutput() + stdout, err := cmd.Execf("systemctl %s docker ", req.Operation) if err != nil { return errors.New(string(stdout)) } diff --git a/backend/app/service/image_repo.go b/backend/app/service/image_repo.go index 7d6544c9a..7eee0885c 100644 --- a/backend/app/service/image_repo.go +++ b/backend/app/service/image_repo.go @@ -2,10 +2,8 @@ package service import ( "encoding/json" - "fmt" "io/ioutil" "os" - "os/exec" "path" "strings" @@ -109,15 +107,13 @@ func (u *ImageRepoService) BatchDelete(req dto.ImageRepoDelete) error { _ = u.handleRegistries("", repo.DownloadUrl, "delete") } if repo.Auth { - cmd := exec.Command("docker", "logout", fmt.Sprintf("%s://%s", repo.Protocol, repo.DownloadUrl)) - _, _ = cmd.CombinedOutput() + _, _ = cmd.Execf("docker logout %s://%s", repo.Protocol, repo.DownloadUrl) } } if err := imageRepoRepo.Delete(commonRepo.WithIdsIn(req.Ids)); err != nil { return err } - cmd := exec.Command("systemctl", "restart", "docker") - stdout, err := cmd.CombinedOutput() + stdout, err := cmd.Exec("systemctl restart docker") if err != nil { return errors.New(string(stdout)) } @@ -136,11 +132,9 @@ func (u *ImageRepoService) Update(req dto.ImageRepoUpdate) error { if repo.DownloadUrl != req.DownloadUrl { _ = u.handleRegistries(req.DownloadUrl, repo.DownloadUrl, "update") if repo.Auth { - cmd := exec.Command("docker", "logout", repo.DownloadUrl) - _, _ = cmd.CombinedOutput() + _, _ = cmd.Execf("docker logout %s", repo.DownloadUrl) } - cmd := exec.Command("systemctl", "restart", "docker") - stdout, err := cmd.CombinedOutput() + stdout, err := cmd.Exec("systemctl restart docker") if err != nil { return errors.New(string(stdout)) } @@ -163,8 +157,7 @@ func (u *ImageRepoService) Update(req dto.ImageRepoUpdate) error { } func (u *ImageRepoService) checkConn(host, user, password string) error { - cmd := exec.Command("docker", "login", "-u", user, "-p", password, host) - stdout, err := cmd.CombinedOutput() + stdout, err := cmd.Execf("docker login -u %s -p %s %s", user, password, host) if err != nil { return errors.New(string(stdout)) } diff --git a/backend/app/service/website_utils.go b/backend/app/service/website_utils.go index 9040d48d7..2f8d1c50f 100644 --- a/backend/app/service/website_utils.go +++ b/backend/app/service/website_utils.go @@ -17,6 +17,7 @@ import ( "github.com/1Panel-dev/1Panel/backend/app/model" "github.com/1Panel-dev/1Panel/backend/constant" "github.com/1Panel-dev/1Panel/backend/global" + "github.com/1Panel-dev/1Panel/backend/utils/cmd" "github.com/1Panel-dev/1Panel/backend/utils/compose" "github.com/1Panel-dev/1Panel/backend/utils/files" "github.com/1Panel-dev/1Panel/backend/utils/nginx" @@ -501,8 +502,7 @@ func handleWebsiteRecover(website *model.Website, fileDir string) error { if err := handleUnTar(fmt.Sprintf("%s/%s.web.tar.gz", fileDir, website.Alias), siteDir); err != nil { return err } - cmd := exec.Command("docker", "exec", "-i", nginxInfo.ContainerName, "nginx", "-s", "reload") - stdout, err := cmd.CombinedOutput() + stdout, err := cmd.Execf("docker exec -i %s nginx -s reload", nginxInfo.ContainerName) if err != nil { return errors.New(string(stdout)) } diff --git a/backend/utils/cmd/cmd.go b/backend/utils/cmd/cmd.go index e41b45a5a..c4f46806e 100644 --- a/backend/utils/cmd/cmd.go +++ b/backend/utils/cmd/cmd.go @@ -2,6 +2,7 @@ package cmd import ( "bytes" + "fmt" "os/exec" ) @@ -16,3 +17,15 @@ func Exec(cmdStr string) (string, error) { } return stdout.String(), nil } + +func Execf(cmdStr string, a ...interface{}) (string, error) { + cmd := exec.Command("bash", "-c", fmt.Sprintf(cmdStr, a...)) + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + err := cmd.Run() + if err != nil { + return stderr.String(), err + } + return stdout.String(), nil +} diff --git a/backend/utils/compose/compose.go b/backend/utils/compose/compose.go index e420a5f5a..b664989e1 100644 --- a/backend/utils/compose/compose.go +++ b/backend/utils/compose/compose.go @@ -1,45 +1,38 @@ package compose import ( - "os/exec" - + "github.com/1Panel-dev/1Panel/backend/utils/cmd" "github.com/compose-spec/compose-go/loader" "github.com/compose-spec/compose-go/types" ) func Up(filePath string) (string, error) { - cmd := exec.Command("docker-compose", "-f", filePath, "up", "-d") - stdout, err := cmd.CombinedOutput() + stdout, err := cmd.Execf("docker-compose -f %s up -d", filePath) return string(stdout), err } func Down(filePath string) (string, error) { - cmd := exec.Command("docker-compose", "-f", filePath, "down") - stdout, err := cmd.CombinedOutput() + stdout, err := cmd.Execf("docker-compose -f %s down", filePath) return string(stdout), err } func Stop(filePath string) (string, error) { - cmd := exec.Command("docker-compose", "-f", filePath, "stop") - stdout, err := cmd.CombinedOutput() + stdout, err := cmd.Execf("docker-compose -f %s stop", filePath) return string(stdout), err } func Restart(filePath string) (string, error) { - cmd := exec.Command("docker-compose", "-f", filePath, "restart") - stdout, err := cmd.CombinedOutput() + stdout, err := cmd.Execf("docker-compose -f %s restart", filePath) return string(stdout), err } func Operate(filePath, operation string) (string, error) { - cmd := exec.Command("docker-compose", "-f", filePath, operation) - stdout, err := cmd.CombinedOutput() + stdout, err := cmd.Execf("docker-compose -f %s %s", filePath, operation) return string(stdout), err } func Rmf(filePath string) (string, error) { - cmd := exec.Command("docker-compose", "-f", filePath, "rm", "-f") - stdout, err := cmd.CombinedOutput() + stdout, err := cmd.Execf("docker-compose -f %s rm -f", filePath) return string(stdout), err } diff --git a/frontend/src/views/cronjob/record/index.vue b/frontend/src/views/cronjob/record/index.vue index d056d54da..59c5399cb 100644 --- a/frontend/src/views/cronjob/record/index.vue +++ b/frontend/src/views/cronjob/record/index.vue @@ -444,9 +444,13 @@ const onDownload = async (recordID: number, backupID: number) => { a.style.display = 'none'; a.href = downloadUrl; if (dialogData.value.rowData!.type === 'database') { - a.download = dateFormatForName(currentRecord.value?.startTime) + '.sql.gz'; + a.download = + dialogData.value.rowData!.dbName + '_' + dateFormatForName(currentRecord.value?.startTime) + '.sql.gz'; + } else if (dialogData.value.rowData!.type === 'website') { + a.download = + dialogData.value.rowData!.website + '_' + dateFormatForName(currentRecord.value?.startTime) + '.tar.gz'; } else { - a.download = dateFormatForName(currentRecord.value?.startTime) + '.tar.gz'; + a.download = dateFormatForName(currentRecord.value?.startTime) + '.sql.gz'; } const event = new MouseEvent('click'); a.dispatchEvent(event); diff --git a/frontend/src/views/setting/snapshot/index.vue b/frontend/src/views/setting/snapshot/index.vue index a6b1ce511..59ebf31b9 100644 --- a/frontend/src/views/setting/snapshot/index.vue +++ b/frontend/src/views/setting/snapshot/index.vue @@ -7,7 +7,7 @@ {{ $t('setting.createSnapshot') }} - + {{ $t('setting.importSnapshot') }}