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"} + +
| 账号说明 | +{{provider.name}} | +
| 服务商 | +{{provider.typeName}} | +
| 密钥ID | +{{provider.apiParams.id}} | +
| 密钥Token | +{{provider.apiParams.token}} | +
暂时还没有可以管理的域名。
+ +| 域名 | +数据更新时间 | +状态 | +操作 | +
|---|---|---|---|
| {{domain.name}} | ++ {{domain.dataUpdatedTime}} + 尚未更新 + | ++ 修改 + 删除 + | +