diff --git a/internal/rpc/rpc_client.go b/internal/rpc/rpc_client.go index 8a568a5a..1eeff2f2 100644 --- a/internal/rpc/rpc_client.go +++ b/internal/rpc/rpc_client.go @@ -115,6 +115,10 @@ func (this *RPCClient) ServerRegionProviderMonthlyStatRPC() pb.ServerRegionProvi return pb.NewServerRegionProviderMonthlyStatServiceClient(this.pickConn()) } +func (this *RPCClient) ServerHTTPFirewallDailyStatRPC() pb.ServerHTTPFirewallDailyStatServiceClient { + return pb.NewServerHTTPFirewallDailyStatServiceClient(this.pickConn()) +} + func (this *RPCClient) ServerGroupRPC() pb.ServerGroupServiceClient { return pb.NewServerGroupServiceClient(this.pickConn()) } diff --git a/internal/web/actions/default/servers/server/stat/init.go b/internal/web/actions/default/servers/server/stat/init.go index d1f5942c..4cb64f65 100644 --- a/internal/web/actions/default/servers/server/stat/init.go +++ b/internal/web/actions/default/servers/server/stat/init.go @@ -16,6 +16,7 @@ func init() { Get("", new(IndexAction)). Get("/providers", new(ProvidersAction)). Get("/clients", new(ClientsAction)). + Get("/waf", new(WafAction)). EndAll() }) } diff --git a/internal/web/actions/default/servers/server/stat/waf.go b/internal/web/actions/default/servers/server/stat/waf.go new file mode 100644 index 00000000..16d496a0 --- /dev/null +++ b/internal/web/actions/default/servers/server/stat/waf.go @@ -0,0 +1,78 @@ +package stat + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/maps" + timeutil "github.com/iwind/TeaGo/utils/time" +) + +type WafAction struct { + actionutils.ParentAction +} + +func (this *WafAction) Init() { + this.Nav("", "stat", "") + this.SecondMenu("waf") +} + +func (this *WafAction) RunGet(params struct { + ServerId int64 +}) { + // 统计数据 + resp, err := this.RPC().ServerHTTPFirewallDailyStatRPC().ComposeServerHTTPFirewallDashboard(this.AdminContext(), &pb.ComposeServerHTTPFirewallDashboardRequest{ + Day: timeutil.Format("Ymd"), + ServerId: params.ServerId, + }) + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["countDailyLog"] = resp.CountDailyLog + this.Data["countDailyBlock"] = resp.CountDailyBlock + this.Data["countDailyCaptcha"] = resp.CountDailyCaptcha + this.Data["countWeeklyBlock"] = resp.CountWeeklyBlock + this.Data["countMonthlyBlock"] = resp.CountMonthlyBlock + + // 分组 + groupStatMaps := []maps.Map{} + for _, group := range resp.HttpFirewallRuleGroups { + groupStatMaps = append(groupStatMaps, maps.Map{ + "group": maps.Map{ + "id": group.HttpFirewallRuleGroup.Id, + "name": group.HttpFirewallRuleGroup.Name, + }, + "count": group.Count, + }) + } + this.Data["groupStats"] = groupStatMaps + + // 每日趋势 + logStatMaps := []maps.Map{} + blockStatMaps := []maps.Map{} + captchaStatMaps := []maps.Map{} + for _, stat := range resp.LogDailyStats { + logStatMaps = append(logStatMaps, maps.Map{ + "day": stat.Day, + "count": stat.Count, + }) + } + for _, stat := range resp.BlockDailyStats { + blockStatMaps = append(blockStatMaps, maps.Map{ + "day": stat.Day, + "count": stat.Count, + }) + } + for _, stat := range resp.CaptchaDailyStats { + captchaStatMaps = append(captchaStatMaps, maps.Map{ + "day": stat.Day, + "count": stat.Count, + }) + } + this.Data["logDailyStats"] = logStatMaps + this.Data["blockDailyStats"] = blockStatMaps + this.Data["captchaDailyStats"] = captchaStatMaps + + this.Show() +} diff --git a/internal/web/actions/default/servers/serverutils/server_helper.go b/internal/web/actions/default/servers/serverutils/server_helper.go index 4fb81990..93cd98d9 100644 --- a/internal/web/actions/default/servers/serverutils/server_helper.go +++ b/internal/web/actions/default/servers/serverutils/server_helper.go @@ -171,6 +171,11 @@ func (this *ServerHelper) createStatMenu(secondMenuItem string, serverIdString s "url": "/servers/server/stat/clients?serverId=" + serverIdString, "isActive": secondMenuItem == "client", }) + menuItems = append(menuItems, maps.Map{ + "name": "WAF", + "url": "/servers/server/stat/waf?serverId=" + serverIdString, + "isActive": secondMenuItem == "waf", + }) return menuItems } diff --git a/web/views/@default/servers/server/stat/waf.css b/web/views/@default/servers/server/stat/waf.css new file mode 100644 index 00000000..346ec7de --- /dev/null +++ b/web/views/@default/servers/server/stat/waf.css @@ -0,0 +1,26 @@ +.grid { + margin-top: 2em !important; + margin-left: 2em !important; +} +.grid .column { + margin-bottom: 2em; + border-right: 1px #eee solid; +} +.grid .column div.value { + margin-top: 1.5em; +} +.grid .column div.value span { + font-size: 2em; + margin-right: 0.2em; +} +.grid .column.no-border { + border-right: 0; +} +.chart-box { + height: 20em; +} +h4 .color-span { + font-size: 0.6em; + padding: 2px 4px; +} +/*# sourceMappingURL=waf.css.map */ \ No newline at end of file diff --git a/web/views/@default/servers/server/stat/waf.css.map b/web/views/@default/servers/server/stat/waf.css.map new file mode 100644 index 00000000..b87862d2 --- /dev/null +++ b/web/views/@default/servers/server/stat/waf.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["waf.less"],"names":[],"mappings":"AAAA;EACC,0BAAA;EACA,2BAAA;;AAFD,KAIC;EACC,kBAAA;EACA,4BAAA;;AANF,KAIC,QAIC,IAAG;EACF,iBAAA;;AATH,KAIC,QAIC,IAAG,MAGF;EACC,cAAA;EACA,mBAAA;;AAbJ,KAkBC,QAAO;EACN,eAAA;;AAIF;EACC,YAAA;;AAGD,EAAG;EACF,gBAAA;EACA,gBAAA","file":"waf.css"} \ No newline at end of file diff --git a/web/views/@default/servers/server/stat/waf.html b/web/views/@default/servers/server/stat/waf.html new file mode 100644 index 00000000..a3d96991 --- /dev/null +++ b/web/views/@default/servers/server/stat/waf.html @@ -0,0 +1,47 @@ +{$layout} + +{$var "header"} + + +{$end} + +{$template "/left_menu"} +