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

This commit is contained in:
Liang Ding 2022-09-08 09:55:29 +08:00
parent 8f6ffd4dcd
commit 313143304b
No known key found for this signature in database
GPG key ID: 136F30F901A2231D
7 changed files with 83 additions and 20 deletions

View file

@ -83,7 +83,7 @@ export const kernelError = () => {
export const exitSiYuan = () => { export const exitSiYuan = () => {
fetchPost("/api/system/exit", {force: false}, (response) => { 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 msgId = showMessage(response.msg, response.data.closeTimeout, "error");
const buttonElement = document.querySelector(`#message [data-id="${msgId}"] button`); const buttonElement = document.querySelector(`#message [data-id="${msgId}"] button`);
if (buttonElement) { 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 /// #if !BROWSER
ipcRenderer.send(Constants.SIYUAN_CONFIG_CLOSETRAY); ipcRenderer.send(Constants.SIYUAN_CONFIG_CLOSETRAY);
ipcRenderer.send(Constants.SIYUAN_QUIT); ipcRenderer.send(Constants.SIYUAN_QUIT);

View file

@ -348,11 +348,21 @@ func exit(c *gin.Context) {
force = forceArg.(bool) force = forceArg.(bool)
} }
err := model.Close(force) execInstallPkgArg := arg["execInstallPkgArg"] // 0默认检查新版本1不执行新版本安装2执行新版本安装
if nil != err { execInstallPkg := 0
ret.Code = 1 if nil != execInstallPkgArg {
ret.Msg = err.Error() + "<div class=\"fn__space\"></div><button class=\"b3-button b3-button--white\">" + model.Conf.Language(97) + "</button>" 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} ret.Data = map[string]interface{}{"closeTimeout": 0}
return
} }
} }

View file

@ -18,8 +18,8 @@ package model
import ( import (
"bytes" "bytes"
"errors"
"os" "os"
"os/exec"
"path/filepath" "path/filepath"
"runtime" "runtime"
"sort" "sort"
@ -345,7 +345,15 @@ func loadLangs() (ret []*conf.Lang) {
var exitLock = sync.Mutex{} 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() exitLock.Lock()
defer exitLock.Unlock() defer exitLock.Unlock()
@ -355,7 +363,7 @@ func Close(force bool) (err error) {
if !force { if !force {
SyncData(false, true, false) SyncData(false, true, false)
if 0 != ExitSyncSucc { if 0 != ExitSyncSucc {
err = errors.New(Conf.Language(96)) exitCode = 1
return return
} }
} }
@ -366,13 +374,35 @@ func Close(force bool) (err error) {
// return true // 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() Conf.Close()
sql.CloseDatabase() sql.CloseDatabase()
util.WebSocketServer.Close()
clearWorkspaceTemp() clearWorkspaceTemp()
logging.LogInfof("exited kernel")
go func() { go func() {
time.Sleep(500 * time.Millisecond) time.Sleep(500 * time.Millisecond)
logging.LogInfof("exited kernel")
util.WebSocketServer.Close()
os.Exit(util.ExitCodeOk) os.Exit(util.ExitCodeOk)
}() }()
return return

View file

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

View file

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

View file

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

View file

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