diff --git a/app/src/dialog/processSystem.ts b/app/src/dialog/processSystem.ts index 34c80f23c..37dba8479 100644 --- a/app/src/dialog/processSystem.ts +++ b/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); diff --git a/kernel/api/system.go b/kernel/api/system.go index a97c94403..54d99c132 100644 --- a/kernel/api/system.go +++ b/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() + "
" + 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) + "" + ret.Data = map[string]interface{}{"closeTimeout": 0} + case 2: // 提示新安装包 + ret.Msg = model.Conf.Language(61) ret.Data = map[string]interface{}{"closeTimeout": 0} - return } } diff --git a/kernel/model/conf.go b/kernel/model/conf.go index 226ee6afd..c608eec9e 100644 --- a/kernel/model/conf.go +++ b/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 diff --git a/kernel/model/liandi.go b/kernel/model/liandi.go index 701fc7a67..6ff628eec 100644 --- a/kernel/model/liandi.go +++ b/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) } }() diff --git a/kernel/model/process.go b/kernel/model/process.go index 358cd9955..4ea4a7387 100644 --- a/kernel/model/process.go +++ b/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) } diff --git a/kernel/model/updater.go b/kernel/model/updater.go index dbe17cd61..3790b9141 100644 --- a/kernel/model/updater.go +++ b/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{} diff --git a/kernel/sql/database.go b/kernel/sql/database.go index 69a837545..362bd86cb 100644 --- a/kernel/sql/database.go +++ b/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 {