全局访问日志增加WAF日志/优化交互/数据看板--WAF--最新拦截记录增加更多链接

This commit is contained in:
刘祥超
2021-08-22 16:34:20 +08:00
parent d9bc1bdfca
commit 4ef8c2bc77
7 changed files with 77 additions and 26 deletions

View File

@@ -25,6 +25,7 @@ func (this *IndexAction) RunGet(params struct {
Ip string Ip string
Domain string Domain string
HasError int HasError int
HasWAF int
RequestId string RequestId string
ServerId int64 ServerId int64
@@ -41,6 +42,7 @@ func (this *IndexAction) RunGet(params struct {
this.Data["domain"] = params.Domain this.Data["domain"] = params.Domain
this.Data["accessLogs"] = []interface{}{} this.Data["accessLogs"] = []interface{}{}
this.Data["hasError"] = params.HasError this.Data["hasError"] = params.HasError
this.Data["hasWAF"] = params.HasWAF
day := params.Day day := params.Day
ipList := []string{} ipList := []string{}
@@ -52,14 +54,15 @@ func (this *IndexAction) RunGet(params struct {
this.Data["hasError"] = params.HasError this.Data["hasError"] = params.HasError
resp, err := this.RPC().HTTPAccessLogRPC().ListHTTPAccessLogs(this.AdminContext(), &pb.ListHTTPAccessLogsRequest{ resp, err := this.RPC().HTTPAccessLogRPC().ListHTTPAccessLogs(this.AdminContext(), &pb.ListHTTPAccessLogsRequest{
RequestId: params.RequestId, RequestId: params.RequestId,
ServerId: params.ServerId, ServerId: params.ServerId,
HasError: params.HasError > 0, HasError: params.HasError > 0,
Day: day, HasFirewallPolicy: params.HasWAF > 0,
Keyword: params.Keyword, Day: day,
Ip: params.Ip, Keyword: params.Keyword,
Domain: params.Domain, Ip: params.Ip,
Size: size, Domain: params.Domain,
Size: size,
}) })
if err != nil { if err != nil {
this.ErrorPage(err) this.ErrorPage(err)
@@ -87,15 +90,16 @@ func (this *IndexAction) RunGet(params struct {
if len(params.RequestId) > 0 { if len(params.RequestId) > 0 {
this.Data["hasPrev"] = true this.Data["hasPrev"] = true
prevResp, err := this.RPC().HTTPAccessLogRPC().ListHTTPAccessLogs(this.AdminContext(), &pb.ListHTTPAccessLogsRequest{ prevResp, err := this.RPC().HTTPAccessLogRPC().ListHTTPAccessLogs(this.AdminContext(), &pb.ListHTTPAccessLogsRequest{
RequestId: params.RequestId, RequestId: params.RequestId,
ServerId: params.ServerId, ServerId: params.ServerId,
HasError: params.HasError > 0, HasError: params.HasError > 0,
Day: day, HasFirewallPolicy: params.HasWAF > 0,
Keyword: params.Keyword, Day: day,
Ip: params.Ip, Keyword: params.Keyword,
Domain: params.Domain, Ip: params.Ip,
Size: size, Domain: params.Domain,
Reverse: true, Size: size,
Reverse: true,
}) })
if err != nil { if err != nil {
this.ErrorPage(err) this.ErrorPage(err)

View File

@@ -23,25 +23,59 @@ Vue.component("http-access-log-search-box", {
keyword: keyword keyword: keyword
} }
}, },
methods: {
cleanIP: function () {
this.ip = ""
this.submit()
},
cleanDomain: function () {
this.domain = ""
this.submit()
},
cleanKeyword: function () {
this.keyword = ""
this.submit()
},
submit: function () {
let parent = this.$el.parentNode
while (true) {
if (parent == null) {
break
}
if (parent.tagName == "FORM") {
break
}
parent = parent.parentNode
}
if (parent != null) {
setTimeout(function () {
parent.submit()
}, 500)
}
}
},
template: `<div> template: `<div>
<div class="margin"></div> <div class="margin"></div>
<div class="ui fields inline"> <div class="ui fields inline">
<div class="ui field"> <div class="ui field">
<div class="ui input left labeled small"> <div class="ui input left right labeled small">
<span class="ui label basic" style="font-weight: normal">IP</span> <span class="ui label basic" style="font-weight: normal">IP</span>
<input type="text" name="ip" placeholder="x.x.x.x" size="15" v-model="ip"/> <input type="text" name="ip" placeholder="x.x.x.x" size="15" v-model="ip"/>
<a class="ui label basic" :class="{disabled: ip.length == 0}" @click.prevent="cleanIP"><i class="icon remove small"></i></a>
</div> </div>
</div> </div>
<div class="ui field"> <div class="ui field">
<div class="ui input left labeled small"> <div class="ui input left labeled small" :class="{'right labeled': domain.length > 0}">
<span class="ui label basic" style="font-weight: normal">域名</span> <span class="ui label basic" style="font-weight: normal">域名</span>
<input type="text" name="domain" placeholder="xxx.com" size="15" v-model="domain"/> <input type="text" name="domain" placeholder="xxx.com" size="15" v-model="domain"/>
<a class="ui label basic" :class="{disabled: domain.length == 0}" @click.prevent="cleanDomain"><i class="icon remove small"></i></a>
</div> </div>
</div> </div>
<div class="ui field"> <div class="ui field">
<div class="ui input left labeled small"> <div class="ui input left labeled small" :class="{'right labeled': keyword.length > 0}">
<span class="ui label basic" style="font-weight: normal">关键词</span> <span class="ui label basic" style="font-weight: normal">关键词</span>
<input type="text" name="keyword" v-model="keyword" placeholder="路径、UserAgent等..." size="18"/> <input type="text" name="keyword" v-model="keyword" placeholder="路径、UserAgent等..." size="18"/>
<a class="ui label basic" :class="{disabled: keyword.length == 0}" @click.prevent="cleanKeyword"><i class="icon remove small"></i></a>
</div> </div>
</div> </div>
<slot></slot> <slot></slot>

View File

@@ -34,4 +34,8 @@
font-size: 0.8em; font-size: 0.8em;
padding: 4px; padding: 4px;
} }
h4.header a {
font-size: 0.85em;
float: right;
}
/*# sourceMappingURL=waf.css.map */ /*# sourceMappingURL=waf.css.map */

View File

@@ -1 +1 @@
{"version":3,"sources":["waf.less"],"names":[],"mappings":"AAAA,GAAG,QACF;EACC,kBAAA;EACA,UAAA;EACA,UAAA;;AAIF;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;;AAnBF,KAsBC,GACC;EACC,aAAA;;AAxBH,KA4BC,QAAO,MACN;EACC,eAAA;;AAKH;EACC,YAAA;;AAGD;EACC,gBAAA;EACA,YAAA","file":"waf.css"} {"version":3,"sources":["waf.less"],"names":[],"mappings":"AAAA,GAAG,QACF;EACC,kBAAA;EACA,UAAA;EACA,UAAA;;AAIF;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;;AAnBF,KAsBC,GACC;EACC,aAAA;;AAxBH,KA4BC,QAAO,MACN;EACC,eAAA;;AAKH;EACC,YAAA;;AAGD;EACC,gBAAA;EACA,YAAA;;AAGD,EAAE,OACD;EACC,iBAAA;EACA,YAAA","file":"waf.css"}

View File

@@ -27,7 +27,7 @@
<!-- 最近日志 --> <!-- 最近日志 -->
<div v-if="accessLogs.length > 0"> <div v-if="accessLogs.length > 0">
<div class="ui divider"></div> <div class="ui divider"></div>
<h4>最新拦截记录</h4> <h4 class="header">最新拦截记录 <a href="/servers/logs?hasWAF=1">更多 &raquo;</a></h4>
<table class="ui table selectable"> <table class="ui table selectable">
<tr v-for="accessLog in accessLogs" :key="accessLog.requestId"> <tr v-for="accessLog in accessLogs" :key="accessLog.requestId">
<td><http-access-log-box :v-access-log="accessLog"></http-access-log-box></td> <td><http-access-log-box :v-access-log="accessLog"></http-access-log-box></td>

View File

@@ -49,3 +49,10 @@
font-size: 0.8em; font-size: 0.8em;
padding: 4px; padding: 4px;
} }
h4.header {
a {
font-size: 0.85em;
float: right;
}
}

View File

@@ -2,13 +2,15 @@
{$template "/datepicker"} {$template "/datepicker"}
<first-menu> <first-menu>
<menu-item :href="path + '?serverId=' + serverId + '&day=' + day + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain" :active="hasError == 0">所有日志</menu-item> <menu-item :href="path + '?serverId=' + serverId + '&day=' + day + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain" :active="hasError == 0 && hasWAF == 0">所有日志</menu-item>
<menu-item :href="path + '?serverId=' + serverId + '&day=' + day + '&hasError=1' + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain" :active="hasError > 0">错误日志</menu-item> <menu-item :href="path + '?serverId=' + serverId + '&day=' + day + '&hasError=1' + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain" :active="hasError > 0">错误日志</menu-item>
<menu-item :href="path + '?serverId=' + serverId + '&day=' + day + '&hasWAF=1' + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain" :active="hasWAF > 0">WAF日志</menu-item>
</first-menu> </first-menu>
<form method="get" class="ui form small" :action="path" autocomplete="off"> <form method="get" class="ui form small" :action="path">
<input type="hidden" name="serverId" :value="serverId"/> <input type="hidden" name="serverId" :value="serverId"/>
<input type="hidden" name="hasError" :value="hasError"/> <input type="hidden" name="hasError" :value="hasError"/>
<input type="hidden" name="hasWAF" :value="hasWAF"/>
<http-access-log-search-box :v-ip="ip" :v-domain="domain" :v-keyword="keyword"> <http-access-log-search-box :v-ip="ip" :v-domain="domain" :v-keyword="keyword">
<div class="ui field"> <div class="ui field">
<input type="text" name="day" maxlength="10" placeholder="选择日期" style="width:7.8em" id="day-input" v-model="day"/> <input type="text" name="day" maxlength="10" placeholder="选择日期" style="width:7.8em" id="day-input" v-model="day"/>
@@ -26,9 +28,9 @@
</table> </table>
<div v-if="accessLogs.length > 0"> <div v-if="accessLogs.length > 0">
<a :href="path + '?serverId=' + serverId + '&requestId=' + lastRequestId + '&day=' + day + '&hasError=' + hasError + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain" v-if="hasPrev">上一页</a> <a :href="path + '?serverId=' + serverId + '&requestId=' + lastRequestId + '&day=' + day + '&hasError=' + hasError + '&hasWAF=' + hasWAF + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain" v-if="hasPrev">上一页</a>
<span v-else class="disabled">上一页</span> <span v-else class="disabled">上一页</span>
<span class="disabled">&nbsp; | &nbsp;</span> <span class="disabled">&nbsp; | &nbsp;</span>
<a :href="path + '?serverId=' + serverId + '&requestId=' + nextRequestId + '&day=' + day + '&hasError=' + hasError + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain" v-if="hasMore">下一页</a> <a :href="path + '?serverId=' + serverId + '&requestId=' + nextRequestId + '&day=' + day + '&hasError=' + hasError + '&hasWAF=' + hasWAF + '&keyword=' + keyword + '&ip=' + ip + '&domain=' + domain" v-if="hasMore">下一页</a>
<span v-else class="disabled">下一页</span> <span v-else class="disabled">下一页</span>
</div> </div>