236 lines
6.2 KiB
Go
236 lines
6.2 KiB
Go
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
|
|
|
package nsutils
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs"
|
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
"github.com/TeaOSLab/EdgeCommon/pkg/systemconfigs"
|
|
"github.com/TeaOSLab/EdgeUser/internal/rpc"
|
|
timeutil "github.com/iwind/TeaGo/utils/time"
|
|
"strings"
|
|
)
|
|
|
|
// FindUserPlanConfig 用户配置
|
|
// 需要保证非 error 的情况下,一定会返回一个不为空的 NSPlanConfig
|
|
func FindUserPlanConfig(ctx context.Context) (*dnsconfigs.NSPlanConfig, error) {
|
|
rpcClient, err := rpc.SharedRPC()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 从套餐中读取
|
|
userPlanResp, err := rpcClient.NSUserPlanRPC().FindNSUserPlan(ctx, &pb.FindNSUserPlanRequest{})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if userPlanResp.NsUserPlan != nil &&
|
|
len(userPlanResp.NsUserPlan.DayTo) > 0 &&
|
|
userPlanResp.NsUserPlan.DayTo >= timeutil.Format("Ymd") /** 在有效期内 **/ {
|
|
var planId = userPlanResp.NsUserPlan.NsPlanId
|
|
if planId > 0 {
|
|
planResp, err := rpcClient.NSPlanRPC().FindNSPlan(ctx, &pb.FindNSPlanRequest{NsPlanId: planId})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if planResp.NsPlan != nil &&
|
|
len(planResp.NsPlan.ConfigJSON) > 0 &&
|
|
planResp.NsPlan.IsOn {
|
|
var config = dnsconfigs.DefaultNSUserPlanConfig()
|
|
err = json.Unmarshal(planResp.NsPlan.ConfigJSON, config)
|
|
if err != nil {
|
|
return nil, errors.New("decode plan config failed '" + err.Error() + "'")
|
|
}
|
|
return config, nil
|
|
}
|
|
}
|
|
}
|
|
|
|
// 从用户设置中读取
|
|
userConfigResp, err := rpcClient.SysSettingRPC().ReadSysSetting(ctx, &pb.ReadSysSettingRequest{Code: systemconfigs.SettingCodeNSUserConfig})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(userConfigResp.ValueJSON) > 0 {
|
|
var config = dnsconfigs.NewNSUserConfig()
|
|
err = json.Unmarshal(userConfigResp.ValueJSON, config)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if config.DefaultPlanConfig != nil {
|
|
return config.DefaultPlanConfig, nil
|
|
}
|
|
}
|
|
|
|
return dnsconfigs.DefaultNSUserPlanConfig(), nil
|
|
}
|
|
|
|
// FindBasicPlan 查找基础套餐
|
|
func FindBasicPlan(ctx context.Context) (*dnsconfigs.NSPlanConfig, error) {
|
|
rpcClient, err := rpc.SharedRPC()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 从用户设置中读取
|
|
userConfigResp, err := rpcClient.SysSettingRPC().ReadSysSetting(ctx, &pb.ReadSysSettingRequest{Code: systemconfigs.SettingCodeNSUserConfig})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(userConfigResp.ValueJSON) > 0 {
|
|
var config = dnsconfigs.NewNSUserConfig()
|
|
err = json.Unmarshal(userConfigResp.ValueJSON, config)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if config.DefaultPlanConfig != nil {
|
|
return config.DefaultPlanConfig, nil
|
|
}
|
|
}
|
|
|
|
return dnsconfigs.DefaultNSUserPlanConfig(), nil
|
|
}
|
|
|
|
// CheckDomainsQuote 检查域名限额
|
|
func CheckDomainsQuote(ctx context.Context, countNew int32) (maxDomains int32, ok bool, err error) {
|
|
config, err := FindUserPlanConfig(ctx)
|
|
if err != nil {
|
|
return 0, false, err
|
|
}
|
|
maxDomains = config.MaxDomains
|
|
if maxDomains <= 0 {
|
|
return 0, true, nil
|
|
}
|
|
|
|
rpcClient, err := rpc.SharedRPC()
|
|
if err != nil {
|
|
return maxDomains, false, err
|
|
}
|
|
|
|
countDomainsResp, err := rpcClient.NSDomainRPC().CountAllNSDomains(ctx, &pb.CountAllNSDomainsRequest{})
|
|
if err != nil {
|
|
return maxDomains, false, err
|
|
}
|
|
|
|
if countDomainsResp.Count+int64(countNew) > int64(maxDomains) {
|
|
return maxDomains, false, nil
|
|
}
|
|
return maxDomains, true, nil
|
|
}
|
|
|
|
// CheckRecordsQuota 检查记录限额
|
|
func CheckRecordsQuota(ctx context.Context, domainId int64, countNew int32) (maxRecords int32, ok bool, err error) {
|
|
config, err := FindUserPlanConfig(ctx)
|
|
if err != nil {
|
|
return 0, false, err
|
|
}
|
|
maxRecords = config.MaxRecordsPerDomain
|
|
if maxRecords <= 0 {
|
|
return 0, true, nil
|
|
}
|
|
|
|
rpcClient, err := rpc.SharedRPC()
|
|
if err != nil {
|
|
return maxRecords, false, err
|
|
}
|
|
|
|
countRecordsResp, err := rpcClient.NSRecordRPC().CountAllNSRecords(ctx, &pb.CountAllNSRecordsRequest{
|
|
NsDomainId: domainId,
|
|
})
|
|
if err != nil {
|
|
return maxRecords, false, err
|
|
}
|
|
|
|
if countRecordsResp.Count+int64(countNew) > int64(maxRecords) {
|
|
return maxRecords, false, nil
|
|
}
|
|
return maxRecords, true, nil
|
|
}
|
|
|
|
// CheckLoadBalanceRecordsQuota 检查负载均衡限额
|
|
func CheckLoadBalanceRecordsQuota(ctx context.Context, domainId int64, recordName string, recordType string, countNew int32) (maxRecords int32, ok bool, err error) {
|
|
recordName = strings.ToLower(recordName)
|
|
recordType = strings.ToUpper(recordType)
|
|
|
|
config, err := FindUserPlanConfig(ctx)
|
|
if err != nil {
|
|
return 0, false, err
|
|
}
|
|
maxRecords = config.MaxLoadBalanceRecordsPerRecord
|
|
if maxRecords <= 0 {
|
|
return 0, true, nil
|
|
}
|
|
|
|
rpcClient, err := rpc.SharedRPC()
|
|
if err != nil {
|
|
return maxRecords, false, err
|
|
}
|
|
|
|
countRecordsResp, err := rpcClient.NSRecordRPC().CountAllNSRecordsWithName(ctx, &pb.CountAllNSRecordsWithNameRequest{
|
|
NsDomainId: domainId,
|
|
Name: recordName,
|
|
Type: recordType,
|
|
})
|
|
if err != nil {
|
|
return maxRecords, false, err
|
|
}
|
|
|
|
if countRecordsResp.Count+int64(countNew) > int64(maxRecords) {
|
|
return maxRecords, false, nil
|
|
}
|
|
return maxRecords, true, nil
|
|
}
|
|
|
|
// FindMinTTL 获取最小的TTL
|
|
func FindMinTTL(ctx context.Context) (int32, error) {
|
|
config, err := FindUserPlanConfig(ctx)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return config.MinTTL, nil
|
|
}
|
|
|
|
func FindDefaultTTL(ctx context.Context) (int32, error) {
|
|
config, err := FindUserPlanConfig(ctx)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
var minTTL = config.MinTTL
|
|
|
|
if minTTL > 600 {
|
|
return minTTL, nil
|
|
}
|
|
return 600, nil
|
|
}
|
|
|
|
// CheckRoutesQuota 检查线路限额
|
|
func CheckRoutesQuota(ctx context.Context, countNew int32) (maxCustomRoutes int32, ok bool, err error) {
|
|
config, err := FindUserPlanConfig(ctx)
|
|
if err != nil {
|
|
return 0, false, err
|
|
}
|
|
maxCustomRoutes = config.MaxCustomRoutes
|
|
if maxCustomRoutes <= 0 {
|
|
return 0, true, nil
|
|
}
|
|
|
|
rpcClient, err := rpc.SharedRPC()
|
|
if err != nil {
|
|
return maxCustomRoutes, false, err
|
|
}
|
|
|
|
countRoutesResp, err := rpcClient.NSRouteRPC().CountAllNSRoutes(ctx, &pb.CountAllNSRoutesRequest{})
|
|
if err != nil {
|
|
return maxCustomRoutes, false, err
|
|
}
|
|
|
|
if countRoutesResp.Count+int64(countNew) > int64(maxCustomRoutes) {
|
|
return maxCustomRoutes, false, nil
|
|
}
|
|
return maxCustomRoutes, true, nil
|
|
}
|