From 6a3fa9f0ca4e37541c89f19c5d7cbfacee5cd161 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A5=A5=E8=B6=85?= Date: Fri, 5 Aug 2022 14:40:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=B8=8D=E5=BF=85=E8=A6=81?= =?UTF-8?q?=E7=9A=84=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rpc/services/nameservers/service_ns.go | 174 ------ .../nameservers/service_ns_access_log.go | 125 ---- .../nameservers/service_ns_cluster.go | 366 ----------- .../services/nameservers/service_ns_domain.go | 259 -------- .../services/nameservers/service_ns_key.go | 170 ----- .../services/nameservers/service_ns_node.go | 587 ------------------ .../nameservers/service_ns_node_stream.go | 317 ---------- .../nameservers/service_ns_question_option.go | 77 --- .../services/nameservers/service_ns_record.go | 247 -------- .../service_ns_record_hourly_stat.go | 50 -- .../services/nameservers/service_ns_route.go | 230 ------- 11 files changed, 2602 deletions(-) delete mode 100644 internal/rpc/services/nameservers/service_ns.go delete mode 100644 internal/rpc/services/nameservers/service_ns_access_log.go delete mode 100644 internal/rpc/services/nameservers/service_ns_cluster.go delete mode 100644 internal/rpc/services/nameservers/service_ns_domain.go delete mode 100644 internal/rpc/services/nameservers/service_ns_key.go delete mode 100644 internal/rpc/services/nameservers/service_ns_node.go delete mode 100644 internal/rpc/services/nameservers/service_ns_node_stream.go delete mode 100644 internal/rpc/services/nameservers/service_ns_question_option.go delete mode 100644 internal/rpc/services/nameservers/service_ns_record.go delete mode 100644 internal/rpc/services/nameservers/service_ns_record_hourly_stat.go delete mode 100644 internal/rpc/services/nameservers/service_ns_route.go diff --git a/internal/rpc/services/nameservers/service_ns.go b/internal/rpc/services/nameservers/service_ns.go deleted file mode 100644 index 448f3a77..00000000 --- a/internal/rpc/services/nameservers/service_ns.go +++ /dev/null @@ -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 -} diff --git a/internal/rpc/services/nameservers/service_ns_access_log.go b/internal/rpc/services/nameservers/service_ns_access_log.go deleted file mode 100644 index 2c41a68a..00000000 --- a/internal/rpc/services/nameservers/service_ns_access_log.go +++ /dev/null @@ -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 -} diff --git a/internal/rpc/services/nameservers/service_ns_cluster.go b/internal/rpc/services/nameservers/service_ns_cluster.go deleted file mode 100644 index e29408c6..00000000 --- a/internal/rpc/services/nameservers/service_ns_cluster.go +++ /dev/null @@ -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) -} diff --git a/internal/rpc/services/nameservers/service_ns_domain.go b/internal/rpc/services/nameservers/service_ns_domain.go deleted file mode 100644 index 8df3fbb3..00000000 --- a/internal/rpc/services/nameservers/service_ns_domain.go +++ /dev/null @@ -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() -} diff --git a/internal/rpc/services/nameservers/service_ns_key.go b/internal/rpc/services/nameservers/service_ns_key.go deleted file mode 100644 index 2bcb4dc1..00000000 --- a/internal/rpc/services/nameservers/service_ns_key.go +++ /dev/null @@ -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 -} diff --git a/internal/rpc/services/nameservers/service_ns_node.go b/internal/rpc/services/nameservers/service_ns_node.go deleted file mode 100644 index 62bae4e8..00000000 --- a/internal/rpc/services/nameservers/service_ns_node.go +++ /dev/null @@ -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 -} diff --git a/internal/rpc/services/nameservers/service_ns_node_stream.go b/internal/rpc/services/nameservers/service_ns_node_stream.go deleted file mode 100644 index b04aa2fe..00000000 --- a/internal/rpc/services/nameservers/service_ns_node_stream.go +++ /dev/null @@ -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 - } -} diff --git a/internal/rpc/services/nameservers/service_ns_question_option.go b/internal/rpc/services/nameservers/service_ns_question_option.go deleted file mode 100644 index 78b65ce3..00000000 --- a/internal/rpc/services/nameservers/service_ns_question_option.go +++ /dev/null @@ -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() -} diff --git a/internal/rpc/services/nameservers/service_ns_record.go b/internal/rpc/services/nameservers/service_ns_record.go deleted file mode 100644 index c4c1e19e..00000000 --- a/internal/rpc/services/nameservers/service_ns_record.go +++ /dev/null @@ -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 -} diff --git a/internal/rpc/services/nameservers/service_ns_record_hourly_stat.go b/internal/rpc/services/nameservers/service_ns_record_hourly_stat.go deleted file mode 100644 index 8ed32acd..00000000 --- a/internal/rpc/services/nameservers/service_ns_record_hourly_stat.go +++ /dev/null @@ -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() -} diff --git a/internal/rpc/services/nameservers/service_ns_route.go b/internal/rpc/services/nameservers/service_ns_route.go deleted file mode 100644 index 19935eac..00000000 --- a/internal/rpc/services/nameservers/service_ns_route.go +++ /dev/null @@ -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 -}