域名服务增加访问日志

This commit is contained in:
刘祥超
2021-06-02 11:53:24 +08:00
parent e9e4abff03
commit 442dd195ca
17 changed files with 829 additions and 121 deletions

View File

@@ -5,6 +5,7 @@ import (
_ "github.com/go-sql-driver/mysql" _ "github.com/go-sql-driver/mysql"
"github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/dbs" "github.com/iwind/TeaGo/dbs"
timeutil "github.com/iwind/TeaGo/utils/time"
"time" "time"
) )
@@ -81,3 +82,15 @@ func (this *AuthorityKeyDAO) ResetKey(tx *dbs.Tx) error {
Delete() Delete()
return err return err
} }
// IsPlus 判断是否为企业版
func (this *AuthorityKeyDAO) IsPlus(tx *dbs.Tx) (bool, error) {
key, err := this.ReadKey(tx)
if err != nil {
return false, err
}
if key == nil {
return false, nil
}
return key.DayTo >= timeutil.Format("Y-m-d"), nil
}

View File

@@ -17,15 +17,28 @@ import (
) )
var accessLogDBMapping = map[int64]*dbs.DB{} // dbNodeId => DB var accessLogDBMapping = map[int64]*dbs.DB{} // dbNodeId => DB
var accessLogDAOMapping = map[int64]*HTTPAccessLogDAOWrapper{} // dbNodeId => DAO
var accessLogLocker = &sync.RWMutex{} var accessLogLocker = &sync.RWMutex{}
var accessLogTableMapping = map[string]bool{} // tableName_crc(dsn) => true
// HTTP服务访问
var httpAccessLogDAOMapping = map[int64]*HTTPAccessLogDAOWrapper{} // dbNodeId => DAO
var httpAccessLogTableMapping = map[string]bool{} // tableName_crc(dsn) => true
// DNS服务访问
var nsAccessLogDAOMapping = map[int64]*NSAccessLogDAOWrapper{} // dbNodeId => DAO
var nsAccessLogTableMapping = map[string]bool{} // tableName_crc(dsn) => true
// HTTPAccessLogDAOWrapper HTTP访问日志DAO
type HTTPAccessLogDAOWrapper struct { type HTTPAccessLogDAOWrapper struct {
DAO *HTTPAccessLogDAO DAO *HTTPAccessLogDAO
NodeId int64 NodeId int64
} }
// NSAccessLogDAOWrapper NS访问日志DAO
type NSAccessLogDAOWrapper struct {
DAO *NSAccessLogDAO
NodeId int64
}
func init() { func init() {
initializer := NewDBNodeInitializer() initializer := NewDBNodeInitializer()
dbs.OnReadyDone(func() { dbs.OnReadyDone(func() {
@@ -34,12 +47,26 @@ func init() {
} }
// 获取获取DAO // 获取获取DAO
func randomAccessLogDAO() (dao *HTTPAccessLogDAOWrapper) { func randomHTTPAccessLogDAO() (dao *HTTPAccessLogDAOWrapper) {
accessLogLocker.RLock() accessLogLocker.RLock()
if len(accessLogDAOMapping) == 0 { if len(httpAccessLogDAOMapping) == 0 {
dao = nil dao = nil
} else { } else {
for _, d := range accessLogDAOMapping { for _, d := range httpAccessLogDAOMapping {
dao = d
break
}
}
accessLogLocker.RUnlock()
return
}
func randomNSAccessLogDAO() (dao *NSAccessLogDAOWrapper) {
accessLogLocker.RLock()
if len(nsAccessLogDAOMapping) == 0 {
dao = nil
} else {
for _, d := range nsAccessLogDAOMapping {
dao = d dao = d
break break
} }
@@ -49,7 +76,7 @@ func randomAccessLogDAO() (dao *HTTPAccessLogDAOWrapper) {
} }
// 检查表格是否存在 // 检查表格是否存在
func findAccessLogTableName(db *dbs.DB, day string) (tableName string, ok bool, err error) { func findHTTPAccessLogTableName(db *dbs.DB, day string) (tableName string, ok bool, err error) {
if !regexp.MustCompile(`^\d{8}$`).MatchString(day) { if !regexp.MustCompile(`^\d{8}$`).MatchString(day) {
err = errors.New("invalid day '" + day + "', should be YYYYMMDD") err = errors.New("invalid day '" + day + "', should be YYYYMMDD")
return return
@@ -64,7 +91,36 @@ func findAccessLogTableName(db *dbs.DB, day string) (tableName string, ok bool,
cacheKey := tableName + "_" + fmt.Sprintf("%d", crc32.ChecksumIEEE([]byte(config.Dsn))) cacheKey := tableName + "_" + fmt.Sprintf("%d", crc32.ChecksumIEEE([]byte(config.Dsn)))
accessLogLocker.RLock() accessLogLocker.RLock()
_, ok = accessLogTableMapping[cacheKey] _, ok = httpAccessLogTableMapping[cacheKey]
accessLogLocker.RUnlock()
if ok {
return tableName, true, nil
}
tableNames, err := db.TableNames()
if err != nil {
return tableName, false, err
}
return tableName, lists.ContainsString(tableNames, tableName), nil
}
func findNSAccessLogTableName(db *dbs.DB, day string) (tableName string, ok bool, err error) {
if !regexp.MustCompile(`^\d{8}$`).MatchString(day) {
err = errors.New("invalid day '" + day + "', should be YYYYMMDD")
return
}
config, err := db.Config()
if err != nil {
return "", false, err
}
tableName = "edgeNSAccessLogs_" + day
cacheKey := tableName + "_" + fmt.Sprintf("%d", crc32.ChecksumIEEE([]byte(config.Dsn)))
accessLogLocker.RLock()
_, ok = nsAccessLogTableMapping[cacheKey]
accessLogLocker.RUnlock() accessLogLocker.RUnlock()
if ok { if ok {
return tableName, true, nil return tableName, true, nil
@@ -79,7 +135,7 @@ func findAccessLogTableName(db *dbs.DB, day string) (tableName string, ok bool,
} }
// 根据日期获取表名 // 根据日期获取表名
func findAccessLogTable(db *dbs.DB, day string, force bool) (string, error) { func findHTTPAccessLogTable(db *dbs.DB, day string, force bool) (string, error) {
config, err := db.Config() config, err := db.Config()
if err != nil { if err != nil {
return "", err return "", err
@@ -90,7 +146,7 @@ func findAccessLogTable(db *dbs.DB, day string, force bool) (string, error) {
if !force { if !force {
accessLogLocker.RLock() accessLogLocker.RLock()
_, ok := accessLogTableMapping[cacheKey] _, ok := httpAccessLogTableMapping[cacheKey]
accessLogLocker.RUnlock() accessLogLocker.RUnlock()
if ok { if ok {
return tableName, nil return tableName, nil
@@ -104,7 +160,7 @@ func findAccessLogTable(db *dbs.DB, day string, force bool) (string, error) {
if lists.ContainsString(tableNames, tableName) { if lists.ContainsString(tableNames, tableName) {
accessLogLocker.Lock() accessLogLocker.Lock()
accessLogTableMapping[cacheKey] = true httpAccessLogTableMapping[cacheKey] = true
accessLogLocker.Unlock() accessLogLocker.Unlock()
return tableName, nil return tableName, nil
} }
@@ -116,13 +172,56 @@ func findAccessLogTable(db *dbs.DB, day string, force bool) (string, error) {
} }
accessLogLocker.Lock() accessLogLocker.Lock()
accessLogTableMapping[cacheKey] = true httpAccessLogTableMapping[cacheKey] = true
accessLogLocker.Unlock() accessLogLocker.Unlock()
return tableName, nil return tableName, nil
} }
// 初始化数据库连接 func findNSAccessLogTable(db *dbs.DB, day string, force bool) (string, error) {
config, err := db.Config()
if err != nil {
return "", err
}
tableName := "edgeNSAccessLogs_" + day
cacheKey := tableName + "_" + fmt.Sprintf("%d", crc32.ChecksumIEEE([]byte(config.Dsn)))
if !force {
accessLogLocker.RLock()
_, ok := nsAccessLogTableMapping[cacheKey]
accessLogLocker.RUnlock()
if ok {
return tableName, nil
}
}
tableNames, err := db.TableNames()
if err != nil {
return tableName, err
}
if lists.ContainsString(tableNames, tableName) {
accessLogLocker.Lock()
nsAccessLogTableMapping[cacheKey] = true
accessLogLocker.Unlock()
return tableName, nil
}
// 创建表格
_, err = db.Exec("CREATE TABLE `" + tableName + "` (\n `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID',\n `domainId` int(11) unsigned DEFAULT '0' COMMENT '域名ID',\n `recordId` int(11) unsigned DEFAULT '0' COMMENT '记录ID',\n `content` json DEFAULT NULL COMMENT '访问数据',\n `requestId` varchar(128) DEFAULT NULL COMMENT '请求ID',\n `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n PRIMARY KEY (`id`),\n KEY `nodeId` (`nodeId`),\n KEY `domainId` (`domainId`),\n KEY `recordId` (`recordId`),\n KEY `requestId` (`requestId`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='域名服务访问日志';")
if err != nil {
return tableName, err
}
accessLogLocker.Lock()
nsAccessLogTableMapping[cacheKey] = true
accessLogLocker.Unlock()
return tableName, nil
}
// DBNodeInitializer 初始化数据库连接
type DBNodeInitializer struct { type DBNodeInitializer struct {
} }
@@ -130,7 +229,7 @@ func NewDBNodeInitializer() *DBNodeInitializer {
return &DBNodeInitializer{} return &DBNodeInitializer{}
} }
// 启动 // Start 启动
func (this *DBNodeInitializer) Start() { func (this *DBNodeInitializer) Start() {
// 初始运行 // 初始运行
err := this.loop() err := this.loop()
@@ -167,7 +266,8 @@ func (this *DBNodeInitializer) loop() error {
if !lists.ContainsInt64(nodeIds, nodeId) { if !lists.ContainsInt64(nodeIds, nodeId) {
closingDbs = append(closingDbs, db) closingDbs = append(closingDbs, db)
delete(accessLogDBMapping, nodeId) delete(accessLogDBMapping, nodeId)
delete(accessLogDAOMapping, nodeId) delete(httpAccessLogDAOMapping, nodeId)
delete(nsAccessLogDAOMapping, nodeId)
logs.Println("[DB_NODE]close db node '" + strconv.FormatInt(nodeId, 10) + "'") logs.Println("[DB_NODE]close db node '" + strconv.FormatInt(nodeId, 10) + "'")
} }
} }
@@ -213,7 +313,9 @@ func (this *DBNodeInitializer) loop() error {
} }
// 检查表是否存在 // 检查表是否存在
tableName, err := findAccessLogTable(db, timeutil.Format("Ymd"), false) // httpAccessLog
{
tableName, err := findHTTPAccessLogTable(db, timeutil.Format("Ymd"), false)
if err != nil { if err != nil {
if !strings.Contains(err.Error(), "1050") { // 非表格已存在错误 if !strings.Contains(err.Error(), "1050") { // 非表格已存在错误
logs.Println("[DB_NODE]create first table in database node failed: " + err.Error()) logs.Println("[DB_NODE]create first table in database node failed: " + err.Error())
@@ -248,13 +350,59 @@ func (this *DBNodeInitializer) loop() error {
dao := &HTTPAccessLogDAO{ dao := &HTTPAccessLogDAO{
DAOObject: daoObject, DAOObject: daoObject,
} }
accessLogDAOMapping[nodeId] = &HTTPAccessLogDAOWrapper{ httpAccessLogDAOMapping[nodeId] = &HTTPAccessLogDAOWrapper{
DAO: dao,
NodeId: nodeId,
}
accessLogLocker.Unlock()
}
// nsAccessLog
{
tableName, err := findNSAccessLogTable(db, timeutil.Format("Ymd"), false)
if err != nil {
if !strings.Contains(err.Error(), "1050") { // 非表格已存在错误
logs.Println("[DB_NODE]create first table in database node failed: " + err.Error())
// 创建节点日志
createLogErr := SharedNodeLogDAO.CreateLog(nil, nodeconfigs.NodeRoleDatabase, nodeId, 0, "error", "ACCESS_LOG", "can not create access log table: "+err.Error(), time.Now().Unix())
if createLogErr != nil {
logs.Println("[NODE_LOG]" + createLogErr.Error())
}
continue
} else {
err = nil
}
}
daoObject := dbs.DAOObject{
Instance: db,
DB: node.Name + "(id:" + strconv.Itoa(int(node.Id)) + ")",
Table: tableName,
PkName: "id",
Model: new(NSAccessLog),
}
err = daoObject.Init()
if err != nil {
logs.Println("[DB_NODE]initialize dao failed: " + err.Error())
continue
}
accessLogLocker.Lock()
accessLogDBMapping[nodeId] = db
dao := &NSAccessLogDAO{
DAOObject: daoObject,
}
nsAccessLogDAOMapping[nodeId] = &NSAccessLogDAOWrapper{
DAO: dao, DAO: dao,
NodeId: nodeId, NodeId: nodeId,
} }
accessLogLocker.Unlock() accessLogLocker.Unlock()
} }
} }
}
return nil return nil
} }

View File

@@ -41,9 +41,9 @@ func NewHTTPAccessLogDAO() *HTTPAccessLogDAO {
}).(*HTTPAccessLogDAO) }).(*HTTPAccessLogDAO)
} }
// 创建访问日志 // CreateHTTPAccessLogs 创建访问日志
func (this *HTTPAccessLogDAO) CreateHTTPAccessLogs(tx *dbs.Tx, accessLogs []*pb.HTTPAccessLog) error { func (this *HTTPAccessLogDAO) CreateHTTPAccessLogs(tx *dbs.Tx, accessLogs []*pb.HTTPAccessLog) error {
dao := randomAccessLogDAO() dao := randomHTTPAccessLogDAO()
if dao == nil { if dao == nil {
dao = &HTTPAccessLogDAOWrapper{ dao = &HTTPAccessLogDAOWrapper{
DAO: SharedHTTPAccessLogDAO, DAO: SharedHTTPAccessLogDAO,
@@ -53,7 +53,7 @@ func (this *HTTPAccessLogDAO) CreateHTTPAccessLogs(tx *dbs.Tx, accessLogs []*pb.
return this.CreateHTTPAccessLogsWithDAO(tx, dao, accessLogs) return this.CreateHTTPAccessLogsWithDAO(tx, dao, accessLogs)
} }
// 使用特定的DAO创建访问日志 // CreateHTTPAccessLogsWithDAO 使用特定的DAO创建访问日志
func (this *HTTPAccessLogDAO) CreateHTTPAccessLogsWithDAO(tx *dbs.Tx, daoWrapper *HTTPAccessLogDAOWrapper, accessLogs []*pb.HTTPAccessLog) error { func (this *HTTPAccessLogDAO) CreateHTTPAccessLogsWithDAO(tx *dbs.Tx, daoWrapper *HTTPAccessLogDAOWrapper, accessLogs []*pb.HTTPAccessLog) error {
if daoWrapper == nil { if daoWrapper == nil {
return errors.New("dao should not be nil") return errors.New("dao should not be nil")
@@ -68,7 +68,7 @@ func (this *HTTPAccessLogDAO) CreateHTTPAccessLogsWithDAO(tx *dbs.Tx, daoWrapper
for _, accessLog := range accessLogs { for _, accessLog := range accessLogs {
day := timeutil.Format("Ymd", time.Unix(accessLog.Timestamp, 0)) day := timeutil.Format("Ymd", time.Unix(accessLog.Timestamp, 0))
table, err := findAccessLogTable(dao.Instance, day, false) table, err := findHTTPAccessLogTable(dao.Instance, day, false)
if err != nil { if err != nil {
return err return err
} }
@@ -97,7 +97,7 @@ func (this *HTTPAccessLogDAO) CreateHTTPAccessLogsWithDAO(tx *dbs.Tx, daoWrapper
if err != nil { if err != nil {
// 是否为 Error 1146: Table 'xxx.xxx' doesn't exist 如果是,则创建表之后重试 // 是否为 Error 1146: Table 'xxx.xxx' doesn't exist 如果是,则创建表之后重试
if strings.Contains(err.Error(), "1146") { if strings.Contains(err.Error(), "1146") {
table, err = findAccessLogTable(dao.Instance, day, true) table, err = findHTTPAccessLogTable(dao.Instance, day, true)
if err != nil { if err != nil {
return err return err
} }
@@ -115,7 +115,7 @@ func (this *HTTPAccessLogDAO) CreateHTTPAccessLogsWithDAO(tx *dbs.Tx, daoWrapper
return nil return nil
} }
// 读取往前的 单页访问日志 // ListAccessLogs 读取往前的 单页访问日志
func (this *HTTPAccessLogDAO) ListAccessLogs(tx *dbs.Tx, lastRequestId string, size int64, day string, serverId int64, reverse bool, hasError bool, firewallPolicyId int64, firewallRuleGroupId int64, firewallRuleSetId int64, hasFirewallPolicy bool, userId int64) (result []*HTTPAccessLog, nextLastRequestId string, hasMore bool, err error) { func (this *HTTPAccessLogDAO) ListAccessLogs(tx *dbs.Tx, lastRequestId string, size int64, day string, serverId int64, reverse bool, hasError bool, firewallPolicyId int64, firewallRuleGroupId int64, firewallRuleSetId int64, hasFirewallPolicy bool, userId int64) (result []*HTTPAccessLog, nextLastRequestId string, hasMore bool, err error) {
if len(day) != 8 { if len(day) != 8 {
return return
@@ -155,7 +155,7 @@ func (this *HTTPAccessLogDAO) listAccessLogs(tx *dbs.Tx, lastRequestId string, s
accessLogLocker.RLock() accessLogLocker.RLock()
daoList := []*HTTPAccessLogDAOWrapper{} daoList := []*HTTPAccessLogDAOWrapper{}
for _, daoWrapper := range accessLogDAOMapping { for _, daoWrapper := range httpAccessLogDAOMapping {
daoList = append(daoList, daoWrapper) daoList = append(daoList, daoWrapper)
} }
accessLogLocker.RUnlock() accessLogLocker.RUnlock()
@@ -178,7 +178,7 @@ func (this *HTTPAccessLogDAO) listAccessLogs(tx *dbs.Tx, lastRequestId string, s
dao := daoWrapper.DAO dao := daoWrapper.DAO
tableName, exists, err := findAccessLogTableName(dao.Instance, day) tableName, exists, err := findHTTPAccessLogTableName(dao.Instance, day)
if !exists { if !exists {
// 表格不存在则跳过 // 表格不存在则跳过
return return
@@ -278,7 +278,7 @@ func (this *HTTPAccessLogDAO) listAccessLogs(tx *dbs.Tx, lastRequestId string, s
} }
} }
// 根据请求ID获取访问日志 // FindAccessLogWithRequestId 根据请求ID获取访问日志
func (this *HTTPAccessLogDAO) FindAccessLogWithRequestId(tx *dbs.Tx, requestId string) (*HTTPAccessLog, error) { func (this *HTTPAccessLogDAO) FindAccessLogWithRequestId(tx *dbs.Tx, requestId string) (*HTTPAccessLog, error) {
if !regexp.MustCompile(`^\d{30,}`).MatchString(requestId) { if !regexp.MustCompile(`^\d{30,}`).MatchString(requestId) {
return nil, errors.New("invalid requestId") return nil, errors.New("invalid requestId")
@@ -286,7 +286,7 @@ func (this *HTTPAccessLogDAO) FindAccessLogWithRequestId(tx *dbs.Tx, requestId s
accessLogLocker.RLock() accessLogLocker.RLock()
daoList := []*HTTPAccessLogDAOWrapper{} daoList := []*HTTPAccessLogDAOWrapper{}
for _, daoWrapper := range accessLogDAOMapping { for _, daoWrapper := range httpAccessLogDAOMapping {
daoList = append(daoList, daoWrapper) daoList = append(daoList, daoWrapper)
} }
accessLogLocker.RUnlock() accessLogLocker.RUnlock()
@@ -309,7 +309,7 @@ func (this *HTTPAccessLogDAO) FindAccessLogWithRequestId(tx *dbs.Tx, requestId s
dao := daoWrapper.DAO dao := daoWrapper.DAO
tableName, exists, err := findAccessLogTableName(dao.Instance, day) tableName, exists, err := findHTTPAccessLogTableName(dao.Instance, day)
if err != nil { if err != nil {
logs.Println("[DB_NODE]" + err.Error()) logs.Println("[DB_NODE]" + err.Error())
return return

View File

@@ -5,7 +5,7 @@ import (
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
) )
// 转换成PB对象 // ToPB 转换成PB对象
func (this *HTTPAccessLog) ToPB() (*pb.HTTPAccessLog, error) { func (this *HTTPAccessLog) ToPB() (*pb.HTTPAccessLog, error) {
p := &pb.HTTPAccessLog{} p := &pb.HTTPAccessLog{}
err := json.Unmarshal([]byte(this.Content), p) err := json.Unmarshal([]byte(this.Content), p)

View File

@@ -100,8 +100,8 @@ func (this *NSClusterDAO) CountAllEnabledClusters(tx *dbs.Tx) (int64, error) {
Count() Count()
} }
// ListEnabledNSClusters 列出单页集群 // ListEnabledClusters 列出单页集群
func (this *NSClusterDAO) ListEnabledNSClusters(tx *dbs.Tx, offset int64, size int64) (result []*NSCluster, err error) { func (this *NSClusterDAO) ListEnabledClusters(tx *dbs.Tx, offset int64, size int64) (result []*NSCluster, err error) {
_, err = this.Query(tx). _, err = this.Query(tx).
State(NSClusterStateEnabled). State(NSClusterStateEnabled).
Offset(offset). Offset(offset).
@@ -112,8 +112,8 @@ func (this *NSClusterDAO) ListEnabledNSClusters(tx *dbs.Tx, offset int64, size i
return return
} }
// FindAllEnabledNSClusters 列出所有集群 // FindAllEnabledClusters 列出所有集群
func (this *NSClusterDAO) FindAllEnabledNSClusters(tx *dbs.Tx) (result []*NSCluster, err error) { func (this *NSClusterDAO) FindAllEnabledClusters(tx *dbs.Tx) (result []*NSCluster, err error) {
_, err = this.Query(tx). _, err = this.Query(tx).
State(NSClusterStateEnabled). State(NSClusterStateEnabled).
DescPk(). DescPk().
@@ -121,3 +121,20 @@ func (this *NSClusterDAO) FindAllEnabledNSClusters(tx *dbs.Tx) (result []*NSClus
FindAll() FindAll()
return return
} }
// UpdateClusterAccessLog 设置访问日志
func (this *NSClusterDAO) UpdateClusterAccessLog(tx *dbs.Tx, clusterId int64, accessLogJSON []byte) error {
return this.Query(tx).
Pk(clusterId).
Set("accessLog", accessLogJSON).
UpdateQuickly()
}
// FindClusterAccessLog 读取访问日志配置
func (this *NSClusterDAO) FindClusterAccessLog(tx *dbs.Tx, clusterId int64) ([]byte, error) {
accessLog, err := this.Query(tx).
Pk(clusterId).
Result("accessLog").
FindStringCol("")
return []byte(accessLog), err
}

View File

@@ -7,6 +7,7 @@ type NSCluster struct {
Name string `field:"name"` // 集群名 Name string `field:"name"` // 集群名
InstallDir string `field:"installDir"` // 安装目录 InstallDir string `field:"installDir"` // 安装目录
State uint8 `field:"state"` // 状态 State uint8 `field:"state"` // 状态
AccessLog string `field:"accessLog"` // 访问日志配置
} }
type NSClusterOperator struct { type NSClusterOperator struct {
@@ -15,6 +16,7 @@ type NSClusterOperator struct {
Name interface{} // 集群名 Name interface{} // 集群名
InstallDir interface{} // 安装目录 InstallDir interface{} // 安装目录
State interface{} // 状态 State interface{} // 状态
AccessLog interface{} // 访问日志配置
} }
func NewNSClusterOperator() *NSClusterOperator { func NewNSClusterOperator() *NSClusterOperator {

View File

@@ -6,6 +6,7 @@ import (
"github.com/TeaOSLab/EdgeAPI/internal/errors" "github.com/TeaOSLab/EdgeAPI/internal/errors"
"github.com/TeaOSLab/EdgeAPI/internal/utils" "github.com/TeaOSLab/EdgeAPI/internal/utils"
"github.com/TeaOSLab/EdgeCommon/pkg/configutils" "github.com/TeaOSLab/EdgeCommon/pkg/configutils"
"github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
_ "github.com/go-sql-driver/mysql" _ "github.com/go-sql-driver/mysql"
"github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/Tea"
@@ -330,6 +331,54 @@ func (this NSNodeDAO) UpdateNodeStatus(tx *dbs.Tx, nodeId int64, statusJSON []by
return err return err
} }
// CountAllLowerVersionNodes 计算所有节点中低于某个版本的节点数量
func (this *NSNodeDAO) CountAllLowerVersionNodes(tx *dbs.Tx, version string) (int64, error) {
return this.Query(tx).
State(NSNodeStateEnabled).
Where("status IS NOT NULL").
Where("(JSON_EXTRACT(status, '$.buildVersionCode') IS NULL OR JSON_EXTRACT(status, '$.buildVersionCode')<:version)").
Param("version", utils.VersionToLong(version)).
Count()
}
// ComposeNodeConfig 组合节点配置
func (this *NSNodeDAO) ComposeNodeConfig(tx *dbs.Tx, nodeId int64) (*dnsconfigs.NSNodeConfig, error) {
if nodeId <= 0 {
return nil, nil
}
node, err := this.FindEnabledNSNode(tx, nodeId)
if err != nil {
return nil, err
}
if node == nil {
return nil, nil
}
cluster, err := SharedNSClusterDAO.FindEnabledNSCluster(tx, int64(node.ClusterId))
if err != nil {
return nil, err
}
if cluster == nil {
return nil, nil
}
config := &dnsconfigs.NSNodeConfig{
Id: int64(node.Id),
ClusterId: int64(node.ClusterId),
}
if len(cluster.AccessLog) > 0 {
ref := &dnsconfigs.AccessLogRef{}
err = json.Unmarshal([]byte(cluster.AccessLog), ref)
if err != nil {
return nil, err
}
config.AccessLogRef = ref
}
return config, nil
}
// NotifyUpdate 通知更新 // NotifyUpdate 通知更新
func (this *NSNodeDAO) NotifyUpdate(tx *dbs.Tx, nodeId int64) error { func (this *NSNodeDAO) NotifyUpdate(tx *dbs.Tx, nodeId int64) error {
// TODO 先什么都不做 // TODO 先什么都不做

View File

@@ -0,0 +1,309 @@
package models
import (
"encoding/json"
"github.com/TeaOSLab/EdgeAPI/internal/configs"
"github.com/TeaOSLab/EdgeAPI/internal/errors"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
_ "github.com/go-sql-driver/mysql"
"github.com/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/dbs"
"github.com/iwind/TeaGo/lists"
"github.com/iwind/TeaGo/logs"
"github.com/iwind/TeaGo/types"
timeutil "github.com/iwind/TeaGo/utils/time"
"regexp"
"sort"
"strconv"
"strings"
"sync"
"time"
)
type NSAccessLogDAO dbs.DAO
func NewNSAccessLogDAO() *NSAccessLogDAO {
return dbs.NewDAO(&NSAccessLogDAO{
DAOObject: dbs.DAOObject{
DB: Tea.Env,
Table: "edgeNSAccessLogs",
Model: new(NSAccessLog),
PkName: "id",
},
}).(*NSAccessLogDAO)
}
var SharedNSAccessLogDAO *NSAccessLogDAO
func init() {
dbs.OnReady(func() {
SharedNSAccessLogDAO = NewNSAccessLogDAO()
})
}
// CreateNSAccessLogs 创建访问日志
func (this *NSAccessLogDAO) CreateNSAccessLogs(tx *dbs.Tx, accessLogs []*pb.NSAccessLog) error {
dao := randomNSAccessLogDAO()
if dao == nil {
dao = &NSAccessLogDAOWrapper{
DAO: SharedNSAccessLogDAO,
NodeId: 0,
}
}
return this.CreateNSAccessLogsWithDAO(tx, dao, accessLogs)
}
// CreateNSAccessLogsWithDAO 使用特定的DAO创建访问日志
func (this *NSAccessLogDAO) CreateNSAccessLogsWithDAO(tx *dbs.Tx, daoWrapper *NSAccessLogDAOWrapper, accessLogs []*pb.NSAccessLog) error {
if daoWrapper == nil {
return errors.New("dao should not be nil")
}
if len(accessLogs) == 0 {
return nil
}
dao := daoWrapper.DAO
// TODO 改成事务批量提交,以加快速度
for _, accessLog := range accessLogs {
day := timeutil.Format("Ymd", time.Unix(accessLog.Timestamp, 0))
table, err := findNSAccessLogTable(dao.Instance, day, false)
if err != nil {
return err
}
fields := map[string]interface{}{}
fields["nodeId"] = accessLog.NsNodeId
fields["domainId"] = accessLog.NsDomainId
fields["recordId"] = accessLog.NsRecordId
fields["createdAt"] = accessLog.Timestamp
fields["requestId"] = accessLog.RequestId + strconv.FormatInt(time.Now().UnixNano(), 10) + configs.PaddingId
content, err := json.Marshal(accessLog)
if err != nil {
return err
}
fields["content"] = content
_, err = dao.Query(tx).
Table(table).
Sets(fields).
Insert()
if err != nil {
// 是否为 Error 1146: Table 'xxx.xxx' doesn't exist 如果是,则创建表之后重试
if strings.Contains(err.Error(), "1146") {
table, err = findNSAccessLogTable(dao.Instance, day, true)
if err != nil {
return err
}
_, err = dao.Query(tx).
Table(table).
Sets(fields).
Insert()
if err != nil {
return err
}
}
}
}
return nil
}
// ListAccessLogs 读取往前的 单页访问日志
func (this *NSAccessLogDAO) ListAccessLogs(tx *dbs.Tx, lastRequestId string, size int64, day string, nodeId int64, domainId int64, recordId int64, reverse bool) (result []*NSAccessLog, nextLastRequestId string, hasMore bool, err error) {
if len(day) != 8 {
return
}
// 限制能查询的最大条数,防止占用内存过多
if size > 1000 {
size = 1000
}
result, nextLastRequestId, err = this.listAccessLogs(tx, lastRequestId, size, day, nodeId, domainId, recordId, reverse)
if err != nil || int64(len(result)) < size {
return
}
moreResult, _, _ := this.listAccessLogs(tx, nextLastRequestId, 1, day, nodeId, domainId, recordId, reverse)
hasMore = len(moreResult) > 0
return
}
// 读取往前的单页访问日志
func (this *NSAccessLogDAO) listAccessLogs(tx *dbs.Tx, lastRequestId string, size int64, day string, nodeId int64, domainId int64, recordId int64, reverse bool) (result []*NSAccessLog, nextLastRequestId string, err error) {
if size <= 0 {
return nil, lastRequestId, nil
}
accessLogLocker.RLock()
daoList := []*NSAccessLogDAOWrapper{}
for _, daoWrapper := range nsAccessLogDAOMapping {
daoList = append(daoList, daoWrapper)
}
accessLogLocker.RUnlock()
if len(daoList) == 0 {
daoList = []*NSAccessLogDAOWrapper{{
DAO: SharedNSAccessLogDAO,
NodeId: 0,
}}
}
locker := sync.Mutex{}
count := len(daoList)
wg := &sync.WaitGroup{}
wg.Add(count)
for _, daoWrapper := range daoList {
go func(daoWrapper *NSAccessLogDAOWrapper) {
defer wg.Done()
dao := daoWrapper.DAO
tableName, exists, err := findNSAccessLogTableName(dao.Instance, day)
if !exists {
// 表格不存在则跳过
return
}
if err != nil {
logs.Println("[DB_NODE]" + err.Error())
return
}
query := dao.Query(tx)
// 条件
if nodeId > 0 {
query.Attr("nodeId", nodeId)
}
if domainId > 0 {
query.Attr("domainId", domainId)
}
if recordId > 0 {
query.Attr("recordId", recordId)
}
// offset
if len(lastRequestId) > 0 {
if !reverse {
query.Where("requestId<:requestId").
Param("requestId", lastRequestId)
} else {
query.Where("requestId>:requestId").
Param("requestId", lastRequestId)
}
}
if !reverse {
query.Desc("requestId")
} else {
query.Asc("requestId")
}
// 开始查询
ones, err := query.
Table(tableName).
Limit(size).
FindAll()
if err != nil {
logs.Println("[DB_NODE]" + err.Error())
return
}
locker.Lock()
for _, one := range ones {
accessLog := one.(*NSAccessLog)
result = append(result, accessLog)
}
locker.Unlock()
}(daoWrapper)
}
wg.Wait()
if len(result) == 0 {
return nil, lastRequestId, nil
}
// 按照requestId排序
sort.Slice(result, func(i, j int) bool {
if !reverse {
return result[i].RequestId > result[j].RequestId
} else {
return result[i].RequestId < result[j].RequestId
}
})
if int64(len(result)) > size {
result = result[:size]
}
requestId := result[len(result)-1].RequestId
if reverse {
lists.Reverse(result)
}
if !reverse {
return result, requestId, nil
} else {
return result, requestId, nil
}
}
// FindAccessLogWithRequestId 根据请求ID获取访问日志
func (this *NSAccessLogDAO) FindAccessLogWithRequestId(tx *dbs.Tx, requestId string) (*NSAccessLog, error) {
if !regexp.MustCompile(`^\d{30,}`).MatchString(requestId) {
return nil, errors.New("invalid requestId")
}
accessLogLocker.RLock()
daoList := []*NSAccessLogDAOWrapper{}
for _, daoWrapper := range nsAccessLogDAOMapping {
daoList = append(daoList, daoWrapper)
}
accessLogLocker.RUnlock()
if len(daoList) == 0 {
daoList = []*NSAccessLogDAOWrapper{{
DAO: SharedNSAccessLogDAO,
NodeId: 0,
}}
}
count := len(daoList)
wg := &sync.WaitGroup{}
wg.Add(count)
var result *NSAccessLog = nil
day := timeutil.FormatTime("Ymd", types.Int64(requestId[:10]))
for _, daoWrapper := range daoList {
go func(daoWrapper *NSAccessLogDAOWrapper) {
defer wg.Done()
dao := daoWrapper.DAO
tableName, exists, err := findNSAccessLogTableName(dao.Instance, day)
if err != nil {
logs.Println("[DB_NODE]" + err.Error())
return
}
if !exists {
return
}
one, err := dao.Query(tx).
Table(tableName).
Attr("requestId", requestId).
Find()
if err != nil {
logs.Println("[DB_NODE]" + err.Error())
return
}
if one != nil {
result = one.(*NSAccessLog)
}
}(daoWrapper)
}
wg.Wait()
return result, nil
}

View File

@@ -0,0 +1,6 @@
package models
import (
_ "github.com/go-sql-driver/mysql"
_ "github.com/iwind/TeaGo/bootstrap"
)

View File

@@ -0,0 +1,26 @@
package models
// NSAccessLog 域名服务访问日志
type NSAccessLog struct {
Id uint64 `field:"id"` // ID
NodeId uint32 `field:"nodeId"` // 节点ID
DomainId uint32 `field:"domainId"` // 域名ID
RecordId uint32 `field:"recordId"` // 记录ID
Content string `field:"content"` // 访问数据
RequestId string `field:"requestId"` // 请求ID
CreatedAt uint64 `field:"createdAt"` // 创建时间
}
type NSAccessLogOperator struct {
Id interface{} // ID
NodeId interface{} // 节点ID
DomainId interface{} // 域名ID
RecordId interface{} // 记录ID
Content interface{} // 访问数据
RequestId interface{} // 请求ID
CreatedAt interface{} // 创建时间
}
func NewNSAccessLogOperator() *NSAccessLogOperator {
return &NSAccessLogOperator{}
}

View File

@@ -0,0 +1,17 @@
package models
import (
"encoding/json"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
)
// ToPB 转换成PB对象
func (this *NSAccessLog) ToPB() (*pb.NSAccessLog, error) {
p := &pb.NSAccessLog{}
err := json.Unmarshal([]byte(this.Content), p)
if err != nil {
return nil, err
}
p.RequestId = this.RequestId
return p, nil
}

View File

@@ -95,4 +95,5 @@ func (this *APINode) registerServices(server *grpc.Server) {
pb.RegisterNSDomainServiceServer(server, &nameservers.NSDomainService{}) pb.RegisterNSDomainServiceServer(server, &nameservers.NSDomainService{})
pb.RegisterNSRecordServiceServer(server, &nameservers.NSRecordService{}) pb.RegisterNSRecordServiceServer(server, &nameservers.NSRecordService{})
pb.RegisterNSRouteServiceServer(server, &nameservers.NSRouteService{}) pb.RegisterNSRouteServiceServer(server, &nameservers.NSRouteService{})
pb.RegisterNSAccessLogServiceServer(server, &nameservers.NSAccessLogService{})
} }

View File

@@ -0,0 +1,102 @@
package nameservers
import (
"context"
"github.com/TeaOSLab/EdgeAPI/internal/db/models"
"github.com/TeaOSLab/EdgeAPI/internal/rpc/services"
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
)
// 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
}
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, 0, 0)
if err != nil {
return nil, err
}
tx := this.NullTx()
// 检查服务ID
if userId > 0 {
// TODO
}
accessLogs, requestId, hasMore, err := models.SharedNSAccessLogDAO.ListAccessLogs(tx, req.RequestId, req.Size, req.Day, req.NsNodeId, req.NsDomainId, req.NsRecordId, req.Reverse)
if err != nil {
return nil, err
}
result := []*pb.NSAccessLog{}
for _, accessLog := range accessLogs {
a, err := accessLog.ToPB()
if err != nil {
return nil, err
}
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, 0, 0)
if err != nil {
return nil, err
}
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
}

View File

@@ -42,6 +42,36 @@ func (this *NSClusterService) UpdateNSCluster(ctx context.Context, req *pb.Updat
return this.Success() return this.Success()
} }
// FindNSClusterAccessLog 查找集群访问日志配置
func (this *NSClusterService) FindNSClusterAccessLog(ctx context.Context, req *pb.FindNSClusterAccessLogRequest) (*pb.FindNSClusterAccessLogResponse, error) {
_, err := this.ValidateAdmin(ctx, 0)
if err != nil {
return nil, err
}
var tx = this.NullTx()
accessLogJSON, err := nameservers.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, 0)
if err != nil {
return nil, err
}
var tx = this.NullTx()
err = nameservers.SharedNSClusterDAO.UpdateClusterAccessLog(tx, req.NsClusterId, req.AccessLogJSON)
if err != nil {
return nil, err
}
return this.Success()
}
// DeleteNSCluster 删除集群 // DeleteNSCluster 删除集群
func (this *NSClusterService) DeleteNSCluster(ctx context.Context, req *pb.DeleteNSCluster) (*pb.RPCSuccess, error) { func (this *NSClusterService) DeleteNSCluster(ctx context.Context, req *pb.DeleteNSCluster) (*pb.RPCSuccess, error) {
_, err := this.ValidateAdmin(ctx, 0) _, err := this.ValidateAdmin(ctx, 0)
@@ -99,7 +129,7 @@ func (this *NSClusterService) ListEnabledNSClusters(ctx context.Context, req *pb
return nil, err return nil, err
} }
var tx = this.NullTx() var tx = this.NullTx()
clusters, err := nameservers.SharedNSClusterDAO.ListEnabledNSClusters(tx, req.Offset, req.Size) clusters, err := nameservers.SharedNSClusterDAO.ListEnabledClusters(tx, req.Offset, req.Size)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -122,7 +152,7 @@ func (this *NSClusterService) FindAllEnabledNSClusters(ctx context.Context, req
return nil, err return nil, err
} }
var tx = this.NullTx() var tx = this.NullTx()
clusters, err := nameservers.SharedNSClusterDAO.FindAllEnabledNSClusters(tx) clusters, err := nameservers.SharedNSClusterDAO.FindAllEnabledClusters(tx)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@@ -4,6 +4,7 @@ package nameservers
import ( import (
"context" "context"
"encoding/json"
"github.com/TeaOSLab/EdgeAPI/internal/db/models/nameservers" "github.com/TeaOSLab/EdgeAPI/internal/db/models/nameservers"
"github.com/TeaOSLab/EdgeAPI/internal/errors" "github.com/TeaOSLab/EdgeAPI/internal/errors"
"github.com/TeaOSLab/EdgeAPI/internal/installers" "github.com/TeaOSLab/EdgeAPI/internal/installers"
@@ -341,8 +342,8 @@ func (this *NSNodeService) UpdateNSNodeStatus(ctx context.Context, req *pb.Updat
return this.Success() return this.Success()
} }
// FindCurrentNSNode 获取当前节点信息 // FindCurrentNSNodeConfig 获取当前节点信息
func (this *NSNodeService) FindCurrentNSNode(ctx context.Context, req *pb.FindCurrentNSNodeRequest) (*pb.FindCurrentNSNodeResponse, error) { func (this *NSNodeService) FindCurrentNSNodeConfig(ctx context.Context, req *pb.FindCurrentNSNodeConfigRequest) (*pb.FindCurrentNSNodeConfigResponse, error) {
// 校验节点 // 校验节点
_, nodeId, err := this.ValidateNodeId(ctx, rpcutils.UserTypeDNS) _, nodeId, err := this.ValidateNodeId(ctx, rpcutils.UserTypeDNS)
if err != nil { if err != nil {
@@ -350,50 +351,17 @@ func (this *NSNodeService) FindCurrentNSNode(ctx context.Context, req *pb.FindCu
} }
var tx = this.NullTx() var tx = this.NullTx()
node, err := nameservers.SharedNSNodeDAO.FindEnabledNSNode(tx, nodeId) config, err := nameservers.SharedNSNodeDAO.ComposeNodeConfig(tx, nodeId)
if err != nil {
return nil, err
}
if node == nil {
return &pb.FindCurrentNSNodeResponse{NsNode: nil}, nil
}
// 集群信息
clusterName, err := nameservers.SharedNSClusterDAO.FindEnabledNSClusterName(tx, int64(node.ClusterId))
if err != nil { if err != nil {
return nil, err return nil, err
} }
// 安装信息 if config == nil {
installStatus, err := node.DecodeInstallStatus() return &pb.FindCurrentNSNodeConfigResponse{NsNodeJSON: nil}, nil
}
configJSON, err := json.Marshal(config)
if err != nil { if err != nil {
return nil, err return nil, err
} }
installStatusResult := &pb.NodeInstallStatus{} return &pb.FindCurrentNSNodeConfigResponse{NsNodeJSON: configJSON}, nil
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.FindCurrentNSNodeResponse{NsNode: &pb.NSNode{
Id: int64(node.Id),
Name: node.Name,
StatusJSON: []byte(node.Status),
UniqueId: node.UniqueId,
Secret: node.Secret,
IsInstalled: node.IsInstalled == 1,
InstallDir: node.InstallDir,
NsCluster: &pb.NSCluster{
Id: int64(node.ClusterId),
Name: clusterName,
},
InstallStatus: installStatusResult,
IsOn: node.IsOn == 1,
}}, nil
} }

View File

@@ -6,6 +6,7 @@ import (
teaconst "github.com/TeaOSLab/EdgeAPI/internal/const" teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
"github.com/TeaOSLab/EdgeAPI/internal/db/models" "github.com/TeaOSLab/EdgeAPI/internal/db/models"
"github.com/TeaOSLab/EdgeAPI/internal/db/models/authority" "github.com/TeaOSLab/EdgeAPI/internal/db/models/authority"
"github.com/TeaOSLab/EdgeAPI/internal/db/models/nameservers"
"github.com/TeaOSLab/EdgeAPI/internal/db/models/stats" "github.com/TeaOSLab/EdgeAPI/internal/db/models/stats"
"github.com/TeaOSLab/EdgeAPI/internal/errors" "github.com/TeaOSLab/EdgeAPI/internal/errors"
rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils" rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
@@ -546,6 +547,12 @@ func (this *AdminService) ComposeAdminDashboard(ctx context.Context, req *pb.Com
}) })
} }
// 是否是企业版
isPlus, err := authority.SharedAuthorityKeyDAO.IsPlus(tx)
if err != nil {
return nil, err
}
// 边缘节点升级信息 // 边缘节点升级信息
{ {
upgradeInfo := &pb.ComposeAdminDashboardResponse_UpgradeInfo{ upgradeInfo := &pb.ComposeAdminDashboardResponse_UpgradeInfo{
@@ -560,7 +567,7 @@ func (this *AdminService) ComposeAdminDashboard(ctx context.Context, req *pb.Com
} }
// 监控节点升级信息 // 监控节点升级信息
{ if isPlus {
upgradeInfo := &pb.ComposeAdminDashboardResponse_UpgradeInfo{ upgradeInfo := &pb.ComposeAdminDashboardResponse_UpgradeInfo{
NewVersion: teaconst.MonitorNodeVersion, NewVersion: teaconst.MonitorNodeVersion,
} }
@@ -573,7 +580,7 @@ func (this *AdminService) ComposeAdminDashboard(ctx context.Context, req *pb.Com
} }
// 认证节点升级信息 // 认证节点升级信息
{ if isPlus {
upgradeInfo := &pb.ComposeAdminDashboardResponse_UpgradeInfo{ upgradeInfo := &pb.ComposeAdminDashboardResponse_UpgradeInfo{
NewVersion: teaconst.AuthorityNodeVersion, NewVersion: teaconst.AuthorityNodeVersion,
} }
@@ -586,7 +593,7 @@ func (this *AdminService) ComposeAdminDashboard(ctx context.Context, req *pb.Com
} }
// 用户节点升级信息 // 用户节点升级信息
{ if isPlus {
upgradeInfo := &pb.ComposeAdminDashboardResponse_UpgradeInfo{ upgradeInfo := &pb.ComposeAdminDashboardResponse_UpgradeInfo{
NewVersion: teaconst.UserNodeVersion, NewVersion: teaconst.UserNodeVersion,
} }
@@ -611,5 +618,18 @@ func (this *AdminService) ComposeAdminDashboard(ctx context.Context, req *pb.Com
resp.ApiNodeUpgradeInfo = upgradeInfo resp.ApiNodeUpgradeInfo = upgradeInfo
} }
// DNS节点升级信息
if isPlus {
upgradeInfo := &pb.ComposeAdminDashboardResponse_UpgradeInfo{
NewVersion: teaconst.DNSNodeVersion,
}
countNodes, err := nameservers.SharedNSNodeDAO.CountAllLowerVersionNodes(tx, upgradeInfo.NewVersion)
if err != nil {
return nil, err
}
upgradeInfo.CountNodes = countNodes
resp.NsNodeUpgradeInfo = upgradeInfo
}
return resp, nil return resp, nil
} }

View File

@@ -7,12 +7,12 @@ import (
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
) )
// 访问日志相关服务 // HTTPAccessLogService 访问日志相关服务
type HTTPAccessLogService struct { type HTTPAccessLogService struct {
BaseService BaseService
} }
// 创建访问日志 // CreateHTTPAccessLogs 创建访问日志
func (this *HTTPAccessLogService) CreateHTTPAccessLogs(ctx context.Context, req *pb.CreateHTTPAccessLogsRequest) (*pb.CreateHTTPAccessLogsResponse, error) { func (this *HTTPAccessLogService) CreateHTTPAccessLogs(ctx context.Context, req *pb.CreateHTTPAccessLogsRequest) (*pb.CreateHTTPAccessLogsResponse, error) {
// 校验请求 // 校验请求
_, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeNode) _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeNode)
@@ -20,13 +20,13 @@ func (this *HTTPAccessLogService) CreateHTTPAccessLogs(ctx context.Context, req
return nil, err return nil, err
} }
if len(req.AccessLogs) == 0 { if len(req.HttpAccessLogs) == 0 {
return &pb.CreateHTTPAccessLogsResponse{}, nil return &pb.CreateHTTPAccessLogsResponse{}, nil
} }
tx := this.NullTx() tx := this.NullTx()
err = models.SharedHTTPAccessLogDAO.CreateHTTPAccessLogs(tx, req.AccessLogs) err = models.SharedHTTPAccessLogDAO.CreateHTTPAccessLogs(tx, req.HttpAccessLogs)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -34,7 +34,7 @@ func (this *HTTPAccessLogService) CreateHTTPAccessLogs(ctx context.Context, req
return &pb.CreateHTTPAccessLogsResponse{}, nil return &pb.CreateHTTPAccessLogsResponse{}, nil
} }
// 列出单页访问日志 // ListHTTPAccessLogs 列出单页访问日志
func (this *HTTPAccessLogService) ListHTTPAccessLogs(ctx context.Context, req *pb.ListHTTPAccessLogsRequest) (*pb.ListHTTPAccessLogsResponse, error) { func (this *HTTPAccessLogService) ListHTTPAccessLogs(ctx context.Context, req *pb.ListHTTPAccessLogsRequest) (*pb.ListHTTPAccessLogsResponse, error) {
// 校验请求 // 校验请求
_, userId, err := this.ValidateAdminAndUser(ctx, 0, 0) _, userId, err := this.ValidateAdminAndUser(ctx, 0, 0)
@@ -74,13 +74,13 @@ func (this *HTTPAccessLogService) ListHTTPAccessLogs(ctx context.Context, req *p
} }
return &pb.ListHTTPAccessLogsResponse{ return &pb.ListHTTPAccessLogsResponse{
AccessLogs: result, HttpAccessLogs: result,
HasMore: hasMore, HasMore: hasMore,
RequestId: requestId, RequestId: requestId,
}, nil }, nil
} }
// 查找单个日志 // FindHTTPAccessLog 查找单个日志
func (this *HTTPAccessLogService) FindHTTPAccessLog(ctx context.Context, req *pb.FindHTTPAccessLogRequest) (*pb.FindHTTPAccessLogResponse, error) { func (this *HTTPAccessLogService) FindHTTPAccessLog(ctx context.Context, req *pb.FindHTTPAccessLogRequest) (*pb.FindHTTPAccessLogResponse, error) {
// 校验请求 // 校验请求
_, userId, err := this.ValidateAdminAndUser(ctx, 0, 0) _, userId, err := this.ValidateAdminAndUser(ctx, 0, 0)
@@ -95,7 +95,7 @@ func (this *HTTPAccessLogService) FindHTTPAccessLog(ctx context.Context, req *pb
return nil, err return nil, err
} }
if accessLog == nil { if accessLog == nil {
return &pb.FindHTTPAccessLogResponse{AccessLog: nil}, nil return &pb.FindHTTPAccessLogResponse{HttpAccessLog: nil}, nil
} }
// 检查权限 // 检查权限
@@ -110,5 +110,5 @@ func (this *HTTPAccessLogService) FindHTTPAccessLog(ctx context.Context, req *pb
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &pb.FindHTTPAccessLogResponse{AccessLog: a}, nil return &pb.FindHTTPAccessLogResponse{HttpAccessLog: a}, nil
} }