mirror of
https://github.com/TeaOSLab/EdgeAPI.git
synced 2025-12-25 06:26:35 +08:00
增加DNS服务商账号管理
This commit is contained in:
133
internal/db/models/dns_provider_dao.go
Normal file
133
internal/db/models/dns_provider_dao.go
Normal file
@@ -0,0 +1,133 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
"github.com/iwind/TeaGo/Tea"
|
||||
"github.com/iwind/TeaGo/dbs"
|
||||
"github.com/iwind/TeaGo/types"
|
||||
"time"
|
||||
)
|
||||
|
||||
const (
|
||||
DNSProviderStateEnabled = 1 // 已启用
|
||||
DNSProviderStateDisabled = 0 // 已禁用
|
||||
)
|
||||
|
||||
type DNSProviderDAO dbs.DAO
|
||||
|
||||
func NewDNSProviderDAO() *DNSProviderDAO {
|
||||
return dbs.NewDAO(&DNSProviderDAO{
|
||||
DAOObject: dbs.DAOObject{
|
||||
DB: Tea.Env,
|
||||
Table: "edgeDNSProviders",
|
||||
Model: new(DNSProvider),
|
||||
PkName: "id",
|
||||
},
|
||||
}).(*DNSProviderDAO)
|
||||
}
|
||||
|
||||
var SharedDNSProviderDAO *DNSProviderDAO
|
||||
|
||||
func init() {
|
||||
dbs.OnReady(func() {
|
||||
SharedDNSProviderDAO = NewDNSProviderDAO()
|
||||
})
|
||||
}
|
||||
|
||||
// 启用条目
|
||||
func (this *DNSProviderDAO) EnableDNSProvider(id int64) error {
|
||||
_, err := this.Query().
|
||||
Pk(id).
|
||||
Set("state", DNSProviderStateEnabled).
|
||||
Update()
|
||||
return err
|
||||
}
|
||||
|
||||
// 禁用条目
|
||||
func (this *DNSProviderDAO) DisableDNSProvider(id int64) error {
|
||||
_, err := this.Query().
|
||||
Pk(id).
|
||||
Set("state", DNSProviderStateDisabled).
|
||||
Update()
|
||||
return err
|
||||
}
|
||||
|
||||
// 查找启用中的条目
|
||||
func (this *DNSProviderDAO) FindEnabledDNSProvider(id int64) (*DNSProvider, error) {
|
||||
result, err := this.Query().
|
||||
Pk(id).
|
||||
Attr("state", DNSProviderStateEnabled).
|
||||
Find()
|
||||
if result == nil {
|
||||
return nil, err
|
||||
}
|
||||
return result.(*DNSProvider), err
|
||||
}
|
||||
|
||||
// 创建服务商
|
||||
func (this *DNSProviderDAO) CreateDNSProvider(providerType string, name string, apiParamsJSON []byte, routesJSON []byte) (int64, error) {
|
||||
op := NewDNSProviderOperator()
|
||||
op.Type = providerType
|
||||
op.Name = name
|
||||
if len(apiParamsJSON) > 0 {
|
||||
op.ApiParams = apiParamsJSON
|
||||
}
|
||||
if len(routesJSON) > 0 {
|
||||
op.Routes = routesJSON
|
||||
}
|
||||
op.State = DNSProviderStateEnabled
|
||||
op.DataUpdatedAt = time.Now().Unix()
|
||||
_, err := this.Save(op)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return types.Int64(op.Id), nil
|
||||
}
|
||||
|
||||
// 修改服务商
|
||||
func (this *DNSProviderDAO) UpdateDNSProvider(dnsProviderId int64, name string, apiParamsJSON []byte, routesJSON []byte) error {
|
||||
if dnsProviderId <= 0 {
|
||||
return errors.New("invalid dnsProviderId")
|
||||
}
|
||||
|
||||
op := NewDNSProviderOperator()
|
||||
op.Id = dnsProviderId
|
||||
op.Name = name
|
||||
|
||||
// 如果留空则表示不修改
|
||||
if len(apiParamsJSON) > 0 {
|
||||
op.ApiParams = apiParamsJSON
|
||||
}
|
||||
|
||||
// 如果留空则表示不修改
|
||||
if len(routesJSON) > 0 {
|
||||
op.Routes = routesJSON
|
||||
}
|
||||
|
||||
op.DataUpdatedAt = time.Now().Unix()
|
||||
_, err := this.Save(op)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 计算服务商数量
|
||||
func (this *DNSProviderDAO) CountAllEnabledDNSProviders() (int64, error) {
|
||||
return this.Query().
|
||||
State(DNSProviderStateEnabled).
|
||||
Count()
|
||||
}
|
||||
|
||||
// 列出单页服务商
|
||||
func (this *DNSProviderDAO) ListEnabledDNSProviders(offset int64, size int64) (result []*DNSProvider, err error) {
|
||||
_, err = this.Query().
|
||||
State(DNSProviderStateEnabled).
|
||||
Offset(offset).
|
||||
Limit(size).
|
||||
DescPk().
|
||||
Slice(&result).
|
||||
FindAll()
|
||||
return
|
||||
}
|
||||
5
internal/db/models/dns_provider_dao_test.go
Normal file
5
internal/db/models/dns_provider_dao_test.go
Normal file
@@ -0,0 +1,5 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
)
|
||||
30
internal/db/models/dns_provider_model.go
Normal file
30
internal/db/models/dns_provider_model.go
Normal file
@@ -0,0 +1,30 @@
|
||||
package models
|
||||
|
||||
// DNS服务商
|
||||
type DNSProvider struct {
|
||||
Id uint32 `field:"id"` // ID
|
||||
Name string `field:"name"` // 名称
|
||||
AdminId uint32 `field:"adminId"` // 管理员ID
|
||||
Type string `field:"type"` // 供应商类型
|
||||
ApiParams string `field:"apiParams"` // API参数
|
||||
CreatedAt uint64 `field:"createdAt"` // 创建时间
|
||||
State uint8 `field:"state"` // 状态
|
||||
Routes string `field:"routes"` // 可以使用的线路
|
||||
DataUpdatedAt uint64 `field:"dataUpdatedAt"` // 数据同步时间
|
||||
}
|
||||
|
||||
type DNSProviderOperator struct {
|
||||
Id interface{} // ID
|
||||
Name interface{} // 名称
|
||||
AdminId interface{} // 管理员ID
|
||||
Type interface{} // 供应商类型
|
||||
ApiParams interface{} // API参数
|
||||
CreatedAt interface{} // 创建时间
|
||||
State interface{} // 状态
|
||||
Routes interface{} // 可以使用的线路
|
||||
DataUpdatedAt interface{} // 数据同步时间
|
||||
}
|
||||
|
||||
func NewDNSProviderOperator() *DNSProviderOperator {
|
||||
return &DNSProviderOperator{}
|
||||
}
|
||||
1
internal/db/models/dns_provider_model_ext.go
Normal file
1
internal/db/models/dns_provider_model_ext.go
Normal file
@@ -0,0 +1 @@
|
||||
package models
|
||||
@@ -268,6 +268,25 @@ func (this *NodeClusterDAO) FindAllEnabledClustersWithGrantId(grantId int64) (re
|
||||
return
|
||||
}
|
||||
|
||||
// 计算使用某个DNS服务商的集群数量
|
||||
func (this *NodeClusterDAO) CountAllEnabledClustersWithDNSProviderId(dnsProviderId int64) (int64, error) {
|
||||
return this.Query().
|
||||
State(NodeClusterStateEnabled).
|
||||
Attr("dnsProviderId", dnsProviderId).
|
||||
Count()
|
||||
}
|
||||
|
||||
// 获取所有使用某个DNS服务商的集群
|
||||
func (this *NodeClusterDAO) FindAllEnabledClustersWithDNSProviderId(dnsProviderId int64) (result []*NodeCluster, err error) {
|
||||
_, err = this.Query().
|
||||
State(NodeClusterStateEnabled).
|
||||
Attr("dnsProviderId", dnsProviderId).
|
||||
Slice(&result).
|
||||
DescPk().
|
||||
FindAll()
|
||||
return
|
||||
}
|
||||
|
||||
// 查找集群的认证ID
|
||||
func (this *NodeClusterDAO) FindClusterGrantId(clusterId int64) (int64, error) {
|
||||
return this.Query().
|
||||
@@ -276,6 +295,21 @@ func (this *NodeClusterDAO) FindClusterGrantId(clusterId int64) (int64, error) {
|
||||
FindInt64Col(0)
|
||||
}
|
||||
|
||||
// 查找DNS信息
|
||||
func (this *NodeClusterDAO) FindClusterDNSInfo(clusterId int64) (*NodeCluster, error) {
|
||||
one, err := this.Query().
|
||||
Pk(clusterId).
|
||||
Result("dnsName", "dnsDomain", "dnsProviderId").
|
||||
Find()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if one == nil {
|
||||
return nil, nil
|
||||
}
|
||||
return one.(*NodeCluster), nil
|
||||
}
|
||||
|
||||
// 生成唯一ID
|
||||
func (this *NodeClusterDAO) genUniqueId() (string, error) {
|
||||
for {
|
||||
|
||||
@@ -17,6 +17,9 @@ type NodeCluster struct {
|
||||
UniqueId string `field:"uniqueId"` // 唯一ID
|
||||
Secret string `field:"secret"` // 密钥
|
||||
HealthCheck string `field:"healthCheck"` // 健康检查
|
||||
DnsProviderId uint32 `field:"dnsProviderId"` // 当前使用的DNS供应商
|
||||
DnsName string `field:"dnsName"` // DNS名称
|
||||
DnsDomain string `field:"dnsDomain"` // DNS域
|
||||
}
|
||||
|
||||
type NodeClusterOperator struct {
|
||||
@@ -35,6 +38,9 @@ type NodeClusterOperator struct {
|
||||
UniqueId interface{} // 唯一ID
|
||||
Secret interface{} // 密钥
|
||||
HealthCheck interface{} // 健康检查
|
||||
DnsProviderId interface{} // 当前使用的DNS供应商
|
||||
DnsName interface{} // DNS名称
|
||||
DnsDomain interface{} // DNS域
|
||||
}
|
||||
|
||||
func NewNodeClusterOperator() *NodeClusterOperator {
|
||||
|
||||
@@ -23,6 +23,7 @@ type Node struct {
|
||||
State uint8 `field:"state"` // 状态
|
||||
ConnectedAPINodes string `field:"connectedAPINodes"` // 当前连接的API节点
|
||||
MaxCPU uint32 `field:"maxCPU"` // 可以使用的最多CPU
|
||||
DnsRoutes string `field:"dnsRoutes"` // DNS线路设置
|
||||
}
|
||||
|
||||
type NodeOperator struct {
|
||||
@@ -47,6 +48,7 @@ type NodeOperator struct {
|
||||
State interface{} // 状态
|
||||
ConnectedAPINodes interface{} // 当前连接的API节点
|
||||
MaxCPU interface{} // 可以使用的最多CPU
|
||||
DnsRoutes interface{} // DNS线路设置
|
||||
}
|
||||
|
||||
func NewNodeOperator() *NodeOperator {
|
||||
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
"github.com/iwind/TeaGo/Tea"
|
||||
"github.com/iwind/TeaGo/dbs"
|
||||
"github.com/iwind/TeaGo/rands"
|
||||
"github.com/iwind/TeaGo/types"
|
||||
"strconv"
|
||||
"strings"
|
||||
@@ -138,6 +139,12 @@ func (this *ServerDAO) CreateServer(adminId int64, userId int64, serverType serv
|
||||
op.GroupIds = groupIdsJSON
|
||||
}
|
||||
|
||||
dnsName, err := this.genDNSName()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
op.DnsName = dnsName
|
||||
|
||||
op.Version = 1
|
||||
op.IsOn = 1
|
||||
op.State = ServerStateEnabled
|
||||
@@ -795,3 +802,19 @@ func (this *ServerDAO) CountAllEnabledServersWithGroupId(groupId int64) (int64,
|
||||
func (this *ServerDAO) createEvent() error {
|
||||
return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
|
||||
}
|
||||
|
||||
// 生成DNS Name
|
||||
func (this *ServerDAO) genDNSName() (string, error) {
|
||||
for {
|
||||
dnsName := rands.HexString(8)
|
||||
exist, err := this.Query().
|
||||
Attr("dnsName", dnsName).
|
||||
Exist()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if !exist {
|
||||
return dnsName, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"crypto/md5"
|
||||
"encoding/json"
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
"github.com/iwind/TeaGo/dbs"
|
||||
"github.com/iwind/TeaGo/logs"
|
||||
"testing"
|
||||
)
|
||||
@@ -42,3 +43,12 @@ func TestNewServerDAO_md5(t *testing.T) {
|
||||
h := m.Sum(nil)
|
||||
t.Logf("%x", h)
|
||||
}
|
||||
|
||||
func TestServerDAO_genDNSName(t *testing.T) {
|
||||
dbs.NotifyReady()
|
||||
dnsName, err := SharedServerDAO.genDNSName()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log("dnsName:", dnsName)
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ type Server struct {
|
||||
Version uint32 `field:"version"` // 版本号
|
||||
CreatedAt uint64 `field:"createdAt"` // 创建时间
|
||||
State uint8 `field:"state"` // 状态
|
||||
DnsName string `field:"dnsName"` // DNS名称
|
||||
}
|
||||
|
||||
type ServerOperator struct {
|
||||
@@ -55,6 +56,7 @@ type ServerOperator struct {
|
||||
Version interface{} // 版本号
|
||||
CreatedAt interface{} // 创建时间
|
||||
State interface{} // 状态
|
||||
DnsName interface{} // DNS名称
|
||||
}
|
||||
|
||||
func NewServerOperator() *ServerOperator {
|
||||
|
||||
Reference in New Issue
Block a user