mirror of
https://github.com/TeaOSLab/EdgeAPI.git
synced 2026-02-15 23:05:37 +08:00
删除不必要的文件
This commit is contained in:
@@ -1,174 +0,0 @@
|
|||||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
|
||||||
|
|
||||||
package nameservers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models/nameservers"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
timeutil "github.com/iwind/TeaGo/utils/time"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NSService 域名服务
|
|
||||||
type NSService struct {
|
|
||||||
services.BaseService
|
|
||||||
}
|
|
||||||
|
|
||||||
// ComposeNSBoard 组合看板数据
|
|
||||||
func (this *NSService) ComposeNSBoard(ctx context.Context, req *pb.ComposeNSBoardRequest) (*pb.ComposeNSBoardResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
var result = &pb.ComposeNSBoardResponse{}
|
|
||||||
|
|
||||||
// 域名
|
|
||||||
countDomains, err := nameservers.SharedNSDomainDAO.CountAllEnabledDomains(tx, 0, 0, "")
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
result.CountNSDomains = countDomains
|
|
||||||
|
|
||||||
// 记录
|
|
||||||
countRecords, err := nameservers.SharedNSRecordDAO.CountAllEnabledRecords(tx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
result.CountNSRecords = countRecords
|
|
||||||
|
|
||||||
// 集群数
|
|
||||||
countClusters, err := models.SharedNSClusterDAO.CountAllEnabledClusters(tx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
result.CountNSClusters = countClusters
|
|
||||||
|
|
||||||
// 节点数
|
|
||||||
countNodes, err := models.SharedNSNodeDAO.CountAllEnabledNodes(tx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
result.CountNSNodes = countNodes
|
|
||||||
|
|
||||||
// 离线节点数
|
|
||||||
countOfflineNodes, err := models.SharedNSNodeDAO.CountAllOfflineNodes(tx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
result.CountOfflineNSNodes = countOfflineNodes
|
|
||||||
|
|
||||||
// 按小时统计
|
|
||||||
hourFrom := timeutil.Format("YmdH", time.Now().Add(-23*time.Hour))
|
|
||||||
hourTo := timeutil.Format("YmdH")
|
|
||||||
hourlyStats, err := nameservers.SharedNSRecordHourlyStatDAO.FindHourlyStats(tx, hourFrom, hourTo)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
for _, stat := range hourlyStats {
|
|
||||||
result.HourlyTrafficStats = append(result.HourlyTrafficStats, &pb.ComposeNSBoardResponse_HourlyTrafficStat{
|
|
||||||
Hour: stat.Hour,
|
|
||||||
Bytes: int64(stat.Bytes),
|
|
||||||
CountRequests: int64(stat.CountRequests),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 按天统计
|
|
||||||
dayFrom := timeutil.Format("Ymd", time.Now().AddDate(0, 0, -14))
|
|
||||||
dayTo := timeutil.Format("Ymd")
|
|
||||||
dailyStats, err := nameservers.SharedNSRecordHourlyStatDAO.FindDailyStats(tx, dayFrom, dayTo)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
for _, stat := range dailyStats {
|
|
||||||
result.DailyTrafficStats = append(result.DailyTrafficStats, &pb.ComposeNSBoardResponse_DailyTrafficStat{
|
|
||||||
Day: stat.Day,
|
|
||||||
Bytes: int64(stat.Bytes),
|
|
||||||
CountRequests: int64(stat.CountRequests),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 域名排行
|
|
||||||
topDomainStats, err := nameservers.SharedNSRecordHourlyStatDAO.ListTopDomains(tx, hourFrom, hourTo, 10)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
for _, stat := range topDomainStats {
|
|
||||||
domainName, err := nameservers.SharedNSDomainDAO.FindNSDomainName(tx, int64(stat.DomainId))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if len(domainName) == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
result.TopNSDomainStats = append(result.TopNSDomainStats, &pb.ComposeNSBoardResponse_DomainStat{
|
|
||||||
NsDomainId: int64(stat.DomainId),
|
|
||||||
NsDomainName: domainName,
|
|
||||||
CountRequests: int64(stat.CountRequests),
|
|
||||||
Bytes: int64(stat.Bytes),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 节点排行
|
|
||||||
topNodeStats, err := nameservers.SharedNSRecordHourlyStatDAO.ListTopNodes(tx, hourFrom, hourTo, 10)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
for _, stat := range topNodeStats {
|
|
||||||
nodeName, err := models.SharedNSNodeDAO.FindEnabledNSNodeName(tx, int64(stat.NodeId))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if len(nodeName) == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
result.TopNSNodeStats = append(result.TopNSNodeStats, &pb.ComposeNSBoardResponse_NodeStat{
|
|
||||||
NsClusterId: int64(stat.ClusterId),
|
|
||||||
NsNodeId: int64(stat.NodeId),
|
|
||||||
NsNodeName: nodeName,
|
|
||||||
CountRequests: int64(stat.CountRequests),
|
|
||||||
Bytes: int64(stat.Bytes),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// CPU、内存、负载
|
|
||||||
cpuValues, err := models.SharedNodeValueDAO.ListValuesForNSNodes(tx, nodeconfigs.NodeValueItemCPU, "usage", nodeconfigs.NodeValueRangeMinute)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
for _, v := range cpuValues {
|
|
||||||
result.CpuNodeValues = append(result.CpuNodeValues, &pb.NodeValue{
|
|
||||||
ValueJSON: v.Value,
|
|
||||||
CreatedAt: int64(v.CreatedAt),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
memoryValues, err := models.SharedNodeValueDAO.ListValuesForNSNodes(tx, nodeconfigs.NodeValueItemMemory, "usage", nodeconfigs.NodeValueRangeMinute)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
for _, v := range memoryValues {
|
|
||||||
result.MemoryNodeValues = append(result.MemoryNodeValues, &pb.NodeValue{
|
|
||||||
ValueJSON: v.Value,
|
|
||||||
CreatedAt: int64(v.CreatedAt),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
loadValues, err := models.SharedNodeValueDAO.ListValuesForNSNodes(tx, nodeconfigs.NodeValueItemLoad, "load1m", nodeconfigs.NodeValueRangeMinute)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
for _, v := range loadValues {
|
|
||||||
result.LoadNodeValues = append(result.LoadNodeValues, &pb.NodeValue{
|
|
||||||
ValueJSON: v.Value,
|
|
||||||
CreatedAt: int64(v.CreatedAt),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
@@ -1,125 +0,0 @@
|
|||||||
package nameservers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models/nameservers"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
|
|
||||||
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/types"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NSAccessLogService 访问日志相关服务
|
|
||||||
type NSAccessLogService struct {
|
|
||||||
services.BaseService
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateNSAccessLogs 创建访问日志
|
|
||||||
func (this *NSAccessLogService) CreateNSAccessLogs(ctx context.Context, req *pb.CreateNSAccessLogsRequest) (*pb.CreateNSAccessLogsResponse, error) {
|
|
||||||
// 校验请求
|
|
||||||
_, _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeDNS)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(req.NsAccessLogs) == 0 {
|
|
||||||
return &pb.CreateNSAccessLogsResponse{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
|
|
||||||
err = models.SharedNSAccessLogDAO.CreateNSAccessLogs(tx, req.NsAccessLogs)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &pb.CreateNSAccessLogsResponse{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListNSAccessLogs 列出单页访问日志
|
|
||||||
func (this *NSAccessLogService) ListNSAccessLogs(ctx context.Context, req *pb.ListNSAccessLogsRequest) (*pb.ListNSAccessLogsResponse, error) {
|
|
||||||
// 校验请求
|
|
||||||
_, userId, err := this.ValidateAdminAndUser(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
|
|
||||||
// 检查服务ID
|
|
||||||
if userId > 0 {
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
accessLogs, requestId, hasMore, err := models.SharedNSAccessLogDAO.ListAccessLogs(tx, req.RequestId, req.Size, req.Day, req.NsClusterId, req.NsNodeId, req.NsDomainId, req.NsRecordId, req.RecordType, req.Keyword, req.Reverse)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var result = []*pb.NSAccessLog{}
|
|
||||||
for _, accessLog := range accessLogs {
|
|
||||||
a, err := accessLog.ToPB()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 线路
|
|
||||||
if len(a.NsRouteCodes) > 0 {
|
|
||||||
for _, routeCode := range a.NsRouteCodes {
|
|
||||||
route, err := nameservers.SharedNSRouteDAO.FindEnabledRouteWithCode(nil, routeCode)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if route != nil {
|
|
||||||
a.NsRoutes = append(a.NsRoutes, &pb.NSRoute{
|
|
||||||
Id: types.Int64(route.Id),
|
|
||||||
IsOn: route.IsOn,
|
|
||||||
Name: route.Name,
|
|
||||||
Code: routeCode,
|
|
||||||
NsCluster: nil,
|
|
||||||
NsDomain: nil,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result = append(result, a)
|
|
||||||
}
|
|
||||||
|
|
||||||
return &pb.ListNSAccessLogsResponse{
|
|
||||||
NsAccessLogs: result,
|
|
||||||
HasMore: hasMore,
|
|
||||||
RequestId: requestId,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindNSAccessLog 查找单个日志
|
|
||||||
func (this *NSAccessLogService) FindNSAccessLog(ctx context.Context, req *pb.FindNSAccessLogRequest) (*pb.FindNSAccessLogResponse, error) {
|
|
||||||
// 校验请求
|
|
||||||
_, userId, err := this.ValidateAdminAndUser(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
|
|
||||||
accessLog, err := models.SharedNSAccessLogDAO.FindAccessLogWithRequestId(tx, req.RequestId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if accessLog == nil {
|
|
||||||
return &pb.FindNSAccessLogResponse{NsAccessLog: nil}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 检查权限
|
|
||||||
if userId > 0 {
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
a, err := accessLog.ToPB()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &pb.FindNSAccessLogResponse{NsAccessLog: a}, nil
|
|
||||||
}
|
|
||||||
@@ -1,366 +0,0 @@
|
|||||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
|
||||||
|
|
||||||
package nameservers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NSClusterService 域名服务集群相关服务
|
|
||||||
type NSClusterService struct {
|
|
||||||
services.BaseService
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateNSCluster 创建集群
|
|
||||||
func (this *NSClusterService) CreateNSCluster(ctx context.Context, req *pb.CreateNSClusterRequest) (*pb.CreateNSClusterResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var tx = this.NullTx()
|
|
||||||
clusterId, err := models.SharedNSClusterDAO.CreateCluster(tx, req.Name, req.AccessLogJSON)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &pb.CreateNSClusterResponse{NsClusterId: clusterId}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateNSCluster 修改集群
|
|
||||||
func (this *NSClusterService) UpdateNSCluster(ctx context.Context, req *pb.UpdateNSClusterRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = models.SharedNSClusterDAO.UpdateCluster(tx, req.NsClusterId, req.Name, req.IsOn)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindNSClusterAccessLog 查找集群访问日志配置
|
|
||||||
func (this *NSClusterService) FindNSClusterAccessLog(ctx context.Context, req *pb.FindNSClusterAccessLogRequest) (*pb.FindNSClusterAccessLogResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
accessLogJSON, err := models.SharedNSClusterDAO.FindClusterAccessLog(tx, req.NsClusterId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &pb.FindNSClusterAccessLogResponse{AccessLogJSON: accessLogJSON}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateNSClusterAccessLog 修改集群访问日志配置
|
|
||||||
func (this *NSClusterService) UpdateNSClusterAccessLog(ctx context.Context, req *pb.UpdateNSClusterAccessLogRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = models.SharedNSClusterDAO.UpdateClusterAccessLog(tx, req.NsClusterId, req.AccessLogJSON)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteNSCluster 删除集群
|
|
||||||
func (this *NSClusterService) DeleteNSCluster(ctx context.Context, req *pb.DeleteNSCluster) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = models.SharedNSClusterDAO.DisableNSCluster(tx, req.NsClusterId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 删除任务
|
|
||||||
err = models.SharedNodeTaskDAO.DeleteAllClusterTasks(tx, nodeconfigs.NodeRoleDNS, req.NsClusterId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindEnabledNSCluster 查找单个可用集群信息
|
|
||||||
func (this *NSClusterService) FindEnabledNSCluster(ctx context.Context, req *pb.FindEnabledNSClusterRequest) (*pb.FindEnabledNSClusterResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var tx = this.NullTx()
|
|
||||||
cluster, err := models.SharedNSClusterDAO.FindEnabledNSCluster(tx, req.NsClusterId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if cluster == nil {
|
|
||||||
return &pb.FindEnabledNSClusterResponse{NsCluster: nil}, nil
|
|
||||||
}
|
|
||||||
return &pb.FindEnabledNSClusterResponse{NsCluster: &pb.NSCluster{
|
|
||||||
Id: int64(cluster.Id),
|
|
||||||
IsOn: cluster.IsOn,
|
|
||||||
Name: cluster.Name,
|
|
||||||
InstallDir: cluster.InstallDir,
|
|
||||||
TcpJSON: cluster.Tcp,
|
|
||||||
TlsJSON: cluster.Tls,
|
|
||||||
UdpJSON: cluster.Udp,
|
|
||||||
}}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CountAllEnabledNSClusters 计算所有可用集群的数量
|
|
||||||
func (this *NSClusterService) CountAllEnabledNSClusters(ctx context.Context, req *pb.CountAllEnabledNSClustersRequest) (*pb.RPCCountResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var tx = this.NullTx()
|
|
||||||
count, err := models.SharedNSClusterDAO.CountAllEnabledClusters(tx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.SuccessCount(count)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListEnabledNSClusters 列出单页可用集群
|
|
||||||
func (this *NSClusterService) ListEnabledNSClusters(ctx context.Context, req *pb.ListEnabledNSClustersRequest) (*pb.ListEnabledNSClustersResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var tx = this.NullTx()
|
|
||||||
clusters, err := models.SharedNSClusterDAO.ListEnabledClusters(tx, req.Offset, req.Size)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var pbClusters = []*pb.NSCluster{}
|
|
||||||
for _, cluster := range clusters {
|
|
||||||
pbClusters = append(pbClusters, &pb.NSCluster{
|
|
||||||
Id: int64(cluster.Id),
|
|
||||||
IsOn: cluster.IsOn,
|
|
||||||
Name: cluster.Name,
|
|
||||||
InstallDir: cluster.InstallDir,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return &pb.ListEnabledNSClustersResponse{NsClusters: pbClusters}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindAllEnabledNSClusters 查找所有可用集群
|
|
||||||
func (this *NSClusterService) FindAllEnabledNSClusters(ctx context.Context, req *pb.FindAllEnabledNSClustersRequest) (*pb.FindAllEnabledNSClustersResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var tx = this.NullTx()
|
|
||||||
clusters, err := models.SharedNSClusterDAO.FindAllEnabledClusters(tx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var pbClusters = []*pb.NSCluster{}
|
|
||||||
for _, cluster := range clusters {
|
|
||||||
pbClusters = append(pbClusters, &pb.NSCluster{
|
|
||||||
Id: int64(cluster.Id),
|
|
||||||
IsOn: cluster.IsOn,
|
|
||||||
Name: cluster.Name,
|
|
||||||
InstallDir: cluster.InstallDir,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return &pb.FindAllEnabledNSClustersResponse{NsClusters: pbClusters}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateNSClusterRecursionConfig 设置递归DNS配置
|
|
||||||
func (this *NSClusterService) UpdateNSClusterRecursionConfig(ctx context.Context, req *pb.UpdateNSClusterRecursionConfigRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 校验配置
|
|
||||||
var config = &dnsconfigs.RecursionConfig{}
|
|
||||||
err = json.Unmarshal(req.RecursionJSON, config)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = models.SharedNSClusterDAO.UpdateRecursion(tx, req.NsClusterId, req.RecursionJSON)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindNSClusterRecursionConfig 读取递归DNS配置
|
|
||||||
func (this *NSClusterService) FindNSClusterRecursionConfig(ctx context.Context, req *pb.FindNSClusterRecursionConfigRequest) (*pb.FindNSClusterRecursionConfigResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
recursion, err := models.SharedNSClusterDAO.FindClusterRecursion(tx, req.NsClusterId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &pb.FindNSClusterRecursionConfigResponse{
|
|
||||||
RecursionJSON: recursion,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindNSClusterTCPConfig 查找集群的TCP设置
|
|
||||||
func (this *NSClusterService) FindNSClusterTCPConfig(ctx context.Context, req *pb.FindNSClusterTCPConfigRequest) (*pb.FindNSClusterTCPConfigResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
tcpJSON, err := models.SharedNSClusterDAO.FindClusterTCP(tx, req.NsClusterId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &pb.FindNSClusterTCPConfigResponse{
|
|
||||||
TcpJSON: tcpJSON,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateNSClusterTCP 修改集群的TCP设置
|
|
||||||
func (this *NSClusterService) UpdateNSClusterTCP(ctx context.Context, req *pb.UpdateNSClusterTCPRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var config = &serverconfigs.TCPProtocolConfig{}
|
|
||||||
err = json.Unmarshal(req.TcpJSON, config)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = models.SharedNSClusterDAO.UpdateClusterTCP(tx, req.NsClusterId, config)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindNSClusterTLSConfig 查找集群的TLS设置
|
|
||||||
func (this *NSClusterService) FindNSClusterTLSConfig(ctx context.Context, req *pb.FindNSClusterTLSConfigRequest) (*pb.FindNSClusterTLSConfigResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
tlsJSON, err := models.SharedNSClusterDAO.FindClusterTLS(tx, req.NsClusterId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &pb.FindNSClusterTLSConfigResponse{
|
|
||||||
TlsJSON: tlsJSON,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateNSClusterTLS 修改集群的TLS设置
|
|
||||||
func (this *NSClusterService) UpdateNSClusterTLS(ctx context.Context, req *pb.UpdateNSClusterTLSRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var config = &serverconfigs.TLSProtocolConfig{}
|
|
||||||
err = json.Unmarshal(req.TlsJSON, config)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = models.SharedNSClusterDAO.UpdateClusterTLS(tx, req.NsClusterId, config)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindNSClusterUDPConfig 查找集群的UDP设置
|
|
||||||
func (this *NSClusterService) FindNSClusterUDPConfig(ctx context.Context, req *pb.FindNSClusterUDPConfigRequest) (*pb.FindNSClusterUDPConfigResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
udpJSON, err := models.SharedNSClusterDAO.FindClusterUDP(tx, req.NsClusterId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &pb.FindNSClusterUDPConfigResponse{
|
|
||||||
UdpJSON: udpJSON,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateNSClusterUDP 修改集群的UDP设置
|
|
||||||
func (this *NSClusterService) UpdateNSClusterUDP(ctx context.Context, req *pb.UpdateNSClusterUDPRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var config = &serverconfigs.UDPProtocolConfig{}
|
|
||||||
err = json.Unmarshal(req.UdpJSON, config)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = models.SharedNSClusterDAO.UpdateClusterUDP(tx, req.NsClusterId, config)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// CountAllNSClustersWithSSLCertId 计算使用某个SSL证书的集群数量
|
|
||||||
func (this *NSClusterService) CountAllNSClustersWithSSLCertId(ctx context.Context, req *pb.CountAllNSClustersWithSSLCertIdRequest) (*pb.RPCCountResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
policyIds, err := models.SharedSSLPolicyDAO.FindAllEnabledPolicyIdsWithCertId(tx, req.SslCertId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if len(policyIds) == 0 {
|
|
||||||
return this.SuccessCount(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
count, err := models.SharedNSClusterDAO.CountAllClustersWithSSLPolicyIds(tx, policyIds)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.SuccessCount(count)
|
|
||||||
}
|
|
||||||
@@ -1,259 +0,0 @@
|
|||||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
|
||||||
|
|
||||||
package nameservers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models/nameservers"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
|
|
||||||
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/utils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NSDomainService 域名相关服务
|
|
||||||
type NSDomainService struct {
|
|
||||||
services.BaseService
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateNSDomain 创建域名
|
|
||||||
func (this *NSDomainService) CreateNSDomain(ctx context.Context, req *pb.CreateNSDomainRequest) (*pb.CreateNSDomainResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
domainId, err := nameservers.SharedNSDomainDAO.CreateDomain(tx, req.NsClusterId, req.UserId, req.Name)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &pb.CreateNSDomainResponse{NsDomainId: domainId}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateNSDomain 修改域名
|
|
||||||
func (this *NSDomainService) UpdateNSDomain(ctx context.Context, req *pb.UpdateNSDomainRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = nameservers.SharedNSDomainDAO.UpdateDomain(tx, req.NsDomainId, req.NsClusterId, req.UserId, req.IsOn)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteNSDomain 删除域名
|
|
||||||
func (this *NSDomainService) DeleteNSDomain(ctx context.Context, req *pb.DeleteNSDomainRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = nameservers.SharedNSDomainDAO.DisableNSDomain(tx, req.NsDomainId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindEnabledNSDomain 查找单个域名
|
|
||||||
func (this *NSDomainService) FindEnabledNSDomain(ctx context.Context, req *pb.FindEnabledNSDomainRequest) (*pb.FindEnabledNSDomainResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
domain, err := nameservers.SharedNSDomainDAO.FindEnabledNSDomain(tx, req.NsDomainId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if domain == nil {
|
|
||||||
return &pb.FindEnabledNSDomainResponse{NsDomain: nil}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 集群
|
|
||||||
cluster, err := models.SharedNSClusterDAO.FindEnabledNSCluster(tx, int64(domain.ClusterId))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if cluster == nil {
|
|
||||||
return &pb.FindEnabledNSDomainResponse{NsDomain: nil}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 用户
|
|
||||||
var pbUser *pb.User
|
|
||||||
if domain.UserId > 0 {
|
|
||||||
user, err := models.SharedUserDAO.FindEnabledUser(tx, int64(domain.UserId), nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if user == nil {
|
|
||||||
return &pb.FindEnabledNSDomainResponse{NsDomain: nil}, nil
|
|
||||||
}
|
|
||||||
pbUser = &pb.User{
|
|
||||||
Id: int64(user.Id),
|
|
||||||
Username: user.Username,
|
|
||||||
Fullname: user.Fullname,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return &pb.FindEnabledNSDomainResponse{
|
|
||||||
NsDomain: &pb.NSDomain{
|
|
||||||
Id: int64(domain.Id),
|
|
||||||
Name: domain.Name,
|
|
||||||
IsOn: domain.IsOn,
|
|
||||||
TsigJSON: domain.Tsig,
|
|
||||||
CreatedAt: int64(domain.CreatedAt),
|
|
||||||
NsCluster: &pb.NSCluster{
|
|
||||||
Id: int64(cluster.Id),
|
|
||||||
IsOn: cluster.IsOn,
|
|
||||||
Name: cluster.Name,
|
|
||||||
},
|
|
||||||
User: pbUser,
|
|
||||||
},
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CountAllEnabledNSDomains 计算域名数量
|
|
||||||
func (this *NSDomainService) CountAllEnabledNSDomains(ctx context.Context, req *pb.CountAllEnabledNSDomainsRequest) (*pb.RPCCountResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
count, err := nameservers.SharedNSDomainDAO.CountAllEnabledDomains(tx, req.NsClusterId, req.UserId, req.Keyword)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.SuccessCount(count)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListEnabledNSDomains 列出单页域名
|
|
||||||
func (this *NSDomainService) ListEnabledNSDomains(ctx context.Context, req *pb.ListEnabledNSDomainsRequest) (*pb.ListEnabledNSDomainsResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
domains, err := nameservers.SharedNSDomainDAO.ListEnabledDomains(tx, req.NsClusterId, req.UserId, req.Keyword, req.Offset, req.Size)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
pbDomains := []*pb.NSDomain{}
|
|
||||||
var cacheMap = utils.NewCacheMap()
|
|
||||||
for _, domain := range domains {
|
|
||||||
// 集群
|
|
||||||
cluster, err := models.SharedNSClusterDAO.FindEnabledNSCluster(tx, int64(domain.ClusterId))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if cluster == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// 用户
|
|
||||||
var pbUser *pb.User
|
|
||||||
if domain.UserId > 0 {
|
|
||||||
user, err := models.SharedUserDAO.FindEnabledUser(tx, int64(domain.UserId), cacheMap)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if user == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
pbUser = &pb.User{
|
|
||||||
Id: int64(user.Id),
|
|
||||||
Username: user.Username,
|
|
||||||
Fullname: user.Fullname,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pbDomains = append(pbDomains, &pb.NSDomain{
|
|
||||||
Id: int64(domain.Id),
|
|
||||||
Name: domain.Name,
|
|
||||||
IsOn: domain.IsOn,
|
|
||||||
CreatedAt: int64(domain.CreatedAt),
|
|
||||||
TsigJSON: domain.Tsig,
|
|
||||||
NsCluster: &pb.NSCluster{
|
|
||||||
Id: int64(cluster.Id),
|
|
||||||
IsOn: cluster.IsOn,
|
|
||||||
Name: cluster.Name,
|
|
||||||
},
|
|
||||||
User: pbUser,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return &pb.ListEnabledNSDomainsResponse{NsDomains: pbDomains}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListNSDomainsAfterVersion 根据版本列出一组域名
|
|
||||||
func (this *NSDomainService) ListNSDomainsAfterVersion(ctx context.Context, req *pb.ListNSDomainsAfterVersionRequest) (*pb.ListNSDomainsAfterVersionResponse, error) {
|
|
||||||
_, _, err := this.ValidateNodeId(ctx, rpcutils.UserTypeDNS)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 集群ID
|
|
||||||
var tx = this.NullTx()
|
|
||||||
if req.Size <= 0 {
|
|
||||||
req.Size = 2000
|
|
||||||
}
|
|
||||||
domains, err := nameservers.SharedNSDomainDAO.ListDomainsAfterVersion(tx, req.Version, req.Size)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var pbDomains []*pb.NSDomain
|
|
||||||
for _, domain := range domains {
|
|
||||||
pbDomains = append(pbDomains, &pb.NSDomain{
|
|
||||||
Id: int64(domain.Id),
|
|
||||||
Name: domain.Name,
|
|
||||||
IsOn: domain.IsOn,
|
|
||||||
IsDeleted: domain.State == nameservers.NSDomainStateDisabled,
|
|
||||||
Version: int64(domain.Version),
|
|
||||||
TsigJSON: domain.Tsig,
|
|
||||||
NsCluster: &pb.NSCluster{Id: int64(domain.ClusterId)},
|
|
||||||
User: nil,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return &pb.ListNSDomainsAfterVersionResponse{NsDomains: pbDomains}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindEnabledNSDomainTSIG 查找TSIG配置
|
|
||||||
func (this *NSDomainService) FindEnabledNSDomainTSIG(ctx context.Context, req *pb.FindEnabledNSDomainTSIGRequest) (*pb.FindEnabledNSDomainTSIGResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
tsig, err := nameservers.SharedNSDomainDAO.FindEnabledDomainTSIG(tx, req.NsDomainId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &pb.FindEnabledNSDomainTSIGResponse{TsigJSON: tsig}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateNSDomainTSIG 修改TSIG配置
|
|
||||||
func (this *NSDomainService) UpdateNSDomainTSIG(ctx context.Context, req *pb.UpdateNSDomainTSIGRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = nameservers.SharedNSDomainDAO.UpdateDomainTSIG(tx, req.NsDomainId, req.TsigJSON)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
@@ -1,170 +0,0 @@
|
|||||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
|
||||||
|
|
||||||
package nameservers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models/nameservers"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NSKeyService NS密钥相关服务
|
|
||||||
type NSKeyService struct {
|
|
||||||
services.BaseService
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateNSKey 创建密钥
|
|
||||||
func (this *NSKeyService) CreateNSKey(ctx context.Context, req *pb.CreateNSKeyRequest) (*pb.CreateNSKeyResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
keyId, err := nameservers.SharedNSKeyDAO.CreateKey(tx, req.NsDomainId, req.NsZoneId, req.Name, req.Algo, req.Secret, req.SecretType)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &pb.CreateNSKeyResponse{NsKeyId: keyId}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateNSKey 修改密钥
|
|
||||||
func (this *NSKeyService) UpdateNSKey(ctx context.Context, req *pb.UpdateNSKeyRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = nameservers.SharedNSKeyDAO.UpdateKey(tx, req.NsKeyId, req.Name, req.Algo, req.Secret, req.SecretType, req.IsOn)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteNSKey 删除密钥
|
|
||||||
func (this *NSKeyService) DeleteNSKey(ctx context.Context, req *pb.DeleteNSKeyRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = nameservers.SharedNSKeyDAO.DisableNSKey(tx, req.NsKeyId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindEnabledNSKey 查找单个密钥
|
|
||||||
func (this *NSKeyService) FindEnabledNSKey(ctx context.Context, req *pb.FindEnabledNSKeyRequest) (*pb.FindEnabledNSKeyResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
key, err := nameservers.SharedNSKeyDAO.FindEnabledNSKey(tx, req.NsKeyId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if key == nil {
|
|
||||||
return &pb.FindEnabledNSKeyResponse{NsKey: nil}, nil
|
|
||||||
}
|
|
||||||
return &pb.FindEnabledNSKeyResponse{
|
|
||||||
NsKey: &pb.NSKey{
|
|
||||||
Id: int64(key.Id),
|
|
||||||
IsOn: key.IsOn,
|
|
||||||
Name: key.Name,
|
|
||||||
Algo: key.Algo,
|
|
||||||
Secret: key.Secret,
|
|
||||||
SecretType: key.SecretType,
|
|
||||||
},
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CountAllEnabledNSKeys 计算密钥数量
|
|
||||||
func (this *NSKeyService) CountAllEnabledNSKeys(ctx context.Context, req *pb.CountAllEnabledNSKeysRequest) (*pb.RPCCountResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
count, err := nameservers.SharedNSKeyDAO.CountEnabledKeys(tx, req.NsDomainId, req.NsZoneId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.SuccessCount(count)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListEnabledNSKeys 列出单页密钥
|
|
||||||
func (this *NSKeyService) ListEnabledNSKeys(ctx context.Context, req *pb.ListEnabledNSKeysRequest) (*pb.ListEnabledNSKeysResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
keys, err := nameservers.SharedNSKeyDAO.ListEnabledKeys(tx, req.NsDomainId, req.NsZoneId, req.Offset, req.Size)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var pbKeys = []*pb.NSKey{}
|
|
||||||
for _, key := range keys {
|
|
||||||
pbKeys = append(pbKeys, &pb.NSKey{
|
|
||||||
Id: int64(key.Id),
|
|
||||||
IsOn: key.IsOn,
|
|
||||||
Name: key.Name,
|
|
||||||
Algo: key.Algo,
|
|
||||||
Secret: key.Secret,
|
|
||||||
SecretType: key.SecretType,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return &pb.ListEnabledNSKeysResponse{NsKeys: pbKeys}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListNSKeysAfterVersion 根据版本列出一组密钥
|
|
||||||
func (this *NSKeyService) ListNSKeysAfterVersion(ctx context.Context, req *pb.ListNSKeysAfterVersionRequest) (*pb.ListNSKeysAfterVersionResponse, error) {
|
|
||||||
_, err := this.ValidateNSNode(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
if req.Size <= 0 {
|
|
||||||
req.Size = 2000
|
|
||||||
}
|
|
||||||
keys, err := nameservers.SharedNSKeyDAO.ListKeysAfterVersion(tx, req.Version, req.Size)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var pbKeys = []*pb.NSKey{}
|
|
||||||
for _, key := range keys {
|
|
||||||
var pbDomain *pb.NSDomain
|
|
||||||
var pbZone *pb.NSZone
|
|
||||||
|
|
||||||
if key.DomainId > 0 {
|
|
||||||
pbDomain = &pb.NSDomain{Id: int64(key.DomainId)}
|
|
||||||
}
|
|
||||||
if key.ZoneId > 0 {
|
|
||||||
pbZone = &pb.NSZone{Id: int64(key.ZoneId)}
|
|
||||||
}
|
|
||||||
|
|
||||||
pbKeys = append(pbKeys, &pb.NSKey{
|
|
||||||
Id: int64(key.Id),
|
|
||||||
IsOn: key.IsOn,
|
|
||||||
Name: "",
|
|
||||||
Algo: key.Algo,
|
|
||||||
Secret: key.Secret,
|
|
||||||
SecretType: key.SecretType,
|
|
||||||
IsDeleted: key.State == nameservers.NSKeyStateDisabled,
|
|
||||||
Version: int64(key.Version),
|
|
||||||
NsDomain: pbDomain,
|
|
||||||
NsZone: pbZone,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return &pb.ListNSKeysAfterVersionResponse{NsKeys: pbKeys}, nil
|
|
||||||
}
|
|
||||||
@@ -1,587 +0,0 @@
|
|||||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
|
||||||
|
|
||||||
package nameservers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/goman"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/installers"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
|
|
||||||
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/logs"
|
|
||||||
stringutil "github.com/iwind/TeaGo/utils/string"
|
|
||||||
"io"
|
|
||||||
"path/filepath"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NSNodeService 域名服务器节点服务
|
|
||||||
type NSNodeService struct {
|
|
||||||
services.BaseService
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindAllEnabledNSNodesWithNSClusterId 根据集群查找所有节点
|
|
||||||
func (this *NSNodeService) FindAllEnabledNSNodesWithNSClusterId(ctx context.Context, req *pb.FindAllEnabledNSNodesWithNSClusterIdRequest) (*pb.FindAllEnabledNSNodesWithNSClusterIdResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
|
|
||||||
nodes, err := models.SharedNSNodeDAO.FindAllEnabledNodesWithClusterId(tx, req.NsClusterId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
pbNodes := []*pb.NSNode{}
|
|
||||||
for _, node := range nodes {
|
|
||||||
pbNodes = append(pbNodes, &pb.NSNode{
|
|
||||||
Id: int64(node.Id),
|
|
||||||
Name: node.Name,
|
|
||||||
IsOn: node.IsOn,
|
|
||||||
UniqueId: node.UniqueId,
|
|
||||||
Secret: node.Secret,
|
|
||||||
IsInstalled: node.IsInstalled,
|
|
||||||
InstallDir: node.InstallDir,
|
|
||||||
IsUp: node.IsUp,
|
|
||||||
NsCluster: nil,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return &pb.FindAllEnabledNSNodesWithNSClusterIdResponse{NsNodes: pbNodes}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CountAllEnabledNSNodes 所有可用的节点数量
|
|
||||||
func (this *NSNodeService) CountAllEnabledNSNodes(ctx context.Context, req *pb.CountAllEnabledNSNodesRequest) (*pb.RPCCountResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
count, err := models.SharedNSNodeDAO.CountAllEnabledNodes(tx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.SuccessCount(count)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CountAllEnabledNSNodesMatch 计算匹配的节点数量
|
|
||||||
func (this *NSNodeService) CountAllEnabledNSNodesMatch(ctx context.Context, req *pb.CountAllEnabledNSNodesMatchRequest) (*pb.RPCCountResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
count, err := models.SharedNSNodeDAO.CountAllEnabledNodesMatch(tx, req.NsClusterId, configutils.ToBoolState(req.InstallState), configutils.ToBoolState(req.ActiveState), req.Keyword)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.SuccessCount(count)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListEnabledNSNodesMatch 列出单页节点
|
|
||||||
func (this *NSNodeService) ListEnabledNSNodesMatch(ctx context.Context, req *pb.ListEnabledNSNodesMatchRequest) (*pb.ListEnabledNSNodesMatchResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
nodes, err := models.SharedNSNodeDAO.ListAllEnabledNodesMatch(tx, req.NsClusterId, configutils.ToBoolState(req.InstallState), configutils.ToBoolState(req.ActiveState), req.Keyword, req.Offset, req.Size)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
pbNodes := []*pb.NSNode{}
|
|
||||||
for _, node := range nodes {
|
|
||||||
// 安装信息
|
|
||||||
installStatus, err := node.DecodeInstallStatus()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
installStatusResult := &pb.NodeInstallStatus{}
|
|
||||||
if installStatus != nil {
|
|
||||||
installStatusResult = &pb.NodeInstallStatus{
|
|
||||||
IsRunning: installStatus.IsRunning,
|
|
||||||
IsFinished: installStatus.IsFinished,
|
|
||||||
IsOk: installStatus.IsOk,
|
|
||||||
Error: installStatus.Error,
|
|
||||||
ErrorCode: installStatus.ErrorCode,
|
|
||||||
UpdatedAt: installStatus.UpdatedAt,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pbNodes = append(pbNodes, &pb.NSNode{
|
|
||||||
Id: int64(node.Id),
|
|
||||||
Name: node.Name,
|
|
||||||
IsOn: node.IsOn,
|
|
||||||
UniqueId: node.UniqueId,
|
|
||||||
Secret: node.Secret,
|
|
||||||
IsActive: node.IsActive,
|
|
||||||
IsInstalled: node.IsInstalled,
|
|
||||||
InstallDir: node.InstallDir,
|
|
||||||
IsUp: node.IsUp,
|
|
||||||
StatusJSON: node.Status,
|
|
||||||
InstallStatus: installStatusResult,
|
|
||||||
NsCluster: nil,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return &pb.ListEnabledNSNodesMatchResponse{NsNodes: pbNodes}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CountAllUpgradeNSNodesWithNSClusterId 计算需要升级的节点数量
|
|
||||||
func (this *NSNodeService) CountAllUpgradeNSNodesWithNSClusterId(ctx context.Context, req *pb.CountAllUpgradeNSNodesWithNSClusterIdRequest) (*pb.RPCCountResponse, error) {
|
|
||||||
// 校验请求
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
|
|
||||||
deployFiles := installers.SharedDeployManager.LoadNSNodeFiles()
|
|
||||||
total := int64(0)
|
|
||||||
for _, deployFile := range deployFiles {
|
|
||||||
count, err := models.SharedNSNodeDAO.CountAllLowerVersionNodesWithClusterId(tx, req.NsClusterId, deployFile.OS, deployFile.Arch, deployFile.Version)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
total += count
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.SuccessCount(total)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateNSNode 创建节点
|
|
||||||
func (this *NSNodeService) CreateNSNode(ctx context.Context, req *pb.CreateNSNodeRequest) (*pb.CreateNSNodeResponse, error) {
|
|
||||||
adminId, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
|
|
||||||
nodeId, err := models.SharedNSNodeDAO.CreateNode(tx, adminId, req.Name, req.NodeClusterId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 增加认证相关
|
|
||||||
if req.NodeLogin != nil {
|
|
||||||
_, err = models.SharedNodeLoginDAO.CreateNodeLogin(tx, nodeconfigs.NodeRoleDNS, nodeId, req.NodeLogin.Name, req.NodeLogin.Type, req.NodeLogin.Params)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return &pb.CreateNSNodeResponse{
|
|
||||||
NsNodeId: nodeId,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteNSNode 删除节点
|
|
||||||
func (this *NSNodeService) DeleteNSNode(ctx context.Context, req *pb.DeleteNSNodeRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
|
|
||||||
err = models.SharedNSNodeDAO.DisableNSNode(tx, req.NsNodeId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 删除任务
|
|
||||||
err = models.SharedNodeTaskDAO.DeleteNodeTasks(tx, nodeconfigs.NodeRoleDNS, req.NsNodeId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindEnabledNSNode 查询单个节点信息
|
|
||||||
func (this *NSNodeService) FindEnabledNSNode(ctx context.Context, req *pb.FindEnabledNSNodeRequest) (*pb.FindEnabledNSNodeResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
|
|
||||||
node, err := models.SharedNSNodeDAO.FindEnabledNSNode(tx, req.NsNodeId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if node == nil {
|
|
||||||
return &pb.FindEnabledNSNodeResponse{NsNode: nil}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 集群信息
|
|
||||||
clusterName, err := models.SharedNSClusterDAO.FindEnabledNSClusterName(tx, int64(node.ClusterId))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 认证信息
|
|
||||||
login, err := models.SharedNodeLoginDAO.FindEnabledNodeLoginWithNodeId(tx, nodeconfigs.NodeRoleDNS, req.NsNodeId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var respLogin *pb.NodeLogin = nil
|
|
||||||
if login != nil {
|
|
||||||
respLogin = &pb.NodeLogin{
|
|
||||||
Id: int64(login.Id),
|
|
||||||
Name: login.Name,
|
|
||||||
Type: login.Type,
|
|
||||||
Params: login.Params,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 安装信息
|
|
||||||
installStatus, err := node.DecodeInstallStatus()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
installStatusResult := &pb.NodeInstallStatus{}
|
|
||||||
if installStatus != nil {
|
|
||||||
installStatusResult = &pb.NodeInstallStatus{
|
|
||||||
IsRunning: installStatus.IsRunning,
|
|
||||||
IsFinished: installStatus.IsFinished,
|
|
||||||
IsOk: installStatus.IsOk,
|
|
||||||
Error: installStatus.Error,
|
|
||||||
ErrorCode: installStatus.ErrorCode,
|
|
||||||
UpdatedAt: installStatus.UpdatedAt,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return &pb.FindEnabledNSNodeResponse{NsNode: &pb.NSNode{
|
|
||||||
Id: int64(node.Id),
|
|
||||||
Name: node.Name,
|
|
||||||
StatusJSON: node.Status,
|
|
||||||
UniqueId: node.UniqueId,
|
|
||||||
Secret: node.Secret,
|
|
||||||
IsInstalled: node.IsInstalled,
|
|
||||||
InstallDir: node.InstallDir,
|
|
||||||
NsCluster: &pb.NSCluster{
|
|
||||||
Id: int64(node.ClusterId),
|
|
||||||
Name: clusterName,
|
|
||||||
},
|
|
||||||
InstallStatus: installStatusResult,
|
|
||||||
IsOn: node.IsOn,
|
|
||||||
IsActive: node.IsActive,
|
|
||||||
NodeLogin: respLogin,
|
|
||||||
}}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateNSNode 修改节点
|
|
||||||
func (this *NSNodeService) UpdateNSNode(ctx context.Context, req *pb.UpdateNSNodeRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
|
|
||||||
err = models.SharedNSNodeDAO.UpdateNode(tx, req.NsNodeId, req.Name, req.NsClusterId, req.IsOn)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 登录信息
|
|
||||||
if req.NodeLogin == nil {
|
|
||||||
err = models.SharedNodeLoginDAO.DisableNodeLogins(tx, nodeconfigs.NodeRoleDNS, req.NsNodeId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if req.NodeLogin.Id > 0 {
|
|
||||||
err = models.SharedNodeLoginDAO.UpdateNodeLogin(tx, req.NodeLogin.Id, req.NodeLogin.Name, req.NodeLogin.Type, req.NodeLogin.Params)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
_, err = models.SharedNodeLoginDAO.CreateNodeLogin(tx, nodeconfigs.NodeRoleDNS, req.NsNodeId, req.NodeLogin.Name, req.NodeLogin.Type, req.NodeLogin.Params)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// InstallNSNode 安装节点
|
|
||||||
func (this *NSNodeService) InstallNSNode(ctx context.Context, req *pb.InstallNSNodeRequest) (*pb.InstallNSNodeResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
goman.New(func() {
|
|
||||||
err = installers.SharedNSNodeQueue().InstallNodeProcess(req.NsNodeId, false)
|
|
||||||
if err != nil {
|
|
||||||
logs.Println("[RPC]install dns node:" + err.Error())
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
return &pb.InstallNSNodeResponse{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindNSNodeInstallStatus 读取节点安装状态
|
|
||||||
func (this *NSNodeService) FindNSNodeInstallStatus(ctx context.Context, req *pb.FindNSNodeInstallStatusRequest) (*pb.FindNSNodeInstallStatusResponse, error) {
|
|
||||||
// 校验请求
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
|
|
||||||
installStatus, err := models.SharedNSNodeDAO.FindNodeInstallStatus(tx, req.NsNodeId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if installStatus == nil {
|
|
||||||
return &pb.FindNSNodeInstallStatusResponse{InstallStatus: nil}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
pbInstallStatus := &pb.NodeInstallStatus{
|
|
||||||
IsRunning: installStatus.IsRunning,
|
|
||||||
IsFinished: installStatus.IsFinished,
|
|
||||||
IsOk: installStatus.IsOk,
|
|
||||||
Error: installStatus.Error,
|
|
||||||
ErrorCode: installStatus.ErrorCode,
|
|
||||||
UpdatedAt: installStatus.UpdatedAt,
|
|
||||||
}
|
|
||||||
return &pb.FindNSNodeInstallStatusResponse{InstallStatus: pbInstallStatus}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateNSNodeIsInstalled 修改节点安装状态
|
|
||||||
func (this *NSNodeService) UpdateNSNodeIsInstalled(ctx context.Context, req *pb.UpdateNSNodeIsInstalledRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
|
|
||||||
err = models.SharedNSNodeDAO.UpdateNodeIsInstalled(tx, req.NsNodeId, req.IsInstalled)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateNSNodeStatus 更新节点状态
|
|
||||||
func (this *NSNodeService) UpdateNSNodeStatus(ctx context.Context, req *pb.UpdateNSNodeStatusRequest) (*pb.RPCSuccess, error) {
|
|
||||||
// 校验节点
|
|
||||||
_, nodeId, err := this.ValidateNodeId(ctx, rpcutils.UserTypeDNS)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if req.NodeId > 0 {
|
|
||||||
nodeId = req.NodeId
|
|
||||||
}
|
|
||||||
|
|
||||||
if nodeId <= 0 {
|
|
||||||
return nil, errors.New("'nodeId' should be greater than 0")
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
|
|
||||||
// 修改时间戳
|
|
||||||
var nodeStatus = &nodeconfigs.NodeStatus{}
|
|
||||||
err = json.Unmarshal(req.StatusJSON, nodeStatus)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.New("decode node status json failed: " + err.Error())
|
|
||||||
}
|
|
||||||
nodeStatus.UpdatedAt = time.Now().Unix()
|
|
||||||
|
|
||||||
// 保存
|
|
||||||
err = models.SharedNSNodeDAO.UpdateNodeStatus(tx, nodeId, nodeStatus)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindCurrentNSNodeConfig 获取当前节点信息
|
|
||||||
func (this *NSNodeService) FindCurrentNSNodeConfig(ctx context.Context, req *pb.FindCurrentNSNodeConfigRequest) (*pb.FindCurrentNSNodeConfigResponse, error) {
|
|
||||||
// 校验节点
|
|
||||||
_, nodeId, err := this.ValidateNodeId(ctx, rpcutils.UserTypeDNS)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
config, err := models.SharedNSNodeDAO.ComposeNodeConfig(tx, nodeId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if config == nil {
|
|
||||||
return &pb.FindCurrentNSNodeConfigResponse{NsNodeJSON: nil}, nil
|
|
||||||
}
|
|
||||||
configJSON, err := json.Marshal(config)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &pb.FindCurrentNSNodeConfigResponse{NsNodeJSON: configJSON}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CheckNSNodeLatestVersion 检查新版本
|
|
||||||
func (this *NSNodeService) CheckNSNodeLatestVersion(ctx context.Context, req *pb.CheckNSNodeLatestVersionRequest) (*pb.CheckNSNodeLatestVersionResponse, error) {
|
|
||||||
_, _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin, rpcutils.UserTypeDNS)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
deployFiles := installers.SharedDeployManager.LoadNSNodeFiles()
|
|
||||||
for _, file := range deployFiles {
|
|
||||||
if file.OS == req.Os && file.Arch == req.Arch && stringutil.VersionCompare(file.Version, req.CurrentVersion) > 0 {
|
|
||||||
return &pb.CheckNSNodeLatestVersionResponse{
|
|
||||||
HasNewVersion: true,
|
|
||||||
NewVersion: file.Version,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return &pb.CheckNSNodeLatestVersionResponse{HasNewVersion: false}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DownloadNSNodeInstallationFile 下载最新DNS节点安装文件
|
|
||||||
func (this *NSNodeService) DownloadNSNodeInstallationFile(ctx context.Context, req *pb.DownloadNSNodeInstallationFileRequest) (*pb.DownloadNSNodeInstallationFileResponse, error) {
|
|
||||||
nodeId, err := this.ValidateNSNode(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var file = installers.SharedDeployManager.FindNSNodeFile(req.Os, req.Arch)
|
|
||||||
if file == nil {
|
|
||||||
return &pb.DownloadNSNodeInstallationFileResponse{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
sum, err := file.Sum()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
data, offset, err := file.Read(req.ChunkOffset)
|
|
||||||
if err != nil && err != io.EOF {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 增加下载速度监控
|
|
||||||
installers.SharedUpgradeLimiter.UpdateNodeBytes(nodeconfigs.NodeRoleDNS, nodeId, int64(len(data)))
|
|
||||||
|
|
||||||
return &pb.DownloadNSNodeInstallationFileResponse{
|
|
||||||
Sum: sum,
|
|
||||||
Offset: offset,
|
|
||||||
ChunkData: data,
|
|
||||||
Version: file.Version,
|
|
||||||
Filename: filepath.Base(file.Path),
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateNSNodeConnectedAPINodes 更改节点连接的API节点信息
|
|
||||||
func (this *NSNodeService) UpdateNSNodeConnectedAPINodes(ctx context.Context, req *pb.UpdateNSNodeConnectedAPINodesRequest) (*pb.RPCSuccess, error) {
|
|
||||||
// 校验节点
|
|
||||||
_, _, nodeId, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeDNS)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
|
|
||||||
err = models.SharedNSNodeDAO.UpdateNodeConnectedAPINodes(tx, nodeId, req.ApiNodeIds)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Wrap(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateNSNodeLogin 修改节点登录信息
|
|
||||||
func (this *NSNodeService) UpdateNSNodeLogin(ctx context.Context, req *pb.UpdateNSNodeLoginRequest) (*pb.RPCSuccess, error) {
|
|
||||||
// 校验请求
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
|
|
||||||
if req.NodeLogin.Id <= 0 {
|
|
||||||
_, err := models.SharedNodeLoginDAO.CreateNodeLogin(tx, nodeconfigs.NodeRoleDNS, req.NsNodeId, req.NodeLogin.Name, req.NodeLogin.Type, req.NodeLogin.Params)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
err = models.SharedNodeLoginDAO.UpdateNodeLogin(tx, req.NodeLogin.Id, req.NodeLogin.Name, req.NodeLogin.Type, req.NodeLogin.Params)
|
|
||||||
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// StartNSNode 启动节点
|
|
||||||
func (this *NSNodeService) StartNSNode(ctx context.Context, req *pb.StartNSNodeRequest) (*pb.StartNSNodeResponse, error) {
|
|
||||||
// 校验节点
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = installers.SharedNSNodeQueue().StartNode(req.NsNodeId)
|
|
||||||
if err != nil {
|
|
||||||
return &pb.StartNSNodeResponse{
|
|
||||||
IsOk: false,
|
|
||||||
Error: err.Error(),
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 修改状态
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = models.SharedNSNodeDAO.UpdateNodeActive(tx, req.NsNodeId, true)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &pb.StartNSNodeResponse{IsOk: true}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// StopNSNode 停止节点
|
|
||||||
func (this *NSNodeService) StopNSNode(ctx context.Context, req *pb.StopNSNodeRequest) (*pb.StopNSNodeResponse, error) {
|
|
||||||
// 校验节点
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = installers.SharedNSNodeQueue().StopNode(req.NsNodeId)
|
|
||||||
if err != nil {
|
|
||||||
return &pb.StopNSNodeResponse{
|
|
||||||
IsOk: false,
|
|
||||||
Error: err.Error(),
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 修改状态
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = models.SharedNSNodeDAO.UpdateNodeActive(tx, req.NsNodeId, false)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &pb.StopNSNodeResponse{IsOk: true}, nil
|
|
||||||
}
|
|
||||||
@@ -1,317 +0,0 @@
|
|||||||
package nameservers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/goman"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/remotelogs"
|
|
||||||
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/messageconfigs"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/dbs"
|
|
||||||
"github.com/iwind/TeaGo/logs"
|
|
||||||
"strconv"
|
|
||||||
"sync"
|
|
||||||
"sync/atomic"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// CommandRequest 命令请求相关
|
|
||||||
type CommandRequest struct {
|
|
||||||
Id int64
|
|
||||||
Code string
|
|
||||||
CommandJSON []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
type CommandRequestWaiting struct {
|
|
||||||
Timestamp int64
|
|
||||||
Chan chan *pb.NSNodeStreamMessage
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *CommandRequestWaiting) Close() {
|
|
||||||
defer func() {
|
|
||||||
recover()
|
|
||||||
}()
|
|
||||||
|
|
||||||
close(this.Chan)
|
|
||||||
}
|
|
||||||
|
|
||||||
var responseChanMap = map[int64]*CommandRequestWaiting{} // request id => response
|
|
||||||
var commandRequestId = int64(0)
|
|
||||||
|
|
||||||
var nodeLocker = &sync.Mutex{}
|
|
||||||
var requestChanMap = map[int64]chan *CommandRequest{} // node id => chan
|
|
||||||
|
|
||||||
func NextCommandRequestId() int64 {
|
|
||||||
return atomic.AddInt64(&commandRequestId, 1)
|
|
||||||
}
|
|
||||||
func init() {
|
|
||||||
dbs.OnReadyDone(func() {
|
|
||||||
// 清理WaitingChannelMap
|
|
||||||
goman.New(func() {
|
|
||||||
ticker := time.NewTicker(30 * time.Second)
|
|
||||||
for range ticker.C {
|
|
||||||
nodeLocker.Lock()
|
|
||||||
for requestId, request := range responseChanMap {
|
|
||||||
if time.Now().Unix()-request.Timestamp > 3600 {
|
|
||||||
responseChanMap[requestId].Close()
|
|
||||||
delete(responseChanMap, requestId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nodeLocker.Unlock()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// 自动同步连接到本API节点的NS节点任务
|
|
||||||
goman.New(func() {
|
|
||||||
defer func() {
|
|
||||||
_ = recover()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// TODO 未来支持同步边缘节点
|
|
||||||
var ticker = time.NewTicker(3 * time.Second)
|
|
||||||
for range ticker.C {
|
|
||||||
nodeIds, err := models.SharedNodeTaskDAO.FindAllDoingNodeIds(nil, nodeconfigs.NodeRoleDNS)
|
|
||||||
if err != nil {
|
|
||||||
remotelogs.Error("NSNodeService_SYNC", err.Error())
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
nodeLocker.Lock()
|
|
||||||
for _, nodeId := range nodeIds {
|
|
||||||
c, ok := requestChanMap[nodeId]
|
|
||||||
if ok {
|
|
||||||
select {
|
|
||||||
case c <- &CommandRequest{
|
|
||||||
Id: NextCommandRequestId(),
|
|
||||||
Code: messageconfigs.NSMessageCodeNewNodeTask,
|
|
||||||
CommandJSON: nil,
|
|
||||||
}:
|
|
||||||
default:
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nodeLocker.Unlock()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// NsNodeStream 节点stream
|
|
||||||
func (this *NSNodeService) NsNodeStream(server pb.NSNodeService_NsNodeStreamServer) error {
|
|
||||||
// TODO 使用此stream快速通知NS节点更新
|
|
||||||
// 校验节点
|
|
||||||
_, _, nodeId, err := rpcutils.ValidateRequest(server.Context(), rpcutils.UserTypeDNS)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 返回连接成功
|
|
||||||
err = models.SharedNSNodeDAO.UpdateNodeConnectedAPINodes(nil, nodeId, []int64{teaconst.NodeId})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
//logs.Println("[RPC]accepted ns node '" + types.String(nodeId) + "' connection")
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
|
|
||||||
// 标记为活跃状态
|
|
||||||
oldIsActive, err := models.SharedNSNodeDAO.FindNodeActive(tx, nodeId)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if !oldIsActive {
|
|
||||||
err = models.SharedNSNodeDAO.UpdateNodeActive(tx, nodeId, true)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 发送恢复消息
|
|
||||||
clusterId, err := models.SharedNSNodeDAO.FindNodeClusterId(tx, nodeId)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
nodeName, err := models.SharedNSNodeDAO.FindEnabledNSNodeName(tx, nodeId)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
subject := "DNS节点\"" + nodeName + "\"已经恢复在线"
|
|
||||||
msg := "DNS节点\"" + nodeName + "\"已经恢复在线"
|
|
||||||
err = models.SharedMessageDAO.CreateNodeMessage(tx, nodeconfigs.NodeRoleDNS, clusterId, nodeId, models.MessageTypeNSNodeActive, models.MessageLevelSuccess, subject, msg, nil, false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nodeLocker.Lock()
|
|
||||||
requestChan, ok := requestChanMap[nodeId]
|
|
||||||
if !ok {
|
|
||||||
requestChan = make(chan *CommandRequest, 1024)
|
|
||||||
requestChanMap[nodeId] = requestChan
|
|
||||||
}
|
|
||||||
nodeLocker.Unlock()
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
nodeLocker.Lock()
|
|
||||||
delete(requestChanMap, nodeId)
|
|
||||||
nodeLocker.Unlock()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// 发送请求
|
|
||||||
goman.New(func() {
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-server.Context().Done():
|
|
||||||
return
|
|
||||||
case commandRequest := <-requestChan:
|
|
||||||
// logs.Println("[RPC]sending command '" + commandRequest.Code + "' to node '" + strconv.FormatInt(nodeId, 10) + "'")
|
|
||||||
retries := 3 // 错误重试次数
|
|
||||||
for i := 0; i < retries; i++ {
|
|
||||||
err := server.Send(&pb.NSNodeStreamMessage{
|
|
||||||
RequestId: commandRequest.Id,
|
|
||||||
Code: commandRequest.Code,
|
|
||||||
DataJSON: commandRequest.CommandJSON,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
if i == retries-1 {
|
|
||||||
logs.Println("[RPC]send command '" + commandRequest.Code + "' failed: " + err.Error())
|
|
||||||
} else {
|
|
||||||
time.Sleep(1 * time.Second)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// 接受请求
|
|
||||||
for {
|
|
||||||
req, err := server.Recv()
|
|
||||||
if err != nil {
|
|
||||||
// 修改节点状态
|
|
||||||
err1 := models.SharedNSNodeDAO.UpdateNodeActive(tx, nodeId, false)
|
|
||||||
if err1 != nil {
|
|
||||||
logs.Println(err1.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func(req *pb.NSNodeStreamMessage) {
|
|
||||||
// 因为 responseChan.Chan 有被关闭的风险,所以我们使用recover防止panic
|
|
||||||
defer func() {
|
|
||||||
recover()
|
|
||||||
}()
|
|
||||||
|
|
||||||
nodeLocker.Lock()
|
|
||||||
responseChan, ok := responseChanMap[req.RequestId]
|
|
||||||
if ok {
|
|
||||||
select {
|
|
||||||
case responseChan.Chan <- req:
|
|
||||||
default:
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nodeLocker.Unlock()
|
|
||||||
}(req)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// SendCommandToNSNode 向节点发送命令
|
|
||||||
func (this *NSNodeService) SendCommandToNSNode(ctx context.Context, req *pb.NSNodeStreamMessage) (*pb.NSNodeStreamMessage, error) {
|
|
||||||
// 校验请求
|
|
||||||
_, _, err := this.ValidateAdminAndUser(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
nodeId := req.NsNodeId
|
|
||||||
if nodeId <= 0 {
|
|
||||||
return nil, errors.New("node id should not be less than 0")
|
|
||||||
}
|
|
||||||
|
|
||||||
nodeLocker.Lock()
|
|
||||||
requestChan, ok := requestChanMap[nodeId]
|
|
||||||
nodeLocker.Unlock()
|
|
||||||
|
|
||||||
if !ok {
|
|
||||||
return &pb.NSNodeStreamMessage{
|
|
||||||
RequestId: req.RequestId,
|
|
||||||
IsOk: false,
|
|
||||||
Message: "node '" + strconv.FormatInt(nodeId, 10) + "' not connected yet",
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
req.RequestId = NextCommandRequestId()
|
|
||||||
|
|
||||||
select {
|
|
||||||
case requestChan <- &CommandRequest{
|
|
||||||
Id: req.RequestId,
|
|
||||||
Code: req.Code,
|
|
||||||
CommandJSON: req.DataJSON,
|
|
||||||
}:
|
|
||||||
// 加入到等待队列中
|
|
||||||
respChan := make(chan *pb.NSNodeStreamMessage, 1)
|
|
||||||
waiting := &CommandRequestWaiting{
|
|
||||||
Timestamp: time.Now().Unix(),
|
|
||||||
Chan: respChan,
|
|
||||||
}
|
|
||||||
|
|
||||||
nodeLocker.Lock()
|
|
||||||
responseChanMap[req.RequestId] = waiting
|
|
||||||
nodeLocker.Unlock()
|
|
||||||
|
|
||||||
// 等待响应
|
|
||||||
timeoutSeconds := req.TimeoutSeconds
|
|
||||||
if timeoutSeconds <= 0 {
|
|
||||||
timeoutSeconds = 10
|
|
||||||
}
|
|
||||||
timeout := time.NewTimer(time.Duration(timeoutSeconds) * time.Second)
|
|
||||||
select {
|
|
||||||
case resp := <-respChan:
|
|
||||||
// 从队列中删除
|
|
||||||
nodeLocker.Lock()
|
|
||||||
delete(responseChanMap, req.RequestId)
|
|
||||||
waiting.Close()
|
|
||||||
nodeLocker.Unlock()
|
|
||||||
|
|
||||||
if resp == nil {
|
|
||||||
return &pb.NSNodeStreamMessage{
|
|
||||||
RequestId: req.RequestId,
|
|
||||||
Code: req.Code,
|
|
||||||
Message: "response timeout",
|
|
||||||
IsOk: false,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return resp, nil
|
|
||||||
case <-timeout.C:
|
|
||||||
// 从队列中删除
|
|
||||||
nodeLocker.Lock()
|
|
||||||
delete(responseChanMap, req.RequestId)
|
|
||||||
waiting.Close()
|
|
||||||
nodeLocker.Unlock()
|
|
||||||
|
|
||||||
return &pb.NSNodeStreamMessage{
|
|
||||||
RequestId: req.RequestId,
|
|
||||||
Code: req.Code,
|
|
||||||
Message: "response timeout over " + fmt.Sprintf("%d", timeoutSeconds) + " seconds",
|
|
||||||
IsOk: false,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return &pb.NSNodeStreamMessage{
|
|
||||||
RequestId: req.RequestId,
|
|
||||||
Code: req.Code,
|
|
||||||
Message: "command queue is full over " + strconv.Itoa(len(requestChan)),
|
|
||||||
IsOk: false,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
|
||||||
|
|
||||||
package nameservers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models/nameservers"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/maps"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NSQuestionOptionService DNS查询选项
|
|
||||||
type NSQuestionOptionService struct {
|
|
||||||
services.BaseService
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateNSQuestionOption 创建选项
|
|
||||||
func (this *NSQuestionOptionService) CreateNSQuestionOption(ctx context.Context, req *pb.CreateNSQuestionOptionRequest) (*pb.CreateNSQuestionOptionResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
var values = maps.Map{}
|
|
||||||
if len(req.ValuesJSON) > 0 {
|
|
||||||
err = json.Unmarshal(req.ValuesJSON, &values)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
optionId, err := nameservers.SharedNSQuestionOptionDAO.CreateOption(tx, req.Name, values)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &pb.CreateNSQuestionOptionResponse{NsQuestionOptionId: optionId}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindNSQuestionOption 读取选项
|
|
||||||
func (this *NSQuestionOptionService) FindNSQuestionOption(ctx context.Context, req *pb.FindNSQuestionOptionRequest) (*pb.FindNSQuestionOptionResponse, error) {
|
|
||||||
_, err := this.ValidateNSNode(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
option, err := nameservers.SharedNSQuestionOptionDAO.FindOption(tx, req.NsQuestionOptionId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if option == nil {
|
|
||||||
return &pb.FindNSQuestionOptionResponse{NsQuestionOption: nil}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return &pb.FindNSQuestionOptionResponse{NsQuestionOption: &pb.NSQuestionOption{
|
|
||||||
Id: int64(option.Id),
|
|
||||||
Name: option.Name,
|
|
||||||
ValuesJSON: option.Values,
|
|
||||||
}}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteNSQuestionOption 删除选项
|
|
||||||
func (this *NSQuestionOptionService) DeleteNSQuestionOption(ctx context.Context, req *pb.DeleteNSQuestionOptionRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = nameservers.SharedNSQuestionOptionDAO.DeleteOption(tx, req.NsQuestionOptionId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
@@ -1,247 +0,0 @@
|
|||||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
|
||||||
|
|
||||||
package nameservers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models/nameservers"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
|
|
||||||
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
"github.com/iwind/TeaGo/types"
|
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NSRecordService 域名记录相关服务
|
|
||||||
type NSRecordService struct {
|
|
||||||
services.BaseService
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateNSRecord 创建记录
|
|
||||||
func (this *NSRecordService) CreateNSRecord(ctx context.Context, req *pb.CreateNSRecordRequest) (*pb.CreateNSRecordResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
recordId, err := nameservers.SharedNSRecordDAO.CreateRecord(tx, req.NsDomainId, req.Description, req.Name, req.Type, req.Value, req.Ttl, req.NsRouteCodes)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &pb.CreateNSRecordResponse{NsRecordId: recordId}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateNSRecord 修改记录
|
|
||||||
func (this *NSRecordService) UpdateNSRecord(ctx context.Context, req *pb.UpdateNSRecordRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = nameservers.SharedNSRecordDAO.UpdateRecord(tx, req.NsRecordId, req.Description, req.Name, req.Type, req.Value, req.Ttl, req.NsRouteCodes, req.IsOn)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteNSRecord 删除记录
|
|
||||||
func (this *NSRecordService) DeleteNSRecord(ctx context.Context, req *pb.DeleteNSRecordRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = nameservers.SharedNSRecordDAO.DisableNSRecord(tx, req.NsRecordId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// CountAllEnabledNSRecords 计算记录数量
|
|
||||||
func (this *NSRecordService) CountAllEnabledNSRecords(ctx context.Context, req *pb.CountAllEnabledNSRecordsRequest) (*pb.RPCCountResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
count, err := nameservers.SharedNSRecordDAO.CountAllEnabledDomainRecords(tx, req.NsDomainId, req.Type, req.Keyword, req.NsRouteCode)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.SuccessCount(count)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListEnabledNSRecords 读取单页记录
|
|
||||||
func (this *NSRecordService) ListEnabledNSRecords(ctx context.Context, req *pb.ListEnabledNSRecordsRequest) (*pb.ListEnabledNSRecordsResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
records, err := nameservers.SharedNSRecordDAO.ListEnabledRecords(tx, req.NsDomainId, req.Type, req.Keyword, req.NsRouteCode, req.Offset, req.Size)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var pbRecords = []*pb.NSRecord{}
|
|
||||||
for _, record := range records {
|
|
||||||
// 线路
|
|
||||||
var pbRoutes = []*pb.NSRoute{}
|
|
||||||
for _, routeCode := range record.DecodeRouteIds() {
|
|
||||||
route, err := nameservers.SharedNSRouteDAO.FindEnabledRouteWithCode(tx, routeCode)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if route == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
pbRoutes = append(pbRoutes, &pb.NSRoute{
|
|
||||||
Id: int64(route.Id),
|
|
||||||
Name: route.Name,
|
|
||||||
Code: route.Code,
|
|
||||||
})
|
|
||||||
|
|
||||||
// TODO 读取其他线路
|
|
||||||
}
|
|
||||||
|
|
||||||
pbRecords = append(pbRecords, &pb.NSRecord{
|
|
||||||
Id: int64(record.Id),
|
|
||||||
Description: record.Description,
|
|
||||||
Name: record.Name,
|
|
||||||
Type: record.Type,
|
|
||||||
Value: record.Value,
|
|
||||||
Ttl: types.Int32(record.Ttl),
|
|
||||||
Weight: types.Int32(record.Weight),
|
|
||||||
CreatedAt: int64(record.CreatedAt),
|
|
||||||
IsOn: record.IsOn,
|
|
||||||
NsDomain: nil,
|
|
||||||
NsRoutes: pbRoutes,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return &pb.ListEnabledNSRecordsResponse{NsRecords: pbRecords}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindEnabledNSRecord 查询单个记录信息
|
|
||||||
func (this *NSRecordService) FindEnabledNSRecord(ctx context.Context, req *pb.FindEnabledNSRecordRequest) (*pb.FindEnabledNSRecordResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
record, err := nameservers.SharedNSRecordDAO.FindEnabledNSRecord(tx, req.NsRecordId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if record == nil {
|
|
||||||
return &pb.FindEnabledNSRecordResponse{NsRecord: nil}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 域名
|
|
||||||
domain, err := nameservers.SharedNSDomainDAO.FindEnabledNSDomain(tx, int64(record.DomainId))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if domain == nil {
|
|
||||||
return &pb.FindEnabledNSRecordResponse{NsRecord: nil}, nil
|
|
||||||
}
|
|
||||||
var pbDomain = &pb.NSDomain{
|
|
||||||
Id: int64(domain.Id),
|
|
||||||
Name: domain.Name,
|
|
||||||
IsOn: domain.IsOn,
|
|
||||||
}
|
|
||||||
|
|
||||||
// 线路
|
|
||||||
var pbRoutes = []*pb.NSRoute{}
|
|
||||||
for _, routeCode := range record.DecodeRouteIds() {
|
|
||||||
route, err := nameservers.SharedNSRouteDAO.FindEnabledRouteWithCode(tx, routeCode)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if route == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
pbRoutes = append(pbRoutes, &pb.NSRoute{
|
|
||||||
Id: int64(route.Id),
|
|
||||||
Name: route.Name,
|
|
||||||
Code: route.Code,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO 读取其他线路
|
|
||||||
|
|
||||||
return &pb.FindEnabledNSRecordResponse{NsRecord: &pb.NSRecord{
|
|
||||||
Id: int64(record.Id),
|
|
||||||
Description: record.Description,
|
|
||||||
Name: record.Name,
|
|
||||||
Type: record.Type,
|
|
||||||
Value: record.Value,
|
|
||||||
Ttl: types.Int32(record.Ttl),
|
|
||||||
Weight: types.Int32(record.Weight),
|
|
||||||
CreatedAt: int64(record.CreatedAt),
|
|
||||||
IsOn: record.IsOn,
|
|
||||||
NsDomain: pbDomain,
|
|
||||||
NsRoutes: pbRoutes,
|
|
||||||
}}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListNSRecordsAfterVersion 根据版本列出一组记录
|
|
||||||
func (this *NSRecordService) ListNSRecordsAfterVersion(ctx context.Context, req *pb.ListNSRecordsAfterVersionRequest) (*pb.ListNSRecordsAfterVersionResponse, error) {
|
|
||||||
_, _, err := this.ValidateNodeId(ctx, rpcutils.UserTypeDNS)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 集群ID
|
|
||||||
var tx = this.NullTx()
|
|
||||||
if req.Size <= 0 {
|
|
||||||
req.Size = 2000
|
|
||||||
}
|
|
||||||
records, err := nameservers.SharedNSRecordDAO.ListRecordsAfterVersion(tx, req.Version, req.Size)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var pbRecords []*pb.NSRecord
|
|
||||||
for _, record := range records {
|
|
||||||
// 线路
|
|
||||||
pbRoutes := []*pb.NSRoute{}
|
|
||||||
routeIds := record.DecodeRouteIds()
|
|
||||||
for _, routeId := range routeIds {
|
|
||||||
var routeIdInt int64 = 0
|
|
||||||
if regexp.MustCompile(`^id:\d+$`).MatchString(routeId) {
|
|
||||||
routeIdInt = types.Int64(routeId[strings.Index(routeId, ":")+1:])
|
|
||||||
}
|
|
||||||
|
|
||||||
pbRoutes = append(pbRoutes, &pb.NSRoute{
|
|
||||||
Id: routeIdInt,
|
|
||||||
Code: routeId,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO 读取其他线路
|
|
||||||
|
|
||||||
pbRecords = append(pbRecords, &pb.NSRecord{
|
|
||||||
Id: int64(record.Id),
|
|
||||||
Description: "",
|
|
||||||
Name: record.Name,
|
|
||||||
Type: record.Type,
|
|
||||||
Value: record.Value,
|
|
||||||
Ttl: types.Int32(record.Ttl),
|
|
||||||
Weight: types.Int32(record.Weight),
|
|
||||||
IsDeleted: record.State == nameservers.NSRecordStateDisabled,
|
|
||||||
IsOn: record.IsOn,
|
|
||||||
Version: int64(record.Version),
|
|
||||||
NsDomain: &pb.NSDomain{Id: int64(record.DomainId)},
|
|
||||||
NsRoutes: pbRoutes,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return &pb.ListNSRecordsAfterVersionResponse{NsRecords: pbRecords}, nil
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
|
||||||
|
|
||||||
package nameservers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models/nameservers"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
|
|
||||||
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
timeutil "github.com/iwind/TeaGo/utils/time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NSRecordHourlyStatService NS记录小时统计
|
|
||||||
type NSRecordHourlyStatService struct {
|
|
||||||
services.BaseService
|
|
||||||
}
|
|
||||||
|
|
||||||
// UploadNSRecordHourlyStats 上传统计
|
|
||||||
func (this *NSRecordHourlyStatService) UploadNSRecordHourlyStats(ctx context.Context, req *pb.UploadNSRecordHourlyStatsRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, nodeId, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeDNS)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if nodeId <= 0 {
|
|
||||||
return nil, errors.New("invalid nodeId")
|
|
||||||
}
|
|
||||||
if len(req.Stats) == 0 {
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
var tx = this.NullTx()
|
|
||||||
clusterId, err := models.SharedNSNodeDAO.FindNodeClusterId(tx, nodeId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 增加小时统计
|
|
||||||
for _, stat := range req.Stats {
|
|
||||||
err := nameservers.SharedNSRecordHourlyStatDAO.IncreaseHourlyStat(tx, clusterId, nodeId, timeutil.FormatTime("YmdH", stat.CreatedAt), stat.NsDomainId, stat.NsRecordId, stat.CountRequests, stat.Bytes)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
@@ -1,230 +0,0 @@
|
|||||||
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
|
||||||
|
|
||||||
package nameservers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/db/models/nameservers"
|
|
||||||
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
|
|
||||||
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
|
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NSRouteService 线路相关服务
|
|
||||||
type NSRouteService struct {
|
|
||||||
services.BaseService
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateNSRoute 创建线路
|
|
||||||
func (this *NSRouteService) CreateNSRoute(ctx context.Context, req *pb.CreateNSRouteRequest) (*pb.CreateNSRouteResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var tx = this.NullTx()
|
|
||||||
routeId, err := nameservers.SharedNSRouteDAO.CreateRoute(tx, req.NsClusterId, req.NsDomainId, req.UserId, req.Name, req.RangesJSON)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &pb.CreateNSRouteResponse{NsRouteId: routeId}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateNSRoute 修改线路
|
|
||||||
func (this *NSRouteService) UpdateNSRoute(ctx context.Context, req *pb.UpdateNSRouteRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = nameservers.SharedNSRouteDAO.UpdateRoute(tx, req.NsRouteId, req.Name, req.RangesJSON)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// DeleteNSRoute 删除线路
|
|
||||||
func (this *NSRouteService) DeleteNSRoute(ctx context.Context, req *pb.DeleteNSRouteRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = nameservers.SharedNSRouteDAO.DisableNSRoute(tx, req.NsRouteId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindEnabledNSRoute 获取单个路线信息
|
|
||||||
func (this *NSRouteService) FindEnabledNSRoute(ctx context.Context, req *pb.FindEnabledNSRouteRequest) (*pb.FindEnabledNSRouteResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var tx = this.NullTx()
|
|
||||||
route, err := nameservers.SharedNSRouteDAO.FindEnabledNSRoute(tx, req.NsRouteId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if route == nil {
|
|
||||||
return &pb.FindEnabledNSRouteResponse{NsRoute: nil}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 集群
|
|
||||||
var pbCluster *pb.NSCluster
|
|
||||||
if route.ClusterId > 0 {
|
|
||||||
cluster, err := models.SharedNSClusterDAO.FindEnabledNSCluster(tx, int64(route.ClusterId))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if cluster != nil {
|
|
||||||
pbCluster = &pb.NSCluster{
|
|
||||||
Id: int64(cluster.Id),
|
|
||||||
IsOn: cluster.IsOn,
|
|
||||||
Name: cluster.Name,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 域名
|
|
||||||
var pbDomain *pb.NSDomain
|
|
||||||
if route.DomainId > 0 {
|
|
||||||
domain, err := nameservers.SharedNSDomainDAO.FindEnabledNSDomain(tx, int64(route.DomainId))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if domain != nil {
|
|
||||||
pbDomain = &pb.NSDomain{
|
|
||||||
Id: int64(domain.Id),
|
|
||||||
Name: domain.Name,
|
|
||||||
IsOn: domain.IsOn,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return &pb.FindEnabledNSRouteResponse{NsRoute: &pb.NSRoute{
|
|
||||||
Id: int64(route.Id),
|
|
||||||
IsOn: route.IsOn,
|
|
||||||
Name: route.Name,
|
|
||||||
RangesJSON: route.Ranges,
|
|
||||||
NsCluster: pbCluster,
|
|
||||||
NsDomain: pbDomain,
|
|
||||||
}}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindAllEnabledNSRoutes 读取所有线路
|
|
||||||
func (this *NSRouteService) FindAllEnabledNSRoutes(ctx context.Context, req *pb.FindAllEnabledNSRoutesRequest) (*pb.FindAllEnabledNSRoutesResponse, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var tx = this.NullTx()
|
|
||||||
routes, err := nameservers.SharedNSRouteDAO.FindAllEnabledRoutes(tx, req.NsClusterId, req.NsDomainId, req.UserId)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var pbRoutes = []*pb.NSRoute{}
|
|
||||||
for _, route := range routes {
|
|
||||||
// 集群
|
|
||||||
var pbCluster *pb.NSCluster
|
|
||||||
if route.ClusterId > 0 {
|
|
||||||
cluster, err := models.SharedNSClusterDAO.FindEnabledNSCluster(tx, int64(route.ClusterId))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if cluster != nil {
|
|
||||||
pbCluster = &pb.NSCluster{
|
|
||||||
Id: int64(cluster.Id),
|
|
||||||
IsOn: cluster.IsOn,
|
|
||||||
Name: cluster.Name,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 域名
|
|
||||||
var pbDomain *pb.NSDomain
|
|
||||||
if route.DomainId > 0 {
|
|
||||||
domain, err := nameservers.SharedNSDomainDAO.FindEnabledNSDomain(tx, int64(route.DomainId))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if domain != nil {
|
|
||||||
pbDomain = &pb.NSDomain{
|
|
||||||
Id: int64(domain.Id),
|
|
||||||
Name: domain.Name,
|
|
||||||
IsOn: domain.IsOn,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pbRoutes = append(pbRoutes, &pb.NSRoute{
|
|
||||||
Id: int64(route.Id),
|
|
||||||
IsOn: route.IsOn,
|
|
||||||
Name: route.Name,
|
|
||||||
RangesJSON: route.Ranges,
|
|
||||||
NsCluster: pbCluster,
|
|
||||||
NsDomain: pbDomain,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return &pb.FindAllEnabledNSRoutesResponse{NsRoutes: pbRoutes}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateNSRouteOrders 设置线路排序
|
|
||||||
func (this *NSRouteService) UpdateNSRouteOrders(ctx context.Context, req *pb.UpdateNSRouteOrdersRequest) (*pb.RPCSuccess, error) {
|
|
||||||
_, err := this.ValidateAdmin(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
var tx = this.NullTx()
|
|
||||||
err = nameservers.SharedNSRouteDAO.UpdateRouteOrders(tx, req.NsRouteIds)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return this.Success()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ListNSRoutesAfterVersion 根据版本列出一组线路
|
|
||||||
func (this *NSRouteService) ListNSRoutesAfterVersion(ctx context.Context, req *pb.ListNSRoutesAfterVersionRequest) (*pb.ListNSRoutesAfterVersionResponse, error) {
|
|
||||||
_, _, err := this.ValidateNodeId(ctx, rpcutils.UserTypeDNS)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 集群ID
|
|
||||||
var tx = this.NullTx()
|
|
||||||
routes, err := nameservers.SharedNSRouteDAO.ListRoutesAfterVersion(tx, req.Version, 2000)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var pbRoutes []*pb.NSRoute
|
|
||||||
for _, route := range routes {
|
|
||||||
// 集群
|
|
||||||
var pbCluster *pb.NSCluster
|
|
||||||
if route.ClusterId > 0 {
|
|
||||||
pbCluster = &pb.NSCluster{Id: int64(route.ClusterId)}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 域名
|
|
||||||
var pbDomain *pb.NSDomain
|
|
||||||
if route.DomainId > 0 {
|
|
||||||
pbDomain = &pb.NSDomain{Id: int64(route.DomainId)}
|
|
||||||
}
|
|
||||||
|
|
||||||
pbRoutes = append(pbRoutes, &pb.NSRoute{
|
|
||||||
Id: int64(route.Id),
|
|
||||||
IsOn: route.IsOn,
|
|
||||||
Name: "",
|
|
||||||
RangesJSON: route.Ranges,
|
|
||||||
IsDeleted: route.State == nameservers.NSRouteStateDisabled,
|
|
||||||
Order: int64(route.Order),
|
|
||||||
Version: int64(route.Version),
|
|
||||||
NsCluster: pbCluster,
|
|
||||||
NsDomain: pbDomain,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return &pb.ListNSRoutesAfterVersionResponse{NsRoutes: pbRoutes}, nil
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user