mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 16:00:24 +08:00 
			
		
		
		
	域名服务增加访问日志
This commit is contained in:
		@@ -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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,16 +16,29 @@ import (
 | 
				
			|||||||
	"time"
 | 
						"time"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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,46 +313,94 @@ func (this *DBNodeInitializer) loop() error {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// 检查表是否存在
 | 
								// 检查表是否存在
 | 
				
			||||||
			tableName, err := findAccessLogTable(db, timeutil.Format("Ymd"), false)
 | 
								// httpAccessLog
 | 
				
			||||||
			if err != nil {
 | 
								{
 | 
				
			||||||
				if !strings.Contains(err.Error(), "1050") { // 非表格已存在错误
 | 
									tableName, err := findHTTPAccessLogTable(db, timeutil.Format("Ymd"), false)
 | 
				
			||||||
					logs.Println("[DB_NODE]create first table in database node failed: " + err.Error())
 | 
									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())
 | 
											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 {
 | 
											if createLogErr != nil {
 | 
				
			||||||
						logs.Println("[NODE_LOG]" + createLogErr.Error())
 | 
												logs.Println("[NODE_LOG]" + createLogErr.Error())
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											continue
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											err = nil
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					 | 
				
			||||||
					continue
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					err = nil
 | 
					 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									daoObject := dbs.DAOObject{
 | 
				
			||||||
 | 
										Instance: db,
 | 
				
			||||||
 | 
										DB:       node.Name + "(id:" + strconv.Itoa(int(node.Id)) + ")",
 | 
				
			||||||
 | 
										Table:    tableName,
 | 
				
			||||||
 | 
										PkName:   "id",
 | 
				
			||||||
 | 
										Model:    new(HTTPAccessLog),
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									err = daoObject.Init()
 | 
				
			||||||
 | 
									if err != nil {
 | 
				
			||||||
 | 
										logs.Println("[DB_NODE]initialize dao failed: " + err.Error())
 | 
				
			||||||
 | 
										continue
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									accessLogLocker.Lock()
 | 
				
			||||||
 | 
									accessLogDBMapping[nodeId] = db
 | 
				
			||||||
 | 
									dao := &HTTPAccessLogDAO{
 | 
				
			||||||
 | 
										DAOObject: daoObject,
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									httpAccessLogDAOMapping[nodeId] = &HTTPAccessLogDAOWrapper{
 | 
				
			||||||
 | 
										DAO:    dao,
 | 
				
			||||||
 | 
										NodeId: nodeId,
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									accessLogLocker.Unlock()
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			daoObject := dbs.DAOObject{
 | 
					 | 
				
			||||||
				Instance: db,
 | 
					 | 
				
			||||||
				DB:       node.Name + "(id:" + strconv.Itoa(int(node.Id)) + ")",
 | 
					 | 
				
			||||||
				Table:    tableName,
 | 
					 | 
				
			||||||
				PkName:   "id",
 | 
					 | 
				
			||||||
				Model:    new(HTTPAccessLog),
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			err = daoObject.Init()
 | 
					 | 
				
			||||||
			if err != nil {
 | 
					 | 
				
			||||||
				logs.Println("[DB_NODE]initialize dao failed: " + err.Error())
 | 
					 | 
				
			||||||
				continue
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			accessLogLocker.Lock()
 | 
								// nsAccessLog
 | 
				
			||||||
			accessLogDBMapping[nodeId] = db
 | 
								{
 | 
				
			||||||
			dao := &HTTPAccessLogDAO{
 | 
									tableName, err := findNSAccessLogTable(db, timeutil.Format("Ymd"), false)
 | 
				
			||||||
				DAOObject: daoObject,
 | 
									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,
 | 
				
			||||||
 | 
										NodeId: nodeId,
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									accessLogLocker.Unlock()
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			accessLogDAOMapping[nodeId] = &HTTPAccessLogDAOWrapper{
 | 
					 | 
				
			||||||
				DAO:    dao,
 | 
					 | 
				
			||||||
				NodeId: nodeId,
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			accessLogLocker.Unlock()
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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 {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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 先什么都不做
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										309
									
								
								internal/db/models/ns_access_log_dao.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										309
									
								
								internal/db/models/ns_access_log_dao.go
									
									
									
									
									
										Normal 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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										6
									
								
								internal/db/models/ns_access_log_dao_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								internal/db/models/ns_access_log_dao_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					package models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
 | 
						_ "github.com/iwind/TeaGo/bootstrap"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
							
								
								
									
										26
									
								
								internal/db/models/ns_access_log_model.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								internal/db/models/ns_access_log_model.go
									
									
									
									
									
										Normal 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{}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										17
									
								
								internal/db/models/ns_access_log_model_ext.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								internal/db/models/ns_access_log_model_ext.go
									
									
									
									
									
										Normal 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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -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{})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										102
									
								
								internal/rpc/services/nameservers/service_ns_access_log.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								internal/rpc/services/nameservers/service_ns_access_log.go
									
									
									
									
									
										Normal 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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -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
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user