浏览代码

:art: 桌面端自动下载更新安装包 https://github.com/siyuan-note/siyuan/issues/5837

Liang Ding 2 年之前
父节点
当前提交
313143304b
共有 7 个文件被更改,包括 83 次插入20 次删除
  1. 15 2
      app/src/dialog/processSystem.ts
  2. 15 5
      kernel/api/system.go
  3. 35 5
      kernel/model/conf.go
  4. 1 1
      kernel/model/liandi.go
  5. 2 2
      kernel/model/process.go
  6. 12 5
      kernel/model/updater.go
  7. 3 0
      kernel/sql/database.go

+ 15 - 2
app/src/dialog/processSystem.ts

@@ -83,7 +83,7 @@ export const kernelError = () => {
 
 export const exitSiYuan = () => {
     fetchPost("/api/system/exit", {force: false}, (response) => {
-        if (response.code === 1) {
+        if (response.code === 1) { // 同步执行失败
             const msgId = showMessage(response.msg, response.data.closeTimeout, "error");
             const buttonElement = document.querySelector(`#message [data-id="${msgId}"] button`);
             if (buttonElement) {
@@ -100,7 +100,20 @@ export const exitSiYuan = () => {
                     });
                 });
             }
-        } else {
+        } else if (response.code === 2) { // 提示新安装包
+            const msgId = showMessage(response.msg, response.data.closeTimeout, "info");
+            const buttonElement = document.querySelector(`#message [data-id="${msgId}"] button`);
+            if (buttonElement) {
+                buttonElement.addEventListener("click", () => {
+                    fetchPost("/api/system/exit", {force: true}, () => {
+                        /// #if !BROWSER
+                        ipcRenderer.send(Constants.SIYUAN_CONFIG_CLOSETRAY);
+                        ipcRenderer.send(Constants.SIYUAN_QUIT);
+                        /// #endif
+                    });
+                });
+            }
+        } else { // 正常退出
             /// #if !BROWSER
             ipcRenderer.send(Constants.SIYUAN_CONFIG_CLOSETRAY);
             ipcRenderer.send(Constants.SIYUAN_QUIT);

+ 15 - 5
kernel/api/system.go

@@ -348,11 +348,21 @@ func exit(c *gin.Context) {
 		force = forceArg.(bool)
 	}
 
-	err := model.Close(force)
-	if nil != err {
-		ret.Code = 1
-		ret.Msg = err.Error() + "<div class=\"fn__space\"></div><button class=\"b3-button b3-button--white\">" + model.Conf.Language(97) + "</button>"
+	execInstallPkgArg := arg["execInstallPkgArg"] // 0:默认检查新版本,1:不执行新版本安装,2:执行新版本安装
+	execInstallPkg := 0
+	if nil != execInstallPkgArg {
+		execInstallPkg = int(execInstallPkgArg.(float64))
+	}
+
+	exitCode := model.Close(force, execInstallPkg)
+	ret.Code = exitCode
+	switch exitCode {
+	case 0:
+	case 1: // 同步执行失败
+		ret.Msg = model.Conf.Language(96) + "<div class=\"fn__space\"></div><button class=\"b3-button b3-button--white\">" + model.Conf.Language(97) + "</button>"
+		ret.Data = map[string]interface{}{"closeTimeout": 0}
+	case 2: // 提示新安装包
+		ret.Msg = model.Conf.Language(61)
 		ret.Data = map[string]interface{}{"closeTimeout": 0}
-		return
 	}
 }

+ 35 - 5
kernel/model/conf.go

@@ -18,8 +18,8 @@ package model
 
 import (
 	"bytes"
-	"errors"
 	"os"
+	"os/exec"
 	"path/filepath"
 	"runtime"
 	"sort"
@@ -345,7 +345,15 @@ func loadLangs() (ret []*conf.Lang) {
 
 var exitLock = sync.Mutex{}
 
-func Close(force bool) (err error) {
+// Close 退出内核进程.
+//
+// force:是否不执行同步过程而直接退出
+// execInstallPkg:是否执行新版本安装包
+//
+//	0:默认按照设置项 System.DownloadInstallPkg 检查并推送提示
+//	1:执行安装
+//	2:不执行安装
+func Close(force bool, execInstallPkg int) (exitCode int) {
 	exitLock.Lock()
 	defer exitLock.Unlock()
 
@@ -355,7 +363,7 @@ func Close(force bool) (err error) {
 	if !force {
 		SyncData(false, true, false)
 		if 0 != ExitSyncSucc {
-			err = errors.New(Conf.Language(96))
+			exitCode = 1
 			return
 		}
 	}
@@ -366,13 +374,35 @@ func Close(force bool) (err error) {
 	//	return true
 	//})
 
+	newVerInstallPkgPath := ""
+	if Conf.System.DownloadInstallPkg && 0 == execInstallPkg {
+		newVerInstallPkgPath = GetNewVerInstallPkgPath()
+		if "" != newVerInstallPkgPath {
+			exitCode = 2
+			return
+		}
+	}
+
+	if 2 == execInstallPkg && "" != newVerInstallPkgPath { // 执行新版本安装
+		logging.LogInfof("install new version [%s]", newVerInstallPkgPath)
+		cmd := exec.Command(newVerInstallPkgPath)
+		util.CmdAttr(cmd)
+		data, cmdErr := cmd.CombinedOutput()
+		if nil != cmdErr {
+			logging.LogErrorf("exec install new version failed: %s", cmdErr)
+			return
+		}
+		logging.LogDebugf("exec install new version output [%s]", data)
+	}
+
 	Conf.Close()
 	sql.CloseDatabase()
-	util.WebSocketServer.Close()
 	clearWorkspaceTemp()
-	logging.LogInfof("exited kernel")
+
 	go func() {
 		time.Sleep(500 * time.Millisecond)
+		logging.LogInfof("exited kernel")
+		util.WebSocketServer.Close()
 		os.Exit(util.ExitCodeOk)
 	}()
 	return

+ 1 - 1
kernel/model/liandi.go

@@ -240,7 +240,7 @@ func AutoRefreshCheck() {
 
 			time.Sleep(3 * time.Minute)
 			checkDownloadInstallPkg()
-			if isExistUpdateInstallPkg() {
+			if "" != GetNewVerInstallPkgPath() {
 				util.PushMsg(Conf.Language(61), 0)
 			}
 		}()

+ 2 - 2
kernel/model/process.go

@@ -34,7 +34,7 @@ func HookResident() {
 	for range time.Tick(time.Second * 30) {
 		if 0 == util.CountSessions() {
 			logging.LogInfof("no active session, exit kernel process now")
-			Close(false)
+			Close(false, 2)
 		}
 	}
 }
@@ -44,5 +44,5 @@ func HandleSignal() {
 	signal.Notify(c, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM)
 	s := <-c
 	logging.LogInfof("received os signal [%s], exit kernel process now", s)
-	Close(false)
+	Close(false, 2)
 }

+ 12 - 5
kernel/model/updater.go

@@ -34,16 +34,23 @@ import (
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 
-func isExistUpdateInstallPkg() bool {
+func GetNewVerInstallPkgPath() string {
+	if !Conf.System.DownloadInstallPkg {
+		return ""
+	}
+
 	downloadPkgURL, checksum, err := getUpdatePkg()
 	if nil != err {
-		return false
+		return ""
 	}
 
 	pkg := path.Base(downloadPkgURL)
-	savePath := filepath.Join(util.TempDir, "install", pkg)
-	localChecksum, _ := sha256Hash(savePath)
-	return checksum == localChecksum
+	ret := filepath.Join(util.TempDir, "install", pkg)
+	localChecksum, _ := sha256Hash(ret)
+	if checksum != localChecksum {
+		return ""
+	}
+	return ret
 }
 
 var checkDownloadInstallPkgLock = sync.Mutex{}

+ 3 - 0
kernel/sql/database.go

@@ -1086,10 +1086,13 @@ func batchUpdateHPath(tx *sql.Tx, boxID, rootID, oldHPath, newHPath string) (err
 func CloseDatabase() {
 	if err := db.Close(); nil != err {
 		logging.LogErrorf("close database failed: %s", err)
+		return
 	}
 	if err := historyDB.Close(); nil != err {
 		logging.LogErrorf("close history database failed: %s", err)
+		return
 	}
+	logging.LogInfof("closed database")
 }
 
 func queryRow(query string, args ...interface{}) *sql.Row {