增加威胁域名审计
This commit is contained in:
+27
-20
@@ -89,6 +89,11 @@ func createTables(db *sql.DB) error {
|
||||
CREATE INDEX IF NOT EXISTS idx_client_ip ON query_logs(client_ip);
|
||||
CREATE INDEX IF NOT EXISTS idx_result ON query_logs(result);
|
||||
CREATE INDEX IF NOT EXISTS idx_query_type ON query_logs(query_type);
|
||||
CREATE INDEX IF NOT EXISTS idx_result_timestamp ON query_logs(result, timestamp DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_query_type_timestamp ON query_logs(query_type, timestamp DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_domain_timestamp ON query_logs(domain, timestamp DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_client_ip_timestamp ON query_logs(client_ip, timestamp DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_result_query_type ON query_logs(result, query_type);
|
||||
`
|
||||
|
||||
_, err := db.Exec(schema)
|
||||
@@ -204,8 +209,6 @@ func (s *SQLiteStore) Log(log QueryLog) error {
|
||||
|
||||
// QueryLogs 查询日志
|
||||
func (s *SQLiteStore) QueryLogs(filter LogFilter, page PageParams) ([]QueryLog, int64, error) {
|
||||
fmt.Printf("SQLiteStore.QueryLogs called: filter=%+v, page=%+v\n", filter, page)
|
||||
|
||||
// 构建查询条件
|
||||
whereClause := "1=1"
|
||||
args := []interface{}{}
|
||||
@@ -235,18 +238,6 @@ func (s *SQLiteStore) QueryLogs(filter LogFilter, page PageParams) ([]QueryLog,
|
||||
searchTerm := "%" + filter.SearchTerm + "%"
|
||||
args = append(args, searchTerm, searchTerm)
|
||||
}
|
||||
|
||||
fmt.Printf("SQLite WHERE clause: %s, args: %v\n", whereClause, args)
|
||||
|
||||
// 获取总数
|
||||
countQuery := fmt.Sprintf("SELECT COUNT(*) FROM query_logs WHERE %s", whereClause)
|
||||
var total int64
|
||||
err := s.db.QueryRow(countQuery, args...).Scan(&total)
|
||||
if err != nil {
|
||||
return nil, 0, fmt.Errorf("查询总数失败:%w", err)
|
||||
}
|
||||
|
||||
fmt.Printf("SQLite total count: %d\n", total)
|
||||
|
||||
// 构建排序
|
||||
sortField := page.SortField
|
||||
@@ -258,28 +249,37 @@ func (s *SQLiteStore) QueryLogs(filter LogFilter, page PageParams) ([]QueryLog,
|
||||
sortDirection = "DESC"
|
||||
}
|
||||
|
||||
// 查询日志
|
||||
// 使用子查询一次性获取总数和数据,提高查询效率
|
||||
query := fmt.Sprintf(`
|
||||
SELECT id, timestamp, client_ip, domain, query_type, response_time,
|
||||
result, block_rule, block_type, from_cache, dnssec, edns,
|
||||
dns_server, dnssec_server, answers, response_code
|
||||
SELECT
|
||||
id, timestamp, client_ip, domain, query_type, response_time,
|
||||
result, block_rule, block_type, from_cache, dnssec, edns,
|
||||
dns_server, dnssec_server, answers, response_code,
|
||||
COUNT(*) OVER() as total_count
|
||||
FROM query_logs
|
||||
WHERE %s
|
||||
ORDER BY %s %s
|
||||
LIMIT ? OFFSET ?
|
||||
`, whereClause, sortField, sortDirection)
|
||||
|
||||
args = append(args, page.Limit, page.Offset)
|
||||
queryArgs := make([]interface{}, len(args)+2)
|
||||
copy(queryArgs, args)
|
||||
queryArgs[len(args)] = page.Limit
|
||||
queryArgs[len(args)+1] = page.Offset
|
||||
|
||||
rows, err := s.db.Query(query, args...)
|
||||
rows, err := s.db.Query(query, queryArgs...)
|
||||
if err != nil {
|
||||
return nil, 0, fmt.Errorf("查询日志失败:%w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var logs []QueryLog
|
||||
var total int64 = 0
|
||||
hasRows := false
|
||||
for rows.Next() {
|
||||
hasRows = true
|
||||
var log QueryLog
|
||||
var totalCount int64
|
||||
err := rows.Scan(
|
||||
&log.ID,
|
||||
&log.Timestamp,
|
||||
@@ -297,11 +297,18 @@ func (s *SQLiteStore) QueryLogs(filter LogFilter, page PageParams) ([]QueryLog,
|
||||
&log.DNSSECServer,
|
||||
&log.Answers,
|
||||
&log.ResponseCode,
|
||||
&totalCount,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, 0, fmt.Errorf("扫描日志失败:%w", err)
|
||||
}
|
||||
logs = append(logs, log)
|
||||
total = totalCount
|
||||
}
|
||||
|
||||
// 如果没有数据,总数为 0
|
||||
if !hasRows {
|
||||
total = 0
|
||||
}
|
||||
|
||||
return logs, total, nil
|
||||
|
||||
Reference in New Issue
Block a user