mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 16:00:24 +08:00 
			
		
		
		
	
		
			
	
	
		
			179 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			179 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								package services
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"context"
							 | 
						||
| 
								 | 
							
									"github.com/TeaOSLab/EdgeAPI/internal/db/models"
							 | 
						||
| 
								 | 
							
									"github.com/TeaOSLab/EdgeAPI/internal/db/models/stats"
							 | 
						||
| 
								 | 
							
									"github.com/TeaOSLab/EdgeAPI/internal/utils"
							 | 
						||
| 
								 | 
							
									"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
							 | 
						||
| 
								 | 
							
									"github.com/iwind/TeaGo/types"
							 | 
						||
| 
								 | 
							
									timeutil "github.com/iwind/TeaGo/utils/time"
							 | 
						||
| 
								 | 
							
									"time"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// FirewallService 防火墙全局服务
							 | 
						||
| 
								 | 
							
								type FirewallService struct {
							 | 
						||
| 
								 | 
							
									BaseService
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ComposeFirewallGlobalBoard 组合看板数据
							 | 
						||
| 
								 | 
							
								func (this *FirewallService) ComposeFirewallGlobalBoard(ctx context.Context, req *pb.ComposeFirewallGlobalBoardRequest) (*pb.ComposeFirewallGlobalBoardResponse, error) {
							 | 
						||
| 
								 | 
							
									_, err := this.ValidateAdmin(ctx, 0)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var now = time.Now()
							 | 
						||
| 
								 | 
							
									var day = timeutil.Format("Ymd")
							 | 
						||
| 
								 | 
							
									var w = types.Int(timeutil.Format("w"))
							 | 
						||
| 
								 | 
							
									if w == 0 {
							 | 
						||
| 
								 | 
							
										w = 7
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									weekFrom := timeutil.Format("Ymd", now.AddDate(0, 0, -w+1))
							 | 
						||
| 
								 | 
							
									weekTo := timeutil.Format("Ymd", now.AddDate(0, 0, -w+7))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var result = &pb.ComposeFirewallGlobalBoardResponse{}
							 | 
						||
| 
								 | 
							
									var tx = this.NullTx()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									countDailyLog, err := stats.SharedServerHTTPFirewallDailyStatDAO.SumDailyCount(tx, 0, 0, "log", day, day)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									result.CountDailyLogs = countDailyLog
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									countDailyBlock, err := stats.SharedServerHTTPFirewallDailyStatDAO.SumDailyCount(tx, 0, 0, "block", day, day)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									result.CountDailyBlocks = countDailyBlock
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									countDailyCaptcha, err := stats.SharedServerHTTPFirewallDailyStatDAO.SumDailyCount(tx, 0, 0, "captcha", day, day)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									result.CountDailyCaptcha = countDailyCaptcha
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									countWeeklyBlock, err := stats.SharedServerHTTPFirewallDailyStatDAO.SumDailyCount(tx, 0, 0, "block", weekFrom, weekTo)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									result.CountWeeklyBlocks = countWeeklyBlock
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// 24小时趋势
							 | 
						||
| 
								 | 
							
									var hourFrom = timeutil.Format("YmdH", time.Now().Add(-23*time.Hour))
							 | 
						||
| 
								 | 
							
									var hourTo = timeutil.Format("YmdH")
							 | 
						||
| 
								 | 
							
									hours, err := utils.RangeHours(hourFrom, hourTo)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										statList, err := stats.SharedServerHTTPFirewallHourlyStatDAO.FindHourlyStats(tx, 0, 0, "log", hourFrom, hourTo)
							 | 
						||
| 
								 | 
							
										if err != nil {
							 | 
						||
| 
								 | 
							
											return nil, err
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										m := map[string]int64{} // day => count
							 | 
						||
| 
								 | 
							
										for _, stat := range statList {
							 | 
						||
| 
								 | 
							
											m[stat.Hour] = int64(stat.Count)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										for _, hour := range hours {
							 | 
						||
| 
								 | 
							
											result.HourlyStats = append(result.HourlyStats, &pb.ComposeFirewallGlobalBoardResponse_HourlyStat{Hour: hour, CountLogs: m[hour]})
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										statList, err := stats.SharedServerHTTPFirewallHourlyStatDAO.FindHourlyStats(tx, 0, 0, "captcha", hourFrom, hourTo)
							 | 
						||
| 
								 | 
							
										if err != nil {
							 | 
						||
| 
								 | 
							
											return nil, err
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										m := map[string]int64{} // day => count
							 | 
						||
| 
								 | 
							
										for _, stat := range statList {
							 | 
						||
| 
								 | 
							
											m[stat.Hour] = int64(stat.Count)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										for index, hour := range hours {
							 | 
						||
| 
								 | 
							
											result.HourlyStats[index].CountCaptcha = m[hour]
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										statList, err := stats.SharedServerHTTPFirewallHourlyStatDAO.FindHourlyStats(tx, 0, 0, "block", hourFrom, hourTo)
							 | 
						||
| 
								 | 
							
										if err != nil {
							 | 
						||
| 
								 | 
							
											return nil, err
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										m := map[string]int64{} // day => count
							 | 
						||
| 
								 | 
							
										for _, stat := range statList {
							 | 
						||
| 
								 | 
							
											m[stat.Hour] = int64(stat.Count)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										for index, hour := range hours {
							 | 
						||
| 
								 | 
							
											result.HourlyStats[index].CountBlocks = m[hour]
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// 14天趋势
							 | 
						||
| 
								 | 
							
									dayFrom := timeutil.Format("Ymd", now.AddDate(0, 0, -14))
							 | 
						||
| 
								 | 
							
									days, err := utils.RangeDays(dayFrom, day)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										statList, err := stats.SharedServerHTTPFirewallDailyStatDAO.FindDailyStats(tx, 0, 0, "log", dayFrom, day)
							 | 
						||
| 
								 | 
							
										if err != nil {
							 | 
						||
| 
								 | 
							
											return nil, err
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										m := map[string]int64{} // day => count
							 | 
						||
| 
								 | 
							
										for _, stat := range statList {
							 | 
						||
| 
								 | 
							
											m[stat.Day] = int64(stat.Count)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										for _, day := range days {
							 | 
						||
| 
								 | 
							
											result.DailyStats = append(result.DailyStats, &pb.ComposeFirewallGlobalBoardResponse_DailyStat{Day: day, CountLogs: m[day]})
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										statList, err := stats.SharedServerHTTPFirewallDailyStatDAO.FindDailyStats(tx, 0, 0, "captcha", dayFrom, day)
							 | 
						||
| 
								 | 
							
										if err != nil {
							 | 
						||
| 
								 | 
							
											return nil, err
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										m := map[string]int64{} // day => count
							 | 
						||
| 
								 | 
							
										for _, stat := range statList {
							 | 
						||
| 
								 | 
							
											m[stat.Day] = int64(stat.Count)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										for index, day := range days {
							 | 
						||
| 
								 | 
							
											result.DailyStats[index].CountCaptcha = m[day]
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										statList, err := stats.SharedServerHTTPFirewallDailyStatDAO.FindDailyStats(tx, 0, 0, "block", dayFrom, day)
							 | 
						||
| 
								 | 
							
										if err != nil {
							 | 
						||
| 
								 | 
							
											return nil, err
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										m := map[string]int64{} // day => count
							 | 
						||
| 
								 | 
							
										for _, stat := range statList {
							 | 
						||
| 
								 | 
							
											m[stat.Day] = int64(stat.Count)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										for index, day := range days {
							 | 
						||
| 
								 | 
							
											result.DailyStats[index].CountBlocks = m[day]
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// 规则分组
							 | 
						||
| 
								 | 
							
									groupStats, err := stats.SharedServerHTTPFirewallDailyStatDAO.GroupDailyCount(tx, 0, 0, dayFrom, day, 0, 10)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									for _, stat := range groupStats {
							 | 
						||
| 
								 | 
							
										ruleGroupName, err := models.SharedHTTPFirewallRuleGroupDAO.FindHTTPFirewallRuleGroupName(tx, int64(stat.HttpFirewallRuleGroupId))
							 | 
						||
| 
								 | 
							
										if err != nil {
							 | 
						||
| 
								 | 
							
											return nil, err
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										if len(ruleGroupName) == 0 {
							 | 
						||
| 
								 | 
							
											continue
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										result.HttpFirewallRuleGroups = append(result.HttpFirewallRuleGroups, &pb.ComposeFirewallGlobalBoardResponse_HTTPFirewallRuleGroupStat{
							 | 
						||
| 
								 | 
							
											HttpFirewallRuleGroup: &pb.HTTPFirewallRuleGroup{Id: int64(stat.HttpFirewallRuleGroupId), Name: ruleGroupName},
							 | 
						||
| 
								 | 
							
											Count:                 int64(stat.Count),
							 | 
						||
| 
								 | 
							
										})
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return result, nil
							 | 
						||
| 
								 | 
							
								}
							 |