diff --git a/internal/web/actions/default/servers/server/log/init.go b/internal/web/actions/default/servers/server/log/init.go index cac0a9a4..8016e1b2 100644 --- a/internal/web/actions/default/servers/server/log/init.go +++ b/internal/web/actions/default/servers/server/log/init.go @@ -15,6 +15,7 @@ func init() { GetPost("", new(IndexAction)). GetPost("/today", new(TodayAction)). GetPost("/history", new(HistoryAction)). + Get("/viewPopup", new(ViewPopupAction)). EndAll() }) } diff --git a/internal/web/actions/default/servers/server/log/viewPopup.go b/internal/web/actions/default/servers/server/log/viewPopup.go new file mode 100644 index 00000000..986fc28d --- /dev/null +++ b/internal/web/actions/default/servers/server/log/viewPopup.go @@ -0,0 +1,86 @@ +package log + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/maps" + "net/http" +) + +type ViewPopupAction struct { + actionutils.ParentAction +} + +func (this *ViewPopupAction) Init() { + this.Nav("", "", "") +} + +func (this *ViewPopupAction) RunGet(params struct { + RequestId string +}) { + accessLogResp, err := this.RPC().HTTPAccessLogRPC().FindHTTPAccessLog(this.AdminContext(), &pb.FindHTTPAccessLogRequest{RequestId: params.RequestId}) + if err != nil { + this.ErrorPage(err) + return + } + accessLog := accessLogResp.AccessLog + if accessLog == nil { + this.WriteString("not found: " + params.RequestId) + return + } + + // 状态 + if len(accessLog.StatusMessage) == 0 { + accessLog.StatusMessage = http.StatusText(int(accessLog.Status)) + } + + this.Data["accessLog"] = accessLog + + // WAF相关 + var wafMap maps.Map = nil + if accessLog.FirewallPolicyId > 0 { + policyResp, err := this.RPC().HTTPFirewallPolicyRPC().FindEnabledFirewallPolicy(this.AdminContext(), &pb.FindEnabledFirewallPolicyRequest{FirewallPolicyId: accessLog.FirewallPolicyId}) + if err != nil { + this.ErrorPage(err) + return + } + if policyResp.FirewallPolicy != nil { + wafMap = maps.Map{ + "policy": maps.Map{ + "id": policyResp.FirewallPolicy.Id, + "name": policyResp.FirewallPolicy.Name, + }, + } + if accessLog.FirewallRuleGroupId > 0 { + groupResp, err := this.RPC().HTTPFirewallRuleGroupRPC().FindEnabledHTTPFirewallRuleGroup(this.AdminContext(), &pb.FindEnabledHTTPFirewallRuleGroupRequest{FirewallRuleGroupId: accessLog.FirewallRuleGroupId}) + if err != nil { + this.ErrorPage(err) + return + } + if groupResp.FirewallRuleGroup != nil { + wafMap["group"] = maps.Map{ + "id": groupResp.FirewallRuleGroup.Id, + "name": groupResp.FirewallRuleGroup.Name, + } + + if accessLog.FirewallRuleSetId > 0 { + setResp, err := this.RPC().HTTPFirewallRuleSetRPC().FindEnabledHTTPFirewallRuleSet(this.AdminContext(), &pb.FindEnabledHTTPFirewallRuleSetRequest{FirewallRuleSetId: accessLog.FirewallRuleSetId}) + if err != nil { + this.ErrorPage(err) + return + } + if setResp.FirewallRuleSet != nil { + wafMap["set"] = maps.Map{ + "id": setResp.FirewallRuleSet.Id, + "name": setResp.FirewallRuleSet.Name, + } + } + } + } + } + } + } + this.Data["wafInfo"] = wafMap + + this.Show() +} diff --git a/internal/web/models/http_firewall_rule_group_dao.go b/internal/web/models/http_firewall_rule_group_dao.go index a3e42507..9966629d 100644 --- a/internal/web/models/http_firewall_rule_group_dao.go +++ b/internal/web/models/http_firewall_rule_group_dao.go @@ -20,7 +20,7 @@ func (this *HTTPFirewallRuleGroupDAO) FindRuleGroupConfig(ctx context.Context, g return nil, err } - groupResp, err := client.HTTPFirewallRuleGroupRPC().FindHTTPFirewallRuleGroupConfig(ctx, &pb.FindHTTPFirewallRuleGroupConfigRequest{FirewallRuleGroupId: groupId}) + groupResp, err := client.HTTPFirewallRuleGroupRPC().FindEnabledHTTPFirewallRuleGroupConfig(ctx, &pb.FindEnabledHTTPFirewallRuleGroupConfigRequest{FirewallRuleGroupId: groupId}) if err != nil { return nil, err } diff --git a/internal/web/models/http_firewall_rule_set_dao.go b/internal/web/models/http_firewall_rule_set_dao.go index adb0ee42..1a1662c9 100644 --- a/internal/web/models/http_firewall_rule_set_dao.go +++ b/internal/web/models/http_firewall_rule_set_dao.go @@ -19,7 +19,7 @@ func (this *HTTPFirewallRuleSetDAO) FindRuleSetConfig(ctx context.Context, setId if err != nil { return nil, err } - resp, err := client.HTTPFirewallRuleSetRPC().FindHTTPFirewallRuleSetConfig(ctx, &pb.FindHTTPFirewallRuleSetConfigRequest{FirewallRuleSetId: setId}) + resp, err := client.HTTPFirewallRuleSetRPC().FindEnabledHTTPFirewallRuleSetConfig(ctx, &pb.FindEnabledHTTPFirewallRuleSetConfigRequest{FirewallRuleSetId: setId}) if err != nil { return nil, err } diff --git a/web/public/js/components/server/http-access-log-box.js b/web/public/js/components/server/http-access-log-box.js index 8aa55694..b87486b7 100644 --- a/web/public/js/components/server/http-access-log-box.js +++ b/web/public/js/components/server/http-access-log-box.js @@ -14,9 +14,33 @@ Vue.component("http-access-log-box", { } return pieces[0] + "." + pieces[1].substr(0, 3); + }, + showLog: function () { + let that = this + let requestId = this.accessLog.requestId + this.$parent.$children.forEach(function (v) { + if (v.deselect != null) { + v.deselect() + } + }) + this.select() + teaweb.popup("/servers/server/log/viewPopup?requestId=" + requestId, { + width: "50em", + height: "24em", + onClose: function () { + that.deselect() + } + }) + }, + select: function () { + this.$refs.box.parentNode.style.cssText = "background: rgba(0, 0, 0, 0.1)" + }, + deselect: function () { + this.$refs.box.parentNode.style.cssText = "" } }, - template: `
+ template: `
{{accessLog.remoteAddr}} [{{accessLog.timeLocal}}] "{{accessLog.requestMethod}} {{accessLog.scheme}}://{{accessLog.host}}{{accessLog.requestURI}} {{accessLog.proto}}" {{accessLog.status}} [cached] [waf {{accessLog.attrs['waf.action']}}] - 耗时:{{formatCost(accessLog.requestTime)}} ms +  
` }) \ No newline at end of file diff --git a/web/public/js/utils.js b/web/public/js/utils.js index 14b1b6be..ba0f2830 100644 --- a/web/public/js/utils.js +++ b/web/public/js/utils.js @@ -118,7 +118,12 @@ window.teaweb = { padding: "0.5em", showConfirmButton: false, showCloseButton: true, - focusConfirm: false + focusConfirm: false, + onClose: function (popup) { + if (typeof (options["onClose"]) == "function") { + options["onClose"].apply(Tea.Vue, arguments) + } + } }); }, popupFinish: function () { diff --git a/web/views/@default/servers/server/log/viewPopup.css b/web/views/@default/servers/server/log/viewPopup.css new file mode 100644 index 00000000..167f944c --- /dev/null +++ b/web/views/@default/servers/server/log/viewPopup.css @@ -0,0 +1,4 @@ +table td { + word-break: break-all; +} +/*# sourceMappingURL=viewPopup.css.map */ \ No newline at end of file diff --git a/web/views/@default/servers/server/log/viewPopup.css.map b/web/views/@default/servers/server/log/viewPopup.css.map new file mode 100644 index 00000000..26996741 --- /dev/null +++ b/web/views/@default/servers/server/log/viewPopup.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["viewPopup.less"],"names":[],"mappings":"AAAA,KAAM;EACL,qBAAA","file":"viewPopup.css"} \ No newline at end of file diff --git a/web/views/@default/servers/server/log/viewPopup.html b/web/views/@default/servers/server/log/viewPopup.html new file mode 100644 index 00000000..877137a9 --- /dev/null +++ b/web/views/@default/servers/server/log/viewPopup.html @@ -0,0 +1,116 @@ +{$layout "layout_popup"} + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
请求概要(Request):{{accessLog.request}}请求URI(RequestURI):{{accessLog.requestURI}}
请求方法(RequestMethod):{{accessLog.requestMethod}}主机地址(Host):{{accessLog.host}}
请求来源(Referer): + {{accessLog.referer}} + - + 终端地址(RemoteAddr:RemotePort):{{accessLog.remoteAddr}}:{{accessLog.remotePort}}
终端信息(UserAgent): + {{accessLog.userAgent}} + - + 协议(Proto):{{accessLog.proto}}
状态(StatusMessage):{{accessLog.status}} {{accessLog.statusMessage}}文件类型(ContentType): + {{accessLog.contentType}} + - +
发送字节(BytesSent):{{accessLog.bytesSent}}
ISO8601时间:{{accessLog.timeISO8601}}本地时间(TimeLocal):{{accessLog.timeLocal}}
WAF策略:{{wafInfo.policy.name}}WAF规则分组: + {{wafInfo.group.name}} + - +
WAF规则集:{{wafInfo.set.name}}
+
+ {{error}} +
+
+
+ +
+ + + + + + + + + +
Status{{accessLog.status}} {{accessLog.statusMessage}}
{{k}}{{v.values[0]}}
+
+ +
+ + + + + +
{{k}}{{v.values[0]}}
+
+ +
+
暂时没有Cookie数据。
+
+ + + + + +
{{k}}{{v}}
+
+
+ +
+ + + + + + + + + +
综合信息(UserAgent){{accessLog.userAgent}}
IP{{accessLog.remoteAddr}}
+
\ No newline at end of file diff --git a/web/views/@default/servers/server/log/viewPopup.js b/web/views/@default/servers/server/log/viewPopup.js new file mode 100644 index 00000000..8d223788 --- /dev/null +++ b/web/views/@default/servers/server/log/viewPopup.js @@ -0,0 +1,7 @@ +Tea.context(function () { + this.tab = "summary" + + this.switchTab = function (tab) { + this.tab = tab + } +}) \ No newline at end of file diff --git a/web/views/@default/servers/server/log/viewPopup.less b/web/views/@default/servers/server/log/viewPopup.less new file mode 100644 index 00000000..ab2feeec --- /dev/null +++ b/web/views/@default/servers/server/log/viewPopup.less @@ -0,0 +1,3 @@ +table td { + word-break: break-all; +} \ No newline at end of file