From ae1a9abf5e56f1524ebb3ed03925f1e17b66cc08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A5=A5=E8=B6=85?= Date: Sat, 20 Nov 2021 18:57:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BF=AE=E6=94=B9API?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E5=9C=B0=E5=9D=80=E7=9A=84=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/nodes/api_stream.go | 64 ++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/internal/nodes/api_stream.go b/internal/nodes/api_stream.go index dcab7cb..cdccf10 100644 --- a/internal/nodes/api_stream.go +++ b/internal/nodes/api_stream.go @@ -9,15 +9,18 @@ import ( "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/TeaOSLab/EdgeNode/internal/caches" + "github.com/TeaOSLab/EdgeNode/internal/configs" teaconst "github.com/TeaOSLab/EdgeNode/internal/const" "github.com/TeaOSLab/EdgeNode/internal/errors" "github.com/TeaOSLab/EdgeNode/internal/events" "github.com/TeaOSLab/EdgeNode/internal/remotelogs" "github.com/TeaOSLab/EdgeNode/internal/rpc" "github.com/TeaOSLab/EdgeNode/internal/utils" + "github.com/iwind/TeaGo/Tea" "io" "net" "net/http" + "net/url" "os/exec" "strconv" "strings" @@ -111,6 +114,8 @@ func (this *APIStream) loop() error { err = this.handleNewNodeTask(message) case messageconfigs.MessageCodeCheckSystemdService: // 检查Systemd服务 err = this.handleCheckSystemdService(message) + case messageconfigs.MessageCodeChangeAPINode: // 修改API节点地址 + err = this.handleChangeAPINode(message) default: err = this.handleUnknownMessage(message) } @@ -570,6 +575,65 @@ func (this *APIStream) handleCheckSystemdService(message *pb.NodeStreamMessage) return nil } +// 修改API地址 +func (this *APIStream) handleChangeAPINode(message *pb.NodeStreamMessage) error { + config, err := configs.LoadAPIConfig() + if err != nil { + this.replyFail(message.RequestId, "read config error: "+err.Error()) + return nil + } + + var messageData = &messageconfigs.ChangeAPINodeMessage{} + err = json.Unmarshal(message.DataJSON, messageData) + if err != nil { + this.replyFail(message.RequestId, "unmarshal message failed: "+err.Error()) + return nil + } + + _, err = url.Parse(messageData.Addr) + if err != nil { + this.replyFail(message.RequestId, "invalid new api node address: '"+messageData.Addr+"'") + return nil + } + + config.RPC.Endpoints = []string{messageData.Addr} + + // 保存到文件 + err = config.WriteFile(Tea.ConfigFile("api.yaml")) + if err != nil { + this.replyFail(message.RequestId, "save config file failed: "+err.Error()) + return nil + } + + this.replyOk(message.RequestId, "") + + go func() { + // 延后生效,防止变更前的API无法读取到状态 + time.Sleep(1 * time.Second) + + rpcClient, err := rpc.SharedRPC() + if err != nil { + remotelogs.Error("API_STREAM", "change rpc endpoint to '"+ + messageData.Addr+"' failed: "+err.Error()) + return + } + + rpcClient.Close() + + err = rpcClient.UpdateConfig(config) + if err != nil { + remotelogs.Error("API_STREAM", "change rpc endpoint to '"+ + messageData.Addr+"' failed: "+err.Error()) + return + } + + remotelogs.Println("API_STREAM", "change rpc endpoint to '"+ + messageData.Addr+"' successfully") + }() + + return nil +} + // 处理未知消息 func (this *APIStream) handleUnknownMessage(message *pb.NodeStreamMessage) error { this.replyFail(message.RequestId, "unknown message code '"+message.Code+"'")