删除不必要的文件

This commit is contained in:
GoEdgeLab
2022-09-23 14:42:52 +08:00
parent 3ddf3e73f1
commit 12e8c639d7
16 changed files with 1 additions and 2395 deletions

1
pkg/dnsconfigs/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
ns_*

View File

@@ -1,37 +0,0 @@
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
package dnsconfigs
import "github.com/iwind/TeaGo/maps"
// 一组系统默认值
// 修改单个IP相关限制值时要考虑到NAT中每个IP会代表很多个主机并非1对1的关系
const (
DefaultMaxThreads = 20000 // 单节点最大线程数
DefaultMaxThreadsMin = 1000 // 单节点最大线程数最小值
DefaultMaxThreadsMax = 100_000 // 单节点最大线程数最大值
DefaultTCPMaxConnections = 100_000 // 单节点TCP最大连接数
DefaultTCPMaxConnectionsPerIP = 1000 // 单IP最大连接数
DefaultTCPMinConnectionsPerIP = 5 // 单IP最小连接数
DefaultTCPNewConnectionsMinutelyRate = 500 // 单IP连接速率限制按分钟
DefaultTCPNewConnectionsMinMinutelyRate = 3 // 单IP最小连接速率
DefaultTCPNewConnectionsSecondlyRate = 300 // 单IP连接速率限制按秒
DefaultTCPNewConnectionsMinSecondlyRate = 3 // 单IP最小连接速率
DefaultTCPLinger = 3 // 单节点TCP Linger值
DefaultTLSHandshakeTimeout = 3 // TLS握手超时时间
)
var DefaultConfigs = maps.Map{
"tcpMaxConnections": DefaultTCPMaxConnections,
"tcpMaxConnectionsPerIP": DefaultTCPMaxConnectionsPerIP,
"tcpMinConnectionsPerIP": DefaultTCPMinConnectionsPerIP,
"tcpNewConnectionsMinutelyRate": DefaultTCPNewConnectionsMinutelyRate,
"tcpNewConnectionsMinMinutelyRate": DefaultTCPNewConnectionsMinMinutelyRate,
"tcpNewConnectionsSecondlyRate": DefaultTCPNewConnectionsSecondlyRate,
"tcpNewConnectionsMinSecondlyRate": DefaultTCPNewConnectionsMinSecondlyRate,
}

View File

@@ -1,14 +0,0 @@
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
package dnsconfigs
type NSAccessLogRef struct {
IsPrior bool `yaml:"isPrior" json:"isPrior"` // 是否覆盖
IsOn bool `yaml:"isOn" json:"isOn"` // 是否启用
LogMissingDomains bool `yaml:"logMissingDomains" json:"logMissingDomains"` // 是否记录找不到的域名
MissingRecordsOnly bool `yaml:"missingRecordsOnly" json:"missingRecordsOnly"` // 只记录找不到解析记录的访问
}
func (this *NSAccessLogRef) Init() error {
return nil
}

View File

@@ -1,54 +0,0 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package dnsconfigs
import "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
// NSDomainStatus 域名状态
type NSDomainStatus = string
const (
NSDomainStatusNone NSDomainStatus = "none" // 初始状态
NSDomainStatusVerified NSDomainStatus = "verified" // 已验证
NSDomainStatusRejected NSDomainStatus = "rejected" // 已驳回(可以重新提交)
NSDomainStatusForbidden NSDomainStatus = "forbidden" // 已禁止(禁止继续使用此域名)
)
func FindAllNSDomainStatusList() []*shared.Definition {
return []*shared.Definition{
{
Name: "未验证",
Code: NSDomainStatusNone,
},
{
Name: "已验证",
Code: NSDomainStatusVerified,
},
{
Name: "已驳回",
Code: NSDomainStatusRejected,
},
{
Name: "已禁止",
Code: NSDomainStatusForbidden,
},
}
}
func NSDomainStatusIsValid(status string) bool {
for _, def := range FindAllNSDomainStatusList() {
if def.Code == status {
return true
}
}
return false
}
func NSDomainStatusName(status string) string {
for _, def := range FindAllNSDomainStatusList() {
if def.Code == status {
return def.Name
}
}
return ""
}

View File

@@ -1,69 +0,0 @@
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
package dnsconfigs
type KeyAlgorithmType = string
const (
KeyAlgorithmTypeHmacSHA1 KeyAlgorithmType = "hmac-sha1."
KeyAlgorithmTypeHmacSHA224 KeyAlgorithmType = "hmac-sha224."
KeyAlgorithmTypeHmacSHA256 KeyAlgorithmType = "hmac-sha256."
KeyAlgorithmTypeHmacSHA384 KeyAlgorithmType = "hmac-sha384."
KeyAlgorithmTypeHmacSHA512 KeyAlgorithmType = "hmac-sha512."
)
type KeyAlgorithmDefinition struct {
Name string `json:"name"`
Code string `json:"code"`
}
func FindAllKeyAlgorithmTypes() []*KeyAlgorithmDefinition {
return []*KeyAlgorithmDefinition{
{
Name: "HmacSHA1",
Code: KeyAlgorithmTypeHmacSHA1,
},
{
Name: "HmacSHA224",
Code: KeyAlgorithmTypeHmacSHA224,
},
{
Name: "HmacSHA256",
Code: KeyAlgorithmTypeHmacSHA256,
},
{
Name: "HmacSHA384",
Code: KeyAlgorithmTypeHmacSHA384,
},
{
Name: "HmacSHA512",
Code: KeyAlgorithmTypeHmacSHA512,
},
}
}
func FindKeyAlgorithmTypeName(algoType KeyAlgorithmType) string {
for _, def := range FindAllKeyAlgorithmTypes() {
if def.Code == algoType {
return def.Name
}
}
return ""
}
type NSKeySecretType = string
const (
NSKeySecretTypeClear NSKeySecretType = "clear"
NSKeySecretTypeBase64 NSKeySecretType = "base64"
)
func FindKeySecretTypeName(secretType NSKeySecretType) string {
switch secretType {
case NSKeySecretTypeClear:
return "明文"
case NSKeySecretTypeBase64:
return "BASE64"
}
return ""
}

View File

@@ -1,85 +0,0 @@
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
package dnsconfigs
import (
"fmt"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/ddosconfigs"
)
type NSNodeConfig struct {
Id int64 `yaml:"id" json:"id"`
NodeId string `yaml:"nodeId" json:"nodeId"`
Secret string `yaml:"secret" json:"secret"`
ClusterId int64 `yaml:"clusterId" json:"clusterId"`
AccessLogRef *NSAccessLogRef `yaml:"accessLogRef" json:"accessLogRef"`
RecursionConfig *NSRecursionConfig `yaml:"recursionConfig" json:"recursionConfig"`
DDoSProtection *ddosconfigs.ProtectionConfig `yaml:"ddosProtection" json:"ddosProtection"`
AllowedIPs []string `yaml:"allowedIPs" json:"allowedIPs"`
TimeZone string `yaml:"timeZone" json:"timeZone"` // 自动设置时区
TCP *serverconfigs.TCPProtocolConfig `yaml:"tcp" json:"tcp"` // TCP配置
TLS *serverconfigs.TLSProtocolConfig `yaml:"tls" json:"tls"` // TLS配置
UDP *serverconfigs.UDPProtocolConfig `yaml:"udp" json:"udp"` // UDP配置
paddedId string
}
func (this *NSNodeConfig) Init() error {
this.paddedId = fmt.Sprintf("%08d", this.Id)
// accessLog
if this.AccessLogRef != nil {
err := this.AccessLogRef.Init()
if err != nil {
return err
}
}
// 递归DNS
if this.RecursionConfig != nil {
err := this.RecursionConfig.Init()
if err != nil {
return err
}
}
// DDoS
if this.DDoSProtection != nil {
err := this.DDoSProtection.Init()
if err != nil {
return err
}
}
// tcp
if this.TCP != nil {
err := this.TCP.Init()
if err != nil {
return err
}
}
// tls
if this.TLS != nil {
err := this.TLS.Init()
if err != nil {
return err
}
}
// udp
if this.UDP != nil {
err := this.UDP.Init()
if err != nil {
return err
}
}
return nil
}
func (this *NSNodeConfig) PaddedId() string {
return this.paddedId
}

View File

@@ -1,26 +0,0 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package dnsconfigs
type NSPlanConfig struct {
SupportCountryRoutes bool `json:"supportCountryRoutes"` // 支持全球国家/地区线路
SupportChinaProvinceRoutes bool `json:"supportChinaProvinceRoutes"` // 支持国内省份线路
SupportISPRoutes bool `json:"supportISPRoutes"` // 支持ISP运营商线路
MaxCustomRoutes int32 `json:"maxCustomRoutes"` // 自定义的线路数量
MinTTL int32 `json:"minTTL"` // 最小TTL
MaxDomains int32 `json:"maxDomains"` // 域名数量
MaxRecordsPerDomain int32 `json:"maxRecordsPerDomain"` // 单域名记录数量
MaxLoadBalanceRecordsPerRecord int32 `json:"maxLoadBalanceRecordsPerRecord"` // 单记录负载均衡条数
SupportRecordStats bool `json:"supportRecordStats"` // 支持记录统计
SupportDomainAlias bool `json:"supportDomainAlias"` // 支持域名别名 TODO
SupportAPI bool `json:"supportAPI"` // 是否支持API操作 TODO
}
func DefaultNSPlanConfig() *NSPlanConfig {
return &NSPlanConfig{}
}
func (this *NSPlanConfig) Init() error {
return nil
}

View File

@@ -1,22 +0,0 @@
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
package dnsconfigs
type NSDNSHost struct {
Host string `json:"host"`
Port int `json:"port"`
Protocol string `json:"protocol"`
}
// NSRecursionConfig 递归DNS设置
type NSRecursionConfig struct {
IsOn bool `json:"isOn"`
Hosts []*NSDNSHost `json:"hosts"`
UseLocalHosts bool `json:"useLocalHosts"` // 自动从本机读取DNS
AllowDomains []string `json:"allowDomains"`
DenyDomains []string `json:"denyDomains"`
}
func (this *NSRecursionConfig) Init() error {
return nil
}

View File

@@ -1,262 +0,0 @@
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
package dnsconfigs
import (
"encoding/json"
"errors"
"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
"github.com/iwind/TeaGo/maps"
"net"
)
type NSRouteRangeType = string
const (
NSRouteRangeTypeIP NSRouteRangeType = "ipRange" // IP范围
NSRouteRangeTypeCIDR NSRouteRangeType = "cidr" // CIDR
NSRouteRangeTypeRegion NSRouteRangeType = "region" // 区域
)
func AllNSRouteRangeTypes() []*shared.Definition {
return []*shared.Definition{
{
Name: "IP范围",
Code: NSRouteRangeTypeIP,
},
{
Name: "CIDR",
Code: NSRouteRangeTypeCIDR,
},
{
Name: "区域",
Code: NSRouteRangeTypeRegion,
},
}
}
// NSRouteRegionResolver 解析IP接口
type NSRouteRegionResolver interface {
Resolve(ip net.IP) (countryId int64, provinceId int64, cityId int64, providerId int64)
}
// NSRouteRangeInterface 线路范围接口
type NSRouteRangeInterface interface {
// Init 初始化
Init() error
// Contains 判断是否包含
Contains(ip net.IP) bool
// SetRegionResolver 设置IP解析接口
SetRegionResolver(resolver NSRouteRegionResolver)
// IsExcluding 是否为排除
IsExcluding() bool
}
type NSBaseRouteRange struct {
IsReverse bool `json:"isReverse"`
routeRegionResolver NSRouteRegionResolver
}
func (this *NSBaseRouteRange) SetRegionResolver(resolver NSRouteRegionResolver) {
this.routeRegionResolver = resolver
}
func (this *NSBaseRouteRange) IsExcluding() bool {
return this.IsReverse
}
// NSRouteRangeIPRange IP范围配置
// IPv4和IPv6不能混用
type NSRouteRangeIPRange struct {
NSBaseRouteRange
IPFrom string `json:"ipFrom"`
IPTo string `json:"ipTo"`
ipFromLong uint64
ipToLong uint64
ipVersion int // 4|6
}
func (this *NSRouteRangeIPRange) Init() error {
var ipFrom = net.ParseIP(this.IPFrom)
var ipTo = net.ParseIP(this.IPTo)
if ipFrom == nil {
return errors.New("invalid ipFrom '" + this.IPFrom + "'")
}
if ipTo == nil {
return errors.New("invalid ipTo '" + this.IPTo + "'")
}
var ipFromVersion = configutils.IPVersion(ipFrom)
var ipToVersion = configutils.IPVersion(ipTo)
if ipFromVersion != ipToVersion {
return errors.New("ipFrom and ipTo version are not same")
}
this.ipVersion = ipFromVersion
this.ipFromLong = configutils.IP2Long(ipFrom)
this.ipToLong = configutils.IP2Long(ipTo)
if this.ipFromLong > this.ipToLong {
this.ipFromLong, this.ipToLong = this.ipToLong, this.ipFromLong
}
return nil
}
func (this *NSRouteRangeIPRange) Contains(netIP net.IP) bool {
if len(netIP) == 0 {
return false
}
var version = configutils.IPVersion(netIP)
if version != this.ipVersion {
return false
}
var ipLong = configutils.IP2Long(netIP)
return ipLong >= this.ipFromLong && ipLong <= this.ipToLong
}
// NSRouteRangeCIDR CIDR范围配置
type NSRouteRangeCIDR struct {
NSBaseRouteRange
CIDR string `json:"cidr"`
cidr *net.IPNet
}
func (this *NSRouteRangeCIDR) Init() error {
_, ipNet, err := net.ParseCIDR(this.CIDR)
if err != nil {
return errors.New("parse cidr failed: " + err.Error())
}
this.cidr = ipNet
return nil
}
func (this *NSRouteRangeCIDR) Contains(netIP net.IP) bool {
if netIP == nil {
return false
}
if this.cidr == nil {
return false
}
return this.cidr.Contains(netIP)
}
// NSRouteRangeRegion 区域范围
// country:ID, province:ID, city:ID, isp:ID
type NSRouteRangeRegion struct {
NSBaseRouteRange
Regions []*routeRegion `json:"regions"`
}
func (this *NSRouteRangeRegion) Init() error {
return nil
}
func (this *NSRouteRangeRegion) Contains(netIP net.IP) bool {
if this.routeRegionResolver == nil {
return false
}
if len(this.Regions) == 0 {
return false
}
countryId, provinceId, cityId, providerId := this.routeRegionResolver.Resolve(netIP)
if countryId <= 0 && provinceId <= 0 && cityId <= 0 && providerId <= 0 {
return false
}
for _, region := range this.Regions {
if region.Id <= 0 {
continue
}
switch region.Type {
case "country":
if region.Id == countryId {
return true
}
case "province":
if region.Id == provinceId {
return true
}
case "city":
if region.Id == cityId {
return true
}
case "isp":
if region.Id == providerId {
return true
}
}
}
return false
}
type routeRegion struct {
Type string `json:"type"` // country|province|city|isp
Id int64 `json:"id"`
Name string `json:"name"`
}
// InitNSRangesFromJSON 从JSON中初始化线路范围
func InitNSRangesFromJSON(rangesJSON []byte) (ranges []NSRouteRangeInterface, err error) {
if len(rangesJSON) == 0 {
return
}
var rangeMaps = []maps.Map{}
err = json.Unmarshal(rangesJSON, &rangeMaps)
if err != nil {
return nil, err
}
for _, rangeMap := range rangeMaps {
var rangeType = rangeMap.GetString("type")
paramsJSON, err := json.Marshal(rangeMap.Get("params"))
if err != nil {
return nil, err
}
var r NSRouteRangeInterface
switch rangeType {
case NSRouteRangeTypeIP:
r = &NSRouteRangeIPRange{}
case NSRouteRangeTypeCIDR:
r = &NSRouteRangeCIDR{}
case NSRouteRangeTypeRegion:
r = &NSRouteRangeRegion{}
default:
return nil, errors.New("invalid route line type '" + rangeType + "'")
}
err = json.Unmarshal(paramsJSON, r)
if err != nil {
return nil, err
}
err = r.Init()
if err != nil {
return nil, err
}
ranges = append(ranges, r)
}
return
}

View File

@@ -1,98 +0,0 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package dnsconfigs
import (
"github.com/iwind/TeaGo/assert"
"net"
"testing"
)
func TestNSRouteRangeIPRange_Contains(t *testing.T) {
var a = assert.NewAssertion(t)
// ipv4
{
var r = &NSRouteRangeIPRange{
IPFrom: "192.168.1.100",
IPTo: "192.168.3.200",
}
err := r.Init()
if err != nil {
t.Fatal(err)
}
a.IsFalse(r.Contains(net.ParseIP("aaa")))
a.IsTrue(r.Contains(net.ParseIP("192.168.1.200")))
a.IsTrue(r.Contains(net.ParseIP("192.168.3.200")))
a.IsFalse(r.Contains(net.ParseIP("192.168.4.1")))
a.IsFalse(r.Contains(net.ParseIP("::1")))
}
// ipv6
{
var prefix = "1:2:3:4:5:6"
var r = &NSRouteRangeIPRange{
IPFrom: prefix + ":1:8",
IPTo: prefix + ":5:10",
}
err := r.Init()
if err != nil {
t.Fatal(err)
}
a.IsFalse(r.Contains(net.ParseIP("aaa")))
a.IsTrue(r.Contains(net.ParseIP(prefix + ":3:4")))
a.IsTrue(r.Contains(net.ParseIP(prefix + ":5:9")))
a.IsTrue(r.Contains(net.ParseIP(prefix + ":5:10")))
a.IsTrue(r.Contains(net.ParseIP(prefix + ":4:8")))
a.IsFalse(r.Contains(net.ParseIP(prefix + ":5:11")))
}
{
var r = &NSRouteRangeCIDR{
CIDR: "192.168.2.1/24",
}
err := r.Init()
if err != nil {
t.Fatal(err)
}
a.IsFalse(r.Contains(net.ParseIP("aaa")))
a.IsTrue(r.Contains(net.ParseIP("192.168.2.1")))
a.IsTrue(r.Contains(net.ParseIP("192.168.2.254")))
a.IsTrue(r.Contains(net.ParseIP("192.168.2.100")))
a.IsFalse(r.Contains(net.ParseIP("192.168.3.1")))
a.IsFalse(r.Contains(net.ParseIP("192.168.1.1")))
}
// reverse ipv4
{
var r = &NSRouteRangeIPRange{
IPFrom: "192.168.1.100",
IPTo: "192.168.3.200",
}
err := r.Init()
if err != nil {
t.Fatal(err)
}
a.IsFalse(r.Contains(net.ParseIP("aaa")))
a.IsTrue(r.Contains(net.ParseIP("192.168.1.200")))
a.IsTrue(r.Contains(net.ParseIP("192.168.3.200")))
a.IsFalse(r.Contains(net.ParseIP("192.168.4.1")))
}
// reverse cidr
{
var r = &NSRouteRangeCIDR{
CIDR: "192.168.2.1/24",
}
err := r.Init()
if err != nil {
t.Fatal(err)
}
a.IsFalse(r.Contains(net.ParseIP("aaa")))
a.IsTrue(r.Contains(net.ParseIP("192.168.2.1")))
a.IsTrue(r.Contains(net.ParseIP("192.168.2.254")))
a.IsTrue(r.Contains(net.ParseIP("192.168.2.100")))
a.IsFalse(r.Contains(net.ParseIP("192.168.3.1")))
a.IsFalse(r.Contains(net.ParseIP("192.168.1.1")))
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,86 +0,0 @@
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
package dnsconfigs
import (
"strings"
"testing"
)
func TestRoutes(t *testing.T) {
// 检查代号是否有空,或者代号是否重复
var codeMap = map[string]bool{} // code => true
for _, routes := range [][]*Route{
AllDefaultChinaProvinceRoutes,
AllDefaultISPRoutes,
AllDefaultWorldRegionRoutes,
} {
for _, route := range routes {
if len(route.Name) == 0 {
t.Fatal("route name should not empty:", route)
}
if len(route.AliasNames) == 0 {
t.Fatal("route alias names should not empty:", route)
}
if len(route.Code) == 0 || route.Code == "world:" {
t.Fatal("route code should not empty:", route)
}
_, ok := codeMap[route.Code]
if ok {
t.Fatal("code duplicated:", route)
}
codeMap[route.Code] = true
if strings.HasPrefix(route.Code, "world:sp:") || (strings.HasPrefix(route.Code, "world:") && route.Code != "world:UAR" && len(route.Code) != 8) {
t.Log("no shorten code:", route)
}
}
}
}
func TestFindDefaultRoute(t *testing.T) {
t.Log(FindDefaultRoute("isp:china_unicom"))
t.Log(FindDefaultRoute("china:province:beijing"))
t.Log(FindDefaultRoute("world:CN"))
t.Log(FindDefaultRoute("world:US"))
}
func TestRoutes_Markdown(t *testing.T) {
var markdown = ""
for index, routes := range [][]*Route{
AllDefaultRoutes,
AllDefaultChinaProvinceRoutes,
AllDefaultISPRoutes,
AllDefaultWorldRegionRoutes,
} {
switch index {
case 0:
markdown += "## 默认线路\n"
case 1:
markdown += "## 中国省市\n"
case 2:
markdown += "## 运营商\n"
case 3:
markdown += "## 全球地区\n"
}
markdown += "| 名称 | 代号 |\n"
markdown += "|-----------|-----------|\n"
for _, route := range routes {
markdown += "| " + route.Name + " | " + route.Code + " |\n"
}
markdown += "\n"
}
t.Log(markdown)
}
func BenchmarkFindDefaultRoute(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = FindDefaultRoute("world:CN")
}
}

View File

@@ -1,6 +0,0 @@
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
package dnsconfigs
type NSSetting struct {
}

View File

@@ -1,8 +0,0 @@
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
package dnsconfigs
// NSTSIGConfig 配置
type NSTSIGConfig struct {
IsOn bool `yaml:"isOn" json:"isOn"`
}

View File

@@ -1,31 +0,0 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package dnsconfigs
func DefaultNSUserConfig() *NSUserConfig {
return &NSUserConfig{
DefaultClusterId: 0,
DefaultPlanConfig: DefaultNSUserPlanConfig(),
}
}
func DefaultNSUserPlanConfig() *NSPlanConfig {
return &NSPlanConfig{
SupportCountryRoutes: true,
SupportChinaProvinceRoutes: true,
SupportISPRoutes: true,
MaxCustomRoutes: 0,
MaxLoadBalanceRecordsPerRecord: 100,
MinTTL: 60,
MaxDomains: 100,
MaxRecordsPerDomain: 1000,
SupportRecordStats: true,
SupportDomainAlias: false,
SupportAPI: false,
}
}
type NSUserConfig struct {
DefaultClusterId int64 `json:"defaultClusterId"` // 默认部署到的集群
DefaultPlanConfig *NSPlanConfig `json:"defaultPlanConfig"` // 默认套餐设置
}

View File

@@ -1,65 +0,0 @@
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
package dnsconfigs
type RecordTTL struct {
Name string `json:"name"`
Value int `json:"value"`
}
func FindAllRecordTTL() []*RecordTTL {
return []*RecordTTL{
{
Name: "5秒",
Value: 5,
},
{
Name: "10秒",
Value: 10,
},
{
Name: "30秒",
Value: 30,
},
{
Name: "1分钟",
Value: 60,
},
{
Name: "3分钟",
Value: 3 * 60,
},
{
Name: "5分钟",
Value: 5 * 60,
},
{
Name: "10分钟",
Value: 10 * 60,
},
{
Name: "30分钟",
Value: 30 * 60,
},
{
Name: "1小时",
Value: 3600,
},
{
Name: "12小时",
Value: 12 * 3600,
},
{
Name: "1天",
Value: 86400,
},
{
Name: "30天",
Value: 30 * 86400,
},
{
Name: "一年",
Value: 365 * 86400,
},
}
}