mirror of
https://github.com/TeaOSLab/EdgeAdmin.git
synced 2025-11-06 23:00:25 +08:00
125 lines
3.1 KiB
Go
125 lines
3.1 KiB
Go
// Copyright 2023 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
|
|
|
package node
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
|
|
"github.com/TeaOSLab/EdgeAdmin/internal/utils/apinodeutils"
|
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
|
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
"github.com/iwind/TeaGo/actions"
|
|
"strings"
|
|
)
|
|
|
|
type UpgradePopupAction struct {
|
|
actionutils.ParentAction
|
|
}
|
|
|
|
func (this *UpgradePopupAction) Init() {
|
|
this.Nav("", "", "")
|
|
}
|
|
|
|
func (this *UpgradePopupAction) RunGet(params struct {
|
|
NodeId int64
|
|
}) {
|
|
this.Data["nodeId"] = params.NodeId
|
|
this.Data["nodeName"] = ""
|
|
this.Data["currentVersion"] = ""
|
|
this.Data["latestVersion"] = ""
|
|
this.Data["result"] = ""
|
|
this.Data["resultIsOk"] = true
|
|
this.Data["canUpgrade"] = false
|
|
this.Data["isUpgrading"] = false
|
|
|
|
nodeResp, err := this.RPC().APINodeRPC().FindEnabledAPINode(this.AdminContext(), &pb.FindEnabledAPINodeRequest{ApiNodeId: params.NodeId})
|
|
if err != nil {
|
|
this.ErrorPage(err)
|
|
return
|
|
}
|
|
var node = nodeResp.ApiNode
|
|
if node == nil {
|
|
this.Data["result"] = "要升级的节点不存在"
|
|
this.Data["resultIsOk"] = false
|
|
this.Show()
|
|
return
|
|
}
|
|
this.Data["nodeName"] = node.Name + " / [" + strings.Join(node.AccessAddrs, ", ") + "]"
|
|
|
|
// 节点状态
|
|
var status = &nodeconfigs.NodeStatus{}
|
|
if len(node.StatusJSON) > 0 {
|
|
err = json.Unmarshal(node.StatusJSON, &status)
|
|
if err != nil {
|
|
this.ErrorPage(errors.New("decode status failed: " + err.Error()))
|
|
return
|
|
}
|
|
this.Data["currentVersion"] = status.BuildVersion
|
|
} else {
|
|
this.Data["result"] = "无法检测到节点当前版本"
|
|
this.Data["resultIsOk"] = false
|
|
this.Show()
|
|
return
|
|
}
|
|
this.Data["latestVersion"] = teaconst.APINodeVersion
|
|
|
|
if status.IsActive && len(status.BuildVersion) > 0 {
|
|
canUpgrade, reason := apinodeutils.CanUpgrade(status.BuildVersion, status.OS, status.Arch)
|
|
if !canUpgrade {
|
|
this.Data["result"] = reason
|
|
this.Data["resultIsOk"] = false
|
|
this.Show()
|
|
return
|
|
}
|
|
this.Data["canUpgrade"] = true
|
|
this.Data["result"] = "等待升级"
|
|
this.Data["resultIsOk"] = true
|
|
} else {
|
|
this.Data["result"] = "当前节点非连接状态无法远程升级"
|
|
this.Data["resultIsOk"] = false
|
|
this.Show()
|
|
return
|
|
}
|
|
|
|
// 是否正在升级
|
|
var oldUpgrader = apinodeutils.SharedManager.FindUpgrader(params.NodeId)
|
|
if oldUpgrader != nil {
|
|
this.Data["result"] = "正在升级中..."
|
|
this.Data["resultIsOk"] = false
|
|
this.Data["isUpgrading"] = true
|
|
}
|
|
|
|
this.Show()
|
|
}
|
|
|
|
func (this *UpgradePopupAction) RunPost(params struct {
|
|
NodeId int64
|
|
|
|
Must *actions.Must
|
|
CSRF *actionutils.CSRF
|
|
}) {
|
|
var manager = apinodeutils.SharedManager
|
|
|
|
var oldUpgrader = manager.FindUpgrader(params.NodeId)
|
|
if oldUpgrader != nil {
|
|
this.Fail("正在升级中,无需重复提交 ...")
|
|
return
|
|
}
|
|
|
|
var upgrader = apinodeutils.NewUpgrader(params.NodeId)
|
|
manager.AddUpgrader(upgrader)
|
|
defer func() {
|
|
manager.RemoveUpgrader(upgrader)
|
|
}()
|
|
|
|
err := upgrader.Upgrade()
|
|
if err != nil {
|
|
this.Fail("升级失败:" + err.Error())
|
|
return
|
|
}
|
|
|
|
this.Success()
|
|
}
|