diff --git a/core/app/service/upgrade.go b/core/app/service/upgrade.go index db45e6e5ba0f..f625adaf6fa4 100644 --- a/core/app/service/upgrade.go +++ b/core/app/service/upgrade.go @@ -25,15 +25,48 @@ import ( "github.com/1Panel-dev/1Panel/core/utils/xpack" ) -var ( - svcBasePath, _ = controller.GetServicePath("") - svcCoreName, _ = controller.LoadServiceName("1panel-core") - selCoreName, _ = controller.SelectInitScript("1panel-core") - scriptCoreName, _ = controller.GetScriptName("1panel-core") - svcAgentName, _ = controller.LoadServiceName("1panel-agent") - selAgentName, _ = controller.SelectInitScript("1panel-agent") - scriptAgentName, _ = controller.GetScriptName("1panel-agent") -) +type serviceInfo struct { + basePath string + coreName string + agentName string + selCoreName string + selAgentName string +} + +func loadServiceInfo() (serviceInfo, error) { + basePath, err := controller.GetServicePath("") + if err != nil { + global.LOG.Errorf("get service path failed: %v", err) + return serviceInfo{}, err + } + coreName, err := controller.LoadServiceName("1panel-core") + if err != nil { + global.LOG.Errorf("load core service name failed: %v", err) + return serviceInfo{}, err + } + agentName, err := controller.LoadServiceName("1panel-agent") + if err != nil { + global.LOG.Errorf("load agent service name failed: %v", err) + return serviceInfo{}, err + } + selCoreName, err := controller.SelectInitScript("1panel-core") + if err != nil { + global.LOG.Errorf("select core init script failed: %v", err) + return serviceInfo{}, err + } + selAgentName, err := controller.SelectInitScript("1panel-agent") + if err != nil { + global.LOG.Errorf("select agent init script failed: %v", err) + return serviceInfo{}, err + } + return serviceInfo{ + basePath: basePath, + coreName: coreName, + agentName: agentName, + selCoreName: selCoreName, + selAgentName: selAgentName, + }, nil +} type UpgradeService struct{} @@ -120,6 +153,10 @@ func (u *UpgradeService) Upgrade(req dto.Upgrade) error { if err != nil { return err } + svcInfo, err := loadServiceInfo() + if err != nil { + return err + } mode := global.CONF.Base.Mode if strings.Contains(req.Version, "beta") { @@ -146,7 +183,7 @@ func (u *UpgradeService) Upgrade(req dto.Upgrade) error { } tmpDir := downloadDir + "/" + strings.ReplaceAll(fileName, ".tar.gz", "") - if err := u.handleBackup(originalDir); err != nil { + if err := u.handleBackup(originalDir, svcInfo); err != nil { global.LOG.Errorf("handle backup original file failed, err: %v", err) _ = settingRepo.Update("SystemStatus", "Free") return @@ -159,56 +196,56 @@ func (u *UpgradeService) Upgrade(req dto.Upgrade) error { if err := files.CopyFileWithRename(path.Join(tmpDir, "1panel-core"), "/usr/local/bin/1panel-core"); err != nil { global.LOG.Errorf("upgrade 1panel-core failed, err: %v", err) _ = settingRepo.Update("SystemStatus", "Free") - u.handleRollback(originalDir, 1) + u.handleRollback(originalDir, 1, svcInfo) return } if err := files.CopyFileWithRename(path.Join(tmpDir, "1panel-agent"), "/usr/local/bin/1panel-agent"); err != nil { global.LOG.Errorf("upgrade 1panel-agent failed, err: %v", err) _ = settingRepo.Update("SystemStatus", "Free") - u.handleRollback(originalDir, 1) + u.handleRollback(originalDir, 1, svcInfo) return } if err := files.CopyItem(false, true, path.Join(tmpDir, "1pctl"), "/usr/local/bin"); err != nil { global.LOG.Errorf("upgrade 1pctl failed, err: %v", err) _ = settingRepo.Update("SystemStatus", "Free") - u.handleRollback(originalDir, 2) + u.handleRollback(originalDir, 2, svcInfo) return } if _, err := cmd.RunDefaultWithStdoutBashCf("sed -i -e 's#BASE_DIR=.*#BASE_DIR=%s#g' /usr/local/bin/1pctl", global.CONF.Base.InstallDir); err != nil { global.LOG.Errorf("upgrade basedir in 1pctl failed, err: %v", err) - u.handleRollback(originalDir, 2) + u.handleRollback(originalDir, 2, svcInfo) return } if _, err := cmd.RunDefaultWithStdoutBashCf("sed -i -e 's#LANGUAGE=.*#LANGUAGE=%s#g' /usr/local/bin/1pctl", oldLang); err != nil { global.LOG.Errorf("upgrade basedir in 1pctl failed, err: %v", err) - u.handleRollback(originalDir, 2) + u.handleRollback(originalDir, 2, svcInfo) return } initScriptPath := path.Join(tmpDir, "initscript") - if err := files.CopyItem(false, true, path.Join(initScriptPath, selCoreName), svcBasePath); err != nil { - global.LOG.Errorf("upgrade %s failed, err: %v", svcCoreName, err) + if err := files.CopyItem(false, true, path.Join(initScriptPath, svcInfo.selCoreName), svcInfo.basePath); err != nil { + global.LOG.Errorf("upgrade %s failed, err: %v", svcInfo.coreName, err) _ = settingRepo.Update("SystemStatus", "Free") - u.handleRollback(originalDir, 3) + u.handleRollback(originalDir, 3, svcInfo) return } - if err := files.CopyItem(false, true, path.Join(initScriptPath, selAgentName), svcBasePath); err != nil { - global.LOG.Errorf("upgrade %s failed, err: %v", svcAgentName, err) + if err := files.CopyItem(false, true, path.Join(initScriptPath, svcInfo.selAgentName), svcInfo.basePath); err != nil { + global.LOG.Errorf("upgrade %s failed, err: %v", svcInfo.agentName, err) _ = settingRepo.Update("SystemStatus", "Free") - u.handleRollback(originalDir, 3) + u.handleRollback(originalDir, 3, svcInfo) return } if err := files.CopyItem(true, true, path.Join(tmpDir, "lang"), "/usr/local/bin"); err != nil { global.LOG.Errorf("Update language files failed: %v", err) _ = settingRepo.Update("SystemStatus", "Free") - u.handleRollback(originalDir, 4) + u.handleRollback(originalDir, 4, svcInfo) } if err := files.CopyItem(false, true, path.Join(tmpDir, "GeoIP.mmdb"), path.Join(global.CONF.Base.InstallDir, "1panel/geo")); err != nil { global.LOG.Warnf("Update GeoIP database failed: %v", err) _ = settingRepo.Update("SystemStatus", "Free") - u.handleRollback(originalDir, 4) + u.handleRollback(originalDir, 4, svcInfo) } global.LOG.Info("upgrade successful!") @@ -231,7 +268,11 @@ func (u *UpgradeService) Rollback(req dto.OperateByID) error { if log.ID == 0 { return buserr.New("ErrRecordNotFound") } - u.handleRollback(log.BackupFile, 3) + svcInfo, err := loadServiceInfo() + if err != nil { + return err + } + u.handleRollback(log.BackupFile, 3, svcInfo) return nil } @@ -295,7 +336,7 @@ func analyzeDoc(version, content string) dto.ReleasesNotes { return item } -func (u *UpgradeService) handleBackup(originalDir string) error { +func (u *UpgradeService) handleBackup(originalDir string, svcInfo serviceInfo) error { if err := files.CopyItem(false, true, "/usr/local/bin/1panel-core", originalDir); err != nil { return err } @@ -308,10 +349,10 @@ func (u *UpgradeService) handleBackup(originalDir string) error { if err := files.CopyItem(true, true, "/usr/local/bin/lang", originalDir); err != nil { return err } - if err := files.CopyItem(false, true, path.Join(svcBasePath, svcCoreName), originalDir); err != nil { + if err := files.CopyItem(false, true, path.Join(svcInfo.basePath, svcInfo.coreName), originalDir); err != nil { return err } - if err := files.CopyItem(false, true, path.Join(svcBasePath, svcAgentName), originalDir); err != nil { + if err := files.CopyItem(false, true, path.Join(svcInfo.basePath, svcInfo.agentName), originalDir); err != nil { return err } if err := files.CopyItem(true, true, path.Join(global.CONF.Base.InstallDir, "1panel/db"), originalDir); err != nil { @@ -323,7 +364,7 @@ func (u *UpgradeService) handleBackup(originalDir string) error { return nil } -func (u *UpgradeService) handleRollback(originalDir string, errStep int) { +func (u *UpgradeService) handleRollback(originalDir string, errStep int, svcInfo serviceInfo) { _ = settingRepo.Update("SystemStatus", "Free") dbPath := path.Join(global.CONF.Base.InstallDir, "1panel") if _, err := os.Stat(path.Join(originalDir, "db")); err == nil { @@ -346,11 +387,11 @@ func (u *UpgradeService) handleRollback(originalDir string, errStep int) { if errStep == 2 { return } - if err := files.CopyItem(false, true, path.Join(originalDir, svcCoreName), svcBasePath); err != nil { - global.LOG.Errorf("rollback %s failed, err: %v", svcCoreName, err) + if err := files.CopyItem(false, true, path.Join(originalDir, svcInfo.coreName), svcInfo.basePath); err != nil { + global.LOG.Errorf("rollback %s failed, err: %v", svcInfo.coreName, err) } - if err := files.CopyItem(false, true, path.Join(originalDir, svcAgentName), svcBasePath); err != nil { - global.LOG.Errorf("rollback %s failed, err: %v", svcAgentName, err) + if err := files.CopyItem(false, true, path.Join(originalDir, svcInfo.agentName), svcInfo.basePath); err != nil { + global.LOG.Errorf("rollback %s failed, err: %v", svcInfo.agentName, err) } if errStep == 3 { return