diff --git a/internal/web/actions/default/clusters/cluster/init.go b/internal/web/actions/default/clusters/cluster/init.go index 23a09949..f28e9997 100644 --- a/internal/web/actions/default/clusters/cluster/init.go +++ b/internal/web/actions/default/clusters/cluster/init.go @@ -54,6 +54,7 @@ func init() { GetPost("/settings/dns", new(dns.IndexAction)). GetPost("/settings/system", new(system.IndexAction)). GetPost("/settings/ssh", new(ssh.IndexAction)). + GetPost("/settings/ssh/test", new(ssh.TestAction)). GetPost("/settings/thresholds", new(thresholds.IndexAction)). // 分组相关 diff --git a/internal/web/actions/default/clusters/cluster/node/settings/ssh/index.go b/internal/web/actions/default/clusters/cluster/node/settings/ssh/index.go index ccf15e6d..54d708cc 100644 --- a/internal/web/actions/default/clusters/cluster/node/settings/ssh/index.go +++ b/internal/web/actions/default/clusters/cluster/node/settings/ssh/index.go @@ -10,6 +10,8 @@ import ( "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/maps" + "net" + "regexp" ) type IndexAction struct { @@ -33,7 +35,7 @@ func (this *IndexAction) RunGet(params struct { // 登录信息 var loginMap maps.Map = nil if node.NodeLogin != nil { - loginParams := maps.Map{} + var loginParams = maps.Map{} if len(node.NodeLogin.Params) > 0 { err = json.Unmarshal(node.NodeLogin.Params, &loginParams) if err != nil { @@ -42,7 +44,7 @@ func (this *IndexAction) RunGet(params struct { } } - grantMap := maps.Map{} + var grantMap = maps.Map{} grantId := loginParams.GetInt64("grantId") if grantId > 0 { grantResp, err := this.RPC().NodeGrantRPC().FindEnabledNodeGrant(this.AdminContext(), &pb.FindEnabledNodeGrantRequest{NodeGrantId: grantId}) @@ -70,6 +72,27 @@ func (this *IndexAction) RunGet(params struct { } } + if loginMap == nil { + addressesResp, err := this.RPC().NodeIPAddressRPC().FindAllEnabledNodeIPAddressesWithNodeId(this.AdminContext(), &pb.FindAllEnabledNodeIPAddressesWithNodeIdRequest{NodeId: node.Id}) + if err != nil { + this.ErrorPage(err) + return + } + if len(addressesResp.NodeIPAddresses) > 0 { + loginMap = maps.Map{ + "id": 0, + "name": "", + "type": "ssh", + "params": maps.Map{ + "host": addressesResp.NodeIPAddresses[0].Ip, + "port": 22, + "grantId": 0, + }, + "grant": nil, + } + } + } + var nodeMap = this.Data["node"].(maps.Map) nodeMap["login"] = loginMap @@ -89,8 +112,13 @@ func (this *IndexAction) RunPost(params struct { }) { defer this.CreateLogInfo("修改节点 %d SSH登录信息", params.NodeId) + // 检查IP地址 + if regexp.MustCompile(`^\d+\.\d+\.\d+\.\d+$`).MatchString(params.SshHost) && net.ParseIP(params.SshHost) == nil { + this.Fail("SSH主机地址 '" + params.SshHost + "' IP格式错误") + } + // TODO 检查登录授权 - loginInfo := &pb.NodeLogin{ + var loginInfo = &pb.NodeLogin{ Id: params.LoginId, Name: "SSH", Type: "ssh", diff --git a/internal/web/actions/default/clusters/cluster/node/settings/ssh/test.go b/internal/web/actions/default/clusters/cluster/node/settings/ssh/test.go new file mode 100644 index 00000000..c039a605 --- /dev/null +++ b/internal/web/actions/default/clusters/cluster/node/settings/ssh/test.go @@ -0,0 +1,31 @@ +// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package ssh + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +type TestAction struct { + actionutils.ParentAction +} + +func (this *TestAction) RunPost(params struct { + GrantId int64 + Host string + Port int32 +}) { + resp, err := this.RPC().NodeGrantRPC().TestNodeGrant(this.AdminContext(), &pb.TestNodeGrantRequest{ + NodeGrantId: params.GrantId, + Host: params.Host, + Port: params.Port, + }) + if err != nil { + this.ErrorPage(err) + return + } + this.Data["isOk"] = resp.IsOk + this.Data["error"] = resp.Error + this.Success() +} diff --git a/internal/web/actions/default/clusters/cluster/updateNodeSSH.go b/internal/web/actions/default/clusters/cluster/updateNodeSSH.go index 8537dfd0..7fa99aff 100644 --- a/internal/web/actions/default/clusters/cluster/updateNodeSSH.go +++ b/internal/web/actions/default/clusters/cluster/updateNodeSSH.go @@ -8,6 +8,8 @@ import ( "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/maps" + "net" + "regexp" ) type UpdateNodeSSHAction struct { @@ -31,7 +33,7 @@ func (this *UpdateNodeSSHAction) RunGet(params struct { return } - node := nodeResp.Node + var node = nodeResp.Node this.Data["node"] = maps.Map{ "id": node.Id, "name": node.Name, @@ -43,7 +45,7 @@ func (this *UpdateNodeSSHAction) RunGet(params struct { } // SSH - loginParams := maps.Map{ + var loginParams = maps.Map{ "host": "", "port": "", "grantId": 0, @@ -59,10 +61,22 @@ func (this *UpdateNodeSSHAction) RunGet(params struct { } } } + + if len(loginParams.GetString("host")) == 0 { + addressesResp, err := this.RPC().NodeIPAddressRPC().FindAllEnabledNodeIPAddressesWithNodeId(this.AdminContext(), &pb.FindAllEnabledNodeIPAddressesWithNodeIdRequest{NodeId: node.Id}) + if err != nil { + this.ErrorPage(err) + return + } + if len(addressesResp.NodeIPAddresses) > 0 { + loginParams["host"] = addressesResp.NodeIPAddresses[0].Ip + } + } + this.Data["params"] = loginParams // 认证信息 - grantId := loginParams.GetInt64("grantId") + var grantId = loginParams.GetInt64("grantId") grantResp, err := this.RPC().NodeGrantRPC().FindEnabledNodeGrant(this.AdminContext(), &pb.FindEnabledNodeGrantRequest{NodeGrantId: grantId}) if err != nil { this.ErrorPage(err) @@ -101,7 +115,12 @@ func (this *UpdateNodeSSHAction) RunPost(params struct { this.Fail("需要选择或填写至少一个认证信息") } - login := &pb.NodeLogin{ + // 检查IP地址 + if regexp.MustCompile(`^\d+\.\d+\.\d+\.\d+$`).MatchString(params.SshHost) && net.ParseIP(params.SshHost) == nil { + this.Fail("SSH主机地址 '" + params.SshHost + "' IP格式错误") + } + + var login = &pb.NodeLogin{ Id: params.LoginId, Name: "SSH", Type: "ssh", diff --git a/web/views/@default/clusters/cluster/node/settings/ssh/index.html b/web/views/@default/clusters/cluster/node/settings/ssh/index.html index 18a39293..2cfe75bc 100644 --- a/web/views/@default/clusters/cluster/node/settings/ssh/index.html +++ b/web/views/@default/clusters/cluster/node/settings/ssh/index.html @@ -30,6 +30,11 @@ + +
正在测试是否连接 ...
+
连接成功!
+
连接失败:{{resp.error}}
+ \ No newline at end of file diff --git a/web/views/@default/clusters/cluster/node/settings/ssh/index.js b/web/views/@default/clusters/cluster/node/settings/ssh/index.js index f865c148..32e45e7a 100644 --- a/web/views/@default/clusters/cluster/node/settings/ssh/index.js +++ b/web/views/@default/clusters/cluster/node/settings/ssh/index.js @@ -27,4 +27,27 @@ Tea.context(function () { } } } + + + // 测试相关 + this.resp = null + this.isTesting = false + + if (this.grant != null && this.grant.id > 0 && this.sshHost.length > 0 && this.sshPort.toString().length > 0) { + this.isTesting = true + this.$delay(function () { + this.$post(".test") + .params({ + grantId: this.grant.id, + host: this.sshHost, + port: this.sshPort + }) + .success(function (resp) { + this.resp = resp.data + }) + .done(function () { + this.isTesting = false + }) + }, 1000) + } }) \ No newline at end of file