diff --git a/internal/web/actions/default/api/index.go b/internal/web/actions/default/api/index.go index b276caf7..79a33a58 100644 --- a/internal/web/actions/default/api/index.go +++ b/internal/web/actions/default/api/index.go @@ -6,6 +6,7 @@ import ( "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/iwind/TeaGo/logs" "github.com/iwind/TeaGo/maps" "time" @@ -52,11 +53,44 @@ func (this *IndexAction) RunGet(params struct{}) { status.IsActive = status.IsActive && time.Now().Unix()-status.UpdatedAt <= 60 // N秒之内认为活跃 } + // Rest地址 + restAccessAddrs := []string{} + if node.RestIsOn { + if len(node.RestHTTPJSON) > 0 { + httpConfig := &serverconfigs.HTTPProtocolConfig{} + err = json.Unmarshal(node.RestHTTPJSON, httpConfig) + if err != nil { + this.ErrorPage(err) + return + } + _ = httpConfig.Init() + if httpConfig.IsOn && len(httpConfig.Listen) > 0 { + for _, listen := range httpConfig.Listen { + restAccessAddrs = append(restAccessAddrs, listen.FullAddresses()...) + } + } + } + + if len(node.RestHTTPSJSON) > 0 { + httpsConfig := &serverconfigs.HTTPSProtocolConfig{} + err = json.Unmarshal(node.RestHTTPSJSON, httpsConfig) + if err != nil { + this.ErrorPage(err) + return + } + _ = httpsConfig.Init() + if httpsConfig.IsOn && len(httpsConfig.Listen) > 0 { + restAccessAddrs = append(restAccessAddrs, httpsConfig.FullAddresses()...) + } + } + } + nodeMaps = append(nodeMaps, maps.Map{ - "id": node.Id, - "isOn": node.IsOn, - "name": node.Name, - "accessAddrs": node.AccessAddrs, + "id": node.Id, + "isOn": node.IsOn, + "name": node.Name, + "accessAddrs": node.AccessAddrs, + "restAccessAddrs": restAccessAddrs, "status": maps.Map{ "isActive": status.IsActive, "updatedAt": status.UpdatedAt, diff --git a/internal/web/actions/default/api/node/createPopup.go b/internal/web/actions/default/api/node/createPopup.go index 7cbfba3b..2599f249 100644 --- a/internal/web/actions/default/api/node/createPopup.go +++ b/internal/web/actions/default/api/node/createPopup.go @@ -28,7 +28,11 @@ func (this *CreatePopupAction) RunPost(params struct { ListensJSON []byte CertIdsJSON []byte AccessAddrsJSON []byte - IsOn bool + + RestIsOn bool + RestListensJSON []byte + + IsOn bool Must *actions.Must }) { @@ -59,6 +63,27 @@ func (this *CreatePopupAction) RunPost(params struct { } } + // Rest监听地址 + restHTTPConfig := &serverconfigs.HTTPProtocolConfig{} + restHTTPSConfig := &serverconfigs.HTTPSProtocolConfig{} + if params.RestIsOn { + restListens := []*serverconfigs.NetworkAddressConfig{} + err = json.Unmarshal(params.RestListensJSON, &restListens) + if err != nil { + this.ErrorPage(err) + return + } + for _, addr := range restListens { + if addr.Protocol.IsHTTPFamily() { + restHTTPConfig.IsOn = true + restHTTPConfig.Listen = append(restHTTPConfig.Listen, addr) + } else if addr.Protocol.IsHTTPSFamily() { + restHTTPSConfig.IsOn = true + restHTTPSConfig.Listen = append(restHTTPSConfig.Listen, addr) + } + } + } + // 证书 certIds := []int64{} if len(params.CertIdsJSON) > 0 { @@ -68,7 +93,7 @@ func (this *CreatePopupAction) RunPost(params struct { return } } - if httpsConfig.IsOn && len(httpsConfig.Listen) > 0 && len(certIds) == 0 { + if ((httpsConfig.IsOn && len(httpsConfig.Listen) > 0) || (restHTTPSConfig.IsOn && len(httpsConfig.Listen) > 0)) && len(certIds) == 0 { this.Fail("请添加至少一个证书") } @@ -99,6 +124,10 @@ func (this *CreatePopupAction) RunPost(params struct { IsOn: true, SSLPolicyId: sslPolicyId, } + restHTTPSConfig.SSLPolicyRef = &sslconfigs.SSLPolicyRef{ + IsOn: true, + SSLPolicyId: sslPolicyId, + } } // 访问地址 @@ -123,11 +152,25 @@ func (this *CreatePopupAction) RunPost(params struct { return } + restHTTPJSON, err := json.Marshal(restHTTPConfig) + if err != nil { + this.ErrorPage(err) + return + } + restHTTPSJSON, err := json.Marshal(restHTTPSConfig) + if err != nil { + this.ErrorPage(err) + return + } + createResp, err := this.RPC().APINodeRPC().CreateAPINode(this.AdminContext(), &pb.CreateAPINodeRequest{ Name: params.Name, Description: params.Description, HttpJSON: httpJSON, HttpsJSON: httpsJSON, + RestIsOn: params.RestIsOn, + RestHTTPJSON: restHTTPJSON, + RestHTTPSJSON: restHTTPSJSON, AccessAddrsJSON: params.AccessAddrsJSON, IsOn: params.IsOn, }) diff --git a/internal/web/actions/default/api/node/index.go b/internal/web/actions/default/api/node/index.go index 379b60bb..e2b8ed43 100644 --- a/internal/web/actions/default/api/node/index.go +++ b/internal/web/actions/default/api/node/index.go @@ -87,15 +87,45 @@ func (this *IndexAction) RunGet(params struct { } } + // Rest地址 + restAccessAddrs := []*serverconfigs.NetworkAddressConfig{} + if node.RestIsOn { + if len(node.RestHTTPJSON) > 0 { + httpConfig := &serverconfigs.HTTPProtocolConfig{} + err = json.Unmarshal(node.RestHTTPJSON, httpConfig) + if err != nil { + this.ErrorPage(err) + return + } + if httpConfig.IsOn && len(httpConfig.Listen) > 0 { + restAccessAddrs = append(restAccessAddrs, httpConfig.Listen...) + } + } + + if len(node.RestHTTPSJSON) > 0 { + httpsConfig := &serverconfigs.HTTPSProtocolConfig{} + err = json.Unmarshal(node.RestHTTPSJSON, httpsConfig) + if err != nil { + this.ErrorPage(err) + return + } + if httpsConfig.IsOn && len(httpsConfig.Listen) > 0 { + restAccessAddrs = append(restAccessAddrs, httpsConfig.Listen...) + } + } + } + this.Data["node"] = maps.Map{ - "id": node.Id, - "name": node.Name, - "description": node.Description, - "isOn": node.IsOn, - "listens": listens, - "accessAddrs": accessAddrs, - "hasHTTPS": sslPolicyId > 0, - "certs": certs, + "id": node.Id, + "name": node.Name, + "description": node.Description, + "isOn": node.IsOn, + "listens": listens, + "accessAddrs": accessAddrs, + "restIsOn": node.RestIsOn, + "restAccessAddrs": restAccessAddrs, + "hasHTTPS": sslPolicyId > 0, + "certs": certs, } this.Show() diff --git a/internal/web/actions/default/api/node/init.go b/internal/web/actions/default/api/node/init.go index a0b585d8..96bdb04a 100644 --- a/internal/web/actions/default/api/node/init.go +++ b/internal/web/actions/default/api/node/init.go @@ -11,7 +11,7 @@ func init() { TeaGo.BeforeStart(func(server *TeaGo.Server) { server. Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeSetting)). - Helper(settingutils.NewHelper("apiNodes")). + Helper(settingutils.NewAdvancedHelper("apiNodes")). Prefix("/api/node"). // 这里不受Helper的约束 diff --git a/internal/web/actions/default/api/node/update.go b/internal/web/actions/default/api/node/update.go index 2c1a1750..bcd458a9 100644 --- a/internal/web/actions/default/api/node/update.go +++ b/internal/web/actions/default/api/node/update.go @@ -57,6 +57,28 @@ func (this *UpdateAction) RunGet(params struct { listens = append(listens, httpConfig.Listen...) listens = append(listens, httpsConfig.Listen...) + restHTTPConfig := &serverconfigs.HTTPProtocolConfig{} + if len(node.RestHTTPJSON) > 0 { + err = json.Unmarshal(node.RestHTTPJSON, restHTTPConfig) + if err != nil { + this.ErrorPage(err) + return + } + } + restHTTPSConfig := &serverconfigs.HTTPSProtocolConfig{} + if len(node.RestHTTPSJSON) > 0 { + err = json.Unmarshal(node.RestHTTPSJSON, restHTTPSConfig) + if err != nil { + this.ErrorPage(err) + return + } + } + + // 监听地址 + restListens := []*serverconfigs.NetworkAddressConfig{} + restListens = append(restListens, restHTTPConfig.Listen...) + restListens = append(restListens, restHTTPSConfig.Listen...) + // 证书信息 certs := []*sslconfigs.SSLCertConfig{} sslPolicyId := int64(0) @@ -95,6 +117,8 @@ func (this *UpdateAction) RunGet(params struct { "description": node.Description, "isOn": node.IsOn, "listens": listens, + "restIsOn": node.RestIsOn, + "restListens": restListens, "certs": certs, "sslPolicyId": sslPolicyId, "accessAddrs": accessAddrs, @@ -109,6 +133,8 @@ func (this *UpdateAction) RunPost(params struct { Name string SslPolicyId int64 ListensJSON []byte + RestIsOn bool + RestListensJSON []byte CertIdsJSON []byte AccessAddrsJSON []byte Description string @@ -143,6 +169,27 @@ func (this *UpdateAction) RunPost(params struct { } } + // Rest监听地址 + restHTTPConfig := &serverconfigs.HTTPProtocolConfig{} + restHTTPSConfig := &serverconfigs.HTTPSProtocolConfig{} + if params.RestIsOn { + restListens := []*serverconfigs.NetworkAddressConfig{} + err = json.Unmarshal(params.RestListensJSON, &restListens) + if err != nil { + this.ErrorPage(err) + return + } + for _, addr := range restListens { + if addr.Protocol.IsHTTPFamily() { + restHTTPConfig.IsOn = true + restHTTPConfig.Listen = append(restHTTPConfig.Listen, addr) + } else if addr.Protocol.IsHTTPSFamily() { + restHTTPSConfig.IsOn = true + restHTTPSConfig.Listen = append(restHTTPSConfig.Listen, addr) + } + } + } + // 证书 certIds := []int64{} if len(params.CertIdsJSON) > 0 { @@ -152,7 +199,7 @@ func (this *UpdateAction) RunPost(params struct { return } } - if httpsConfig.IsOn && len(httpsConfig.Listen) > 0 && len(certIds) == 0 { + if ((httpsConfig.IsOn && len(httpsConfig.Listen) > 0) || (restHTTPSConfig.IsOn && len(httpsConfig.Listen) > 0)) && len(certIds) == 0 { this.Fail("请添加至少一个证书") } @@ -196,6 +243,10 @@ func (this *UpdateAction) RunPost(params struct { IsOn: true, SSLPolicyId: sslPolicyId, } + restHTTPSConfig.SSLPolicyRef = &sslconfigs.SSLPolicyRef{ + IsOn: true, + SSLPolicyId: sslPolicyId, + } // 访问地址 accessAddrs := []*serverconfigs.NetworkAddressConfig{} @@ -218,6 +269,16 @@ func (this *UpdateAction) RunPost(params struct { this.ErrorPage(err) return } + restHTTPJSON, err := json.Marshal(restHTTPConfig) + if err != nil { + this.ErrorPage(err) + return + } + restHTTPSJSON, err := json.Marshal(restHTTPSConfig) + if err != nil { + this.ErrorPage(err) + return + } _, err = this.RPC().APINodeRPC().UpdateAPINode(this.AdminContext(), &pb.UpdateAPINodeRequest{ NodeId: params.NodeId, @@ -225,6 +286,9 @@ func (this *UpdateAction) RunPost(params struct { Description: params.Description, HttpJSON: httpJSON, HttpsJSON: httpsJSON, + RestIsOn: params.RestIsOn, + RestHTTPJSON: restHTTPJSON, + RestHTTPSJSON: restHTTPSJSON, AccessAddrsJSON: params.AccessAddrsJSON, IsOn: params.IsOn, }) diff --git a/web/views/@default/api/index.html b/web/views/@default/api/index.html index 5d850358..a5098d8a 100644 --- a/web/views/@default/api/index.html +++ b/web/views/@default/api/index.html @@ -10,7 +10,8 @@ 节点名称 - 访问地址 + GRPC访问地址 + HTTP访问地址 版本号 CPU 内存 @@ -22,9 +23,16 @@ {{node.name}}
- {{addr}} + {{addr}}
+
-
+ +
+ {{addr}} +
+
-
+ v{{node.status.buildVersion}} - diff --git a/web/views/@default/api/node/createPopup.html b/web/views/@default/api/node/createPopup.html index d5d9fcb7..7741a243 100644 --- a/web/views/@default/api/node/createPopup.html +++ b/web/views/@default/api/node/createPopup.html @@ -10,10 +10,10 @@ - 进程监听端口 * + GRPC监听端口 * -

API节点进程监听的网络端口。

+

通过GRPC访问API节点进程监听的网络端口。

@@ -23,17 +23,30 @@ - 外部访问地址 * + GRPC 外部访问地址 * -

边缘节点和管理平台等外部节点访问API节点的网络地址。

+

边缘节点和管理平台等外部节点访问API节点的网络地址,需要保证其他节点能够通过此地址访问到API节点服务。

- + + 是否开启HTTP API端口 + + 是否启用HTTP API +

启用后用户可以通过HTTP API调用服务接口。

+ + + + HTTP API监听端口 + + +

HTTP API节点进程监听的网络端口。

+ + 描述 diff --git a/web/views/@default/api/node/createPopup.js b/web/views/@default/api/node/createPopup.js index 2947518d..8fd1eb9a 100644 --- a/web/views/@default/api/node/createPopup.js +++ b/web/views/@default/api/node/createPopup.js @@ -1,8 +1,27 @@ Tea.context(function () { this.hasHTTPS = false + this.grpcAddrs = [] + this.restAddrs = [] + this.changeListens = function (addrs) { - this.hasHTTPS = addrs.$any(function (k, v) { + this.grpcAddrs = addrs + + this.hasHTTPS = this.grpcAddrs.$any(function (k, v) { return v.protocol == "https" - }) + }) || (this.restIsOn && this.restAddrs.$any(function (k, v) { + return v.protocol == "https" + })) } + + this.changeRestListens = function (addrs) { + this.restAddrs = addrs + + this.hasHTTPS = this.grpcAddrs.$any(function (k, v) { + return v.protocol == "https" + }) || (this.node.restIsOn && this.restAddrs.$any(function (k, v) { + return v.protocol == "https" + })) + } + + this.restIsOn = false }) \ No newline at end of file diff --git a/web/views/@default/api/node/index.html b/web/views/@default/api/node/index.html index e551af06..9886a00c 100644 --- a/web/views/@default/api/node/index.html +++ b/web/views/@default/api/node/index.html @@ -15,7 +15,7 @@ - 进程监听端口 + GRPC监听端口

API节点进程监听的网络端口。

@@ -28,12 +28,19 @@ - 外部访问地址 + GRPC外部访问地址 -

外部访问API节点的网络地址。

+

通过GRPC访问API节点的网络地址。

+ + HTTP外部访问地址 + + +

通过HTTP访问API节点的网络地址。

+ + 描述 diff --git a/web/views/@default/api/node/update.html b/web/views/@default/api/node/update.html index 59d5adcb..4556551a 100644 --- a/web/views/@default/api/node/update.html +++ b/web/views/@default/api/node/update.html @@ -13,10 +13,10 @@ - 进程监听端口 * + GRPC监听端口 * -

API节点进程监听的网络端口。

+

通过GRPC访问API节点进程监听的网络端口。

@@ -26,17 +26,30 @@ - 外部访问地址 * + GRPC访问地址 * -

边缘节点和管理平台等外部节点访问API节点的网络地址。

+

边缘节点和管理平台等外部节点访问API节点的网络地址,需要保证其他节点能够通过此地址访问到API节点服务。

- + + 是否开启HTTP API端口 + + 是否启用HTTP API +

启用后用户可以通过HTTP API调用服务接口。

+ + + + HTTP API监听端口 + + +

HTTP API节点进程监听的网络端口。

+ + 描述 diff --git a/web/views/@default/api/node/update.js b/web/views/@default/api/node/update.js index 58842b48..a01086cf 100644 --- a/web/views/@default/api/node/update.js +++ b/web/views/@default/api/node/update.js @@ -3,10 +3,29 @@ Tea.context(function () { this.hasHTTPS = this.node.listens.$any(function (k, v) { return v.protocol == "https" - }) + }) || (this.node.restIsOn && this.node.restListens.$any(function (k, v) { + return v.protocol == "https" + })) + this.grpcAddrs = [] + this.restAddrs = [] + this.changeListens = function (addrs) { - this.hasHTTPS = addrs.$any(function (k, v) { + this.grpcAddrs = addrs + + this.hasHTTPS = this.grpcAddrs.$any(function (k, v) { return v.protocol == "https" - }) + }) || (this.node.restIsOn && this.restAddrs.$any(function (k, v) { + return v.protocol == "https" + })) + } + + this.changeRestListens = function (addrs) { + this.restAddrs = addrs + + this.hasHTTPS = this.grpcAddrs.$any(function (k, v) { + return v.protocol == "https" + }) || (this.node.restIsOn && this.restAddrs.$any(function (k, v) { + return v.protocol == "https" + })) } }) \ No newline at end of file