From a609a36795e8b460b9769604fe83799f548929e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A5=A5=E8=B6=85?= Date: Thu, 12 Nov 2020 14:41:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0DNS=E5=9F=9F=E5=90=8D?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/rpc/rpc_client.go | 4 ++ .../default/dns/domains/createPopup.go | 60 ++++++++++++++++ .../web/actions/default/dns/domains/delete.go | 38 ++++++++++ .../default/dns/domains/domainutils/utils.go | 18 +++++ .../default/dns/domains/updatePopup.go | 15 ++++ internal/web/actions/default/dns/init.go | 11 +++ .../default/dns/providers/createPopup.go | 1 - .../actions/default/dns/providers/index.go | 9 +++ .../actions/default/dns/providers/provider.go | 72 +++++++++++++++++++ .../default/dns/providers/updatePopup.go | 2 - .../@default/dns/domains/createPopup.html | 19 +++++ web/views/@default/dns/domains/createPopup.js | 3 + web/views/@default/dns/providers/index.html | 13 ++-- web/views/@default/dns/providers/index.js | 11 --- .../@default/dns/providers/provider.html | 59 +++++++++++++++ web/views/@default/dns/providers/provider.js | 34 +++++++++ 16 files changed, 350 insertions(+), 19 deletions(-) create mode 100644 internal/web/actions/default/dns/domains/createPopup.go create mode 100644 internal/web/actions/default/dns/domains/delete.go create mode 100644 internal/web/actions/default/dns/domains/domainutils/utils.go create mode 100644 internal/web/actions/default/dns/domains/updatePopup.go create mode 100644 internal/web/actions/default/dns/providers/provider.go create mode 100644 web/views/@default/dns/domains/createPopup.html create mode 100644 web/views/@default/dns/domains/createPopup.js create mode 100644 web/views/@default/dns/providers/provider.html create mode 100644 web/views/@default/dns/providers/provider.js diff --git a/internal/rpc/rpc_client.go b/internal/rpc/rpc_client.go index ce209757..87cde058 100644 --- a/internal/rpc/rpc_client.go +++ b/internal/rpc/rpc_client.go @@ -208,6 +208,10 @@ func (this *RPCClient) DNSProviderRPC() pb.DNSProviderServiceClient { return pb.NewDNSProviderServiceClient(this.pickConn()) } +func (this *RPCClient) DNSDomainRPC() pb.DNSDomainServiceClient { + return pb.NewDNSDomainServiceClient(this.pickConn()) +} + // 构造Admin上下文 func (this *RPCClient) Context(adminId int64) context.Context { ctx := context.Background() diff --git a/internal/web/actions/default/dns/domains/createPopup.go b/internal/web/actions/default/dns/domains/createPopup.go new file mode 100644 index 00000000..baf80ea6 --- /dev/null +++ b/internal/web/actions/default/dns/domains/createPopup.go @@ -0,0 +1,60 @@ +package domains + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/oplogs" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/dns/domains/domainutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/actions" + "strings" +) + +type CreatePopupAction struct { + actionutils.ParentAction +} + +func (this *CreatePopupAction) Init() { + this.Nav("", "", "") +} + +func (this *CreatePopupAction) RunGet(params struct { + ProviderId int64 +}) { + this.Data["providerId"] = params.ProviderId + + this.Show() +} + +func (this *CreatePopupAction) RunPost(params struct { + ProviderId int64 + Name string + + Must *actions.Must + CSRF *actionutils.CSRF +}) { + // TODO 检查ProviderId + + params.Must. + Field("name", params.Name). + Require("请输入域名") + + // 校验域名 + domain := strings.ToLower(params.Name) + domain = strings.Replace(domain, " ", "", -1) + if !domainutils.ValidateDomainFormat(domain) { + this.Fail("域名格式不正确,请修改后重新提交") + } + + createResp, err := this.RPC().DNSDomainRPC().CreateDNSDomain(this.AdminContext(), &pb.CreateDNSDomainRequest{ + DnsProviderId: params.ProviderId, + Name: domain, + }) + if err != nil { + this.ErrorPage(err) + return + } + + this.CreateLog(oplogs.LevelInfo, "添加管理域名到DNS服务商 %d", createResp.DnsDomainId) + + this.Success() +} diff --git a/internal/web/actions/default/dns/domains/delete.go b/internal/web/actions/default/dns/domains/delete.go new file mode 100644 index 00000000..95dda065 --- /dev/null +++ b/internal/web/actions/default/dns/domains/delete.go @@ -0,0 +1,38 @@ +package domains + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/oplogs" + "github.com/TeaOSLab/EdgeAdmin/internal/utils/numberutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +type DeleteAction struct { + actionutils.ParentAction +} + +func (this *DeleteAction) RunPost(params struct { + DomainId int64 +}) { + // 记录日志 + this.CreateLog(oplogs.LevelInfo, "从DNS服务商中删除域名 %d", params.DomainId) + + // 检查是否正在使用 + countResp, err := this.RPC().NodeClusterRPC().CountAllEnabledNodeClustersWithDNSDomainId(this.AdminContext(), &pb.CountAllEnabledNodeClustersWithDNSDomainIdRequest{DnsDomainId: params.DomainId}) + if err != nil { + this.ErrorPage(err) + return + } + if countResp.Count > 0 { + this.Fail("当前域名正在被" + numberutils.FormatInt64(countResp.Count) + "个集群所使用,所以不能删除。请修改后再操作。") + } + + // 执行删除 + _, err = this.RPC().DNSDomainRPC().DeleteDNSDomain(this.AdminContext(), &pb.DeleteDNSDomainRequest{DnsDomainId: params.DomainId}) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/dns/domains/domainutils/utils.go b/internal/web/actions/default/dns/domains/domainutils/utils.go new file mode 100644 index 00000000..0f8c9ec3 --- /dev/null +++ b/internal/web/actions/default/dns/domains/domainutils/utils.go @@ -0,0 +1,18 @@ +package domainutils + +import ( + "regexp" + "strings" +) + +// 校验域名格式 +func ValidateDomainFormat(domain string) bool { + pieces := strings.Split(domain, ".") + for _, piece := range pieces { + if !regexp.MustCompile(`^[a-z0-9-]+$`).MatchString(piece) { + return false + } + } + + return true +} diff --git a/internal/web/actions/default/dns/domains/updatePopup.go b/internal/web/actions/default/dns/domains/updatePopup.go new file mode 100644 index 00000000..3d9b0cd1 --- /dev/null +++ b/internal/web/actions/default/dns/domains/updatePopup.go @@ -0,0 +1,15 @@ +package domains + +import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + +type UpdatePopupAction struct { + actionutils.ParentAction +} + +func (this *UpdatePopupAction) Init() { + this.Nav("", "", "") +} + +func (this *UpdatePopupAction) RunGet(params struct{}) { + this.Show() +} diff --git a/internal/web/actions/default/dns/init.go b/internal/web/actions/default/dns/init.go index 5ca6b509..daafed66 100644 --- a/internal/web/actions/default/dns/init.go +++ b/internal/web/actions/default/dns/init.go @@ -1,6 +1,7 @@ package dns import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/dns/domains" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/dns/providers" "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" "github.com/iwind/TeaGo" @@ -14,12 +15,22 @@ func init() { Prefix("/dns"). Get("", new(IndexAction)). + // 服务商 Prefix("/dns/providers"). Data("teaSubMenu", "provider"). Get("", new(providers.IndexAction)). GetPost("/createPopup", new(providers.CreatePopupAction)). GetPost("/updatePopup", new(providers.UpdatePopupAction)). Post("/delete", new(providers.DeleteAction)). + Get("/provider", new(providers.ProviderAction)). + EndData(). + + // 域名 + Prefix("/dns/domains"). + Data("teaSubMenu", "provider"). + GetPost("/createPopup", new(domains.CreatePopupAction)). + GetPost("/updatePopup", new(domains.UpdatePopupAction)). + Post("/delete", new(domains.DeleteAction)). EndData(). EndAll() diff --git a/internal/web/actions/default/dns/providers/createPopup.go b/internal/web/actions/default/dns/providers/createPopup.go index 31ee16fa..afc7ddf7 100644 --- a/internal/web/actions/default/dns/providers/createPopup.go +++ b/internal/web/actions/default/dns/providers/createPopup.go @@ -71,7 +71,6 @@ func (this *CreatePopupAction) RunPost(params struct { Name: params.Name, Type: params.Type, ApiParamsJSON: apiParams.AsJSON(), - RoutesJSON: nil, }) if err != nil { this.ErrorPage(err) diff --git a/internal/web/actions/default/dns/providers/index.go b/internal/web/actions/default/dns/providers/index.go index 917ab6b5..b68dcd25 100644 --- a/internal/web/actions/default/dns/providers/index.go +++ b/internal/web/actions/default/dns/providers/index.go @@ -40,12 +40,21 @@ func (this *IndexAction) RunGet(params struct{}) { dataUpdatedTime = timeutil.FormatTime("Y-m-d H:i:s", provider.DataUpdatedAt) } + // 域名 + countDomainsResp, err := this.RPC().DNSDomainRPC().CountAllEnabledDNSDomainsWithDNSProviderId(this.AdminContext(), &pb.CountAllEnabledDNSDomainsWithDNSProviderIdRequest{DnsProviderId: provider.Id}) + if err != nil { + this.ErrorPage(err) + return + } + countDomains := countDomainsResp.Count + providerMaps = append(providerMaps, maps.Map{ "id": provider.Id, "name": provider.Name, "type": provider.Type, "typeName": provider.TypeName, "dataUpdatedTime": dataUpdatedTime, + "countDomains": countDomains, }) } this.Data["providers"] = providerMaps diff --git a/internal/web/actions/default/dns/providers/provider.go b/internal/web/actions/default/dns/providers/provider.go new file mode 100644 index 00000000..3cfa805b --- /dev/null +++ b/internal/web/actions/default/dns/providers/provider.go @@ -0,0 +1,72 @@ +package providers + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/maps" + timeutil "github.com/iwind/TeaGo/utils/time" +) + +type ProviderAction struct { + actionutils.ParentAction +} + +func (this *ProviderAction) Init() { + this.Nav("", "", "") +} + +func (this *ProviderAction) RunGet(params struct { + ProviderId int64 +}) { + providerResp, err := this.RPC().DNSProviderRPC().FindEnabledDNSProvider(this.AdminContext(), &pb.FindEnabledDNSProviderRequest{DnsProviderId: params.ProviderId}) + if err != nil { + this.ErrorPage(err) + return + } + provider := providerResp.DnsProvider + if provider == nil { + this.NotFound("dnsProvider", params.ProviderId) + return + } + + apiParams := maps.Map{} + if len(provider.ApiParamsJSON) > 0 { + err = json.Unmarshal(provider.ApiParamsJSON, &apiParams) + if err != nil { + this.ErrorPage(err) + return + } + } + + this.Data["provider"] = maps.Map{ + "id": provider.Id, + "name": provider.Name, + "type": provider.Type, + "typeName": provider.TypeName, + "apiParams": apiParams, + } + + // 域名 + domainsResp, err := this.RPC().DNSDomainRPC().FindAllEnabledDNSDomainsWithDNSProviderId(this.AdminContext(), &pb.FindAllEnabledDNSDomainsWithDNSProviderIdRequest{DnsProviderId: provider.Id}) + if err != nil { + this.ErrorPage(err) + return + } + domainMaps := []maps.Map{} + for _, domain := range domainsResp.DnsDomains { + dataUpdatedTime := "" + if domain.DataUpdatedAt > 0 { + dataUpdatedTime = timeutil.FormatTime("Y-m-d H:i:s", domain.DataUpdatedAt) + } + domainMaps = append(domainMaps, maps.Map{ + "id": domain.Id, + "name": domain.Name, + "isOn": domain.IsOn, + "dataUpdatedTime": dataUpdatedTime, + }) + } + this.Data["domains"] = domainMaps + + this.Show() +} diff --git a/internal/web/actions/default/dns/providers/updatePopup.go b/internal/web/actions/default/dns/providers/updatePopup.go index 8bf9079e..a2a220bb 100644 --- a/internal/web/actions/default/dns/providers/updatePopup.go +++ b/internal/web/actions/default/dns/providers/updatePopup.go @@ -38,7 +38,6 @@ func (this *UpdatePopupAction) RunGet(params struct { this.ErrorPage(err) return } - } this.Data["provider"] = maps.Map{ @@ -107,7 +106,6 @@ func (this *UpdatePopupAction) RunPost(params struct { DnsProviderId: params.ProviderId, Name: params.Name, ApiParamsJSON: apiParams.AsJSON(), - RoutesJSON: nil, }) if err != nil { this.ErrorPage(err) diff --git a/web/views/@default/dns/domains/createPopup.html b/web/views/@default/dns/domains/createPopup.html new file mode 100644 index 00000000..a95d2d6c --- /dev/null +++ b/web/views/@default/dns/domains/createPopup.html @@ -0,0 +1,19 @@ +{$layout "layout_popup"} + +

添加管理域名

+ +
+ + + + + + + +
域名 * + +

在DNS服务商中可以管理的域名。

+
+ + +
\ No newline at end of file diff --git a/web/views/@default/dns/domains/createPopup.js b/web/views/@default/dns/domains/createPopup.js new file mode 100644 index 00000000..c8fe9515 --- /dev/null +++ b/web/views/@default/dns/domains/createPopup.js @@ -0,0 +1,3 @@ +Tea.context(function () { + this.success = NotifyPopup +}) \ No newline at end of file diff --git a/web/views/@default/dns/providers/index.html b/web/views/@default/dns/providers/index.html index 41f42417..80e91fe9 100644 --- a/web/views/@default/dns/providers/index.html +++ b/web/views/@default/dns/providers/index.html @@ -11,21 +11,24 @@ 账号说明 服务商 - 可用线路 - 最近更新时间 + 域名 + 数据更新时间 操作 - + {{provider.name}} {{provider.typeName}} - + + 0个域名 + {{provider.countDomains}}个域名 + {{provider.dataUpdatedTime}} - - 修改   删除 + 详情     删除 diff --git a/web/views/@default/dns/providers/index.js b/web/views/@default/dns/providers/index.js index 22de9a02..3a635240 100644 --- a/web/views/@default/dns/providers/index.js +++ b/web/views/@default/dns/providers/index.js @@ -10,17 +10,6 @@ Tea.context(function () { }) } - this.updateProvider = function (providerId) { - teaweb.popup(Tea.url(".updatePopup?providerId=" + providerId), { - height: "26em", - callback: function () { - teaweb.success("保存成功", function () { - teaweb.reload() - }) - } - }) - } - this.deleteProvider = function (providerId) { let that = this teaweb.confirm("确定要删除这个DNS服务商账号吗?", function () { diff --git a/web/views/@default/dns/providers/provider.html b/web/views/@default/dns/providers/provider.html new file mode 100644 index 00000000..0a06ef46 --- /dev/null +++ b/web/views/@default/dns/providers/provider.html @@ -0,0 +1,59 @@ +{$layout} + + + DNS账号列表 + | + {{provider.name}} + + + +

账号信息 [修改]

+ + + + + + + + + + + + + + + + + + + + + +
账号说明{{provider.name}}
服务商{{provider.typeName}}
密钥ID{{provider.apiParams.id}}
密钥Token{{provider.apiParams.token}}
+ + +

管理的域名 [添加域名]

+

暂时还没有可以管理的域名。

+ + + + + + + + + + + + + + + + +
域名数据更新时间状态操作
{{domain.name}} + {{domain.dataUpdatedTime}} + 尚未更新 + + 修改   + 删除 +
\ No newline at end of file diff --git a/web/views/@default/dns/providers/provider.js b/web/views/@default/dns/providers/provider.js new file mode 100644 index 00000000..7cd8b75b --- /dev/null +++ b/web/views/@default/dns/providers/provider.js @@ -0,0 +1,34 @@ +Tea.context(function () { + this.updateProvider = function (providerId) { + teaweb.popup(Tea.url(".updatePopup?providerId=" + providerId), { + height: "26em", + callback: function () { + teaweb.success("保存成功", function () { + teaweb.reload() + }) + } + }) + } + + this.createDomain = function () { + teaweb.popup("/dns/domains/createPopup?providerId=" + this.provider.id, { + callback: function () { + teaweb.success("保存成功", function () { + teaweb.reload() + }) + } + }) + } + + this.deleteDomain = function (domain) { + let that = this + teaweb.confirm("确定要删除域名\"" + domain.name + "\"吗?", function () { + that.$post("/dns/domains/delete") + .params({ + domainId: domain.id + }) + .post() + .refresh() + }) + } +}) \ No newline at end of file