// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. package providers import ( "regexp" "github.com/TeaOSLab/EdgeCommon/pkg/langs/codes" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeUser/internal/web/actions/actionutils" "github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/maps" "github.com/iwind/TeaGo/rands" "github.com/iwind/TeaGo/types" ) type CreatePopupAction struct { actionutils.ParentAction } func (this *CreatePopupAction) Init() { this.Nav("", "", "") } func (this *CreatePopupAction) RunGet(params struct{}) { // 所有厂商 typesResp, err := this.RPC().DNSProviderRPC().FindAllDNSProviderTypes(this.UserContext(), &pb.FindAllDNSProviderTypesRequest{}) if err != nil { this.ErrorPage(err) return } typeMaps := []maps.Map{} for _, t := range typesResp.ProviderTypes { typeMaps = append(typeMaps, maps.Map{ "name": t.Name, "code": t.Code, "description": t.Description, }) } this.Data["types"] = typeMaps // 自动生成CustomHTTP私钥 this.Data["paramCustomHTTPSecret"] = rands.HexString(32) // EdgeDNS集群列表 nsClustersResp, err := this.RPC().NSClusterRPC().FindAllNSClusters(this.UserContext(), &pb.FindAllNSClustersRequest{}) if err != nil { this.ErrorPage(err) return } var nsClusterMaps = []maps.Map{} for _, nsCluster := range nsClustersResp.NsClusters { nsClusterMaps = append(nsClusterMaps, maps.Map{ "id": nsCluster.Id, "name": nsCluster.Name, }) } this.Data["nsClusters"] = nsClusterMaps this.Show() } func (this *CreatePopupAction) RunPost(params struct { Name string Type string // DNSPod ParamDNSPodId string ParamDNSPodToken string ParamDNSPodRegion string ParamDNSPodAPIType string ParamDNSPodAccessKeyId string ParamDNSPodAccessKeySecret string // AliDNS ParamAliDNSAccessKeyId string ParamAliDNSAccessKeySecret string ParamAliDNSRegionId string // HuaweiDNS ParamHuaweiAccessKeyId string ParamHuaweiAccessKeySecret string ParamHuaweiEndpoint string // CloudFlare ParamCloudFlareAPIKey string ParamCloudFlareEmail string // GoDaddy ParamGoDaddyKey string ParamGoDaddySecret string // ClouDNS ParamClouDNSAuthId string ParamClouDNSSubAuthId string ParamClouDNSAuthPassword string // DNS.COM ParamDNSComKey string ParamDNSComSecret string // DNS.LA ParamDNSLaAPIId string ParamDNSLaSecret string // VolcEngine ParamVolcEngineAccessKeyId string ParamVolcEngineAccessKeySecret string // Amazon Route 53 ParamAmazonRoute53AccessKeyId string ParamAmazonRoute53AccessKeySecret string ParamAmazonRoute53Region string // Microsoft Azure DNS ParamAzureDNSSubscriptionId string ParamAzureDNSTenantId string ParamAzureDNSClientId string ParamAzureDNSClientSecret string ParamAzureDNSResourceGroupName string // bunny.net ParamBunnyNetAPIKey string // Gname ParamGnameAppid string ParamGnameSecret string // Local EdgeDNS ParamLocalEdgeDNSClusterId int64 // EdgeDNS API ParamEdgeDNSAPIHost string ParamEdgeDNSAPIRole string ParamEdgeDNSAPIAccessKeyId string ParamEdgeDNSAPIAccessKeySecret string // CustomHTTP ParamCustomHTTPURL string ParamCustomHTTPSecret string MinTTL int32 Must *actions.Must CSRF *actionutils.CSRF }) { params.Must. Field("name", params.Name). Require("请输入账号说明"). Field("type", params.Type). Require("请选择服务商厂家") var apiParams = maps.Map{} switch params.Type { case "dnspod": apiParams["apiType"] = params.ParamDNSPodAPIType switch params.ParamDNSPodAPIType { case "tencentDNS": params.Must. Field("paramDNSPodAccessKeyId", params.ParamDNSPodAccessKeyId). Require("请输入SecretId"). Field("paramDNSPodAccessKeySecret", params.ParamDNSPodAccessKeySecret). Require("请输入SecretKey") apiParams["accessKeyId"] = params.ParamDNSPodAccessKeyId apiParams["accessKeySecret"] = params.ParamDNSPodAccessKeySecret apiParams["region"] = params.ParamDNSPodRegion default: params.Must. Field("paramId", params.ParamDNSPodId). Require("请输入密钥ID"). Field("paramToken", params.ParamDNSPodToken). Require("请输入密钥Token") apiParams["id"] = params.ParamDNSPodId apiParams["token"] = params.ParamDNSPodToken apiParams["region"] = params.ParamDNSPodRegion } case "alidns": params.Must. Field("paramAliDNSAccessKeyId", params.ParamAliDNSAccessKeyId). Require("请输入AccessKeyId"). Field("paramAliDNSAccessKeySecret", params.ParamAliDNSAccessKeySecret). Require("请输入AccessKeySecret") apiParams["accessKeyId"] = params.ParamAliDNSAccessKeyId apiParams["accessKeySecret"] = params.ParamAliDNSAccessKeySecret apiParams["regionId"] = params.ParamAliDNSRegionId case "huaweiDNS": params.Must. Field("paramHuaweiAccessKeyId", params.ParamHuaweiAccessKeyId). Require("请输入AccessKeyId"). Field("paramHuaweiAccessKeySecret", params.ParamHuaweiAccessKeySecret). Require("请输入AccessKeySecret") apiParams["accessKeyId"] = params.ParamHuaweiAccessKeyId apiParams["accessKeySecret"] = params.ParamHuaweiAccessKeySecret apiParams["endpoint"] = params.ParamHuaweiEndpoint case "cloudFlare": params.Must. Field("paramCloudFlareAPIKey", params.ParamCloudFlareAPIKey). Require("请输入API密钥"). Field("paramCloudFlareEmail", params.ParamCloudFlareEmail). Email("请输入正确格式的邮箱地址") apiParams["apiKey"] = params.ParamCloudFlareAPIKey apiParams["email"] = params.ParamCloudFlareEmail case "godaddy": params.Must. Field("paramGodaddyKey", params.ParamGoDaddyKey). Require("请输入Key"). Field("paramGodaddySecret", params.ParamGoDaddySecret). Require("请输入Secret") apiParams["key"] = params.ParamGoDaddyKey apiParams["secret"] = params.ParamGoDaddySecret case "cloudns": var authIdString = params.ParamClouDNSAuthId var subAuthIdString = params.ParamClouDNSSubAuthId var authPassword = params.ParamClouDNSAuthPassword if len(authIdString) == 0 && len(subAuthIdString) == 0 { this.FailField("paramClouDNSAuthId", "请输入用户或者子用户的认证ID(auth-id)") } if len(authIdString) > 0 { if !regexp.MustCompile(`^\d+$`).MatchString(authIdString) { this.FailField("paramClouDNSAuthId", "用户认证ID需要是一个整数") } } if len(subAuthIdString) > 0 { if !regexp.MustCompile(`^\d+$`).MatchString(subAuthIdString) { this.FailField("paramClouDNSSubAuthId", "子用户认证ID需要是一个整数") } } if len(authPassword) == 0 { this.FailField("paramClouDNSPassword", "请输入用户或者子用户的认证密码") } apiParams["authId"] = types.Int64(authIdString) apiParams["subAuthId"] = types.Int64(subAuthIdString) apiParams["authPassword"] = authPassword case "dnscom": params.Must. Field("paramDNSComKey", params.ParamDNSComKey). Require("请输入ApiKey"). Field("paramDNSComSecret", params.ParamDNSComSecret). Require("请输入ApiSecret") apiParams["key"] = params.ParamDNSComKey apiParams["secret"] = params.ParamDNSComSecret case "dnsla": params.Must. Field("paramDNSLaAPIId", params.ParamDNSLaAPIId). Require("请输入API ID"). Field("paramDNSLaSecret", params.ParamDNSLaSecret). Require("请输入API密钥") apiParams["apiId"] = params.ParamDNSLaAPIId apiParams["secret"] = params.ParamDNSLaSecret case "volcEngine": params.Must. Field("paramVolcEngineAccessKeyId", params.ParamVolcEngineAccessKeyId). Require("请输入Access Key ID"). Field("paramVolcEngineAccessKeySecret", params.ParamVolcEngineAccessKeySecret). Require("请输入Secret Access Key") apiParams["accessKeyId"] = params.ParamVolcEngineAccessKeyId apiParams["accessKeySecret"] = params.ParamVolcEngineAccessKeySecret case "amazonRoute53": params.Must. Field("paramAmazonRoute53AccessKeyId", params.ParamAmazonRoute53AccessKeyId). Require("请输入Access Key ID"). Field("paramAmazonRoute53AccessKeySecret", params.ParamAmazonRoute53AccessKeySecret). Require("请输入Secret Access Key") apiParams["accessKeyId"] = params.ParamAmazonRoute53AccessKeyId apiParams["accessKeySecret"] = params.ParamAmazonRoute53AccessKeySecret apiParams["region"] = params.ParamAmazonRoute53Region case "azureDNS": params.Must. Field("paramAzureDNSSubscriptionId", params.ParamAzureDNSSubscriptionId). Require("请输入Subscription ID"). Field("paramAzureDNSTenantId", params.ParamAzureDNSTenantId). Require("请输入Tenant ID"). Field("paramAzureDNSClientId", params.ParamAzureDNSClientId). Require("请输入Client ID"). Field("paramAzureDNSClientSecret", params.ParamAzureDNSClientSecret). Require("请输入Client Secret"). Field("paramAzureDNSResourceGroupName", params.ParamAzureDNSResourceGroupName). Require("请输入Resource Group Name") apiParams["subscriptionId"] = params.ParamAzureDNSSubscriptionId apiParams["tenantId"] = params.ParamAzureDNSTenantId apiParams["clientId"] = params.ParamAzureDNSClientId apiParams["clientSecret"] = params.ParamAzureDNSClientSecret apiParams["resourceGroupName"] = params.ParamAzureDNSResourceGroupName case "bunnyNet": params.Must. Field("paramBunnyNetAPIKey", params.ParamBunnyNetAPIKey). Require("请输入API密钥") apiParams["apiKey"] = params.ParamBunnyNetAPIKey case "gname": params.Must. Field("paramGnameAppid", params.ParamGnameAppid). Require("请输入APPID"). Field("paramGnameSecret", params.ParamGnameSecret). Require("请输入API Secret") apiParams["appid"] = params.ParamGnameAppid apiParams["secret"] = params.ParamGnameSecret case "localEdgeDNS": params.Must. Field("paramLocalEdgeDNSClusterId", params.ParamLocalEdgeDNSClusterId). Gt(0, "请选择域名服务集群") apiParams["clusterId"] = params.ParamLocalEdgeDNSClusterId case "edgeDNSAPI": params.Must. Field("paramEdgeDNSAPIHost", params.ParamEdgeDNSAPIHost). Require("请输入API地址"). Field("paramEdgeDNSAPIRole", params.ParamEdgeDNSAPIRole). Require("请选择AccessKey类型"). Field("paramEdgeDNSAPIAccessKeyId", params.ParamEdgeDNSAPIAccessKeyId). Require("请输入AccessKey ID"). Field("paramEdgeDNSAPIAccessKeySecret", params.ParamEdgeDNSAPIAccessKeySecret). Require("请输入AccessKey密钥") apiParams["host"] = params.ParamEdgeDNSAPIHost apiParams["role"] = params.ParamEdgeDNSAPIRole apiParams["accessKeyId"] = params.ParamEdgeDNSAPIAccessKeyId apiParams["accessKeySecret"] = params.ParamEdgeDNSAPIAccessKeySecret case "customHTTP": params.Must. Field("paramCustomHTTPURL", params.ParamCustomHTTPURL). Require("请输入HTTP URL"). Match("^(?i)(http|https):", "URL必须以http://或者https://开头"). Field("paramCustomHTTPSecret", params.ParamCustomHTTPSecret). Require("请输入私钥") apiParams["url"] = params.ParamCustomHTTPURL apiParams["secret"] = params.ParamCustomHTTPSecret default: this.Fail("暂时不支持此服务商'" + params.Type + "'") } createResp, err := this.RPC().DNSProviderRPC().CreateDNSProvider(this.UserContext(), &pb.CreateDNSProviderRequest{ Name: params.Name, Type: params.Type, ApiParamsJSON: apiParams.AsJSON(), MinTTL: params.MinTTL, }) if err != nil { this.ErrorPage(err) return } defer this.CreateLogInfo(codes.DNSProvider_LogCreateDNSProvider, createResp.DnsProviderId) this.Success() }