fix: Fix service name loading failure in some scenarios (#11800)

Refs #11789
This commit is contained in:
ssongliu
2026-02-05 08:24:56 +00:00
committed by GitHub
parent 5db2ccbb22
commit 1eb5830238
+73 -32
View File
@@ -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