瀏覽代碼

Merge remote-tracking branch 'origin/dev' into dev

Vanessa 2 年之前
父節點
當前提交
2f20e64e20
共有 5 個文件被更改,包括 123 次插入119 次删除
  1. 7 7
      kernel/go.mod
  2. 14 16
      kernel/go.sum
  3. 5 0
      kernel/model/conf.go
  4. 93 86
      kernel/model/liandi.go
  5. 4 10
      kernel/model/updater.go

+ 7 - 7
kernel/go.mod

@@ -7,7 +7,7 @@ require (
 	github.com/88250/css v0.1.2
 	github.com/88250/flock v0.8.2
 	github.com/88250/gulu v1.2.3-0.20220916075322-eb117059d70a
-	github.com/88250/lute v1.7.5-0.20220927074749-900f0dcf1c81
+	github.com/88250/lute v1.7.5-0.20220928025238-bda91cbd4072
 	github.com/88250/pdfcpu v0.3.13
 	github.com/88250/vitess-sqlparser v0.0.0-20210205111146-56a2ded2aba1
 	github.com/ConradIrwin/font v0.0.0-20210318200717-ce8d41cc0732
@@ -28,7 +28,7 @@ require (
 	github.com/gin-contrib/gzip v0.0.6
 	github.com/gin-contrib/sessions v0.0.5
 	github.com/gin-gonic/gin v1.8.1
-	github.com/imroc/req/v3 v3.23.0
+	github.com/imroc/req/v3 v3.24.0
 	github.com/jinzhu/copier v0.3.5
 	github.com/mattn/go-sqlite3 v2.0.3+incompatible
 	github.com/mitchellh/go-ps v1.0.0
@@ -42,7 +42,7 @@ require (
 	github.com/siyuan-note/encryption v0.0.0-20220713091850-5ecd92177b75
 	github.com/siyuan-note/eventbus v0.0.0-20220916025349-3ac6e75522da
 	github.com/siyuan-note/filelock v0.0.0-20220720144616-011221f7e128
-	github.com/siyuan-note/httpclient v0.0.0-20220906125021-bb9ddffaea0e
+	github.com/siyuan-note/httpclient v0.0.0-20220928030253-4f6a778563e9
 	github.com/siyuan-note/logging v0.0.0-20220717040626-f796b05ee520
 	github.com/steambap/captcha v1.4.1
 	github.com/vmihailenco/msgpack/v5 v5.3.5
@@ -111,12 +111,12 @@ require (
 	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
 	go.uber.org/atomic v1.10.0 // indirect
 	go.uber.org/multierr v1.8.0 // indirect
-	golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7 // indirect
-	golang.org/x/exp v0.0.0-20220921164117-439092de6870 // indirect
+	golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be // indirect
+	golang.org/x/exp v0.0.0-20220927162542-c76eaa363f9d // indirect
 	golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
-	golang.org/x/net v0.0.0-20220923203811-8be639271d50 // indirect
+	golang.org/x/net v0.0.0-20220927171203-f486391704dc // indirect
 	golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7 // indirect
-	golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 // indirect
+	golang.org/x/sys v0.0.0-20220927170352-d9d178bc13c6 // indirect
 	golang.org/x/tools v0.1.12 // indirect
 	google.golang.org/protobuf v1.28.1 // indirect
 	gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect

+ 14 - 16
kernel/go.sum

@@ -19,10 +19,8 @@ github.com/88250/go-sqlite3 v1.14.13-0.20220714142610-fbbda1ee84f5 h1:8HdZozCsXS
 github.com/88250/go-sqlite3 v1.14.13-0.20220714142610-fbbda1ee84f5/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
 github.com/88250/gulu v1.2.3-0.20220916075322-eb117059d70a h1:qQdnk8clbgA+MXtf5bXOTOby32iQYjqMOn6oBIMV/Tk=
 github.com/88250/gulu v1.2.3-0.20220916075322-eb117059d70a/go.mod h1:I1qBzsksFL2ciGSuqDE7R3XW4BUMrfDgOvSXEk7FsAI=
-github.com/88250/lute v1.7.5-0.20220926155035-518f58c05151 h1:EssPM5yyEXae3Ilak7cV2yYWcISv2YtzfDNGFhwpV64=
-github.com/88250/lute v1.7.5-0.20220926155035-518f58c05151/go.mod h1:cEoBGi0zArPqAsp0MdG9SKinvH/xxZZWXU7sRx8vHSA=
-github.com/88250/lute v1.7.5-0.20220927074749-900f0dcf1c81 h1:NIED063lHDzC+BJuRWKuNlw/3PAB4MDxWOGt0OHv1rs=
-github.com/88250/lute v1.7.5-0.20220927074749-900f0dcf1c81/go.mod h1:cEoBGi0zArPqAsp0MdG9SKinvH/xxZZWXU7sRx8vHSA=
+github.com/88250/lute v1.7.5-0.20220928025238-bda91cbd4072 h1:0d7YXGtw2ybeGs6oClIFiKvTqySfJCu5SUdJJWil6MA=
+github.com/88250/lute v1.7.5-0.20220928025238-bda91cbd4072/go.mod h1:cEoBGi0zArPqAsp0MdG9SKinvH/xxZZWXU7sRx8vHSA=
 github.com/88250/pdfcpu v0.3.13 h1:touMWMZkCGalMIbEg9bxYp7rETM+zwb9hXjwhqi4I7Q=
 github.com/88250/pdfcpu v0.3.13/go.mod h1:S5YT38L/GCjVjmB4PB84PymA1qfopjEhfhTNQilLpv4=
 github.com/88250/vitess-sqlparser v0.0.0-20210205111146-56a2ded2aba1 h1:48T899JQDwyyRu9yXHePYlPdHtpJfrJEUGBMH3SMBWY=
@@ -198,8 +196,8 @@ github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq
 github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
 github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=
 github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=
-github.com/imroc/req/v3 v3.23.0 h1:H/keAKrf8+JDDFGfKd1GZfSUzEZbPQNM8gBiHxo86SE=
-github.com/imroc/req/v3 v3.23.0/go.mod h1:EluRnkfh8A39BmrCARYhcUrfGyR8qPw+O0BZyTy4j9k=
+github.com/imroc/req/v3 v3.24.0 h1:I3f6cn14mYh2BSklfDMEduOf6f/2I59Yv13v7BmsGBw=
+github.com/imroc/req/v3 v3.24.0/go.mod h1:EluRnkfh8A39BmrCARYhcUrfGyR8qPw+O0BZyTy4j9k=
 github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU=
 github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg=
 github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=
@@ -358,8 +356,8 @@ github.com/siyuan-note/eventbus v0.0.0-20220916025349-3ac6e75522da h1:/jNhl7LC+9
 github.com/siyuan-note/eventbus v0.0.0-20220916025349-3ac6e75522da/go.mod h1:Sqo4FYX5lAXu7gWkbEdJF0e6P57tNNVV4WDKYDctokI=
 github.com/siyuan-note/filelock v0.0.0-20220720144616-011221f7e128 h1:p90RgCJ0BFRY60wOFQ+XHAgI6ey3sUWbqHcQ7T3KWfQ=
 github.com/siyuan-note/filelock v0.0.0-20220720144616-011221f7e128/go.mod h1:NeC98UUl+U62YScI0qWIjzrK+L4Z6WsBL5bueShjBKs=
-github.com/siyuan-note/httpclient v0.0.0-20220906125021-bb9ddffaea0e h1:iSjaFQk9v8FEMaKMiS9yg8eqxz4jtKC3oKEd6NLN1aA=
-github.com/siyuan-note/httpclient v0.0.0-20220906125021-bb9ddffaea0e/go.mod h1:3jflmXEfJKvq+80WvLTLVUVdYfVh26vO05wddmUyXaM=
+github.com/siyuan-note/httpclient v0.0.0-20220928030253-4f6a778563e9 h1:3fa7E/3isQ+22RQfHctL65sUOFbBspYBq2wiHZPtyCY=
+github.com/siyuan-note/httpclient v0.0.0-20220928030253-4f6a778563e9/go.mod h1:fa1KsHyCuOedk1CKXDi7Y6USwwU5oNo1Zd4jDo3BpDM=
 github.com/siyuan-note/logging v0.0.0-20220717040626-f796b05ee520 h1:kscYjMt7jXYdd7Qj2OSUoBnoHc5B0U/E6OSx86VRLr4=
 github.com/siyuan-note/logging v0.0.0-20220717040626-f796b05ee520/go.mod h1:t1zRGxK13L/9ZFoGyTD39IbFCbee3CsypDj4b5dt4qM=
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
@@ -422,12 +420,12 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
 golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7 h1:WJywXQVIb56P2kAvXeMGTIgQ1ZHQxR60+F9dLsodECc=
-golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be h1:fmw3UbQh+nxngCAHrDCCztao/kbYFnWjoqop8dHx05A=
+golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4=
-golang.org/x/exp v0.0.0-20220921164117-439092de6870 h1:j8b6j9gzSigH28O5SjSpQSSh9lFd6f5D/q0aHjNTulc=
-golang.org/x/exp v0.0.0-20220921164117-439092de6870/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
+golang.org/x/exp v0.0.0-20220927162542-c76eaa363f9d h1:3wgmvnqHUJ8SxiNWwea5NCzTwAVfhTtuV+0ClVFlClc=
+golang.org/x/exp v0.0.0-20220927162542-c76eaa363f9d/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 golang.org/x/image v0.0.0-20190823064033-3a9bac650e44/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
@@ -468,8 +466,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx
 golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.0.0-20220802222814-0bcc04d9c69b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
-golang.org/x/net v0.0.0-20220923203811-8be639271d50 h1:vKyz8L3zkd+xrMeIaBsQ/MNVPVFSffdaU3ZyYlBGFnI=
-golang.org/x/net v0.0.0-20220923203811-8be639271d50/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
+golang.org/x/net v0.0.0-20220927171203-f486391704dc h1:FxpXZdoBqT8RjqTy6i1E8nXHhW21wK7ptQ/EPIGxzPQ=
+golang.org/x/net v0.0.0-20220927171203-f486391704dc/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -516,8 +514,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc=
-golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220927170352-d9d178bc13c6 h1:cy1ko5847T/lJ45eyg/7uLprIE/amW5IXxGtEnQdYMI=
+golang.org/x/sys v0.0.0-20220927170352-d9d178bc13c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/text v0.0.0-20180302201248-b7ef84aaf62a/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

+ 5 - 0
kernel/model/conf.go

@@ -379,6 +379,7 @@ func Close(force bool, execInstallPkg int) (exitCode int) {
 	//	return true
 	//})
 
+	waitSecondForExecInstallPkg := false
 	if !skipNewVerInstallPkg() {
 		newVerInstallPkgPath := getNewVerInstallPkgPath()
 		if "" != newVerInstallPkgPath {
@@ -387,6 +388,7 @@ func Close(force bool, execInstallPkg int) (exitCode int) {
 				logging.LogInfof("the new version install pkg is ready [%s], waiting for the user's next instruction", newVerInstallPkgPath)
 				return
 			} else if 2 == execInstallPkg { // 执行新版本安装
+				waitSecondForExecInstallPkg = true
 				go execNewVerInstallPkg(newVerInstallPkgPath)
 			}
 		}
@@ -398,6 +400,9 @@ func Close(force bool, execInstallPkg int) (exitCode int) {
 
 	go func() {
 		time.Sleep(500 * time.Millisecond)
+		if waitSecondForExecInstallPkg {
+			time.Sleep(1 * time.Second)
+		}
 		logging.LogInfof("exited kernel")
 		util.WebSocketServer.Close()
 		os.Exit(util.ExitCodeOk)

+ 93 - 86
kernel/model/liandi.go

@@ -150,102 +150,109 @@ var (
 
 func AutoRefreshCheck() {
 	for {
-		if !subscriptionExpirationReminded {
-			subscriptionExpirationReminded = true
-			go func() {
-				defer logging.Recover()
-
-				if "ios" == util.Container {
-					return
-				}
-				if IsSubscriber() && -1 != Conf.User.UserSiYuanProExpireTime {
-					expired := int64(Conf.User.UserSiYuanProExpireTime)
-					if time.Now().UnixMilli() >= expired { // 已经过期
-						time.Sleep(time.Second * 30)
-						util.PushErrMsg(Conf.Language(128), 0)
-						return
-					}
-					remains := (expired - time.Now().UnixMilli()) / 1000 / 60 / 60 / 24
-					if 0 < remains && 15 > remains { // 15 后过期
-						time.Sleep(3 * time.Minute)
-						util.PushErrMsg(fmt.Sprintf(Conf.Language(127), remains), 0)
-						return
-					}
-				}
-			}()
+		go refreshSubscriptionExpirationRemind()
+		go refreshUser()
+		go refreshAnnouncement()
+		go refreshCheckDownloadInstallPkg()
+
+		<-refreshCheckTicker.C
+	}
+}
+
+func refreshSubscriptionExpirationRemind() {
+	if subscriptionExpirationReminded {
+		return
+	}
+	subscriptionExpirationReminded = true
+
+	defer logging.Recover()
+
+	if "ios" == util.Container {
+		return
+	}
+	if IsSubscriber() && -1 != Conf.User.UserSiYuanProExpireTime {
+		expired := int64(Conf.User.UserSiYuanProExpireTime)
+		if time.Now().UnixMilli() >= expired { // 已经过期
+			time.Sleep(time.Second * 30)
+			util.PushErrMsg(Conf.Language(128), 0)
+			return
 		}
+		remains := (expired - time.Now().UnixMilli()) / 1000 / 60 / 60 / 24
+		if 0 < remains && 15 > remains { // 15 后过期
+			time.Sleep(3 * time.Minute)
+			util.PushErrMsg(fmt.Sprintf(Conf.Language(127), remains), 0)
+			return
+		}
+	}
+}
 
-		go func() {
-			defer logging.Recover()
+func refreshUser() {
+	defer logging.Recover()
 
-			if nil != Conf.User {
-				time.Sleep(2 * time.Minute)
-				if nil != Conf.User {
-					RefreshUser(Conf.User.UserToken)
-				}
-				subscriptionExpirationReminded = false
-			}
-		}()
-
-		go func() {
-			defer logging.Recover()
-
-			time.Sleep(1 * time.Minute)
-			announcementConf := filepath.Join(util.HomeDir, ".config", "siyuan", "announcement.json")
-			var existingAnnouncements, newAnnouncements []*Announcement
-			if gulu.File.IsExist(announcementConf) {
-				data, err := os.ReadFile(announcementConf)
-				if nil != err {
-					logging.LogErrorf("read announcement conf failed: %s", err)
-					return
-				}
-				if err = gulu.JSON.UnmarshalJSON(data, &existingAnnouncements); nil != err {
-					logging.LogErrorf("unmarshal announcement conf failed: %s", err)
-					os.Remove(announcementConf)
-					return
-				}
-			}
+	if nil != Conf.User {
+		time.Sleep(2 * time.Minute)
+		if nil != Conf.User {
+			RefreshUser(Conf.User.UserToken)
+		}
+		subscriptionExpirationReminded = false
+	}
+}
 
-			for _, announcement := range GetAnnouncements() {
-				var exist bool
-				for _, existingAnnouncement := range existingAnnouncements {
-					if announcement.Id == existingAnnouncement.Id {
-						exist = true
-						break
-					}
-				}
-				if !exist {
-					existingAnnouncements = append(existingAnnouncements, announcement)
-					newAnnouncements = append(newAnnouncements, announcement)
-				}
-			}
+func refreshCheckDownloadInstallPkg() {
+	defer logging.Recover()
 
-			data, err := gulu.JSON.MarshalJSON(existingAnnouncements)
-			if nil != err {
-				logging.LogErrorf("marshal announcement conf failed: %s", err)
-				return
-			}
-			if err = os.WriteFile(announcementConf, data, 0644); nil != err {
-				logging.LogErrorf("write announcement conf failed: %s", err)
-				return
-			}
+	time.Sleep(3 * time.Minute)
+	checkDownloadInstallPkg()
+	if "" != getNewVerInstallPkgPath() {
+		util.PushMsg(Conf.Language(62), 0)
+	}
+}
 
-			for _, newAnnouncement := range newAnnouncements {
-				util.PushMsg(fmt.Sprintf(Conf.Language(11), newAnnouncement.URL, newAnnouncement.Title), 0)
-			}
-		}()
+func refreshAnnouncement() {
+	defer logging.Recover()
 
-		go func() {
-			defer logging.Recover()
+	time.Sleep(1 * time.Minute)
+	announcementConf := filepath.Join(util.HomeDir, ".config", "siyuan", "announcement.json")
+	var existingAnnouncements, newAnnouncements []*Announcement
+	if gulu.File.IsExist(announcementConf) {
+		data, err := os.ReadFile(announcementConf)
+		if nil != err {
+			logging.LogErrorf("read announcement conf failed: %s", err)
+			return
+		}
+		if err = gulu.JSON.UnmarshalJSON(data, &existingAnnouncements); nil != err {
+			logging.LogErrorf("unmarshal announcement conf failed: %s", err)
+			os.Remove(announcementConf)
+			return
+		}
+	}
 
-			time.Sleep(3 * time.Minute)
-			checkDownloadInstallPkg()
-			if "" != getNewVerInstallPkgPath() {
-				util.PushMsg(Conf.Language(62), 0)
+	for _, announcement := range GetAnnouncements() {
+		var exist bool
+		for _, existingAnnouncement := range existingAnnouncements {
+			if announcement.Id == existingAnnouncement.Id {
+				exist = true
+				break
 			}
-		}()
+		}
+		if !exist {
+			existingAnnouncements = append(existingAnnouncements, announcement)
+			newAnnouncements = append(newAnnouncements, announcement)
+		}
+	}
 
-		<-refreshCheckTicker.C
+	data, err := gulu.JSON.MarshalJSON(existingAnnouncements)
+	if nil != err {
+		logging.LogErrorf("marshal announcement conf failed: %s", err)
+		return
+	}
+	if err = os.WriteFile(announcementConf, data, 0644); nil != err {
+		logging.LogErrorf("write announcement conf failed: %s", err)
+		return
+	}
+
+	for _, newAnnouncement := range newAnnouncements {
+		util.PushMsg(fmt.Sprintf(Conf.Language(11), newAnnouncement.URL, newAnnouncement.Title), 0)
 	}
 }
 

+ 4 - 10
kernel/model/updater.go

@@ -46,12 +46,11 @@ func execNewVerInstallPkg(newVerInstallPkgPath string) {
 		cmd = exec.Command("sh", "-c", newVerInstallPkgPath)
 	}
 	util.CmdAttr(cmd)
-	data, cmdErr := cmd.CombinedOutput()
+	cmdErr := cmd.Start()
 	if nil != cmdErr {
 		logging.LogErrorf("exec install new version failed: %s", cmdErr)
 		return
 	}
-	logging.LogInfof("installed new version output [%s]", data)
 }
 
 func getNewVerInstallPkgPath() string {
@@ -148,18 +147,13 @@ func downloadInstallPkg(pkgURL, checksum string) {
 
 	logging.LogInfof("downloading install package [%s]", pkgURL)
 	client := req.C().SetTimeout(60 * time.Minute)
-	callback := func(info req.DownloadInfo) {
-		//logging.LogDebugf("downloading install package [%s %.2f%%]", pkgURL, float64(info.DownloadedSize)/float64(info.Response.ContentLength)*100.0)
-	}
-	resp, err := client.R().SetOutputFile(savePath).SetDownloadCallback(callback).Get(pkgURL)
+	err := client.NewParallelDownload(pkgURL).SetConcurrency(8).SetSegmentSize(1024 * 1024 * 4).
+		SetOutputFile(savePath).Do()
 	if nil != err {
 		logging.LogErrorf("download install package failed: %s", err)
 		return
 	}
-	if 200 != resp.StatusCode {
-		logging.LogErrorf("download install package [%s] failed [sc=%d]", pkgURL, resp.StatusCode)
-		return
-	}
+
 	localChecksum, _ := sha256Hash(savePath)
 	if checksum != localChecksum {
 		logging.LogErrorf("verify checksum failed, download install package [%s] checksum [%s] not equal to downloaded [%s] checksum [%s]", pkgURL, checksum, savePath, localChecksum)