From a6174247860a5bfc3566f18fe09549dc61716982 Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Mon, 24 Mar 2025 17:38:45 +0800 Subject: [PATCH] fix: fix some snapshot problems (#8228) --- agent/app/service/snapshot.go | 3 +- agent/app/service/snapshot_create.go | 5 +- agent/app/service/snapshot_recover.go | 14 ++-- agent/utils/common/sqlite.go | 5 +- core/app/service/upgrade.go | 15 ++-- core/cmd/server/cmd/restore.go | 69 +++++++---------- frontend/src/components/task-list/index.vue | 2 +- .../src/layout/components/Sidebar/index.vue | 2 +- frontend/src/views/cronjob/library/index.vue | 2 +- frontend/src/views/host/firewall/ip/index.vue | 2 +- .../src/views/host/firewall/port/index.vue | 4 +- frontend/src/views/host/ssh/log/log.vue | 2 +- frontend/src/views/log/login/index.vue | 2 +- frontend/src/views/log/system/index.vue | 2 +- frontend/src/views/log/task/index.vue | 2 +- frontend/src/views/log/website/index.vue | 2 +- .../views/setting/snapshot/create/index.vue | 8 +- frontend/src/views/setting/snapshot/index.vue | 74 +++++++++++++++++-- frontend/src/views/terminal/command/index.vue | 2 +- frontend/src/views/website/website/index.vue | 2 +- 20 files changed, 133 insertions(+), 86 deletions(-) diff --git a/agent/app/service/snapshot.go b/agent/app/service/snapshot.go index fd5dda1f5..c4af3e615 100644 --- a/agent/app/service/snapshot.go +++ b/agent/app/service/snapshot.go @@ -124,6 +124,7 @@ func (u *SnapshotService) LoadSnapshotData() (dto.SnapshotData, error) { } } } + data.BackupData = itemBackups return data, nil } @@ -148,7 +149,7 @@ func (u *SnapshotService) Delete(req dto.SnapshotBatchDelete) error { } for _, item := range accounts { global.LOG.Debugf("remove snapshot file %s.tar.gz from %s", snap.Name, item.name) - _, _ = item.client.Delete(path.Join("system_snapshot", snap.Name+".tar.gz")) + _, _ = item.client.Delete(path.Join(item.backupPath, "system_snapshot", snap.Name+".tar.gz")) } } diff --git a/agent/app/service/snapshot_create.go b/agent/app/service/snapshot_create.go index bed7c77d3..e34cadddd 100644 --- a/agent/app/service/snapshot_create.go +++ b/agent/app/service/snapshot_create.go @@ -217,13 +217,13 @@ func loadDbConn(snap *snapHelper, targetDir string, req dto.SnapshotCreate) erro return err } - agentDb, err := common.LoadDBConnByPathWithErr(path.Join(targetDir, "db"), "agent.db") + agentDb, err := common.LoadDBConnByPathWithErr(path.Join(targetDir, "db/agent.db"), "agent.db") snap.Task.LogWithStatus(i18n.GetWithName("SnapNewDB", "agent"), err) if err != nil { return err } snap.snapAgentDB = agentDb - coreDb, err := common.LoadDBConnByPathWithErr(path.Join(targetDir, "db"), "core.db") + coreDb, err := common.LoadDBConnByPathWithErr(path.Join(targetDir, "db/core.db"), "core.db") snap.Task.LogWithStatus(i18n.GetWithName("SnapNewDB", "core"), err) if err != nil { return err @@ -253,7 +253,6 @@ func loadDbConn(snap *snapHelper, targetDir string, req dto.SnapshotCreate) erro } _ = snap.snapAgentDB.Where("id = ?", snap.SnapID).Delete(&model.Snapshot{}).Error - return nil } diff --git a/agent/app/service/snapshot_recover.go b/agent/app/service/snapshot_recover.go index f7a1afc3f..7b5a6be01 100644 --- a/agent/app/service/snapshot_recover.go +++ b/agent/app/service/snapshot_recover.go @@ -337,24 +337,22 @@ func recoverBaseData(src string, itemHelper *snapRecoverHelper) error { } if global.IsMaster { - err = itemHelper.FileOp.CopyFile(path.Join(src, "1panel"), "/usr/local/bin") + err = itemHelper.FileOp.CopyFile(path.Join(src, "1panel-core"), "/usr/local/bin") itemHelper.Task.LogWithStatus(i18n.GetWithName("SnapCopy", "/usr/local/bin/1panel-core"), err) if err != nil { return err } + err = itemHelper.FileOp.CopyFile(path.Join(src, "1panel-core.service"), "/etc/systemd/system") + itemHelper.Task.LogWithStatus(i18n.GetWithName("SnapCopy", "/etc/systemd/system/1panel-core.service"), err) + if err != nil { + return err + } } err = itemHelper.FileOp.CopyFile(path.Join(src, "1panel-agent"), "/usr/local/bin") itemHelper.Task.LogWithStatus(i18n.GetWithName("SnapCopy", "/usr/local/bin/1panel-agent"), err) if err != nil { return err } - if global.IsMaster { - err = itemHelper.FileOp.CopyFile(path.Join(src, "1panel-core.service"), "/etc/systemd/system") - itemHelper.Task.LogWithStatus(i18n.GetWithName("SnapCopy", "/etc/systemd/system/1panel-core.service"), err) - if err != nil { - return err - } - } err = itemHelper.FileOp.CopyFile(path.Join(src, "1panel-agent.service"), "/etc/systemd/system") itemHelper.Task.LogWithStatus(i18n.GetWithName("SnapCopy", "/etc/systemd/system/1panel-agent.service"), err) if err != nil { diff --git a/agent/utils/common/sqlite.go b/agent/utils/common/sqlite.go index 7ab95d705..bbd08041c 100644 --- a/agent/utils/common/sqlite.go +++ b/agent/utils/common/sqlite.go @@ -60,10 +60,13 @@ func CloseDB(db *gorm.DB) { } func GetDBWithPath(dbPath string) (*gorm.DB, error) { - db, _ := gorm.Open(sqlite.Open(dbPath), &gorm.Config{ + db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{ DisableForeignKeyConstraintWhenMigrating: true, Logger: newLogger(), }) + if err != nil { + return nil, err + } sqlDB, dbError := db.DB() if dbError != nil { return nil, dbError diff --git a/core/app/service/upgrade.go b/core/app/service/upgrade.go index b710aa233..9c6aa8c32 100644 --- a/core/app/service/upgrade.go +++ b/core/app/service/upgrade.go @@ -86,12 +86,11 @@ func (u *UpgradeService) LoadNotes(req dto.Upgrade) (string, error) { func (u *UpgradeService) Upgrade(req dto.Upgrade) error { global.LOG.Info("start to upgrade now...") - timeStr := time.Now().Format(constant.DateTimeSlimLayout) baseDir := path.Join(global.CONF.Base.InstallDir, fmt.Sprintf("1panel/tmp/upgrade/%s", req.Version)) - rootDir := path.Join(baseDir, fmt.Sprintf("upgrade_%s/downloads", timeStr)) + downloadDir := path.Join(baseDir, "downloads") _ = os.RemoveAll(baseDir) - originalDir := path.Join(baseDir, fmt.Sprintf("upgrade_%s/original", timeStr)) - if err := os.MkdirAll(rootDir, os.ModePerm); err != nil { + originalDir := path.Join(baseDir, "original") + if err := os.MkdirAll(downloadDir, os.ModePerm); err != nil { return err } if err := os.MkdirAll(originalDir, os.ModePerm); err != nil { @@ -110,21 +109,21 @@ func (u *UpgradeService) Upgrade(req dto.Upgrade) error { fileName := fmt.Sprintf("1panel-%s-%s-%s.tar.gz", req.Version, "linux", itemArch) _ = settingRepo.Update("SystemStatus", "Upgrading") go func() { - if err := files.DownloadFileWithProxy(downloadPath+"/"+fileName, rootDir+"/"+fileName); err != nil { + if err := files.DownloadFileWithProxy(downloadPath+"/"+fileName, downloadDir+"/"+fileName); err != nil { global.LOG.Errorf("download service file failed, err: %v", err) _ = settingRepo.Update("SystemStatus", "Free") return } global.LOG.Info("download all file successful!") defer func() { - _ = os.Remove(rootDir) + _ = os.Remove(downloadDir) }() - if err := files.HandleUnTar(rootDir+"/"+fileName, rootDir, ""); err != nil { + if err := files.HandleUnTar(downloadDir+"/"+fileName, downloadDir, ""); err != nil { global.LOG.Errorf("decompress file failed, err: %v", err) _ = settingRepo.Update("SystemStatus", "Free") return } - tmpDir := rootDir + "/" + strings.ReplaceAll(fileName, ".tar.gz", "") + tmpDir := downloadDir + "/" + strings.ReplaceAll(fileName, ".tar.gz", "") if err := u.handleBackup(originalDir); err != nil { global.LOG.Errorf("handle backup original file failed, err: %v", err) diff --git a/core/cmd/server/cmd/restore.go b/core/cmd/server/cmd/restore.go index dcd5f8742..326552b59 100644 --- a/core/cmd/server/cmd/restore.go +++ b/core/cmd/server/cmd/restore.go @@ -12,7 +12,6 @@ import ( "github.com/1Panel-dev/1Panel/core/i18n" cmdUtils "github.com/1Panel-dev/1Panel/core/utils/cmd" "github.com/1Panel-dev/1Panel/core/utils/files" - "github.com/pkg/errors" "github.com/spf13/cobra" ) @@ -45,51 +44,47 @@ var restoreCmd = &cobra.Command{ return nil } tmpPath = path.Join(upgradeDir, tmpPath, "original") - fmt.Println(i18n.GetMsgWithMapForCmd("RestoreStep1", map[string]interface{}{"name": tmpPath})) - if err := files.CopyFile(path.Join(tmpPath, "1panel"), "/usr/local/bin", true); err != nil { + fmt.Println(i18n.GetMsgWithMapForCmd("RestoreStep1", map[string]interface{}{"name": tmpPath})) + if err := files.CopyFile(path.Join(tmpPath, "1panel-agent"), "/usr/local/bin/1panel-agent", true); err != nil { return err } + if err := files.CopyFile(path.Join(tmpPath, "1panel-core"), "/usr/local/bin/1panel-core", true); err != nil { + return err + } + sudo := cmdUtils.SudoHandleCmd() + _, _ = cmdUtils.Execf("%s chmod 755 /usr/local/bin/1panel-agent /usr/local/bin/1panel-core", sudo) + fmt.Println(i18n.GetMsgByKeyForCmd("RestoreStep2")) - if err := files.CopyFile(path.Join(tmpPath, "1pctl"), "/usr/local/bin", true); err != nil { + if err := files.CopyFile(path.Join(tmpPath, "1pctl"), "/usr/local/bin/1pctl", true); err != nil { return err } + _, _ = cmdUtils.Execf("%s chmod 755 /usr/local/bin/1pctl", sudo) _, _ = cmdUtils.Execf("cp -r %s /usr/local/bin", path.Join(tmpPath, "lang")) geoPath := path.Join(global.CONF.Base.InstallDir, "1panel/geo") _, _ = cmdUtils.Execf("mkdir %s && cp %s %s/", geoPath, path.Join(tmpPath, "GeoIP.mmdb"), geoPath) + fmt.Println(i18n.GetMsgByKeyForCmd("RestoreStep3")) - if err := files.CopyFile(path.Join(tmpPath, "1panel-core.service"), "/etc/systemd/system", true); err != nil { + if err := files.CopyFile(path.Join(tmpPath, "1panel-core.service"), "/etc/systemd/system/1panel-core.service", true); err != nil { return err } - if err := files.CopyFile(path.Join(tmpPath, "1panel-agent.service"), "/etc/systemd/system", true); err != nil { + if err := files.CopyFile(path.Join(tmpPath, "1panel-agent.service"), "/etc/systemd/system/1panel-agent.service", true); err != nil { return err } fmt.Println(i18n.GetMsgByKeyForCmd("RestoreStep4")) - checkPointOfWal() - if _, err := os.Stat(path.Join(tmpPath, "1Panel.db")); err == nil { - if err := files.CopyFile(path.Join(tmpPath, "1Panel.db"), path.Join(baseDir, "1panel/db"), true); err != nil { - return err - } - } - if _, err := os.Stat(path.Join(tmpPath, "db.tar.gz")); err == nil { - if err := handleUnTar(path.Join(tmpPath, "db.tar.gz"), path.Join(baseDir, "1panel")); err != nil { - return err + if _, err := os.Stat(path.Join(tmpPath, "db")); err == nil { + dbPath := path.Join(baseDir, "1panel/db") + if err := files.CopyItem(true, true, path.Join(tmpPath, "db"), dbPath); err != nil { + global.LOG.Errorf("rollback 1panel db failed, err: %v", err) } } + fmt.Println(i18n.GetMsgByKeyForCmd("RestoreStep5")) fmt.Println(i18n.GetMsgByKeyForCmd("RestoreSuccessful")) return nil }, } -func checkPointOfWal() { - db, err := loadDBConn() - if err != nil { - return - } - _ = db.Exec("PRAGMA wal_checkpoint(TRUNCATE);").Error -} - func loadRestorePath(upgradeDir string) (string, error) { if _, err := os.Stat(upgradeDir); err != nil && os.IsNotExist(err) { return "no such file", nil @@ -98,32 +93,22 @@ func loadRestorePath(upgradeDir string) (string, error) { if err != nil { return "", err } - var folders []string + type itemState struct { + Name string + CreateAt time.Time + } + var folders []itemState for _, file := range files { if file.IsDir() { - folders = append(folders, file.Name()) + info, _ := file.Info() + folders = append(folders, itemState{Name: file.Name(), CreateAt: info.ModTime()}) } } if len(folders) == 0 { return "no such file", nil } sort.Slice(folders, func(i, j int) bool { - return folders[i] > folders[j] + return folders[i].CreateAt.After(folders[j].CreateAt) }) - return folders[0], nil -} - -func handleUnTar(sourceFile, targetDir string) error { - if _, err := os.Stat(targetDir); err != nil && os.IsNotExist(err) { - if err = os.MkdirAll(targetDir, os.ModePerm); err != nil { - return err - } - } - - commands := fmt.Sprintf("tar zxvfC %s %s", sourceFile, targetDir) - stdout, err := cmdUtils.ExecWithTimeOut(commands, 20*time.Second) - if err != nil { - return errors.New(stdout) - } - return nil + return folders[0].Name, nil } diff --git a/frontend/src/components/task-list/index.vue b/frontend/src/components/task-list/index.vue index fd2a03172..891e335d9 100644 --- a/frontend/src/components/task-list/index.vue +++ b/frontend/src/components/task-list/index.vue @@ -3,7 +3,7 @@