bash_go_service/backend-service/pkg/version/version.go

104 lines
3.0 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package version
import (
"bash_go_service/shared/pkg/constants"
"bash_go_service/shared/pkg/logger"
"os"
"path/filepath"
"time"
"version/pkg/handler"
)
func CheckUpdate() (bool, error) {
logger.Info("Executing version update check at %v", time.Now())
res, err := handler.CheckVersionUpdate()
needUpdate, newVersion, md5sum, soMd5 := res.NeedUpdate, res.Version, res.ExeMd5, res.SoMd5
if err != nil {
logger.Error("Failed to check for updates: %v", err)
return false, err
}
if !needUpdate {
logger.Info("No update needed.")
return false, nil
}
currentExePath, err := os.Executable()
if err != nil {
logger.Error("Failed to get executable path: %v", err)
return false, err
}
currentExeDir := filepath.Dir(currentExePath)
currentExeBase := filepath.Base(currentExePath)
backupPath, err := handler.BackupCurrentExecutable(currentExePath, currentExeBase, currentExeDir)
if err != nil {
logger.Error("Failed to backup current executable: %v", err)
return false, err
}
logger.Info("Backup current executable to: %s", backupPath)
currentSoPath := filepath.Join(constants.SoPath, constants.SoName)
soBackupPath, err := handler.BackupCurrentExecutable(
currentSoPath,
constants.SoName, currentExeDir)
if err != nil {
logger.Error("Failed to backup so-lib: %v", err)
return false, err
}
logger.Info("Backup current so-lib to: %s", soBackupPath)
// 下载最新的exe并且校验md5
newExePath, err := handler.DownloadNewExecutable(currentExeDir, currentExeBase, newVersion, res.ExeUrl)
if err != nil {
logger.Error("Failed to download new executable: %v", err)
_ = os.Remove(backupPath)
return false, err
}
if err := handler.VerifyMD5(newExePath, md5sum); err != nil {
logger.Error("MD5 verification failed: %v", err)
// Attempt rollback
_ = os.Remove(newExePath)
return false, err
}
// 下载最新的so并且校验md5
newSoPath, err := handler.DownloadNewExecutable(constants.SoPath, constants.SoName, newVersion, res.SoUrl)
if err != nil {
logger.Error("Failed to download new so-lib: %v", err)
// Attempt rollback
_ = os.Remove(soBackupPath)
return false, err
}
if err := handler.VerifyMD5(newSoPath, soMd5); err != nil {
logger.Error("MD5 verification failed: %v", err)
// Attempt rollback
_ = os.Remove(newSoPath)
return false, err
}
info := handler.CreateUpdateInfo(backupPath, newExePath, currentExePath, soBackupPath, newSoPath, currentSoPath)
err = handler.SaveUpdateInfo(currentExePath, *info)
if err != nil {
logger.Error("Failed to save update info: %v", err)
return false, err
}
logger.Info("The update will be initiated on the next application start.")
// 下次启动的时候检查更新
// if err := handler.ExecuteUpdate(currentExeDir, backupPath, newExePath, currentExePath); err != nil {
// logger.Error("Failed to execute update: %v", err)
// // Attempt rollback
// _ = os.Rename(backupPath, currentExePath)
// _ = os.Remove(newExePath)
// return
// }
// logger.Info("Update process initiated, current process exiting.")
//
return true, nil
}