diff --git a/internal/utils/lookup.go b/internal/utils/lookup.go index fb3b6c9a..8e6fb1ea 100644 --- a/internal/utils/lookup.go +++ b/internal/utils/lookup.go @@ -1,6 +1,7 @@ package utils import ( + "github.com/TeaOSLab/EdgeCommon/pkg/configutils" "github.com/miekg/dns" ) @@ -16,13 +17,19 @@ func LookupCNAME(host string) (string, error) { m.SetQuestion(host+".", dns.TypeCNAME) m.RecursionDesired = true - r, _, err := c.Exchange(m, config.Servers[0]+":"+config.Port) - if err != nil { - return "", err - } - if len(r.Answer) == 0 { - return "", nil - } - return r.Answer[0].(*dns.CNAME).Target, nil + var lastErr error + for _, serverAddr := range config.Servers { + r, _, err := c.Exchange(m, configutils.QuoteIP(serverAddr)+":"+config.Port) + if err != nil { + lastErr = err + continue + } + if len(r.Answer) == 0 { + continue + } + + return r.Answer[0].(*dns.CNAME).Target, nil + } + return "", lastErr } diff --git a/internal/web/actions/default/servers/server/settings/dns/index.go b/internal/web/actions/default/servers/server/settings/dns/index.go index 7deb7055..56ec72b6 100644 --- a/internal/web/actions/default/servers/server/settings/dns/index.go +++ b/internal/web/actions/default/servers/server/settings/dns/index.go @@ -3,6 +3,7 @@ package dns import ( "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/actions" ) type IndexAction struct { @@ -28,6 +29,28 @@ func (this *IndexAction) RunGet(params struct { } else { this.Data["dnsDomain"] = "" } + this.Data["supportCNAME"] = dnsInfoResp.SupportCNAME this.Show() } + +func (this *IndexAction) RunPost(params struct { + ServerId int64 + SupportCNAME bool + + Must *actions.Must + CSRF *actionutils.CSRF +}) { + defer this.CreateLogInfo("修改服务 %d 的DNS设置", params.ServerId) + + _, err := this.RPC().ServerRPC().UpdateServerDNS(this.AdminContext(), &pb.UpdateServerDNSRequest{ + ServerId: params.ServerId, + SupportCNAME: params.SupportCNAME, + }) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/server/settings/dns/init.go b/internal/web/actions/default/servers/server/settings/dns/init.go index ab0110d4..d75e5c9e 100644 --- a/internal/web/actions/default/servers/server/settings/dns/init.go +++ b/internal/web/actions/default/servers/server/settings/dns/init.go @@ -14,6 +14,7 @@ func init() { Helper(serverutils.NewServerHelper()). Prefix("/servers/server/settings/dns"). GetPost("", new(IndexAction)). + Post("/regenerateCNAME", new(RegenerateCNAMEAction)). EndAll() }) } diff --git a/internal/web/actions/default/servers/server/settings/dns/regenerateCNAME.go b/internal/web/actions/default/servers/server/settings/dns/regenerateCNAME.go new file mode 100644 index 00000000..57271685 --- /dev/null +++ b/internal/web/actions/default/servers/server/settings/dns/regenerateCNAME.go @@ -0,0 +1,26 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package dns + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +type RegenerateCNAMEAction struct { + actionutils.ParentAction +} + +func (this *RegenerateCNAMEAction) RunPost(params struct { + ServerId int64 +}) { + defer this.CreateLogInfo("重新生成服务 %d 的CNAME", params.ServerId) + + _, err := this.RPC().ServerRPC().RegenerateServerCNAME(this.AdminContext(), &pb.RegenerateServerCNAMERequest{ServerId: params.ServerId}) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/web/views/@default/servers/server/settings/dns/index.html b/web/views/@default/servers/server/settings/dns/index.html index 651964f9..7719ae30 100644 --- a/web/views/@default/servers/server/settings/dns/index.html +++ b/web/views/@default/servers/server/settings/dns/index.html @@ -3,13 +3,25 @@ {$template "/left_menu"}
- - - - - -
当前服务CNAME - {{dnsName}}.{{dnsDomain}}.根域名   -

可以在DNS设置一个CNAME记录,名字为你自己的域名,值为上面这个值。

-
+
+ + + + + + + + + + + +
当前服务CNAME + {{dnsName}}.{{dnsDomain}}.根域名    [重新生成] +

可以在DNS设置一个CNAME记录,名字为你自己的域名,值为上面这个值。

+
支持CNAME + +

选中后表示允许任意域名使用此服务的CNAME直接访问此服务。需要节点服务器可以正确解析DNS记录。在严格匹配域名时才会生效。

+
+ +
\ No newline at end of file diff --git a/web/views/@default/servers/server/settings/dns/index.js b/web/views/@default/servers/server/settings/dns/index.js new file mode 100644 index 00000000..41f75934 --- /dev/null +++ b/web/views/@default/servers/server/settings/dns/index.js @@ -0,0 +1,14 @@ +Tea.context(function () { + this.success = NotifyReloadSuccess("保存成功") + + this.regenerateCNAME = function () { + let serverId = this.serverId + teaweb.confirm("确定要重新生成此服务的CNAME吗?", function () { + this.$post(".regenerateCNAME") + .params({ + serverId: serverId + }) + .refresh() + }) + } +}) \ No newline at end of file