diff --git a/agent/app/service/backup_app.go b/agent/app/service/backup_app.go index a3e37b0b79d3..38515aac73fc 100644 --- a/agent/app/service/backup_app.go +++ b/agent/app/service/backup_app.go @@ -159,7 +159,7 @@ func handleAppBackup(install *model.AppInstall, parentTask *task.Task, backupDir } appPath := install.GetPath() - if err := handleTar(appPath, tmpDir, "app.tar.gz", excludes, ""); err != nil { + if err := fileOp.TarGzCompressPro(true, appPath, path.Join(tmpDir, "app.tar.gz"), "", excludes); err != nil { return err } @@ -170,7 +170,7 @@ func handleAppBackup(install *model.AppInstall, parentTask *task.Task, backupDir } } t.LogStart(i18n.GetMsgByKey("CompressDir")) - if err := handleTar(tmpDir, backupDir, fileName, "", secret); err != nil { + if err := fileOp.TarGzCompressPro(true, tmpDir, path.Join(backupDir, fileName), secret, ""); err != nil { return err } t.Log(i18n.GetWithName("CompressFileSuccess", fileName)) @@ -200,7 +200,7 @@ func handleAppRecover(install *model.AppInstall, parentTask *task.Task, recoverF recoverApp := func(t *task.Task) error { fileOp := files.NewFileOp() - if err := handleUnTar(recoverFile, path.Dir(recoverFile), secret); err != nil { + if err := fileOp.TarGzExtractPro(recoverFile, path.Dir(recoverFile), secret); err != nil { return err } tmpPath := strings.ReplaceAll(recoverFile, ".tar.gz", "") @@ -307,7 +307,7 @@ func handleAppRecover(install *model.AppInstall, parentTask *task.Task, recoverF deCompressName := i18n.GetWithName("DeCompressFile", "app.tar.gz") t.LogStart(deCompressName) - if err := handleUnTar(tmpPath+"/app.tar.gz", install.GetAppPath(), ""); err != nil { + if err := fileOp.TarGzExtractPro(tmpPath+"/app.tar.gz", install.GetAppPath(), ""); err != nil { t.LogFailedWithErr(deCompressName, err) _ = fileOp.DeleteDir(appDir) _ = fileOp.Rename(backPath, appDir) diff --git a/agent/app/service/backup_mysql.go b/agent/app/service/backup_mysql.go index a61950b540d8..c16d4bc6f2d2 100644 --- a/agent/app/service/backup_mysql.go +++ b/agent/app/service/backup_mysql.go @@ -61,12 +61,13 @@ func (u *BackupService) MysqlRecoverByUpload(req dto.CommonRecover) error { if strings.HasSuffix(fileName, ".tar.gz") { fileNameItem := time.Now().Format(constant.DateTimeSlimLayout) dstDir := fmt.Sprintf("%s/%s", path.Dir(req.File), fileNameItem) - if _, err := os.Stat(dstDir); err != nil && os.IsNotExist(err) { - if err = os.MkdirAll(dstDir, os.ModePerm); err != nil { + fileOp := files.NewFileOp() + if !fileOp.Stat(dstDir) { + if err := fileOp.CreateDir(dstDir, os.ModePerm); err != nil { return fmt.Errorf("mkdir %s failed, err: %v", dstDir, err) } } - if err := handleUnTar(req.File, dstDir, ""); err != nil { + if err := fileOp.TarGzExtractPro(req.File, dstDir, ""); err != nil { _ = os.RemoveAll(dstDir) return err } diff --git a/agent/app/service/backup_postgresql.go b/agent/app/service/backup_postgresql.go index 1a54ad3c04ba..e5292e0aaee1 100644 --- a/agent/app/service/backup_postgresql.go +++ b/agent/app/service/backup_postgresql.go @@ -61,12 +61,13 @@ func (u *BackupService) PostgresqlRecoverByUpload(req dto.CommonRecover) error { if strings.HasSuffix(fileName, ".tar.gz") { fileNameItem := time.Now().Format(constant.DateTimeSlimLayout) dstDir := fmt.Sprintf("%s/%s", path.Dir(req.File), fileNameItem) - if _, err := os.Stat(dstDir); err != nil && os.IsNotExist(err) { - if err = os.MkdirAll(dstDir, os.ModePerm); err != nil { + fileOp := files.NewFileOp() + if !fileOp.Stat(dstDir) { + if err := fileOp.CreateDir(dstDir, os.ModePerm); err != nil { return fmt.Errorf("mkdir %s failed, err: %v", dstDir, err) } } - if err := handleUnTar(req.File, dstDir, ""); err != nil { + if err := fileOp.TarGzExtractPro(req.File, dstDir, ""); err != nil { _ = os.RemoveAll(dstDir) return err } diff --git a/agent/app/service/backup_redis.go b/agent/app/service/backup_redis.go index 0ac23dc86b3b..8ca3491a69a5 100644 --- a/agent/app/service/backup_redis.go +++ b/agent/app/service/backup_redis.go @@ -102,7 +102,7 @@ func handleRedisBackup(redisInfo *repo.RootInfo, parentTask *task.Task, backupDi if strings.HasSuffix(fileName, ".tar.gz") { redisDataDir := fmt.Sprintf("%s/%s/%s/data/appendonlydir", constant.AppInstallDir, "redis", redisInfo.Name) - if err := handleTar(redisDataDir, backupDir, fileName, "", secret); err != nil { + if err := fileOp.TarGzCompressPro(true, redisDataDir, path.Join(backupDir, fileName), secret, ""); err != nil { return err } return nil @@ -201,7 +201,7 @@ func handleRedisRecover(redisInfo *repo.RootInfo, parentTask *task.Task, recover } if appendonly == "yes" && strings.HasPrefix(redisInfo.Version, "7.") { redisDataDir := fmt.Sprintf("%s/%s/%s/data", constant.AppInstallDir, "redis", redisInfo.Name) - if err := handleUnTar(recoverFile, redisDataDir, secret); err != nil { + if err := fileOp.TarGzExtractPro(recoverFile, redisDataDir, secret); err != nil { return err } } else { diff --git a/agent/app/service/backup_runtime.go b/agent/app/service/backup_runtime.go index 771f94a8896b..38e89bc23ec4 100644 --- a/agent/app/service/backup_runtime.go +++ b/agent/app/service/backup_runtime.go @@ -35,10 +35,10 @@ func handleRuntimeBackup(runtime *model.Runtime, backupDir, fileName string, exc } appPath := runtime.GetPath() - if err := handleTar(appPath, tmpDir, "runtime.tar.gz", excludes, secret); err != nil { + if err := fileOp.TarGzCompressPro(true, appPath, path.Join(tmpDir, "runtime.tar.gz"), secret, excludes); err != nil { return err } - if err := handleTar(tmpDir, backupDir, fileName, "", secret); err != nil { + if err := fileOp.TarGzCompressPro(true, tmpDir, path.Join(backupDir, fileName), secret, ""); err != nil { return err } return nil @@ -47,7 +47,7 @@ func handleRuntimeBackup(runtime *model.Runtime, backupDir, fileName string, exc func handleRuntimeRecover(runtime *model.Runtime, recoverFile string, isRollback bool, secret string) error { isOk := false fileOp := files.NewFileOp() - if err := handleUnTar(recoverFile, path.Dir(recoverFile), secret); err != nil { + if err := fileOp.TarGzExtractPro(recoverFile, path.Dir(recoverFile), secret); err != nil { return err } tmpPath := strings.ReplaceAll(recoverFile, ".tar.gz", "") @@ -100,7 +100,7 @@ func handleRuntimeRecover(runtime *model.Runtime, recoverFile string, isRollback _ = fileOp.Rename(runtimeDir, backPath) _ = fileOp.CreateDir(runtimeDir, constant.DirPerm) - if err := handleUnTar(tmpPath+"/runtime.tar.gz", fmt.Sprintf("%s/%s", constant.RuntimeDir, runtime.Type), secret); err != nil { + if err := fileOp.TarGzExtractPro(tmpPath+"/runtime.tar.gz", fmt.Sprintf("%s/%s", constant.RuntimeDir, runtime.Type), secret); err != nil { global.LOG.Errorf("handle recover from runtime.tar.gz failed, err: %v", err) _ = fileOp.DeleteDir(runtimeDir) _ = fileOp.Rename(backPath, runtimeDir) diff --git a/agent/app/service/backup_website.go b/agent/app/service/backup_website.go index 2e73e1e053ef..0e6a00e9e647 100644 --- a/agent/app/service/backup_website.go +++ b/agent/app/service/backup_website.go @@ -79,7 +79,7 @@ func handleWebsiteRecover(website *model.Website, recoverFile string, isRollback fileOp := files.NewFileOp() tmpPath := strings.ReplaceAll(recoverFile, ".tar.gz", "") t.Log(i18n.GetWithName("DeCompressFile", recoverFile)) - if err = handleUnTar(recoverFile, path.Dir(recoverFile), secret); err != nil { + if err = fileOp.TarGzExtractPro(recoverFile, path.Dir(recoverFile), secret); err != nil { return err } defer func() { @@ -182,7 +182,7 @@ func handleWebsiteRecover(website *model.Website, recoverFile string, isRollback } taskName := i18n.GetMsgByKey("TaskRecover") + i18n.GetMsgByKey("websiteDir") t.Log(taskName) - if err = handleUnTar(fmt.Sprintf("%s/%s.web.tar.gz", tmpPath, website.Alias), GetSitePath(*website, SiteDir), ""); err != nil { + if err = fileOp.TarGzExtractPro(fmt.Sprintf("%s/%s.web.tar.gz", tmpPath, website.Alias), GetSitePath(*website, SiteDir), ""); err != nil { t.LogFailedWithErr(taskName, err) return err } @@ -263,10 +263,10 @@ func handleWebsiteBackup(website *model.Website, backupDir, fileName, excludes, websiteDir := GetSitePath(*website, SiteDir) t.LogStart(i18n.GetMsgByKey("CompressDir")) - if err = handleTar(websiteDir, tmpDir, fmt.Sprintf("%s.web.tar.gz", website.Alias), excludes, ""); err != nil { + if err = fileOp.TarGzCompressPro(true, websiteDir, path.Join(tmpDir, fmt.Sprintf("%s.web.tar.gz", website.Alias)), "", excludes); err != nil { return err } - if err = handleTar(tmpDir, backupDir, fileName, "", secret); err != nil { + if err = fileOp.TarGzCompressPro(true, tmpDir, path.Join(backupDir, fileName), secret, ""); err != nil { return err } t.Log(i18n.GetWithName("CompressFileSuccess", fileName)) diff --git a/agent/app/service/cronjob_backup.go b/agent/app/service/cronjob_backup.go index 4f5b6b1b2922..c1197258f24c 100644 --- a/agent/app/service/cronjob_backup.go +++ b/agent/app/service/cronjob_backup.go @@ -316,6 +316,7 @@ func loadWebsForJob(cronjob model.Cronjob) []model.Website { } func handleBackupLogs(targetDir, fileName string, secret string) error { + fileOp := files.NewFileOp() websites, err := websiteRepo.List() if err != nil { return err @@ -338,7 +339,7 @@ func handleBackupLogs(targetDir, fileName string, secret string) error { if len(logFiles) != 0 { for i := 0; i < len(logFiles); i++ { if !logFiles[i].IsDir() { - _ = common.CopyFile(path.Join(itemDir, logFiles[i].Name()), dirItem) + _ = fileOp.CopyFile(path.Join(itemDir, logFiles[i].Name()), dirItem) } } } @@ -347,7 +348,7 @@ func handleBackupLogs(targetDir, fileName string, secret string) error { if len(logFiles2) != 0 { for i := 0; i < len(logFiles2); i++ { if !logFiles2[i].IsDir() { - _ = common.CopyFile(path.Join(itemDir2, logFiles2[i].Name()), dirItem) + _ = fileOp.CopyFile(path.Join(itemDir2, logFiles2[i].Name()), dirItem) } } } @@ -366,7 +367,7 @@ func handleBackupLogs(targetDir, fileName string, secret string) error { if len(systemLogFiles) != 0 { for i := 0; i < len(systemLogFiles); i++ { if !systemLogFiles[i].IsDir() { - _ = common.CopyFile(path.Join(systemLogDir, systemLogFiles[i].Name()), systemDir) + _ = fileOp.CopyFile(path.Join(systemLogDir, systemLogFiles[i].Name()), systemDir) } } } @@ -382,13 +383,13 @@ func handleBackupLogs(targetDir, fileName string, secret string) error { if len(loginLogFiles) != 0 { for i := 0; i < len(loginLogFiles); i++ { if !loginLogFiles[i].IsDir() && (strings.HasPrefix(loginLogFiles[i].Name(), "secure") || strings.HasPrefix(loginLogFiles[i].Name(), "auth.log")) { - _ = common.CopyFile(path.Join("/var/log", loginLogFiles[i].Name()), loginDir) + _ = fileOp.CopyFile(path.Join("/var/log", loginLogFiles[i].Name()), loginDir) } } } global.LOG.Debug("backup ssh log successful!") - if err := handleTar(targetDir, path.Dir(targetDir), fileName, "", secret); err != nil { + if err := fileOp.TarGzCompressPro(true, targetDir, path.Join(path.Dir(targetDir), fileName), secret, ""); err != nil { return err } defer func() { diff --git a/agent/app/service/cronjob_helper.go b/agent/app/service/cronjob_helper.go index 7180b3c7ca52..7ee076b1f9d0 100644 --- a/agent/app/service/cronjob_helper.go +++ b/agent/app/service/cronjob_helper.go @@ -17,7 +17,6 @@ import ( "github.com/1Panel-dev/1Panel/agent/utils/cmd" "github.com/1Panel-dev/1Panel/agent/utils/files" "github.com/1Panel-dev/1Panel/agent/utils/ntp" - "github.com/pkg/errors" ) func (u *CronjobService) HandleJob(cronjob *model.Cronjob) { @@ -140,81 +139,6 @@ func (u *CronjobService) handleNtpSync() error { return nil } -func handleTar(sourceDir, targetDir, name, exclusionRules string, secret string) error { - if _, err := os.Stat(targetDir); err != nil && os.IsNotExist(err) { - if err = os.MkdirAll(targetDir, os.ModePerm); err != nil { - return err - } - } - - excludes := strings.Split(exclusionRules, ",") - excludeRules := "" - for _, exclude := range excludes { - if len(exclude) == 0 { - continue - } - excludeRules += " --exclude " + exclude - } - path := "" - if strings.Contains(sourceDir, "/") { - itemDir := strings.ReplaceAll(sourceDir[strings.LastIndex(sourceDir, "/"):], "/", "") - aheadDir := sourceDir[:strings.LastIndex(sourceDir, "/")] - if len(aheadDir) == 0 { - aheadDir = "/" - } - path += fmt.Sprintf("-C %s %s", aheadDir, itemDir) - } else { - path = sourceDir - } - - commands := "" - - if len(secret) != 0 { - extraCmd := "| openssl enc -aes-256-cbc -salt -k '" + secret + "' -out" - commands = fmt.Sprintf("tar --warning=no-file-changed --ignore-failed-read --exclude-from=<(find %s -type s -print) -zcf %s %s %s %s", sourceDir, " -"+excludeRules, path, extraCmd, targetDir+"/"+name) - global.LOG.Debug(strings.ReplaceAll(commands, fmt.Sprintf(" %s ", secret), "******")) - } else { - itemPrefix := pathUtils.Base(sourceDir) - if itemPrefix == "/" { - itemPrefix = "" - } - commands = fmt.Sprintf("tar --warning=no-file-changed --ignore-failed-read --exclude-from=<(find %s -type s -printf '%s' | sed 's|^|%s/|') -zcf %s %s %s", sourceDir, "%P\n", itemPrefix, targetDir+"/"+name, excludeRules, path) - global.LOG.Debug(commands) - } - stdout, err := cmd.ExecWithTimeOut(commands, 24*time.Hour) - if err != nil { - if len(stdout) != 0 { - global.LOG.Errorf("do handle tar failed, stdout: %s, err: %v", stdout, err) - return fmt.Errorf("do handle tar failed, stdout: %s, err: %v", stdout, err) - } - } - return nil -} - -func handleUnTar(sourceFile, targetDir string, secret string) error { - if _, err := os.Stat(targetDir); err != nil && os.IsNotExist(err) { - if err = os.MkdirAll(targetDir, os.ModePerm); err != nil { - return err - } - } - commands := "" - if len(secret) != 0 { - extraCmd := "openssl enc -d -aes-256-cbc -k '" + secret + "' -in " + sourceFile + " | " - commands = fmt.Sprintf("%s tar -zxvf - -C %s", extraCmd, targetDir+" > /dev/null 2>&1") - global.LOG.Debug(strings.ReplaceAll(commands, fmt.Sprintf(" %s ", secret), "******")) - } else { - commands = fmt.Sprintf("tar zxvfC %s %s", sourceFile, targetDir) - global.LOG.Debug(commands) - } - - stdout, err := cmd.ExecWithTimeOut(commands, 24*time.Hour) - if err != nil { - global.LOG.Errorf("do handle untar failed, stdout: %s, err: %v", stdout, err) - return errors.New(stdout) - } - return nil -} - func (u *CronjobService) handleCutWebsiteLog(cronjob *model.Cronjob, startTime time.Time) ([]string, string, error) { var ( err error diff --git a/agent/app/service/snapshot_create.go b/agent/app/service/snapshot_create.go index f2591fb46cd1..637415ef5b01 100644 --- a/agent/app/service/snapshot_create.go +++ b/agent/app/service/snapshot_create.go @@ -248,38 +248,38 @@ func snapBaseData(snap snapHelper, targetDir string) error { snap.Task.Log("---------------------- 2 / 8 ----------------------") snap.Task.LogStart(i18n.GetMsgByKey("SnapBaseInfo")) - err := common.CopyFile("/usr/local/bin/1panel-core", targetDir) + err := snap.FileOp.CopyFile("/usr/local/bin/1panel-core", targetDir) snap.Task.LogWithStatus(i18n.GetWithName("SnapCopy", "/usr/local/bin/1panel-core"), err) if err != nil { return err } - err = common.CopyFile("/usr/local/bin/1panel-agent", targetDir) + err = snap.FileOp.CopyFile("/usr/local/bin/1panel-agent", targetDir) snap.Task.LogWithStatus(i18n.GetWithName("SnapCopy", "/usr/local/bin/1panel-agent"), err) if err != nil { return err } - err = common.CopyFile("/usr/local/bin/1pctl", targetDir) + err = snap.FileOp.CopyFile("/usr/local/bin/1pctl", targetDir) snap.Task.LogWithStatus(i18n.GetWithName("SnapCopy", "/usr/local/bin/1pctl"), err) if err != nil { return err } - err = common.CopyFile("/etc/systemd/system/1panel.service", targetDir) + err = snap.FileOp.CopyFile("/etc/systemd/system/1panel.service", targetDir) snap.Task.LogWithStatus(i18n.GetWithName("SnapCopy", "/etc/systemd/system/1panel.service"), err) if err != nil { return err } - err = common.CopyFile("/etc/systemd/system/1panel-agent.service", targetDir) + err = snap.FileOp.CopyFile("/etc/systemd/system/1panel-agent.service", targetDir) snap.Task.LogWithStatus(i18n.GetWithName("SnapCopy", "/etc/systemd/system/1panel-agent.service"), err) if err != nil { return err } if snap.FileOp.Stat("/etc/docker/daemon.json") { - err = common.CopyFile("/etc/docker/daemon.json", targetDir) + err = snap.FileOp.CopyFile("/etc/docker/daemon.json", targetDir) snap.Task.LogWithStatus(i18n.GetWithName("SnapCopy", "/etc/docker/daemon.json"), err) if err != nil { return err diff --git a/agent/init/viper/viper.go b/agent/init/viper/viper.go index eaa058db1b60..25f6739308df 100644 --- a/agent/init/viper/viper.go +++ b/agent/init/viper/viper.go @@ -8,7 +8,6 @@ import ( "github.com/1Panel-dev/1Panel/agent/cmd/server/conf" "github.com/1Panel-dev/1Panel/agent/configs" "github.com/1Panel-dev/1Panel/agent/global" - "github.com/1Panel-dev/1Panel/agent/utils/common" "github.com/1Panel-dev/1Panel/agent/utils/files" "github.com/1Panel-dev/1Panel/agent/utils/xpack" "github.com/fsnotify/fsnotify" @@ -65,10 +64,11 @@ func initDir() { } global.CONF.System.BaseDir = nodeInfo.BaseDir - _, _ = common.CreateDirWhenNotExist(true, path.Join(global.CONF.System.BaseDir, "1panel/docker/compose/")) - global.CONF.System.DataDir, _ = common.CreateDirWhenNotExist(true, path.Join(global.CONF.System.BaseDir, "1panel")) - global.CONF.System.Cache, _ = common.CreateDirWhenNotExist(true, path.Join(global.CONF.System.DataDir, "cache")) - global.CONF.System.DbPath, _ = common.CreateDirWhenNotExist(true, path.Join(global.CONF.System.DataDir, "db")) - global.CONF.System.LogPath, _ = common.CreateDirWhenNotExist(true, path.Join(global.CONF.System.DataDir, "log")) - global.CONF.System.TmpDir, _ = common.CreateDirWhenNotExist(true, path.Join(global.CONF.System.DataDir, "tmp")) + fileOp := files.NewFileOp() + _, _ = fileOp.CreateDirWithPath(true, path.Join(global.CONF.System.BaseDir, "1panel/docker/compose/")) + global.CONF.System.DataDir, _ = fileOp.CreateDirWithPath(true, path.Join(global.CONF.System.BaseDir, "1panel")) + global.CONF.System.Cache, _ = fileOp.CreateDirWithPath(true, path.Join(global.CONF.System.DataDir, "cache")) + global.CONF.System.DbPath, _ = fileOp.CreateDirWithPath(true, path.Join(global.CONF.System.DataDir, "db")) + global.CONF.System.LogPath, _ = fileOp.CreateDirWithPath(true, path.Join(global.CONF.System.DataDir, "log")) + global.CONF.System.TmpDir, _ = fileOp.CreateDirWithPath(true, path.Join(global.CONF.System.DataDir, "tmp")) } diff --git a/agent/utils/cloud_storage/client/local.go b/agent/utils/cloud_storage/client/local.go index 7703de3d2a02..20a2c3611b37 100644 --- a/agent/utils/cloud_storage/client/local.go +++ b/agent/utils/cloud_storage/client/local.go @@ -6,7 +6,7 @@ import ( "path" "path/filepath" - "github.com/1Panel-dev/1Panel/agent/utils/common" + "github.com/1Panel-dev/1Panel/agent/utils/files" ) type localClient struct { @@ -43,6 +43,7 @@ func (c localClient) Delete(file string) (bool, error) { } func (c localClient) Upload(src, target string) (bool, error) { + fileOp := files.NewFileOp() targetFilePath := path.Join(c.dir, target) if _, err := os.Stat(path.Dir(targetFilePath)); err != nil { if os.IsNotExist(err) { @@ -54,13 +55,14 @@ func (c localClient) Upload(src, target string) (bool, error) { } } - if err := common.CopyFile(src, targetFilePath); err != nil { + if err := fileOp.CopyAndReName(src, targetFilePath, "", true); err != nil { return false, fmt.Errorf("cp file failed, err: %v", err) } return true, nil } func (c localClient) Download(src, target string) (bool, error) { + fileOp := files.NewFileOp() localPath := path.Join(c.dir, src) if _, err := os.Stat(path.Dir(target)); err != nil { if os.IsNotExist(err) { @@ -72,7 +74,7 @@ func (c localClient) Download(src, target string) (bool, error) { } } - if err := common.CopyFile(localPath, target); err != nil { + if err := fileOp.CopyAndReName(localPath, target, "", true); err != nil { return false, fmt.Errorf("cp file failed, err: %v", err) } return true, nil diff --git a/agent/utils/common/common.go b/agent/utils/common/common.go index d4a1aa655524..b71ba0488680 100644 --- a/agent/utils/common/common.go +++ b/agent/utils/common/common.go @@ -3,12 +3,9 @@ package common import ( "crypto/rand" "fmt" - "github.com/1Panel-dev/1Panel/agent/constant" "io" mathRand "math/rand" "net" - "os" - "path" "reflect" "regexp" "sort" @@ -17,10 +14,8 @@ import ( "time" "unicode" - "golang.org/x/net/idna" - - "github.com/1Panel-dev/1Panel/agent/global" "github.com/1Panel-dev/1Panel/agent/utils/cmd" + "golang.org/x/net/idna" ) func CompareVersion(version1, version2 string) bool { @@ -150,36 +145,6 @@ func GetSortedVersions(versions []string) []string { return versions } -func CopyFile(src, dst string) error { - source, err := os.Open(src) - if err != nil { - return err - } - defer source.Close() - - if path.Base(src) != path.Base(dst) { - dst = path.Join(dst, path.Base(src)) - } - if _, err := os.Stat(path.Dir(dst)); err != nil { - if os.IsNotExist(err) { - _ = os.MkdirAll(path.Dir(dst), os.ModePerm) - } - } - target, err := os.OpenFile(dst+"_temp", os.O_RDWR|os.O_CREATE|os.O_TRUNC, constant.DirPerm) - if err != nil { - return err - } - defer target.Close() - - if _, err = io.Copy(target, source); err != nil { - return err - } - if err = os.Rename(dst+"_temp", dst); err != nil { - return err - } - return nil -} - func IsCrossVersion(version1, version2 string) bool { version1s := strings.Split(version1, ".") version2s := strings.Split(version2, ".") @@ -358,17 +323,3 @@ func SplitStr(str string, spi ...string) []string { func IsValidIP(ip string) bool { return net.ParseIP(ip) != nil } - -func CreateDirWhenNotExist(isDir bool, pathItem string) (string, error) { - checkPath := pathItem - if !isDir { - checkPath = path.Dir(pathItem) - } - if _, err := os.Stat(checkPath); err != nil && os.IsNotExist(err) { - if err = os.MkdirAll(checkPath, os.ModePerm); err != nil { - global.LOG.Errorf("mkdir %s failed, err: %v", checkPath, err) - return pathItem, err - } - } - return pathItem, nil -} diff --git a/agent/utils/common/sqlite.go b/agent/utils/common/sqlite.go index 28330698073c..7ab95d705420 100644 --- a/agent/utils/common/sqlite.go +++ b/agent/utils/common/sqlite.go @@ -7,13 +7,14 @@ import ( "path" "time" + "github.com/1Panel-dev/1Panel/agent/global" "github.com/glebarez/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" ) func LoadDBConnByPath(fullPath, dbName string) *gorm.DB { - if _, err := CreateDirWhenNotExist(true, path.Dir(fullPath)); err != nil { + if _, err := createDirWhenNotExist(true, path.Dir(fullPath)); err != nil { panic(fmt.Errorf("init db dir failed, err: %v", err)) } if _, err := os.Stat(fullPath); err != nil { @@ -32,7 +33,7 @@ func LoadDBConnByPath(fullPath, dbName string) *gorm.DB { } func LoadDBConnByPathWithErr(fullPath, dbName string) (*gorm.DB, error) { - if _, err := CreateDirWhenNotExist(true, path.Dir(fullPath)); err != nil { + if _, err := createDirWhenNotExist(true, path.Dir(fullPath)); err != nil { return nil, fmt.Errorf("init db dir failed, err: %v", err) } if _, err := os.Stat(fullPath); err != nil { @@ -84,3 +85,17 @@ func newLogger() logger.Interface { }, ) } + +func createDirWhenNotExist(isDir bool, pathItem string) (string, error) { + checkPath := pathItem + if !isDir { + checkPath = path.Dir(pathItem) + } + if _, err := os.Stat(checkPath); err != nil && os.IsNotExist(err) { + if err = os.MkdirAll(checkPath, os.ModePerm); err != nil { + global.LOG.Errorf("mkdir %s failed, err: %v", checkPath, err) + return pathItem, err + } + } + return pathItem, nil +} diff --git a/agent/utils/files/file_op.go b/agent/utils/files/file_op.go index 3f5653c49226..d4888c3738bf 100644 --- a/agent/utils/files/file_op.go +++ b/agent/utils/files/file_op.go @@ -65,6 +65,19 @@ func (f FileOp) CreateDirWithMode(dst string, mode fs.FileMode) error { } return f.ChmodRWithMode(dst, mode, true) } +func (f FileOp) CreateDirWithPath(isDir bool, pathItem string) (string, error) { + checkPath := pathItem + if !isDir { + checkPath = path.Dir(pathItem) + } + if f.Stat(checkPath) { + if err := f.CreateDir(checkPath, os.ModePerm); err != nil { + global.LOG.Errorf("mkdir %s failed, err: %v", checkPath, err) + return pathItem, err + } + } + return pathItem, nil +} func (f FileOp) CreateFile(dst string) error { if _, err := f.Fs.Create(dst); err != nil { @@ -728,8 +741,6 @@ func (f FileOp) TarGzCompressPro(withDir bool, src, dst, secret, exclusionRules exMap := make(map[string]struct{}) exStr := "" excludes := strings.Split(exclusionRules, ";") - excludes = append(excludes, "*.sock") - excludes = append(excludes, "*.socket") for _, exclude := range excludes { if len(exclude) == 0 { continue @@ -742,11 +753,15 @@ func (f FileOp) TarGzCompressPro(withDir bool, src, dst, secret, exclusionRules exMap[exclude] = struct{}{} } + itemPrefix := filepath.Base(src) + if itemPrefix == "/" { + itemPrefix = "" + } if len(secret) != 0 { - commands = fmt.Sprintf("tar -zcf - %s | openssl enc -aes-256-cbc -salt -pbkdf2 -k '%s' -out %s", srcItem, secret, dst) + commands = fmt.Sprintf("tar --warning=no-file-changed --ignore-failed-read --exclude-from=<(find %s -type s -print-printf '%s' | sed 's|^|%s/|') -zcf - %s | openssl enc -aes-256-cbc -salt -pbkdf2 -k '%s' -out %s", src, "%P\n", itemPrefix, srcItem, secret, dst) global.LOG.Debug(strings.ReplaceAll(commands, fmt.Sprintf(" %s ", secret), "******")) } else { - commands = fmt.Sprintf("tar zcf %s %s %s", dst, exStr, srcItem) + commands = fmt.Sprintf("tar --warning=no-file-changed --ignore-failed-read --exclude-from=<(find %s -type s -print-printf '%s' | sed 's|^|%s/|') -zcf %s %s %s", src, "%P\n", itemPrefix, dst, exStr, srcItem) global.LOG.Debug(commands) } return cmd.ExecCmdWithDir(commands, workdir)