Files
EdgeAPI/internal/db/models/nameservers/ns_key_dao.go
2022-07-24 09:56:27 +08:00

210 lines
4.6 KiB
Go

package nameservers
import (
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
"github.com/TeaOSLab/EdgeAPI/internal/errors"
"github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
_ "github.com/go-sql-driver/mysql"
"github.com/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/dbs"
)
const (
NSKeyStateEnabled = 1 // 已启用
NSKeyStateDisabled = 0 // 已禁用
)
type NSKeyDAO dbs.DAO
func NewNSKeyDAO() *NSKeyDAO {
return dbs.NewDAO(&NSKeyDAO{
DAOObject: dbs.DAOObject{
DB: Tea.Env,
Table: "edgeNSKeys",
Model: new(NSKey),
PkName: "id",
},
}).(*NSKeyDAO)
}
var SharedNSKeyDAO *NSKeyDAO
func init() {
dbs.OnReady(func() {
SharedNSKeyDAO = NewNSKeyDAO()
})
}
// EnableNSKey 启用条目
func (this *NSKeyDAO) EnableNSKey(tx *dbs.Tx, id int64) error {
_, err := this.Query(tx).
Pk(id).
Set("state", NSKeyStateEnabled).
Update()
return err
}
// DisableNSKey 禁用条目
func (this *NSKeyDAO) DisableNSKey(tx *dbs.Tx, keyId int64) error {
_, err := this.Query(tx).
Pk(keyId).
Set("state", NSKeyStateDisabled).
Update()
if err != nil {
return err
}
return this.NotifyUpdate(tx, keyId)
}
// FindEnabledNSKey 查找启用中的条目
func (this *NSKeyDAO) FindEnabledNSKey(tx *dbs.Tx, id int64) (*NSKey, error) {
result, err := this.Query(tx).
Pk(id).
Attr("state", NSKeyStateEnabled).
Find()
if result == nil {
return nil, err
}
return result.(*NSKey), err
}
// FindNSKeyName 根据主键查找名称
func (this *NSKeyDAO) FindNSKeyName(tx *dbs.Tx, id int64) (string, error) {
return this.Query(tx).
Pk(id).
Result("name").
FindStringCol("")
}
// CreateKey 创建Key
func (this *NSKeyDAO) CreateKey(tx *dbs.Tx, domainId int64, zoneId int64, name string, algo dnsconfigs.KeyAlgorithmType, secret string, secretType string) (int64, error) {
var op = NewNSKeyOperator()
op.DomainId = domainId
op.ZoneId = zoneId
op.Name = name
op.Algo = algo
op.Secret = secret
op.SecretType = secretType
op.State = NSKeyStateEnabled
keyId, err := this.SaveInt64(tx, op)
if err != nil {
return 0, err
}
err = this.NotifyUpdate(tx, keyId)
if err != nil {
return keyId, err
}
return keyId, nil
}
// UpdateKey 修改Key
func (this *NSKeyDAO) UpdateKey(tx *dbs.Tx, keyId int64, name string, algo dnsconfigs.KeyAlgorithmType, secret string, secretType string, isOn bool) error {
if keyId <= 0 {
return errors.New("invalid keyId")
}
var op = NewNSKeyOperator()
op.Id = keyId
op.Name = name
op.Algo = algo
op.Secret = secret
op.SecretType = secretType
op.IsOn = isOn
err := this.Save(tx, op)
if err != nil {
return err
}
return this.NotifyUpdate(tx, keyId)
}
// CountEnabledKeys 计算Key的数量
func (this *NSKeyDAO) CountEnabledKeys(tx *dbs.Tx, domainId int64, zoneId int64) (int64, error) {
var query = this.Query(tx).
State(NSKeyStateEnabled)
if domainId > 0 {
query.Attr("domainId", domainId)
}
if zoneId > 0 {
query.Attr("zoneId", zoneId)
}
return query.Count()
}
// ListEnabledKeys 列出单页Key
func (this *NSKeyDAO) ListEnabledKeys(tx *dbs.Tx, domainId int64, zoneId int64, offset int64, size int64) (result []*NSKey, err error) {
var query = this.Query(tx).
State(NSKeyStateEnabled)
if domainId > 0 {
query.Attr("domainId", domainId)
}
if zoneId > 0 {
query.Attr("zoneId", zoneId)
}
_, err = query.
DescPk().
Offset(offset).
Limit(size).
Slice(&result).
FindAll()
return
}
// IncreaseVersion 增加版本
func (this *NSKeyDAO) IncreaseVersion(tx *dbs.Tx) (int64, error) {
return models.SharedSysLockerDAO.Increase(tx, "NS_KEY_VERSION", 1)
}
// ListKeysAfterVersion 列出某个版本后的密钥
func (this *NSKeyDAO) ListKeysAfterVersion(tx *dbs.Tx, version int64, size int64) (result []*NSKey, err error) {
if size <= 0 {
size = 10000
}
_, err = this.Query(tx).
Gte("version", version).
Limit(size).
Asc("version").
Slice(&result).
FindAll()
return
}
// NotifyUpdate 通知更新
func (this *NSKeyDAO) NotifyUpdate(tx *dbs.Tx, keyId int64) error {
version, err := this.IncreaseVersion(tx)
if err != nil {
return err
}
err = this.Query(tx).
Pk(keyId).
Set("version", version).
UpdateQuickly()
if err != nil {
return err
}
// 通知集群
domainId, err := this.Query(tx).
Pk(keyId).
Result("domainId").
FindInt64Col(0)
if err != nil {
return err
}
if domainId > 0 {
clusterId, err := SharedNSDomainDAO.FindEnabledDomainClusterId(tx, domainId)
if err != nil {
return err
}
if clusterId > 0 {
err = models.SharedNodeTaskDAO.CreateClusterTask(tx, nodeconfigs.NodeRoleDNS, clusterId, 0, models.NSNodeTaskTypeKeyChanged)
if err != nil {
return err
}
}
}
return nil
}