104 lines
3.0 KiB
Go
104 lines
3.0 KiB
Go
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
|
||
}
|