2021-01-27 23:00:02 +08:00
|
|
|
|
package tasks
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"encoding/json"
|
|
|
|
|
|
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
|
|
|
|
|
dnsmodels "github.com/TeaOSLab/EdgeAPI/internal/db/models/dns"
|
|
|
|
|
|
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients"
|
2021-06-02 18:13:48 +08:00
|
|
|
|
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
|
2021-12-14 10:49:29 +08:00
|
|
|
|
"github.com/TeaOSLab/EdgeAPI/internal/goman"
|
2021-06-07 10:02:07 +08:00
|
|
|
|
"github.com/TeaOSLab/EdgeAPI/internal/utils"
|
2021-09-20 20:01:21 +08:00
|
|
|
|
"github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs"
|
2021-05-26 14:40:05 +08:00
|
|
|
|
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
2021-01-27 23:00:02 +08:00
|
|
|
|
"github.com/iwind/TeaGo/dbs"
|
|
|
|
|
|
"github.com/iwind/TeaGo/lists"
|
|
|
|
|
|
"net"
|
|
|
|
|
|
"strings"
|
|
|
|
|
|
"time"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|
|
dbs.OnReadyDone(func() {
|
2021-12-14 10:49:29 +08:00
|
|
|
|
goman.New(func() {
|
2022-04-23 12:32:30 +08:00
|
|
|
|
NewDNSTaskExecutor(10 * time.Second).Start()
|
2021-12-14 10:49:29 +08:00
|
|
|
|
})
|
2021-01-27 23:00:02 +08:00
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-04-15 16:59:48 +08:00
|
|
|
|
// DNSTaskExecutor DNS任务执行器
|
2021-01-27 23:00:02 +08:00
|
|
|
|
type DNSTaskExecutor struct {
|
2022-04-23 12:32:30 +08:00
|
|
|
|
BaseTask
|
|
|
|
|
|
|
|
|
|
|
|
ticker *time.Ticker
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-23 12:32:30 +08:00
|
|
|
|
func NewDNSTaskExecutor(duration time.Duration) *DNSTaskExecutor {
|
|
|
|
|
|
return &DNSTaskExecutor{
|
|
|
|
|
|
ticker: time.NewTicker(duration),
|
|
|
|
|
|
}
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (this *DNSTaskExecutor) Start() {
|
2022-04-23 12:32:30 +08:00
|
|
|
|
for range this.ticker.C {
|
|
|
|
|
|
err := this.Loop()
|
2021-01-27 23:00:02 +08:00
|
|
|
|
if err != nil {
|
2022-04-23 12:32:30 +08:00
|
|
|
|
this.logErr("DNSTaskExecutor", err.Error())
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-23 12:32:30 +08:00
|
|
|
|
func (this *DNSTaskExecutor) Loop() error {
|
|
|
|
|
|
if !models.SharedAPINodeDAO.CheckAPINodeIsPrimaryWithoutErr() {
|
2021-01-27 23:00:02 +08:00
|
|
|
|
return nil
|
|
|
|
|
|
}
|
2022-04-23 12:32:30 +08:00
|
|
|
|
|
|
|
|
|
|
return this.loop()
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-23 12:32:30 +08:00
|
|
|
|
func (this *DNSTaskExecutor) loop() error {
|
2021-01-27 23:00:02 +08:00
|
|
|
|
tasks, err := dnsmodels.SharedDNSTaskDAO.FindAllDoingTasks(nil)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
for _, task := range tasks {
|
|
|
|
|
|
taskId := int64(task.Id)
|
|
|
|
|
|
switch task.Type {
|
|
|
|
|
|
case dnsmodels.DNSTaskTypeServerChange:
|
2022-04-18 18:21:29 +08:00
|
|
|
|
err = this.doServer(taskId, int64(task.ClusterId), int64(task.ServerId))
|
2021-01-27 23:00:02 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
err = dnsmodels.SharedDNSTaskDAO.UpdateDNSTaskError(nil, taskId, err.Error())
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
case dnsmodels.DNSTaskTypeNodeChange:
|
|
|
|
|
|
err = this.doNode(taskId, int64(task.NodeId))
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
err = dnsmodels.SharedDNSTaskDAO.UpdateDNSTaskError(nil, taskId, err.Error())
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
case dnsmodels.DNSTaskTypeClusterChange:
|
|
|
|
|
|
err = this.doCluster(taskId, int64(task.ClusterId))
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
err = dnsmodels.SharedDNSTaskDAO.UpdateDNSTaskError(nil, taskId, err.Error())
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2022-04-18 21:00:40 +08:00
|
|
|
|
case dnsmodels.DNSTaskTypeClusterRemoveDomain:
|
|
|
|
|
|
err = this.doClusterRemove(taskId, int64(task.ClusterId), int64(task.DomainId), task.RecordName)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
err = dnsmodels.SharedDNSTaskDAO.UpdateDNSTaskError(nil, taskId, err.Error())
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2021-01-27 23:00:02 +08:00
|
|
|
|
case dnsmodels.DNSTaskTypeDomainChange:
|
2022-04-18 18:21:29 +08:00
|
|
|
|
err = this.doDomainWithTask(taskId, int64(task.DomainId))
|
2021-01-27 23:00:02 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
err = dnsmodels.SharedDNSTaskDAO.UpdateDNSTaskError(nil, taskId, err.Error())
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-02-24 19:26:59 +08:00
|
|
|
|
// 修改服务相关记录
|
2022-04-18 18:21:29 +08:00
|
|
|
|
func (this *DNSTaskExecutor) doServer(taskId int64, oldClusterId int64, serverId int64) error {
|
2021-01-27 23:00:02 +08:00
|
|
|
|
var tx *dbs.Tx
|
|
|
|
|
|
|
|
|
|
|
|
isOk := false
|
|
|
|
|
|
defer func() {
|
|
|
|
|
|
if isOk {
|
|
|
|
|
|
err := dnsmodels.SharedDNSTaskDAO.UpdateDNSTaskDone(tx, taskId)
|
|
|
|
|
|
if err != nil {
|
2022-04-23 12:32:30 +08:00
|
|
|
|
this.logErr("DNSTaskExecutor", err.Error())
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
|
|
// 检查是否已通过审核
|
|
|
|
|
|
serverDNS, err := models.SharedServerDAO.FindStatelessServerDNS(tx, serverId)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
if serverDNS == nil {
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
if len(serverDNS.DnsName) == 0 {
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-18 18:21:29 +08:00
|
|
|
|
var recordName = serverDNS.DnsName
|
|
|
|
|
|
var recordType = dnstypes.RecordTypeCNAME
|
|
|
|
|
|
|
2022-04-18 18:35:57 +08:00
|
|
|
|
// 新的DNS设置
|
2022-04-18 21:00:40 +08:00
|
|
|
|
manager, newDomainId, domain, clusterDNSName, dnsConfig, err := this.findDNSManagerWithClusterId(tx, int64(serverDNS.ClusterId))
|
2022-04-18 18:35:57 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-18 18:21:29 +08:00
|
|
|
|
// 如果集群发生了变化,则从老的集群中删除
|
|
|
|
|
|
if oldClusterId > 0 && int64(serverDNS.ClusterId) != oldClusterId {
|
2022-04-18 21:00:40 +08:00
|
|
|
|
oldManager, oldDomainId, oldDomain, _, _, err := this.findDNSManagerWithClusterId(tx, oldClusterId)
|
2022-04-18 18:21:29 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
2022-04-18 18:35:57 +08:00
|
|
|
|
|
|
|
|
|
|
// 如果域名发生了变化
|
|
|
|
|
|
if oldDomainId != newDomainId {
|
|
|
|
|
|
if oldManager != nil {
|
|
|
|
|
|
oldRecord, err := oldManager.QueryRecord(oldDomain, recordName, recordType)
|
2022-04-18 18:21:29 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
2022-04-18 18:35:57 +08:00
|
|
|
|
if oldRecord != nil {
|
|
|
|
|
|
// 删除记录
|
|
|
|
|
|
err = oldManager.DeleteRecord(oldDomain, oldRecord)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
2022-04-18 18:21:29 +08:00
|
|
|
|
|
2022-04-18 18:35:57 +08:00
|
|
|
|
// 更新域名中记录缓存
|
|
|
|
|
|
// 这里不创建域名更新任务,而是直接更新,避免影响其他任务的执行
|
|
|
|
|
|
err = this.doDomain(oldDomainId)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
2022-04-18 18:21:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 处理新的集群
|
2021-01-27 23:00:02 +08:00
|
|
|
|
if manager == nil {
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
2021-09-20 20:01:21 +08:00
|
|
|
|
var ttl int32 = 0
|
|
|
|
|
|
if dnsConfig != nil {
|
|
|
|
|
|
ttl = dnsConfig.TTL
|
|
|
|
|
|
}
|
2021-01-27 23:00:02 +08:00
|
|
|
|
|
|
|
|
|
|
recordValue := clusterDNSName + "." + domain + "."
|
|
|
|
|
|
recordRoute := manager.DefaultRoute()
|
2022-03-22 21:45:07 +08:00
|
|
|
|
if serverDNS.State == models.ServerStateDisabled || !serverDNS.IsOn {
|
2021-01-27 23:00:02 +08:00
|
|
|
|
// 检查记录是否已经存在
|
|
|
|
|
|
record, err := manager.QueryRecord(domain, recordName, recordType)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
if record != nil {
|
|
|
|
|
|
// 删除
|
|
|
|
|
|
err = manager.DeleteRecord(domain, record)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
2022-04-18 18:35:57 +08:00
|
|
|
|
err = dnsmodels.SharedDNSTaskDAO.CreateDomainTask(tx, newDomainId, dnsmodels.DNSTaskTypeDomainChange)
|
2021-01-27 23:00:02 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 是否已存在
|
2022-04-18 18:35:57 +08:00
|
|
|
|
exist, err := dnsmodels.SharedDNSDomainDAO.ExistDomainRecord(tx, newDomainId, recordName, recordType, recordRoute, recordValue)
|
2021-01-27 23:00:02 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
if exist {
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 检查记录是否已经存在
|
|
|
|
|
|
record, err := manager.QueryRecord(domain, recordName, recordType)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
if record != nil {
|
|
|
|
|
|
if record.Value == recordValue || record.Value == strings.TrimRight(recordValue, ".") {
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 删除
|
|
|
|
|
|
err = manager.DeleteRecord(domain, record)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
2022-04-18 18:35:57 +08:00
|
|
|
|
err = dnsmodels.SharedDNSTaskDAO.CreateDomainTask(tx, newDomainId, dnsmodels.DNSTaskTypeDomainChange)
|
2021-01-27 23:00:02 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-02 18:13:48 +08:00
|
|
|
|
err = manager.AddRecord(domain, &dnstypes.Record{
|
2021-01-27 23:00:02 +08:00
|
|
|
|
Id: "",
|
|
|
|
|
|
Name: recordName,
|
|
|
|
|
|
Type: recordType,
|
|
|
|
|
|
Value: recordValue,
|
|
|
|
|
|
Route: recordRoute,
|
2021-09-20 20:01:21 +08:00
|
|
|
|
TTL: ttl,
|
2021-01-27 23:00:02 +08:00
|
|
|
|
})
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-18 18:35:57 +08:00
|
|
|
|
err = dnsmodels.SharedDNSTaskDAO.CreateDomainTask(tx, newDomainId, dnsmodels.DNSTaskTypeDomainChange)
|
2021-01-27 23:00:02 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-02-24 19:26:59 +08:00
|
|
|
|
// 修改节点相关记录
|
2021-01-27 23:00:02 +08:00
|
|
|
|
func (this *DNSTaskExecutor) doNode(taskId int64, nodeId int64) error {
|
|
|
|
|
|
isOk := false
|
|
|
|
|
|
defer func() {
|
|
|
|
|
|
if isOk {
|
|
|
|
|
|
err := dnsmodels.SharedDNSTaskDAO.UpdateDNSTaskDone(nil, taskId)
|
|
|
|
|
|
if err != nil {
|
2022-04-23 12:32:30 +08:00
|
|
|
|
this.logErr("DNSTaskExecutor", err.Error())
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
|
|
var tx *dbs.Tx
|
|
|
|
|
|
node, err := models.SharedNodeDAO.FindStatelessNodeDNS(tx, nodeId)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
if node == nil {
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 转交给cluster统一处理
|
2021-07-31 22:23:11 +08:00
|
|
|
|
clusterIds, err := models.SharedNodeDAO.FindEnabledAndOnNodeClusterIds(tx, nodeId)
|
2021-01-27 23:00:02 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
2021-07-31 22:23:11 +08:00
|
|
|
|
for _, clusterId := range clusterIds {
|
|
|
|
|
|
err = dnsmodels.SharedDNSTaskDAO.CreateClusterTask(tx, clusterId, dnsmodels.DNSTaskTypeClusterChange)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2021-01-27 23:00:02 +08:00
|
|
|
|
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-02-24 19:26:59 +08:00
|
|
|
|
// 修改集群相关记录
|
2021-01-27 23:00:02 +08:00
|
|
|
|
func (this *DNSTaskExecutor) doCluster(taskId int64, clusterId int64) error {
|
|
|
|
|
|
isOk := false
|
|
|
|
|
|
defer func() {
|
|
|
|
|
|
if isOk {
|
|
|
|
|
|
err := dnsmodels.SharedDNSTaskDAO.UpdateDNSTaskDone(nil, taskId)
|
|
|
|
|
|
if err != nil {
|
2022-04-23 12:32:30 +08:00
|
|
|
|
this.logErr("DNSTaskExecutor", err.Error())
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
|
|
var tx *dbs.Tx
|
2022-04-18 21:00:40 +08:00
|
|
|
|
manager, domainId, domain, clusterDNSName, dnsConfig, err := this.findDNSManagerWithClusterId(tx, clusterId)
|
2021-01-27 23:00:02 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
if manager == nil {
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-09-20 16:37:48 +08:00
|
|
|
|
var clusterDomain = clusterDNSName + "." + domain
|
|
|
|
|
|
|
2021-09-20 20:01:21 +08:00
|
|
|
|
var ttl int32 = 0
|
|
|
|
|
|
if dnsConfig != nil {
|
|
|
|
|
|
ttl = dnsConfig.TTL
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-01-27 23:00:02 +08:00
|
|
|
|
// 以前的节点记录
|
|
|
|
|
|
records, err := manager.GetRecords(domain)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
2021-09-20 16:37:48 +08:00
|
|
|
|
var oldRecordsMap = map[string]*dnstypes.Record{} // route@value => record
|
|
|
|
|
|
var oldCnameRecordsMap = map[string]*dnstypes.Record{} // cname => record
|
2021-01-27 23:00:02 +08:00
|
|
|
|
for _, record := range records {
|
2021-06-07 10:02:07 +08:00
|
|
|
|
if (record.Type == dnstypes.RecordTypeA || record.Type == dnstypes.RecordTypeAAAA) && record.Name == clusterDNSName {
|
2021-01-27 23:00:02 +08:00
|
|
|
|
key := record.Route + "@" + record.Value
|
|
|
|
|
|
oldRecordsMap[key] = record
|
|
|
|
|
|
}
|
2021-09-20 16:37:48 +08:00
|
|
|
|
|
|
|
|
|
|
if record.Type == dnstypes.RecordTypeCNAME {
|
|
|
|
|
|
oldCnameRecordsMap[record.Name] = record
|
|
|
|
|
|
}
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 当前的节点记录
|
2022-08-25 19:18:30 +08:00
|
|
|
|
var newRecordKeys = []string{}
|
|
|
|
|
|
nodes, err := models.SharedNodeDAO.FindAllEnabledNodesDNSWithClusterId(tx, clusterId, true, dnsConfig != nil && dnsConfig.IncludingLnNodes)
|
2021-01-27 23:00:02 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
2022-08-25 19:18:30 +08:00
|
|
|
|
var isChanged = false
|
2021-01-27 23:00:02 +08:00
|
|
|
|
for _, node := range nodes {
|
|
|
|
|
|
routes, err := node.DNSRouteCodesForDomainId(domainId)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
if len(routes) == 0 {
|
|
|
|
|
|
routes = []string{manager.DefaultRoute()}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 所有的IP记录
|
2021-05-26 14:40:05 +08:00
|
|
|
|
ipAddresses, err := models.SharedNodeIPAddressDAO.FindAllEnabledAddressesWithNode(tx, int64(node.Id), nodeconfigs.NodeRoleNode)
|
2021-01-27 23:00:02 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
if len(ipAddresses) == 0 {
|
|
|
|
|
|
continue
|
|
|
|
|
|
}
|
|
|
|
|
|
for _, ipAddress := range ipAddresses {
|
2022-08-25 19:18:30 +08:00
|
|
|
|
var ip = ipAddress.DNSIP()
|
2022-03-22 22:11:32 +08:00
|
|
|
|
if len(ip) == 0 || !ipAddress.CanAccess || !ipAddress.IsUp || !ipAddress.IsOn {
|
2021-01-27 23:00:02 +08:00
|
|
|
|
continue
|
|
|
|
|
|
}
|
|
|
|
|
|
if net.ParseIP(ip) == nil {
|
|
|
|
|
|
continue
|
|
|
|
|
|
}
|
|
|
|
|
|
for _, route := range routes {
|
2022-08-25 19:18:30 +08:00
|
|
|
|
var key = route + "@" + ip
|
2021-01-27 23:00:02 +08:00
|
|
|
|
_, ok := oldRecordsMap[key]
|
|
|
|
|
|
if ok {
|
|
|
|
|
|
newRecordKeys = append(newRecordKeys, key)
|
|
|
|
|
|
continue
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-08-25 19:18:30 +08:00
|
|
|
|
var recordType = dnstypes.RecordTypeA
|
2021-06-07 10:02:07 +08:00
|
|
|
|
if utils.IsIPv6(ip) {
|
|
|
|
|
|
recordType = dnstypes.RecordTypeAAAA
|
|
|
|
|
|
}
|
2021-06-02 18:13:48 +08:00
|
|
|
|
err = manager.AddRecord(domain, &dnstypes.Record{
|
2021-01-27 23:00:02 +08:00
|
|
|
|
Id: "",
|
|
|
|
|
|
Name: clusterDNSName,
|
2021-06-07 10:02:07 +08:00
|
|
|
|
Type: recordType,
|
2021-01-27 23:00:02 +08:00
|
|
|
|
Value: ip,
|
|
|
|
|
|
Route: route,
|
2021-09-20 20:01:21 +08:00
|
|
|
|
TTL: ttl,
|
2021-01-27 23:00:02 +08:00
|
|
|
|
})
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
isChanged = true
|
|
|
|
|
|
newRecordKeys = append(newRecordKeys, key)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 删除多余的节点解析记录
|
|
|
|
|
|
for key, record := range oldRecordsMap {
|
|
|
|
|
|
if !lists.ContainsString(newRecordKeys, key) {
|
2021-04-15 16:59:48 +08:00
|
|
|
|
isChanged = true
|
2021-01-27 23:00:02 +08:00
|
|
|
|
err = manager.DeleteRecord(domain, record)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-09-20 16:37:48 +08:00
|
|
|
|
// 服务域名
|
|
|
|
|
|
servers, err := models.SharedServerDAO.FindAllServersDNSWithClusterId(tx, clusterId)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
serverRecords := []*dnstypes.Record{} // 之所以用数组再存一遍,是因为dnsName可能会重复
|
|
|
|
|
|
serverRecordsMap := map[string]*dnstypes.Record{} // dnsName => *Record
|
|
|
|
|
|
for _, record := range records {
|
|
|
|
|
|
if record.Type == dnstypes.RecordTypeCNAME && record.Value == clusterDomain+"." {
|
|
|
|
|
|
serverRecords = append(serverRecords, record)
|
|
|
|
|
|
serverRecordsMap[record.Name] = record
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 新增的域名
|
|
|
|
|
|
serverDNSNames := []string{}
|
|
|
|
|
|
for _, server := range servers {
|
|
|
|
|
|
dnsName := server.DnsName
|
|
|
|
|
|
if len(dnsName) == 0 {
|
|
|
|
|
|
continue
|
|
|
|
|
|
}
|
|
|
|
|
|
serverDNSNames = append(serverDNSNames, dnsName)
|
|
|
|
|
|
_, ok := serverRecordsMap[dnsName]
|
|
|
|
|
|
if !ok {
|
|
|
|
|
|
isChanged = true
|
|
|
|
|
|
err = manager.AddRecord(domain, &dnstypes.Record{
|
|
|
|
|
|
Id: "",
|
|
|
|
|
|
Name: dnsName,
|
|
|
|
|
|
Type: dnstypes.RecordTypeCNAME,
|
|
|
|
|
|
Value: clusterDomain + ".",
|
|
|
|
|
|
Route: "", // 注意这里为空,需要在执行过程中获取默认值
|
2021-09-20 20:01:21 +08:00
|
|
|
|
TTL: ttl,
|
2021-09-20 16:37:48 +08:00
|
|
|
|
})
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 自动设置的CNAME
|
2021-09-20 20:01:21 +08:00
|
|
|
|
var cnameRecords = []string{}
|
|
|
|
|
|
if dnsConfig != nil {
|
|
|
|
|
|
cnameRecords = dnsConfig.CNameRecords
|
|
|
|
|
|
}
|
2021-09-20 16:37:48 +08:00
|
|
|
|
for _, cnameRecord := range cnameRecords {
|
|
|
|
|
|
serverDNSNames = append(serverDNSNames, cnameRecord)
|
|
|
|
|
|
_, ok := serverRecordsMap[cnameRecord]
|
|
|
|
|
|
if !ok {
|
|
|
|
|
|
isChanged = true
|
|
|
|
|
|
err = manager.AddRecord(domain, &dnstypes.Record{
|
|
|
|
|
|
Id: "",
|
|
|
|
|
|
Name: cnameRecord,
|
|
|
|
|
|
Type: dnstypes.RecordTypeCNAME,
|
|
|
|
|
|
Value: clusterDomain + ".",
|
|
|
|
|
|
Route: "", // 注意这里为空,需要在执行过程中获取默认值
|
2021-09-20 20:01:21 +08:00
|
|
|
|
TTL: ttl,
|
2021-09-20 16:37:48 +08:00
|
|
|
|
})
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 多余的域名
|
|
|
|
|
|
for _, record := range serverRecords {
|
|
|
|
|
|
if !lists.ContainsString(serverDNSNames, record.Name) {
|
|
|
|
|
|
isChanged = true
|
|
|
|
|
|
err = manager.DeleteRecord(domain, record)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-01-27 23:00:02 +08:00
|
|
|
|
// 通知更新域名
|
|
|
|
|
|
if isChanged {
|
|
|
|
|
|
err = dnsmodels.SharedDNSTaskDAO.CreateDomainTask(tx, domainId, dnsmodels.DNSTaskTypeDomainChange)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-18 21:00:40 +08:00
|
|
|
|
func (this *DNSTaskExecutor) doClusterRemove(taskId int64, clusterId int64, domainId int64, dnsName string) error {
|
|
|
|
|
|
var isOk = false
|
|
|
|
|
|
defer func() {
|
|
|
|
|
|
if isOk {
|
|
|
|
|
|
err := dnsmodels.SharedDNSTaskDAO.UpdateDNSTaskDone(nil, taskId)
|
|
|
|
|
|
if err != nil {
|
2022-04-23 12:32:30 +08:00
|
|
|
|
this.logErr("DNSTaskExecutor", err.Error())
|
2022-04-18 21:00:40 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
|
|
var tx *dbs.Tx
|
|
|
|
|
|
if len(dnsName) == 0 {
|
|
|
|
|
|
dnsInfo, err := models.SharedNodeClusterDAO.FindClusterDNSInfo(tx, clusterId, nil)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
if dnsInfo == nil {
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
dnsName = dnsInfo.DnsName
|
|
|
|
|
|
if len(dnsName) == 0 {
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
domain, manager, err := this.findDNSManagerWithDomainId(tx, domainId)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
if domain == nil {
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
var fullName = dnsName + "." + domain.Name
|
|
|
|
|
|
|
|
|
|
|
|
records, err := domain.DecodeRecords()
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var isChanged bool
|
|
|
|
|
|
|
|
|
|
|
|
for _, record := range records {
|
|
|
|
|
|
// node A
|
|
|
|
|
|
if (record.Type == dnstypes.RecordTypeA || record.Type == dnstypes.RecordTypeAAAA) && record.Name == dnsName {
|
|
|
|
|
|
err = manager.DeleteRecord(domain.Name, record)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
isChanged = true
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// server CNAME
|
|
|
|
|
|
if record.Type == dnstypes.RecordTypeCNAME && strings.TrimRight(record.Value, ".") == fullName {
|
|
|
|
|
|
err = manager.DeleteRecord(domain.Name, record)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
isChanged = true
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if isChanged {
|
|
|
|
|
|
err = dnsmodels.SharedDNSTaskDAO.CreateDomainTask(tx, domainId, dnsmodels.DNSTaskTypeDomainChange)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-18 18:21:29 +08:00
|
|
|
|
func (this *DNSTaskExecutor) doDomain(domainId int64) error {
|
|
|
|
|
|
return this.doDomainWithTask(0, domainId)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (this *DNSTaskExecutor) doDomainWithTask(taskId int64, domainId int64) error {
|
2021-01-27 23:00:02 +08:00
|
|
|
|
var tx *dbs.Tx
|
|
|
|
|
|
|
|
|
|
|
|
isOk := false
|
|
|
|
|
|
defer func() {
|
|
|
|
|
|
if isOk {
|
2022-04-18 18:21:29 +08:00
|
|
|
|
if taskId > 0 {
|
|
|
|
|
|
err := dnsmodels.SharedDNSTaskDAO.UpdateDNSTaskDone(tx, taskId)
|
|
|
|
|
|
if err != nil {
|
2022-04-23 12:32:30 +08:00
|
|
|
|
this.logErr("DNSTaskExecutor", err.Error())
|
2022-04-18 18:21:29 +08:00
|
|
|
|
}
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}()
|
|
|
|
|
|
|
2021-08-22 11:35:33 +08:00
|
|
|
|
dnsDomain, err := dnsmodels.SharedDNSDomainDAO.FindEnabledDNSDomain(tx, domainId, nil)
|
2021-01-27 23:00:02 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
if dnsDomain == nil {
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
providerId := int64(dnsDomain.ProviderId)
|
|
|
|
|
|
if providerId <= 0 {
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
provider, err := dnsmodels.SharedDNSProviderDAO.FindEnabledDNSProvider(tx, providerId)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
if provider == nil {
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
manager := dnsclients.FindProvider(provider.Type)
|
|
|
|
|
|
if manager == nil {
|
2022-04-23 12:32:30 +08:00
|
|
|
|
this.logErr("DNSTaskExecutor", "unsupported dns provider type '"+provider.Type+"'")
|
2021-01-27 23:00:02 +08:00
|
|
|
|
isOk = true
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
params, err := provider.DecodeAPIParams()
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
err = manager.Auth(params)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
records, err := manager.GetRecords(dnsDomain.Name)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
recordsJSON, err := json.Marshal(records)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
err = dnsmodels.SharedDNSDomainDAO.UpdateDomainRecords(tx, domainId, recordsJSON)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
isOk = true
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-18 21:00:40 +08:00
|
|
|
|
func (this *DNSTaskExecutor) findDNSManagerWithClusterId(tx *dbs.Tx, clusterId int64) (manager dnsclients.ProviderInterface, domainId int64, domain string, clusterDNSName string, dnsConfig *dnsconfigs.ClusterDNSConfig, err error) {
|
2021-08-22 11:35:33 +08:00
|
|
|
|
clusterDNS, err := models.SharedNodeClusterDAO.FindClusterDNSInfo(tx, clusterId, nil)
|
2021-01-27 23:00:02 +08:00
|
|
|
|
if err != nil {
|
2021-09-20 16:37:48 +08:00
|
|
|
|
return nil, 0, "", "", nil, err
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
if clusterDNS == nil || len(clusterDNS.DnsName) == 0 || clusterDNS.DnsDomainId <= 0 {
|
2021-09-20 16:37:48 +08:00
|
|
|
|
return nil, 0, "", "", nil, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-09-20 20:01:21 +08:00
|
|
|
|
dnsConfig, err = clusterDNS.DecodeDNSConfig()
|
2021-09-20 16:37:48 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, 0, "", "", nil, err
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-18 21:00:40 +08:00
|
|
|
|
dnsDomain, manager, err := this.findDNSManagerWithDomainId(tx, int64(clusterDNS.DnsDomainId))
|
2021-01-27 23:00:02 +08:00
|
|
|
|
if err != nil {
|
2021-09-20 16:37:48 +08:00
|
|
|
|
return nil, 0, "", "", nil, err
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
2022-04-18 21:00:40 +08:00
|
|
|
|
|
2021-01-27 23:00:02 +08:00
|
|
|
|
if dnsDomain == nil {
|
2022-04-18 21:00:40 +08:00
|
|
|
|
return nil, 0, "", clusterDNS.DnsName, dnsConfig, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return manager, int64(dnsDomain.Id), dnsDomain.Name, clusterDNS.DnsName, dnsConfig, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (this *DNSTaskExecutor) findDNSManagerWithDomainId(tx *dbs.Tx, domainId int64) (*dnsmodels.DNSDomain, dnsclients.ProviderInterface, error) {
|
|
|
|
|
|
dnsDomain, err := dnsmodels.SharedDNSDomainDAO.FindEnabledDNSDomain(tx, domainId, nil)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
if dnsDomain == nil {
|
|
|
|
|
|
return nil, nil, nil
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
providerId := int64(dnsDomain.ProviderId)
|
|
|
|
|
|
if providerId <= 0 {
|
2022-04-18 21:00:40 +08:00
|
|
|
|
return nil, nil, nil
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
provider, err := dnsmodels.SharedDNSProviderDAO.FindEnabledDNSProvider(tx, providerId)
|
|
|
|
|
|
if err != nil {
|
2022-04-18 21:00:40 +08:00
|
|
|
|
return nil, nil, err
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
if provider == nil {
|
2022-04-18 21:00:40 +08:00
|
|
|
|
return nil, nil, nil
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2022-04-18 21:00:40 +08:00
|
|
|
|
var manager = dnsclients.FindProvider(provider.Type)
|
2021-01-27 23:00:02 +08:00
|
|
|
|
if manager == nil {
|
2022-04-23 12:32:30 +08:00
|
|
|
|
this.logErr("DNSTaskExecutor", "unsupported dns provider type '"+provider.Type+"'")
|
2022-04-18 21:00:40 +08:00
|
|
|
|
return nil, nil, nil
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
params, err := provider.DecodeAPIParams()
|
|
|
|
|
|
if err != nil {
|
2022-04-18 21:00:40 +08:00
|
|
|
|
return nil, nil, err
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
err = manager.Auth(params)
|
|
|
|
|
|
if err != nil {
|
2022-04-18 21:00:40 +08:00
|
|
|
|
return nil, nil, err
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|
2022-04-18 21:00:40 +08:00
|
|
|
|
return dnsDomain, manager, nil
|
2021-01-27 23:00:02 +08:00
|
|
|
|
}
|