mirror of
https://github.com/TeaOSLab/EdgeAPI.git
synced 2025-11-05 00:52:27 +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
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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