Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 73 additions & 32 deletions core/app/service/upgrade.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{}

Expand Down Expand Up @@ -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") {
Expand All @@ -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
Expand All @@ -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!")
Expand All @@ -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
}

Expand Down Expand Up @@ -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
}
Expand All @@ -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 {
Expand All @@ -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 {
Expand All @@ -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
Expand Down
Loading