diff --git a/kernel/model/updater.go b/kernel/model/updater.go index 5cd8fe6bd..b0a5667c1 100644 --- a/kernel/model/updater.go +++ b/kernel/model/updater.go @@ -62,12 +62,12 @@ func getNewVerInstallPkgPath() string { return "" } - downloadPkgURL, checksum, err := getUpdatePkg() - if nil != err || "" == downloadPkgURL || "" == checksum { + downloadPkgURLs, checksum, err := getUpdatePkg() + if nil != err || 1 > len(downloadPkgURLs) || "" == checksum { return "" } - pkg := path.Base(downloadPkgURL) + pkg := path.Base(downloadPkgURLs[0]) ret := filepath.Join(util.TempDir, "install", pkg) localChecksum, _ := sha256Hash(ret) if checksum != localChecksum { @@ -92,21 +92,32 @@ func checkDownloadInstallPkg() { checkDownloadInstallPkgLock.Lock() defer checkDownloadInstallPkgLock.Unlock() - downloadPkgURL, checksum, err := getUpdatePkg() - if nil != err || "" == downloadPkgURL || "" == checksum { + downloadPkgURLs, checksum, err := getUpdatePkg() + if nil != err || 1 > len(downloadPkgURLs) || "" == checksum { return } - downloadInstallPkg(downloadPkgURL, checksum) + msgId := util.PushMsg(Conf.Language(103), 60*1000*10) + succ := false + for _, downloadPkgURL := range downloadPkgURLs { + err = downloadInstallPkg(downloadPkgURL, checksum) + if nil == err { + succ = true + break + + } + } + if !succ { + util.PushUpdateMsg(msgId, Conf.Language(104), 7000) + } } -func getUpdatePkg() (downloadPkgURL, checksum string, err error) { +func getUpdatePkg() (downloadPkgURLs []string, checksum string, err error) { result, err := util.GetRhyResult(false) if nil != err { return } - installPkgSite := result["installPkg"].(string) ver := result["ver"].(string) if isVersionUpToDate(ver) { return @@ -125,13 +136,20 @@ func getUpdatePkg() (downloadPkgURL, checksum string, err error) { suffix = "linux.AppImage" } pkg := "siyuan-" + ver + "-" + suffix - downloadPkgURL = installPkgSite + "siyuan/" + pkg + + url := "https://github.com/siyuan-note/siyuan/releases/download/v" + ver + "/" + pkg + downloadPkgURLs = append(downloadPkgURLs, url) + url = "https://ghproxy.com/" + url + downloadPkgURLs = append(downloadPkgURLs, url) + url = "https://release.b3log.org/siyuan/" + pkg + downloadPkgURLs = append(downloadPkgURLs, url) + checksums := result["checksums"].(map[string]interface{}) checksum = checksums[pkg].(string) return } -func downloadInstallPkg(pkgURL, checksum string) { +func downloadInstallPkg(pkgURL, checksum string) (err error) { if "" == pkgURL || "" == checksum { return } @@ -145,22 +163,20 @@ func downloadInstallPkg(pkgURL, checksum string) { } } - err := os.MkdirAll(filepath.Join(util.TempDir, "install"), 0755) + err = os.MkdirAll(filepath.Join(util.TempDir, "install"), 0755) if nil != err { logging.LogErrorf("create temp install dir failed: %s", err) return } logging.LogInfof("downloading install package [%s]", pkgURL) - msgId := util.PushMsg(Conf.Language(103), 60*1000*10) client := req.C().SetTLSHandshakeTimeout(7 * time.Second).SetTimeout(10 * time.Minute) callback := func(info req.DownloadInfo) { //logging.LogDebugf("downloading install package [%s %.2f%%]", pkgURL, float64(info.DownloadedSize)/float64(info.Response.ContentLength)*100.0) } _, err = client.R().SetOutputFile(savePath).SetDownloadCallback(callback).Get(pkgURL) if nil != err { - logging.LogErrorf("download install package failed: %s", err) - util.PushUpdateMsg(msgId, Conf.Language(104), 7000) + logging.LogErrorf("download install package [%s] failed: %s", pkgURL, err) return } @@ -170,6 +186,7 @@ func downloadInstallPkg(pkgURL, checksum string) { return } logging.LogInfof("downloaded install package [%s] to [%s]", pkgURL, savePath) + return } func sha256Hash(filename string) (ret string, err error) {