Files
komari-agent/update/update.go

86 lines
2.3 KiB
Go
Raw 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 update
import (
"fmt"
"log"
"net/http"
"os"
"strings"
"time"
"github.com/blang/semver"
"github.com/komari-monitor/komari-agent/dnsresolver"
"github.com/rhysd/go-github-selfupdate/selfupdate"
)
var (
CurrentVersion string = "0.0.1"
Repo string = "komari-monitor/komari-agent"
)
// parseVersion 解析可能带有 v/V 前缀,以及预发布或构建元数据的版本字符串
func parseVersion(ver string) (semver.Version, error) {
ver = strings.TrimPrefix(ver, "v")
ver = strings.TrimPrefix(ver, "V")
return semver.ParseTolerant(ver)
}
// needUpdate 判断是否需要更新
func needUpdate(current, latest semver.Version) bool {
// 返回最新版本大于当前版本时需要更新
return latest.Compare(current) > 0
}
func DoUpdateWorks() {
ticker_ := time.NewTicker(time.Duration(6) * time.Hour)
for range ticker_.C {
CheckAndUpdate()
}
}
// 检查更新并执行自动更新
func CheckAndUpdate() error {
log.Println("Checking update...")
// Parse current version
currentSemVer, err := parseVersion(CurrentVersion)
if err != nil {
return fmt.Errorf("failed to parse current version: %v", err)
}
// 使用dnsresolver创建自定义HTTP客户端并设置为全局默认客户端
// 这会影响所有HTTP请求包括selfupdate库中的请求
http.DefaultClient = dnsresolver.GetHTTPClient(60 * time.Second) // Create selfupdate configuration
config := selfupdate.Config{}
updater, err := selfupdate.NewUpdater(config)
if err != nil {
return fmt.Errorf("failed to create updater: %v", err)
}
// Check for latest version
latest, err := updater.UpdateSelf(currentSemVer, Repo)
if err != nil {
return fmt.Errorf("failed to check for updates: %v", err)
}
// Determine if update is needed
if latest.Version.Equals(currentSemVer) {
log.Println("Current version is the latest:", CurrentVersion)
return nil
}
// Default is installed as a service, so don't automatically restart
//execPath, err := os.Executable()
//if err != nil {
// return fmt.Errorf("failed to get current executable path: %v", err)
//}
// _, err = os.StartProcess(execPath, os.Args, &os.ProcAttr{
// Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
// })
// if err != nil {
// return fmt.Errorf("failed to restart program: %v", err)
// }
log.Printf("Successfully updated to version %s\n", latest.Version)
os.Exit(42)
return nil
}