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]}} |
+
+
+
+
+
+
+
+
+
+ | 综合信息(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