mirror of
https://gitee.com/lauix/HFish
synced 2025-05-10 20:08:12 +08:00
!1 合并V0.6.4代码到主线
* [UPD]更新到V0.6.4版本 1.新增获取威胁情报数据以及批量导出数据,2.系统设置页面整体调整。可以配置获取威胁情报API key以及syslog告警推送
This commit is contained in:
parent
5a1f7cf616
commit
236d2aaf2a
@ -50,11 +50,21 @@
|
|||||||
color: #dc0e0e;
|
color: #dc0e0e;
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
|
.title {
|
||||||
|
font-family: MicrosoftYaHeiUI-Bold;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #2B3D51;
|
||||||
|
line-height: 16px;
|
||||||
|
border-left: 3px solid #2B3D51;
|
||||||
|
padding-left: 3px;
|
||||||
|
margin: 15px 0;
|
||||||
|
margin-left:20px;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-12">
|
<div class="row">
|
||||||
<h4 class="page-title">分布式集群</h4>
|
<h4 class="title">分布式集群</h4>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-sm-12">
|
<div class="col-sm-12">
|
||||||
<div class="card-box table-responsive">
|
<div class="card-box table-responsive">
|
||||||
|
@ -11,7 +11,16 @@
|
|||||||
color: #ff0101;
|
color: #ff0101;
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
|
.title_1 {
|
||||||
|
font-family: MicrosoftYaHeiUI-Bold;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #2B3D51;
|
||||||
|
line-height: 16px;
|
||||||
|
border-left: 3px solid #2B3D51;
|
||||||
|
padding-left: 3px;
|
||||||
|
margin: 15px 0;
|
||||||
|
margin-left:10px;
|
||||||
|
}
|
||||||
.openx {
|
.openx {
|
||||||
background: #3dd209;
|
background: #3dd209;
|
||||||
width: 10px;
|
width: 10px;
|
||||||
@ -107,8 +116,11 @@
|
|||||||
切换大屏 <i class="ion-log-in"></i>
|
切换大屏 <i class="ion-log-in"></i>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<h4 class="page-title">仪表盘</h4>
|
<div class="row">
|
||||||
|
<h4 class="title_1">仪表盘</h4>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!--仪表盘-->
|
||||||
<div class="col-xs-12 col-md-6 col-lg-6 col-xl-2">
|
<div class="col-xs-12 col-md-6 col-lg-6 col-xl-2">
|
||||||
<div class="card-box tilebox-two">
|
<div class="card-box tilebox-two">
|
||||||
<i class="icon-ghost pull-xs-right text-muted"></i>
|
<i class="icon-ghost pull-xs-right text-muted"></i>
|
||||||
@ -214,6 +226,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!--折线图-->
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<div class="card-box">
|
<div class="card-box">
|
||||||
<p class="titlea">最近24小时</p>
|
<p class="titlea">最近24小时</p>
|
||||||
@ -388,6 +401,7 @@
|
|||||||
<script>
|
<script>
|
||||||
// $('#myRegInfo').modal('show');
|
// $('#myRegInfo').modal('show');
|
||||||
|
|
||||||
|
// 数字的初始化
|
||||||
var m = moment(new Date());
|
var m = moment(new Date());
|
||||||
|
|
||||||
var arr = new Array();
|
var arr = new Array();
|
||||||
@ -757,7 +771,7 @@
|
|||||||
];
|
];
|
||||||
|
|
||||||
var myChart = echarts.init(document.getElementById('myChart'));
|
var myChart = echarts.init(document.getElementById('myChart'));
|
||||||
|
// 获取数据并填充
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "GET",
|
type: "GET",
|
||||||
url: "/get/dashboard/data",
|
url: "/get/dashboard/data",
|
||||||
@ -1120,6 +1134,7 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// echarts中的图标自适应
|
||||||
window.onresize = function () {
|
window.onresize = function () {
|
||||||
myChart.resize();
|
myChart.resize();
|
||||||
myChar1.resize();
|
myChar1.resize();
|
||||||
@ -1127,4 +1142,4 @@
|
|||||||
myChar3.resize();
|
myChar3.resize();
|
||||||
myChar4.resize();
|
myChar4.resize();
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
933
admin/fish.html
933
admin/fish.html
File diff suppressed because it is too large
Load Diff
@ -1,17 +1,15 @@
|
|||||||
{{define "footer"}}
|
{{define "footer"}}
|
||||||
|
|
||||||
<!-- Footer -->
|
<!-- Footer -->
|
||||||
<footer class="footer text-right">
|
<!-- <footer class="footer text-right">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12">
|
<div class="col-xs-12">
|
||||||
Copyright 2019 © <a href="https://hfish.io" target="_blank">HFish</a> - <a
|
Copyright 2019 © <a href="https://hfish.io" target="_blank">HFish</a>
|
||||||
href="https://hack.lc"
|
|
||||||
target="_blank">HackLC</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer> -->
|
||||||
</div>
|
</div>
|
||||||
<div class="side-bar right-bar">
|
<div class="side-bar right-bar">
|
||||||
<div class="nicescroll">
|
<div class="nicescroll">
|
||||||
@ -79,7 +77,7 @@
|
|||||||
<p>发布 v0.3.1 版本</p>
|
<p>发布 v0.3.1 版本</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="time-item">
|
<div class="time-item">
|
||||||
<div class="item-info">
|
<div class="item-info">
|
||||||
<small class="text-muted">2019-08-27</small>
|
<small class="text-muted">2019-08-27</small>
|
||||||
<p>发布 v0.3 版本</p>
|
<p>发布 v0.3 版本</p>
|
||||||
@ -119,7 +117,8 @@
|
|||||||
<script src="/static/libs/waypoints/lib/jquery.waypoints.js"></script>
|
<script src="/static/libs/waypoints/lib/jquery.waypoints.js"></script>
|
||||||
<script src="/static/libs/counterup/jquery.counterup.min.js"></script>
|
<script src="/static/libs/counterup/jquery.counterup.min.js"></script>
|
||||||
<script src="/static/libs/moment/moment.min.js"></script>
|
<script src="/static/libs/moment/moment.min.js"></script>
|
||||||
|
<!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.full.min.js"></script> -->
|
||||||
|
<script src="/static/js/jquery.datetimepicker.full.min.js"></script>
|
||||||
<!-- App js -->
|
<!-- App js -->
|
||||||
<script src="/static/js/jquery.core.js"></script>
|
<script src="/static/js/jquery.core.js"></script>
|
||||||
<script src="/static/js/jquery.app.js"></script>
|
<script src="/static/js/jquery.app.js"></script>
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
<link href="/static/css/style.css" rel="stylesheet" type="text/css"/>
|
<link href="/static/css/style.css" rel="stylesheet" type="text/css"/>
|
||||||
<link href="/static/libs/bootstrap-sweetalert/sweet-alert.css" rel="stylesheet" type="text/css"/>
|
<link href="/static/libs/bootstrap-sweetalert/sweet-alert.css" rel="stylesheet" type="text/css"/>
|
||||||
<link href="/static/libs/switchery/switchery.min.css" rel="stylesheet"/>
|
<link href="/static/libs/switchery/switchery.min.css" rel="stylesheet"/>
|
||||||
|
<!-- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.css" /> -->
|
||||||
|
<link rel="stylesheet" href="/static/css/jquery.datetimepicker.css">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
@ -47,9 +49,9 @@
|
|||||||
<div class="menu-extras">
|
<div class="menu-extras">
|
||||||
<ul class="nav navbar-nav pull-right">
|
<ul class="nav navbar-nav pull-right">
|
||||||
<li class="nav-item dropdown notification-list">
|
<li class="nav-item dropdown notification-list">
|
||||||
<a class="nav-link waves-effect waves-light right-bar-toggle" href="javascript:void(0);">
|
<!-- <a class="nav-link waves-effect waves-light right-bar-toggle" href="javascript:void(0);">
|
||||||
<i class="zmdi zmdi-format-subject noti-icon"></i>
|
<i class="zmdi zmdi-format-subject noti-icon"></i>
|
||||||
</a>
|
</a> -->
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item dropdown notification-list">
|
<li class="nav-item dropdown notification-list">
|
||||||
<a class="nav-link dropdown-toggle arrow-none waves-effect waves-light nav-user"
|
<a class="nav-link dropdown-toggle arrow-none waves-effect waves-light nav-user"
|
||||||
@ -57,8 +59,7 @@
|
|||||||
aria-haspopup="false" aria-expanded="false">
|
aria-haspopup="false" aria-expanded="false">
|
||||||
<img src="/static/images/avatar.jpg" alt="user" class="img-circle avatarx">
|
<img src="/static/images/avatar.jpg" alt="user" class="img-circle avatarx">
|
||||||
</a>
|
</a>
|
||||||
<div class="dropdown-menu dropdown-menu-right dropdown-arrow profile-dropdown "
|
<div class="dropdown-menu dropdown-menu-right dropdown-arrow profile-dropdown "aria-labelledby="Preview">
|
||||||
aria-labelledby="Preview">
|
|
||||||
<!-- item-->
|
<!-- item-->
|
||||||
<div class="dropdown-item noti-title">
|
<div class="dropdown-item noti-title">
|
||||||
<h5 class="text-overflow">
|
<h5 class="text-overflow">
|
||||||
|
@ -56,9 +56,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div style="text-align: center;color: #ececec;">
|
<div style="text-align: center;color: #ececec;">
|
||||||
Copyright 2019 © <a href="https://github.com/hacklcx/HFish" target="_blank" style="color: #fff">HFish</a> - <a
|
Copyright 2019 © <a href="https://github.com/hacklcx/HFish" target="_blank" style="color: #fff">HFish</a>
|
||||||
href="https://hack.lc"
|
|
||||||
target="_blank" style="color: #fff">HackLC</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
@ -1,6 +1,16 @@
|
|||||||
{{template "header"}}
|
{{template "header"}}
|
||||||
<script type="text/javascript" src="/static/libs/wangeditor3/wangEditor.css"></script>
|
<script type="text/javascript" src="/static/libs/wangeditor3/wangEditor.css"></script>
|
||||||
<style>
|
<style>
|
||||||
|
.title_1 {
|
||||||
|
font-family: MicrosoftYaHeiUI-Bold;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #2B3D51;
|
||||||
|
line-height: 16px;
|
||||||
|
border-left: 3px solid #2B3D51;
|
||||||
|
padding-left: 3px;
|
||||||
|
margin: 15px 0;
|
||||||
|
margin-left:20px;
|
||||||
|
}
|
||||||
.card-box {
|
.card-box {
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
}
|
}
|
||||||
@ -51,10 +61,9 @@
|
|||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<!-- Page-Title -->
|
<!-- Page-Title -->
|
||||||
<div class="col-sm-12">
|
<div class="row">
|
||||||
<h4 class="page-title">邮件群发</h4>
|
<h4 class="title_1">邮件群发</h4>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-sm-12">
|
<div class="col-sm-12">
|
||||||
<div class="card-box pdbox">
|
<div class="card-box pdbox">
|
||||||
<div class="img">
|
<div class="img">
|
||||||
|
2167
admin/setting.html
2167
admin/setting.html
File diff suppressed because it is too large
Load Diff
@ -1,20 +1,69 @@
|
|||||||
package alert
|
package alert
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"HFish/utils/try"
|
|
||||||
"strings"
|
|
||||||
"HFish/utils/send"
|
|
||||||
"bytes"
|
"bytes"
|
||||||
"net/http"
|
|
||||||
"HFish/utils/log"
|
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"HFish/view/data"
|
"fmt"
|
||||||
"github.com/gin-gonic/gin"
|
"net/http"
|
||||||
|
"strings"
|
||||||
"HFish/error"
|
"HFish/error"
|
||||||
"HFish/utils/cache"
|
"HFish/utils/cache"
|
||||||
|
"HFish/utils/geo"
|
||||||
|
"HFish/utils/log"
|
||||||
"HFish/utils/passwd"
|
"HFish/utils/passwd"
|
||||||
|
"HFish/utils/send"
|
||||||
|
"HFish/utils/try"
|
||||||
|
"HFish/view/data"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func AlertSyslog(model string, projectName string, typex string, agent string, ipx string, country string, region string, city string, infox string, time string) {
|
||||||
|
// 判断syslog通知
|
||||||
|
try.Try(func() {
|
||||||
|
// 只有新加入才会发送syslog通知
|
||||||
|
if (model == "new") {
|
||||||
|
status, _ := cache.Get("SyslogConfigStatus")
|
||||||
|
|
||||||
|
// 判断是否启用通知
|
||||||
|
if status == "1" {
|
||||||
|
info, _ := cache.Get("SyslogConfigInfo")
|
||||||
|
configs := strings.Split(info.(string), "&&")
|
||||||
|
|
||||||
|
if (country == "本地地址") {
|
||||||
|
region = ""
|
||||||
|
city = ""
|
||||||
|
} else if (country == "局域网") {
|
||||||
|
region = ""
|
||||||
|
city = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断是否开启脱敏
|
||||||
|
passwdConfigStatus, _ := cache.Get("PasswdConfigStatus")
|
||||||
|
|
||||||
|
if (passwdConfigStatus == "1") {
|
||||||
|
if (typex == "FTP" || typex == "SSH") {
|
||||||
|
// 获取脱敏加密字符
|
||||||
|
passwdConfigInfo, _ := cache.Get("PasswdConfigInfo")
|
||||||
|
|
||||||
|
arr := strings.Split(infox, "&&")
|
||||||
|
|
||||||
|
infox = arr[0] + "&&" + passwd.Desensitization(arr[1], passwdConfigInfo.(string))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
text := fmt.Sprintf("project: %s, type: %s, agent: %s, ip: %s, geo: %s, info: %s, time: %s",
|
||||||
|
projectName, typex, agent, ipx, geo.Format(country, region, city, "-"), infox, time)
|
||||||
|
|
||||||
|
log.Pr("HFish", "127.0.0.1", "alert syslog:", text)
|
||||||
|
for _, v := range configs {
|
||||||
|
config := strings.Split(v, ":")
|
||||||
|
send.SendSyslog(config[0], config[1], config[2], text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).Catch(func() {
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func AlertMail(model string, typex string, agent string, ipx string, country string, region string, city string, infox string) {
|
func AlertMail(model string, typex string, agent string, ipx string, country string, region string, city string, infox string) {
|
||||||
// 判断邮件通知
|
// 判断邮件通知
|
||||||
try.Try(func() {
|
try.Try(func() {
|
||||||
@ -49,18 +98,19 @@ func AlertMail(model string, typex string, agent string, ipx string, country str
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
geoInfo := geo.Format(country, region, city, " ")
|
||||||
text := `
|
text := `
|
||||||
<div><b>Hi,上钩了!</b></div>
|
<div><b>Hi,上钩了!</b></div>
|
||||||
<div><b><br /></b></div>
|
<div><b><br /></b></div>
|
||||||
<div><b>集群名称:</b>` + agent + `</div>
|
<div><b>集群名称:</b>` + agent + `</div>
|
||||||
<div><b>攻击IP:</b>` + ipx + `</div>
|
<div><b>攻击IP:</b>` + ipx + `</div>
|
||||||
<div><b>地理信息:</b>` + country + ` ` + region + ` ` + city + `</div>
|
<div><b>地理信息:</b>` + geoInfo + `</div>
|
||||||
<div><b>上钩内容:</b>` + infox + `</div>
|
<div><b>上钩内容:</b>` + infox + `</div>
|
||||||
<div><br /></div>
|
<div><br /></div>
|
||||||
<div><span style="color: rgb(128, 128, 128); font-size: 10px;">(HFish 自动发送)</span></div>
|
<div><span style="color: rgb(128, 128, 128); font-size: 10px;">(HFish 自动发送)</span></div>
|
||||||
`
|
`
|
||||||
|
|
||||||
send.SendMail(config[4:], "[HFish]提醒你,"+typex+"有鱼上钩!", text, config)
|
send.SendMail(config[5:], "[HFish]提醒你,"+typex+"有鱼上钩!", text, config)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}).Catch(func() {
|
}).Catch(func() {
|
||||||
@ -128,10 +178,6 @@ func AlertDataWs(model string, typex string, projectName string, agent string, i
|
|||||||
})
|
})
|
||||||
|
|
||||||
// 发送到客户端
|
// 发送到客户端
|
||||||
data.Send(gin.H{
|
data.Send(error.ErrSuccessWithData(d))
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
"data": d,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,9 +3,9 @@ package dbUtil
|
|||||||
import (
|
import (
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
_ "github.com/mattn/go-sqlite3"
|
_ "github.com/mattn/go-sqlite3"
|
||||||
|
"github.com/gohouse/gorose"
|
||||||
"HFish/utils/conf"
|
"HFish/utils/conf"
|
||||||
"HFish/utils/log"
|
"HFish/utils/log"
|
||||||
"github.com/gohouse/gorose"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var engin *gorose.Engin
|
var engin *gorose.Engin
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package exec
|
package exec
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os/exec"
|
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"os/exec"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Execute(shell string) (string, error) {
|
func Execute(shell string) (string, error) {
|
||||||
|
@ -1,19 +1,18 @@
|
|||||||
package custom
|
package custom
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net"
|
|
||||||
"HFish/core/pool"
|
|
||||||
"time"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"time"
|
||||||
"strings"
|
"strings"
|
||||||
|
"HFish/core/pool"
|
||||||
|
"HFish/core/report"
|
||||||
|
"HFish/core/rpc/client"
|
||||||
"HFish/utils/conf"
|
"HFish/utils/conf"
|
||||||
"HFish/utils/is"
|
"HFish/utils/is"
|
||||||
"HFish/core/rpc/client"
|
|
||||||
"HFish/core/report"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func Start(name string, addr string, info string) {
|
func Start(name string, addr string, info string) {
|
||||||
fmt.Println(444444)
|
|
||||||
netListen, _ := net.Listen("tcp", addr)
|
netListen, _ := net.Listen("tcp", addr)
|
||||||
|
|
||||||
defer netListen.Close()
|
defer netListen.Close()
|
||||||
@ -49,15 +48,10 @@ func StartCustom() {
|
|||||||
names := conf.GetCustomName()
|
names := conf.GetCustomName()
|
||||||
for i := 0; i < len(names); i++ {
|
for i := 0; i < len(names); i++ {
|
||||||
status := conf.Get(string(names[i]), "status")
|
status := conf.Get(string(names[i]), "status")
|
||||||
fmt.Println(1111111)
|
|
||||||
if status != "0" {
|
if status != "0" {
|
||||||
fmt.Println(22222)
|
|
||||||
|
|
||||||
addr := conf.Get(string(names[i]), "addr")
|
addr := conf.Get(string(names[i]), "addr")
|
||||||
info := conf.Get(string(names[i]), "info")
|
info := conf.Get(string(names[i]), "info")
|
||||||
|
|
||||||
fmt.Println(33333333)
|
|
||||||
|
|
||||||
go Start(names[i], addr, info)
|
go Start(names[i], addr, info)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
package elasticsearch
|
package elasticsearch
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
"strings"
|
"strings"
|
||||||
"HFish/utils/is"
|
"HFish/core/report"
|
||||||
"HFish/core/rpc/client"
|
"HFish/core/rpc/client"
|
||||||
"HFish/core/report"
|
"HFish/utils/is"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Config represents the configuration information.
|
// Config represents the configuration information.
|
||||||
|
119
core/report/intelligence.go
Normal file
119
core/report/intelligence.go
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
package report
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"HFish/utils/cache"
|
||||||
|
"HFish/utils/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CommonResponse struct {
|
||||||
|
ResponseCode int `json:"response_code"`
|
||||||
|
VerboseMsg string `json:"verbose_msg"`
|
||||||
|
Data json.RawMessage `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func doHttpGet(reqUrl string) ([]byte, error) {
|
||||||
|
resp, err := http.Get(reqUrl)
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "http get err", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "read body err", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return body, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func doHttpPost(reqUrl, apikey, info string) ([]byte, error) {
|
||||||
|
values := url.Values{}
|
||||||
|
values.Add("apikey", apikey)
|
||||||
|
values.Add("source", "hfish")
|
||||||
|
values.Add("info", info)
|
||||||
|
resp, err := http.PostForm(reqUrl, values)
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "http post err", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "read body err", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return body, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func fetchIntelligenceData(ip string) (string, error) {
|
||||||
|
if len(ip) == 0 {
|
||||||
|
return "", fmt.Errorf("ERR_IP")
|
||||||
|
}
|
||||||
|
status, _ := cache.Get("ApikeyStatus")
|
||||||
|
// 判断是否启用获取云端威胁情报
|
||||||
|
if status == "0" {
|
||||||
|
return "", fmt.Errorf("ERR_APIKEY")
|
||||||
|
}
|
||||||
|
apikey, _ := cache.Get("ApikeyInfo")
|
||||||
|
url := fmt.Sprintf("https://api.threatbook.cn/v3/scene/ip_reputation?apikey=%s&resource=%s", apikey, ip)
|
||||||
|
body, err := doHttpGet(url)
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "do http post err", err)
|
||||||
|
return "", fmt.Errorf("ERR_HTTP")
|
||||||
|
}
|
||||||
|
|
||||||
|
var result CommonResponse
|
||||||
|
if err := json.Unmarshal(body, &result); err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "json unmarshal err", err)
|
||||||
|
return "", fmt.Errorf("ERR_JSON")
|
||||||
|
}
|
||||||
|
if result.ResponseCode != 0 {
|
||||||
|
return "", fmt.Errorf("ERR_RESP:%d:%s", result.ResponseCode, result.VerboseMsg)
|
||||||
|
}
|
||||||
|
|
||||||
|
intelligenceData, err := json.Marshal(result.Data)
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "json marshal err", err)
|
||||||
|
return "", fmt.Errorf("ERR_JSON")
|
||||||
|
}
|
||||||
|
return string(intelligenceData), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func collectIntelligenceData(info string) error {
|
||||||
|
status, _ := cache.Get("ApikeyStatus")
|
||||||
|
if status == "0" {
|
||||||
|
return fmt.Errorf("apikey disbale")
|
||||||
|
}
|
||||||
|
|
||||||
|
apikeyInfo, _ := cache.Get("ApikeyInfo")
|
||||||
|
apikey, ok := apikeyInfo.(string)
|
||||||
|
if !ok || apikey == "" {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "apikey illegal:", apikey)
|
||||||
|
return fmt.Errorf("apikey illegal")
|
||||||
|
}
|
||||||
|
|
||||||
|
url := "https://x.threatbook.cn/co_intel_inf"
|
||||||
|
body, err := doHttpPost(url, apikey, info)
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "do http post err", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var result CommonResponse
|
||||||
|
if err := json.Unmarshal(body, &result); err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "json unmarshal err", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if result.ResponseCode != 0 {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "collect intelligence fail:", result.VerboseMsg)
|
||||||
|
return fmt.Errorf("err response code: %d", result.ResponseCode)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
@ -1,17 +1,19 @@
|
|||||||
package report
|
package report
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"HFish/core/dbUtil"
|
"fmt"
|
||||||
"time"
|
|
||||||
"HFish/utils/log"
|
|
||||||
"HFish/utils/ip"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"HFish/utils/try"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
"HFish/core/alert"
|
"HFish/core/alert"
|
||||||
"HFish/utils/conf"
|
"HFish/core/dbUtil"
|
||||||
"HFish/core/pool"
|
"HFish/core/pool"
|
||||||
"HFish/utils/cache"
|
"HFish/utils/cache"
|
||||||
|
"HFish/utils/conf"
|
||||||
|
"HFish/utils/geo"
|
||||||
|
"HFish/utils/ip"
|
||||||
|
"HFish/utils/log"
|
||||||
|
"HFish/utils/try"
|
||||||
)
|
)
|
||||||
|
|
||||||
type HFishInfo struct {
|
type HFishInfo struct {
|
||||||
@ -30,6 +32,9 @@ type HFishInfo struct {
|
|||||||
|
|
||||||
// 通知模块
|
// 通知模块
|
||||||
func alertx(id string, model string, typex string, projectName string, agent string, ipx string, country string, region string, city string, infox string, timex string) {
|
func alertx(id string, model string, typex string, projectName string, agent string, ipx string, country string, region string, city string, infox string, timex string) {
|
||||||
|
// Syslog通知
|
||||||
|
alert.AlertSyslog(model, projectName, typex, agent, ipx, country, region, city, infox, timex)
|
||||||
|
|
||||||
// 邮件通知
|
// 邮件通知
|
||||||
alert.AlertMail(model, typex, agent, ipx, country, region, city, infox)
|
alert.AlertMail(model, typex, agent, ipx, country, region, city, infox)
|
||||||
|
|
||||||
@ -117,6 +122,16 @@ func isWhiteIp(ip string) bool {
|
|||||||
|
|
||||||
// 通用的插入
|
// 通用的插入
|
||||||
func insertInfo(typex string, projectName string, agent string, ipx string, country string, region string, city string, info string) int64 {
|
func insertInfo(typex string, projectName string, agent string, ipx string, country string, region string, city string, info string) int64 {
|
||||||
|
timex := time.Now().Format("2006-01-02 15:04:05")
|
||||||
|
text := fmt.Sprintf("project: %s, type: %s, agent: %s, ip: %s, geo: %s, info: %s, time: %s",
|
||||||
|
projectName, typex, agent, ipx, geo.Format(country, region, city, "-"), info, timex)
|
||||||
|
collectIntelligenceData(text)
|
||||||
|
|
||||||
|
intelligence, err := fetchIntelligenceData(ipx)
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "fetch intelligence data err", err)
|
||||||
|
intelligence = err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
id, err := dbUtil.DB().Table("hfish_info").Data(map[string]interface{}{
|
id, err := dbUtil.DB().Table("hfish_info").Data(map[string]interface{}{
|
||||||
"type": typex,
|
"type": typex,
|
||||||
@ -126,8 +141,10 @@ func insertInfo(typex string, projectName string, agent string, ipx string, coun
|
|||||||
"country": country,
|
"country": country,
|
||||||
"region": region,
|
"region": region,
|
||||||
"city": city,
|
"city": city,
|
||||||
|
"intelligence": intelligence,
|
||||||
"info": info,
|
"info": info,
|
||||||
"create_time": time.Now().Format("2006-01-02 15:04:05"),
|
"info_len": len(info),
|
||||||
|
"create_time": timex,
|
||||||
}).InsertGetId()
|
}).InsertGetId()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -38,10 +38,12 @@ CREATE TABLE `hfish_info` (
|
|||||||
`project_name` varchar(20) NOT NULL DEFAULT '',
|
`project_name` varchar(20) NOT NULL DEFAULT '',
|
||||||
`agent` varchar(20) NOT NULL DEFAULT '',
|
`agent` varchar(20) NOT NULL DEFAULT '',
|
||||||
`ip` varchar(20) NOT NULL DEFAULT '',
|
`ip` varchar(20) NOT NULL DEFAULT '',
|
||||||
|
`intelligence` text NOT NULL DEFAULT '';
|
||||||
`country` varchar(10) NOT NULL DEFAULT '',
|
`country` varchar(10) NOT NULL DEFAULT '',
|
||||||
`region` varchar(10) NOT NULL DEFAULT '',
|
`region` varchar(10) NOT NULL DEFAULT '',
|
||||||
`city` varchar(10) NOT NULL,
|
`city` varchar(10) NOT NULL,
|
||||||
`info` text NOT NULL,
|
`info` text NOT NULL,
|
||||||
|
`info_len` int(11) NOT NULL,
|
||||||
`create_time` datetime NOT NULL,
|
`create_time` datetime NOT NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
KEY `info_index_1` (`type`) USING BTREE,
|
KEY `info_index_1` (`type`) USING BTREE,
|
||||||
@ -87,7 +89,7 @@ CREATE TABLE `hfish_setting` (
|
|||||||
-- Records of `hfish_setting`
|
-- Records of `hfish_setting`
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
BEGIN;
|
BEGIN;
|
||||||
INSERT INTO `hfish_setting` VALUES ('1', 'mail', '', '2019-09-02 20:15:00', '0', 'E-mail 群发', '群发邮件SMTP服务器配置'), ('2', 'alertMail', '', '2019-09-02 18:58:12', '0', 'E-mail 通知', '蜜罐告警会通过邮件告知信息'), ('3', 'webHook', '', '2019-09-03 11:49:00', '0', 'WebHook 通知', '蜜罐告警会请求指定API告知信息'), ('4', 'whiteIp', '', '2019-09-02 20:15:00', '0', 'IP 白名单', '蜜罐上钩会过滤掉白名单IP'), ('5', 'passwdTM', '', '2020-02-24 12:04', '0', '密码脱敏', '发送邮件如果有密码内容自动加星');
|
INSERT INTO `hfish_setting` VALUES ('1', 'mail', '', '2019-09-02 20:15:00', '0', 'E-mail 群发', '群发邮件SMTP服务器配置'), ('2', 'alertMail', '', '2019-09-02 18:58:12', '0', 'E-mail 通知', '蜜罐告警会通过邮件告知信息'), ('3', 'webHook', '', '2019-09-03 11:49:00', '0', 'WebHook 通知', '蜜罐告警会请求指定API告知信息'), ('4', 'whiteIp', '', '2019-09-02 20:15:00', '0', 'IP 白名单', '蜜罐上钩会过滤掉白名单IP'), ('5', 'passwdTM', '', '2020-02-24 12:04', '0', '密码脱敏', '发送邮件如果有密码内容自动加星'), ('6', 'apikey', '', '2020-11-10 22:45', '0', 'API Key', '微步在线X情报社区API Key'), ('7', 'syslog', '', '2020-11-11 17:02', '0', 'Syslog 通知', '蜜罐告警会通过Syslog告知信息');
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS = 1;
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
|
24
docker-compose.yml
Normal file
24
docker-compose.yml
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
version: "3"
|
||||||
|
services:
|
||||||
|
hfish:
|
||||||
|
build:
|
||||||
|
context: ./dockerfile
|
||||||
|
dockerfile: ./Dockerfile
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "9001:9001" # Landing page
|
||||||
|
|
||||||
|
- "21:21"
|
||||||
|
- "22:22"
|
||||||
|
- "23:23"
|
||||||
|
- "69:69"
|
||||||
|
- "3306:3306"
|
||||||
|
- "5900:5900"
|
||||||
|
- "6379:6379"
|
||||||
|
- "7879:7879"
|
||||||
|
- "8080:8080"
|
||||||
|
- "8081:8081"
|
||||||
|
- "8989:8989"
|
||||||
|
- "9000:9000"
|
||||||
|
- "9200:9200"
|
||||||
|
- "11211:11211"
|
@ -1,7 +1,8 @@
|
|||||||
FROM alpine:latest
|
FROM alpine:latest
|
||||||
|
|
||||||
ENV GLIBC_VERSION 2.29-r0
|
ENV GLIBC_VERSION 2.29-r0
|
||||||
ENV HFISH_VERSION 0.6
|
ENV HFISH_VERSION 0.6.2
|
||||||
|
ENV HFISH_VERSION_NEW 0.6.3
|
||||||
|
|
||||||
# Download and install glibc
|
# Download and install glibc
|
||||||
RUN apk update && \
|
RUN apk update && \
|
||||||
@ -16,7 +17,15 @@ RUN apk update && \
|
|||||||
RUN curl -Lo /tmp/HFish.tar.gz https://github.com/hacklcx/HFish/releases/download/${HFISH_VERSION}/HFish-${HFISH_VERSION}-linux-amd64.tar.gz && \
|
RUN curl -Lo /tmp/HFish.tar.gz https://github.com/hacklcx/HFish/releases/download/${HFISH_VERSION}/HFish-${HFISH_VERSION}-linux-amd64.tar.gz && \
|
||||||
tar -zxvf /tmp/HFish.tar.gz -C /tmp && \
|
tar -zxvf /tmp/HFish.tar.gz -C /tmp && \
|
||||||
mv /tmp/HFish-${HFISH_VERSION}-linux-amd64 /tmp/HFish && \
|
mv /tmp/HFish-${HFISH_VERSION}-linux-amd64 /tmp/HFish && \
|
||||||
rm -f /tmp/HFish.tar.gz /tmp/HFish/LICENSE /tmp/HFish/README.md
|
rm -f /tmp/HFish.tar.gz /tmp/HFish/LICENSE && \
|
||||||
|
rm -f /tmp/HFish/HFish /tmp/HFish/static/data/js/data.js
|
||||||
|
|
||||||
|
RUN curl -Lo /tmp/HFish.tar.gz https://github.com/hacklcx/HFish/releases/download/${HFISH_VERSION_NEW}/HFish-${HFISH_VERSION_NEW}-linux-amd64.tar.gz && \
|
||||||
|
tar -zxvf /tmp/HFish.tar.gz -C /tmp && \
|
||||||
|
cp /tmp/HFish-${HFISH_VERSION_NEW}-linux-amd64/HFish /tmp/HFish/ && \
|
||||||
|
cp /tmp/HFish-${HFISH_VERSION_NEW}-linux-amd64/static/data/js/data.js /tmp/HFish/static/data/js/ && \
|
||||||
|
rm -rf /tmp/HFish-${HFISH_VERSION}-linux-amd64 && \
|
||||||
|
rm -f /tmp/HFish.tar.gz
|
||||||
|
|
||||||
COPY Entrypoint.sh /Entrypoint.sh
|
COPY Entrypoint.sh /Entrypoint.sh
|
||||||
|
|
||||||
|
@ -2,28 +2,29 @@ package error
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
var (
|
||||||
ErrSuccessCode = 200
|
ErrSuccess = gin.H{"code": 200, "msg": "成功"}
|
||||||
ErrSuccessMsg = "success"
|
ErrFailApiKey = gin.H{"code": 1001, "msg": "秘钥不正确"}
|
||||||
|
ErrFailLogin = gin.H{"code": 1002, "msg": "账号密码不正确"}
|
||||||
ErrFailApiKeyCode = 1001
|
ErrFailMail = gin.H{"code": 1003, "msg": "邮箱未启用"}
|
||||||
ErrFailApiKeyMsg = "秘钥不正确"
|
ErrFailConfig = gin.H{"code": 1004, "msg": "请配置后再启用"}
|
||||||
|
ErrFailPlug = gin.H{"code": 1005, "msg": "上报信息错误"}
|
||||||
ErrFailLoginCode = 1002
|
ErrInputData = gin.H{"code": 1006, "msg": "请求数据非法"}
|
||||||
ErrFailLoginMsg = "账号密码不正确"
|
ErrUpdateData = gin.H{"code": 1007, "msg": "数据更新失败"}
|
||||||
|
ErrDeleteData = gin.H{"code": 1008, "msg": "数据清除失败"}
|
||||||
ErrFailMailCode = 1003
|
ErrTestSyslog = gin.H{"code": 1009, "msg": "测试Syslog发送失败"}
|
||||||
ErrFailMailMsg = "邮箱未启用"
|
ErrTestEmail = gin.H{"code": 1010, "msg": "测试邮件发送失败"}
|
||||||
|
ErrTestIntelligence = gin.H{"code": 1011, "msg": "测试获取威胁情报失败"}
|
||||||
ErrFailConfigCode = 1004
|
ErrExportData = gin.H{"code": 1012, "msg": "数据导出失败"}
|
||||||
ErrFailConfigMsg = "请配置后在启用"
|
|
||||||
|
|
||||||
ErrFailPlugCode = 1005
|
|
||||||
ErrFailPlugMsg = "上报信息错误"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func ErrSuccessWithData(data interface{}) gin.H {
|
||||||
|
return gin.H{"code": 200, "msg": "success", "data": data}
|
||||||
|
}
|
||||||
|
|
||||||
func Check(e error, tips string) {
|
func Check(e error, tips string) {
|
||||||
if e != nil {
|
if e != nil {
|
||||||
fmt.Println(tips)
|
fmt.Println(tips)
|
||||||
|
1
go.mod
1
go.mod
@ -16,6 +16,7 @@ require (
|
|||||||
github.com/go-sql-driver/mysql v1.4.1
|
github.com/go-sql-driver/mysql v1.4.1
|
||||||
github.com/gohouse/gorose v0.0.0-20190830103550-ad3ce0985b9e
|
github.com/gohouse/gorose v0.0.0-20190830103550-ad3ce0985b9e
|
||||||
github.com/gorilla/websocket v1.4.1
|
github.com/gorilla/websocket v1.4.1
|
||||||
|
github.com/hashicorp/go-syslog v1.0.0
|
||||||
github.com/ipipdotnet/ipdb-go v1.2.0
|
github.com/ipipdotnet/ipdb-go v1.2.0
|
||||||
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869
|
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869
|
||||||
github.com/kr/pretty v0.1.0 // indirect
|
github.com/kr/pretty v0.1.0 // indirect
|
||||||
|
30
go.sum
30
go.sum
@ -4,18 +4,14 @@ github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+I
|
|||||||
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394/go.mod h1:Q8n74mJTIgjX4RBBcHnJ05h//6/k6foqmgE45jTQtxg=
|
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394/go.mod h1:Q8n74mJTIgjX4RBBcHnJ05h//6/k6foqmgE45jTQtxg=
|
||||||
github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y=
|
github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y=
|
||||||
github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
|
github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
|
||||||
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY=
|
|
||||||
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
|
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
|
||||||
github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P97fT2CiHkbFQwkK3mjsFAP6zCYV2aXtjw=
|
github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P97fT2CiHkbFQwkK3mjsFAP6zCYV2aXtjw=
|
||||||
github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA=
|
github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA=
|
||||||
github.com/bradleypeabody/gorilla-sessions-memcache v0.0.0-20181103040241-659414f458e1/go.mod h1:dkChI7Tbtx7H1Tj7TqGSZMOeGpMP5gLHtjroHd4agiI=
|
github.com/bradleypeabody/gorilla-sessions-memcache v0.0.0-20181103040241-659414f458e1/go.mod h1:dkChI7Tbtx7H1Tj7TqGSZMOeGpMP5gLHtjroHd4agiI=
|
||||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/elazarl/goproxy v0.0.0-20190711103511-473e67f1d7d2 h1:aZtFdDNWY/yH86JPR2WX/PN63635VsE/f/nXNPAbYxY=
|
github.com/elazarl/goproxy v0.0.0-20190711103511-473e67f1d7d2 h1:aZtFdDNWY/yH86JPR2WX/PN63635VsE/f/nXNPAbYxY=
|
||||||
github.com/elazarl/goproxy v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
|
github.com/elazarl/goproxy v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
|
||||||
github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2 h1:dWB6v3RcOy03t/bUadywsbyrQwCqZeNIEX6M1OtSZOM=
|
|
||||||
github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8=
|
github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8=
|
||||||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
|
|
||||||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
||||||
github.com/gin-contrib/sessions v0.0.1 h1:xr9V/u3ERQnkugKSY/u36cNnC4US4bHJpdxcB6eIZLk=
|
github.com/gin-contrib/sessions v0.0.1 h1:xr9V/u3ERQnkugKSY/u36cNnC4US4bHJpdxcB6eIZLk=
|
||||||
github.com/gin-contrib/sessions v0.0.1/go.mod h1:iziXm/6pvTtf7og1uxT499sel4h3S9DfwsrhNZ+REXM=
|
github.com/gin-contrib/sessions v0.0.1/go.mod h1:iziXm/6pvTtf7og1uxT499sel4h3S9DfwsrhNZ+REXM=
|
||||||
@ -23,7 +19,6 @@ github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 h1:t8FVkw33L+wilf2
|
|||||||
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
|
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
|
||||||
github.com/gin-gonic/gin v1.4.0 h1:3tMoCCfM7ppqsR0ptz/wi1impNpT7/9wQtMZ8lr1mCQ=
|
github.com/gin-gonic/gin v1.4.0 h1:3tMoCCfM7ppqsR0ptz/wi1impNpT7/9wQtMZ8lr1mCQ=
|
||||||
github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM=
|
github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM=
|
||||||
github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
|
|
||||||
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
|
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
|
||||||
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
|
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
|
||||||
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
|
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
|
||||||
@ -37,7 +32,6 @@ github.com/gohouse/t v0.0.5/go.mod h1:CUtvHWNU9GY0Lvk+gcrhs9Ixmei7J5QQXiAvqcwccs
|
|||||||
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
|
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
|
github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
|
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=
|
github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=
|
||||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||||
@ -48,19 +42,17 @@ github.com/gorilla/sessions v1.1.3 h1:uXoZdcdA5XdXF3QzuSlheVRUvjl+1rKY7zBXL68L9R
|
|||||||
github.com/gorilla/sessions v1.1.3/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w=
|
github.com/gorilla/sessions v1.1.3/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w=
|
||||||
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
|
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
|
||||||
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
|
github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE=
|
||||||
|
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
|
||||||
github.com/ipipdotnet/ipdb-go v1.2.0 h1:Afa0qx/SgRevzIK8Qg1TevuD5M28kFLWbzPvU+GQJ08=
|
github.com/ipipdotnet/ipdb-go v1.2.0 h1:Afa0qx/SgRevzIK8Qg1TevuD5M28kFLWbzPvU+GQJ08=
|
||||||
github.com/ipipdotnet/ipdb-go v1.2.0/go.mod h1:6SFLNyXDBF6q99FQvbOZJQCc2rdPrB1V5DSy4S83RSw=
|
github.com/ipipdotnet/ipdb-go v1.2.0/go.mod h1:6SFLNyXDBF6q99FQvbOZJQCc2rdPrB1V5DSy4S83RSw=
|
||||||
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 h1:IPJ3dvxmJ4uczJe5YQdrYB16oTJlGSC/OyZDqUk9xX4=
|
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 h1:IPJ3dvxmJ4uczJe5YQdrYB16oTJlGSC/OyZDqUk9xX4=
|
||||||
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag=
|
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag=
|
||||||
github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs=
|
|
||||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
|
||||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||||
github.com/kidstuff/mongostore v0.0.0-20181113001930-e650cd85ee4b/go.mod h1:g2nVr8KZVXJSS97Jo8pJ0jgq29P6H7dG0oplUA86MQw=
|
github.com/kidstuff/mongostore v0.0.0-20181113001930-e650cd85ee4b/go.mod h1:g2nVr8KZVXJSS97Jo8pJ0jgq29P6H7dG0oplUA86MQw=
|
||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc=
|
github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc=
|
||||||
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
@ -68,62 +60,46 @@ github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsO
|
|||||||
github.com/mattn/go-sqlite3 v1.11.0 h1:LDdKkqtYlom37fkvqs8rMPFKAMe8+SgjbwZ6ex1/A/Q=
|
github.com/mattn/go-sqlite3 v1.11.0 h1:LDdKkqtYlom37fkvqs8rMPFKAMe8+SgjbwZ6ex1/A/Q=
|
||||||
github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
||||||
github.com/memcachier/mc v2.0.1+incompatible/go.mod h1:7bkvFE61leUBvXz+yxsOnGBQSZpBSPIMUQSmmSHvuXc=
|
github.com/memcachier/mc v2.0.1+incompatible/go.mod h1:7bkvFE61leUBvXz+yxsOnGBQSZpBSPIMUQSmmSHvuXc=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
|
|
||||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
github.com/panjf2000/ants v1.2.0 h1:Ufw4aDz9RqH1RVblx2W9L9Uv5vSX5apbX5+peR7LQ5k=
|
github.com/panjf2000/ants v1.2.0 h1:pMQ1/XpSgnWx3ro4y1xr/uA3jXUsTuAaU3Dm0JjwggE=
|
||||||
github.com/panjf2000/ants v1.2.0/go.mod h1:AaACblRPzq35m1g3enqYcxspbbiOJJYaxU2wMpm1cXY=
|
github.com/panjf2000/ants v1.2.0/go.mod h1:AaACblRPzq35m1g3enqYcxspbbiOJJYaxU2wMpm1cXY=
|
||||||
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
|
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
|
||||||
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
|
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
|
||||||
github.com/pin/tftp v2.1.0+incompatible h1:Yng4J7jv6lOc6IF4XoB5mnd3P7ZrF60XQq+my3FAMus=
|
github.com/pin/tftp v2.1.0+incompatible h1:Yng4J7jv6lOc6IF4XoB5mnd3P7ZrF60XQq+my3FAMus=
|
||||||
github.com/pin/tftp v2.1.0+incompatible/go.mod h1:xVpZOMCXTy+A5QMjEVN0Glwa1sUvaJhFXbr/aAxuxGY=
|
github.com/pin/tftp v2.1.0+incompatible/go.mod h1:xVpZOMCXTy+A5QMjEVN0Glwa1sUvaJhFXbr/aAxuxGY=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/quasoft/memstore v0.0.0-20180925164028-84a050167438/go.mod h1:wTPjTepVu7uJBYgZ0SdWHQlIas582j6cn2jgk4DDdlg=
|
github.com/quasoft/memstore v0.0.0-20180925164028-84a050167438/go.mod h1:wTPjTepVu7uJBYgZ0SdWHQlIas582j6cn2jgk4DDdlg=
|
||||||
github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc=
|
github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc=
|
||||||
github.com/scottkiss/grtm v0.0.0-20151009105840-1c69ec29e5b2 h1:C4Gz5wNytFIEJN9WBBKJGMU54GQwz2Po9Czk2PApvic=
|
|
||||||
github.com/scottkiss/grtm v0.0.0-20151009105840-1c69ec29e5b2/go.mod h1:NNbGtn1IQBVpUM3RyHaK+i2DF6DX/9C3rB9xhFAk+ko=
|
github.com/scottkiss/grtm v0.0.0-20151009105840-1c69ec29e5b2/go.mod h1:NNbGtn1IQBVpUM3RyHaK+i2DF6DX/9C3rB9xhFAk+ko=
|
||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
|
|
||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8=
|
|
||||||
github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||||
github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
|
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw=
|
github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw=
|
||||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5 h1:58fnuSXlxZmFdJyvtTFVmVhcMLU6v5fEb/ok4wyqtNU=
|
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5 h1:58fnuSXlxZmFdJyvtTFVmVhcMLU6v5fEb/ok4wyqtNU=
|
||||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c h1:uOCk1iQW6Vc18bnC13MfzScl+wdKBmM9Y9kU7Z83/lw=
|
|
||||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65 h1:+rhAzEzT3f4JtomfC371qB+0Ola2caSKcY69NUBZrRQ=
|
golang.org/x/net v0.0.0-20190603091049-60506f45cf65 h1:+rhAzEzT3f4JtomfC371qB+0Ola2caSKcY69NUBZrRQ=
|
||||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8=
|
|
||||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c h1:+EXw7AwNOKzPFXMZ1yNjO40aWCh3PIquJB2fYlv9wcs=
|
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c h1:+EXw7AwNOKzPFXMZ1yNjO40aWCh3PIquJB2fYlv9wcs=
|
||||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
google.golang.org/appengine v1.6.2 h1:j8RI1yW0SkI+paT6uGwMlrMI/6zwYA6/CFil8rxOzGI=
|
|
||||||
google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
||||||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
|
|
||||||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
|
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM=
|
|
||||||
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
|
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
|
||||||
gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ=
|
gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ=
|
||||||
gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y=
|
gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y=
|
||||||
|
275
logs/hfish.log
275
logs/hfish.log
@ -1,199 +1,76 @@
|
|||||||
[HFish] ::1 - [2020-05-12 15:38:15] "GET /data HTTP/1.1 200 2.283702ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:41:48] "GET / HTTP/1.1 200 6.9816ms "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:15 | 200 | 2.509664ms | ::1 | GET /data
|
[GIN] 2020/12/02 - 22:41:48 | 200 | 6.9816ms | ::1 | GET /
|
||||||
[HFish] ::1 - [2020-05-12 15:38:15] "GET /static/data/js/data.js HTTP/1.1 304 254.018µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:41:49] "GET /get/dashboard/pie_data HTTP/1.1 200 1.9951ms "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:15 | 304 | 344.02µs | ::1 | GET /static/data/js/data.js
|
[GIN] 2020/12/02 - 22:41:49 | 200 | 2.9911ms | ::1 | GET /get/dashboard/pie_data
|
||||||
[HFish] ::1 - [2020-05-12 15:38:15] "GET /data/get/china HTTP/1.1 200 6.770024ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:41:49] "GET /data/get/password HTTP/1.1 200 0s "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:15 | 200 | 6.820082ms | ::1 | GET /data/get/china
|
[GIN] 2020/12/02 - 22:41:49 | 200 | 0s | ::1 | GET /data/get/password
|
||||||
[HFish] ::1 - [2020-05-12 15:38:15] "GET /static/favicon.ico HTTP/1.1 200 4.536303ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:41:49] "GET /get/dashboard/data HTTP/1.1 200 4.9493ms "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:15 | 200 | 4.575423ms | ::1 | GET /static/favicon.ico
|
[GIN] 2020/12/02 - 22:41:49 | 200 | 4.9493ms | ::1 | GET /get/dashboard/data
|
||||||
[HFish] ::1 - [2020-05-12 15:38:15] "GET /data/get/country HTTP/1.1 200 5.581452ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:41:49] "GET /data/get/account HTTP/1.1 200 3.989ms "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:15 | 200 | 5.640788ms | ::1 | GET /data/get/country
|
[GIN] 2020/12/02 - 22:41:49 | 200 | 3.989ms | ::1 | GET /data/get/account
|
||||||
[HFish] ::1 - [2020-05-12 15:38:15] "GET /data/get/ip HTTP/1.1 200 7.157539ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:41:50] "GET /setting HTTP/1.1 200 4.9877ms "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:15 | 200 | 7.189286ms | ::1 | GET /data/get/ip
|
[GIN] 2020/12/02 - 22:41:50 | 200 | 4.9877ms | ::1 | GET /setting
|
||||||
[HFish] ::1 - [2020-05-12 15:38:15] "GET /data/get/info HTTP/1.1 200 1.000452ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:41:50] "GET /get/setting/alert HTTP/1.1 200 995.9µs "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:15 | 200 | 1.026445ms | ::1 | GET /data/get/info
|
[GIN] 2020/12/02 - 22:41:50 | 200 | 995.9µs | ::1 | GET /get/setting/alert
|
||||||
[HFish] ::1 - [2020-05-12 15:38:15] "GET /data/get/type HTTP/1.1 200 8.230676ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:41:53] "GET /static/js/jquery.min.map HTTP/1.1 200 51.8621ms "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:15 | 200 | 8.269832ms | ::1 | GET /data/get/type
|
[GIN] 2020/12/02 - 22:41:53 | 200 | 51.8621ms | ::1 | GET /static/js/jquery.min.map
|
||||||
[HFish] ::1 - [2020-05-12 15:38:15] "GET /data/get/account HTTP/1.1 200 8.289315ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:41:53] "GET /static/css/style.css.map HTTP/1.1 200 26.9286ms "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:15 | 200 | 8.32347ms | ::1 | GET /data/get/account
|
[GIN] 2020/12/02 - 22:41:53 | 200 | 26.9286ms | ::1 | GET /static/css/style.css.map
|
||||||
[HFish] ::1 - [2020-05-12 15:38:15] "GET /data/get/word HTTP/1.1 200 24.471028ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:42:04] "GET /fish HTTP/1.1 200 6.9792ms "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:15 | 200 | 24.499375ms | ::1 | GET /data/get/word
|
[GIN] 2020/12/02 - 22:42:04 | 200 | 6.9792ms | ::1 | GET /fish
|
||||||
[HFish] ::1 - [2020-05-12 15:38:15] "GET /data/get/password HTTP/1.1 200 24.760854ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:42:04] "GET /get/fish/list?page_no=1&page_size=10&type=all&colony=all&so_text=&start_time=&end_time=&condition=&length= HTTP/1.1 200 998.5µs "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:15 | 200 | 24.791455ms | ::1 | GET /data/get/password
|
[GIN] 2020/12/02 - 22:42:04 | 200 | 998.5µs | ::1 | GET /get/fish/list?page_no=1&page_size=10&type=all&colony=all&so_text=&start_time=&end_time=&condition=&length=
|
||||||
[HFish] ::1 - [2020-05-12 15:38:17] "GET /data HTTP/1.1 200 1.966663ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:42:04] "GET /get/fish/typeList HTTP/1.1 200 0s "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:17 | 200 | 2.006766ms | ::1 | GET /data
|
[GIN] 2020/12/02 - 22:42:04 | 200 | 0s | ::1 | GET /get/fish/typeList
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /data/ws HTTP/1.1 200 2.659693884s "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:42:06] "GET /dashboard HTTP/1.1 200 4.9868ms "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 2.659738826s | ::1 | GET /data/ws
|
[GIN] 2020/12/02 - 22:42:06 | 200 | 4.9868ms | ::1 | GET /dashboard
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /static/data/css/bootstrap/css/bootstrap.min.css HTTP/1.1 200 838.32µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:42:06] "GET /get/dashboard/data HTTP/1.1 200 0s "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 902.515µs | ::1 | GET /static/data/css/bootstrap/css/bootstrap.min.css
|
[GIN] 2020/12/02 - 22:42:06 | 200 | 0s | ::1 | GET /get/dashboard/data
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /static/data/css/app.css HTTP/1.1 200 300.2µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:42:06] "GET /get/dashboard/pie_data HTTP/1.1 200 0s "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 334.387µs | ::1 | GET /static/data/css/app.css
|
[GIN] 2020/12/02 - 22:42:06 | 200 | 0s | ::1 | GET /get/dashboard/pie_data
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /static/data/js/dark.js HTTP/1.1 200 418.236µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:42:06] "GET /data/get/account HTTP/1.1 200 998.9µs "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 450.933µs | ::1 | GET /static/data/js/dark.js
|
[GIN] 2020/12/02 - 22:42:06 | 200 | 998.9µs | ::1 | GET /data/get/account
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /static/data/js/echarts-wordcloud.min.js HTTP/1.1 200 1.041864ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:42:06] "GET /data/get/password HTTP/1.1 200 996µs "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /static/data/js/data.js HTTP/1.1 200 539.028µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[GIN] 2020/12/02 - 22:42:06 | 200 | 996µs | ::1 | GET /data/get/password
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 586.17µs | ::1 | GET /static/data/js/data.js
|
[HFish] ::1 - [2020-12-02 22:42:08] "GET /fish HTTP/1.1 200 4.9588ms "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 1.072769ms | ::1 | GET /static/data/js/echarts-wordcloud.min.js
|
[GIN] 2020/12/02 - 22:42:08 | 200 | 4.9588ms | ::1 | GET /fish
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /static/js/xss.min.js HTTP/1.1 200 1.10371ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:42:08] "GET /get/fish/typeList HTTP/1.1 200 999.1µs "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 1.137992ms | ::1 | GET /static/js/xss.min.js
|
[GIN] 2020/12/02 - 22:42:08 | 200 | 999.1µs | ::1 | GET /get/fish/typeList
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /static/data/js/echarts-3.8.5.min.js HTTP/1.1 200 2.64812ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:42:08] "GET /get/fish/list?page_no=1&page_size=10&type=all&colony=all&so_text=&start_time=&end_time=&condition=&length= HTTP/1.1 200 999.1µs "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 2.69818ms | ::1 | GET /static/data/js/echarts-3.8.5.min.js
|
[GIN] 2020/12/02 - 22:42:08 | 200 | 999.1µs | ::1 | GET /get/fish/list?page_no=1&page_size=10&type=all&colony=all&so_text=&start_time=&end_time=&condition=&length=
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /static/data/js/jquery-3.3.1.min.js HTTP/1.1 200 2.092707ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:42:09] "GET /fish HTTP/1.1 200 4.9876ms "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 2.144618ms | ::1 | GET /static/data/js/jquery-3.3.1.min.js
|
[GIN] 2020/12/02 - 22:42:09 | 200 | 4.9876ms | ::1 | GET /fish
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /static/data/js/echarts-map-world.js HTTP/1.1 200 19.067376ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:42:09] "GET /get/fish/typeList HTTP/1.1 200 996.5µs "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 19.121825ms | ::1 | GET /static/data/js/echarts-map-world.js
|
[GIN] 2020/12/02 - 22:42:09 | 200 | 996.5µs | ::1 | GET /get/fish/typeList
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /static/data/img/bg01.png HTTP/1.1 200 4.853002ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:42:09] "GET /get/fish/list?page_no=1&page_size=10&type=all&colony=all&so_text=&start_time=&end_time=&condition=&length= HTTP/1.1 200 996.5µs "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 4.898637ms | ::1 | GET /static/data/img/bg01.png
|
[GIN] 2020/12/02 - 22:42:09 | 200 | 996.5µs | ::1 | GET /get/fish/list?page_no=1&page_size=10&type=all&colony=all&so_text=&start_time=&end_time=&condition=&length=
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /static/data/img/panel.png HTTP/1.1 200 1.738537ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:42:10] "GET /dashboard HTTP/1.1 200 5.0045ms "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 1.767635ms | ::1 | GET /static/data/img/panel.png
|
[GIN] 2020/12/02 - 22:42:10 | 200 | 5.0045ms | ::1 | GET /dashboard
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /static/data/img/header.png HTTP/1.1 200 2.811511ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:42:10] "GET /get/dashboard/data HTTP/1.1 200 998.7µs "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 2.841579ms | ::1 | GET /static/data/img/header.png
|
[GIN] 2020/12/02 - 22:42:10 | 200 | 998.7µs | ::1 | GET /get/dashboard/data
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /static/data/css/bootstrap/fonts/glyphicons-halflings-regular.woff2 HTTP/1.1 200 639.806µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:42:10] "GET /get/dashboard/pie_data HTTP/1.1 200 0s "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 675.684µs | ::1 | GET /static/data/css/bootstrap/fonts/glyphicons-halflings-regular.woff2
|
[GIN] 2020/12/02 - 22:42:10 | 200 | 0s | ::1 | GET /get/dashboard/pie_data
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /data/get/china HTTP/1.1 200 2.230235ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:42:10] "GET /data/get/account HTTP/1.1 200 998µs "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 2.269335ms | ::1 | GET /data/get/china
|
[GIN] 2020/12/02 - 22:42:10 | 200 | 998µs | ::1 | GET /data/get/account
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /data/get/country HTTP/1.1 200 896.345µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:42:10] "GET /data/get/password HTTP/1.1 200 997.3µs "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 926.024µs | ::1 | GET /data/get/country
|
[GIN] 2020/12/02 - 22:42:10 | 200 | 997.3µs | ::1 | GET /data/get/password
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /data/get/ip HTTP/1.1 200 874.956µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:43:29] "GET /setting HTTP/1.1 200 4.9887ms "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 904.238µs | ::1 | GET /data/get/ip
|
[GIN] 2020/12/02 - 22:43:29 | 200 | 4.9887ms | ::1 | GET /setting
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /data/get/type HTTP/1.1 200 709.212µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:43:29] "GET /get/setting/alert HTTP/1.1 200 997µs "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 746.803µs | ::1 | GET /data/get/type
|
[GIN] 2020/12/02 - 22:43:29 | 200 | 997µs | ::1 | GET /get/setting/alert
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /data/get/account HTTP/1.1 200 1.627896ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:43:31] "GET /mail HTTP/1.1 200 2.9929ms "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 1.680522ms | ::1 | GET /data/get/account
|
[GIN] 2020/12/02 - 22:43:31 | 200 | 2.9929ms | ::1 | GET /mail
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /data/get/password HTTP/1.1 200 3.195177ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:43:32] "GET /colony HTTP/1.1 200 2.9929ms "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 3.225945ms | ::1 | GET /data/get/password
|
[GIN] 2020/12/02 - 22:43:32 | 200 | 2.9929ms | ::1 | GET /colony
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /data/get/word HTTP/1.1 200 1.585743ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:43:32] "GET /get/colony/list HTTP/1.1 200 0s "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 1.610624ms | ::1 | GET /data/get/word
|
[GIN] 2020/12/02 - 22:43:32 | 200 | 0s | ::1 | GET /get/colony/list
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /data/get/info HTTP/1.1 200 779.195µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:43:33] "GET /fish HTTP/1.1 200 4.9862ms "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 805.17µs | ::1 | GET /data/get/info
|
[GIN] 2020/12/02 - 22:43:33 | 200 | 4.9862ms | ::1 | GET /fish
|
||||||
[HFish] ::1 - [2020-05-12 15:38:18] "GET /static/favicon.ico HTTP/1.1 200 167.029µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:43:33] "GET /get/fish/list?page_no=1&page_size=10&type=all&colony=all&so_text=&start_time=&end_time=&condition=&length= HTTP/1.1 200 0s "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:18 | 200 | 203.745µs | ::1 | GET /static/favicon.ico
|
[GIN] 2020/12/02 - 22:43:33 | 200 | 0s | ::1 | GET /get/fish/list?page_no=1&page_size=10&type=all&colony=all&so_text=&start_time=&end_time=&condition=&length=
|
||||||
[HFish] ::1 - [2020-05-12 15:38:45] "GET /data HTTP/1.1 200 3.245404ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:43:33] "GET /get/fish/typeList HTTP/1.1 200 0s "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:45 | 200 | 3.281593ms | ::1 | GET /data
|
[GIN] 2020/12/02 - 22:43:33 | 200 | 0s | ::1 | GET /get/fish/typeList
|
||||||
[HFish] ::1 - [2020-05-12 15:38:45] "GET /data/ws HTTP/1.1 200 26.942354532s "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:43:35] "GET /get/fish/export?type=all&colony=all&so_text=&condition=%3E&length=&start_time=&end_time= HTTP/1.1 200 963µs "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:45 | 200 | 26.942416279s | ::1 | GET /data/ws
|
[GIN] 2020/12/02 - 22:43:35 | 200 | 963µs | ::1 | GET /get/fish/export?type=all&colony=all&so_text=&condition=%3E&length=&start_time=&end_time=
|
||||||
[HFish] ::1 - [2020-05-12 15:38:45] "GET /static/data/js/data.js HTTP/1.1 200 177.513µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
[HFish] ::1 - [2020-12-02 22:43:47] "GET /get/fish/list?page_no=1&page_size=10&type=all&colony=all&so_text=&start_time=&end_time=&condition=%3E&length= HTTP/1.1 200 998.1µs "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" "
|
||||||
[GIN] 2020/05/12 - 15:38:45 | 200 | 239.294µs | ::1 | GET /static/data/js/data.js
|
[GIN] 2020/12/02 - 22:43:47 | 200 | 998.1µs | ::1 | GET /get/fish/list?page_no=1&page_size=10&type=all&colony=all&so_text=&start_time=&end_time=&condition=%3E&length=
|
||||||
[HFish] ::1 - [2020-05-12 15:38:45] "GET /data/get/china HTTP/1.1 200 850.43µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:38:45 | 200 | 899.502µs | ::1 | GET /data/get/china
|
|
||||||
[HFish] ::1 - [2020-05-12 15:38:45] "GET /data/get/country HTTP/1.1 200 855.67µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:38:45 | 200 | 903.691µs | ::1 | GET /data/get/country
|
|
||||||
[HFish] ::1 - [2020-05-12 15:38:45] "GET /data/get/ip HTTP/1.1 200 780.447µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:38:45 | 200 | 812.129µs | ::1 | GET /data/get/ip
|
|
||||||
[HFish] ::1 - [2020-05-12 15:38:45] "GET /data/get/type HTTP/1.1 200 1.033283ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:38:45 | 200 | 1.086369ms | ::1 | GET /data/get/type
|
|
||||||
[HFish] ::1 - [2020-05-12 15:38:45] "GET /data/get/account HTTP/1.1 200 1.643614ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:38:45 | 200 | 1.6883ms | ::1 | GET /data/get/account
|
|
||||||
[HFish] ::1 - [2020-05-12 15:38:45] "GET /data/get/info HTTP/1.1 200 790.703µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:38:45 | 200 | 816.217µs | ::1 | GET /data/get/info
|
|
||||||
[HFish] ::1 - [2020-05-12 15:38:45] "GET /data/get/word HTTP/1.1 200 2.248212ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:38:45 | 200 | 2.278713ms | ::1 | GET /data/get/word
|
|
||||||
[HFish] ::1 - [2020-05-12 15:38:45] "GET /data/get/password HTTP/1.1 200 4.763362ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:38:45 | 200 | 4.796271ms | ::1 | GET /data/get/password
|
|
||||||
[HFish] ::1 - [2020-05-12 15:38:45] "GET /static/favicon.ico HTTP/1.1 200 114.917µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:38:45 | 200 | 157.499µs | ::1 | GET /static/favicon.ico
|
|
||||||
[SSH] 127.0.0.1 - [2020-05-12 15:39:07] 已经连接 []
|
|
||||||
[SSH] 127.0.0.1 - [2020-05-12 15:39:08] 已经连接 []
|
|
||||||
[SSH] 127.0.0.1 - [2020-05-12 15:39:09] 已经连接 []
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:11] "GET /data HTTP/1.1 200 1.635292ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:11 | 200 | 1.667211ms | ::1 | GET /data
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:11] "GET /data/ws HTTP/1.1 200 26.232692289s "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:11 | 200 | 26.232742232s | ::1 | GET /data/ws
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:11] "GET /static/data/js/data.js HTTP/1.1 304 257.512µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:11 | 304 | 334.669µs | ::1 | GET /static/data/js/data.js
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:11] "GET /data/get/china HTTP/1.1 200 1.418136ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:11 | 200 | 1.462278ms | ::1 | GET /data/get/china
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:11] "GET /data/get/country HTTP/1.1 200 959.153µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:11 | 200 | 1.003611ms | ::1 | GET /data/get/country
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:11] "GET /data/get/type HTTP/1.1 200 988.235µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:11 | 200 | 1.099816ms | ::1 | GET /data/get/type
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:11] "GET /data/get/ip HTTP/1.1 200 856.439µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:11 | 200 | 1.43707ms | ::1 | GET /data/get/ip
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:11] "GET /data/get/account HTTP/1.1 200 1.851153ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:11 | 200 | 2.602562ms | ::1 | GET /data/get/account
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:11] "GET /data/get/info HTTP/1.1 200 1.077105ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:11 | 200 | 1.109674ms | ::1 | GET /data/get/info
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:11] "GET /data/get/word HTTP/1.1 200 2.354968ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:11 | 200 | 2.390979ms | ::1 | GET /data/get/word
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:11] "GET /data/get/password HTTP/1.1 200 6.808522ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:11 | 200 | 6.880126ms | ::1 | GET /data/get/password
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:12] "GET /static/favicon.ico HTTP/1.1 200 124.337µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:12 | 200 | 157.233µs | ::1 | GET /static/favicon.ico
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:32] "GET /data HTTP/1.1 200 3.593028ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:32 | 200 | 3.644136ms | ::1 | GET /data
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:32] "GET /data/ws HTTP/1.1 200 20.64108451s "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:32 | 200 | 20.641193324s | ::1 | GET /data/ws
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:32] "GET /static/data/js/data.js HTTP/1.1 304 115.843µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:32 | 304 | 174.761µs | ::1 | GET /static/data/js/data.js
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:32] "GET /data/get/country HTTP/1.1 200 975.066µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:32 | 200 | 1.031313ms | ::1 | GET /data/get/country
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:32] "GET /data/get/ip HTTP/1.1 200 1.54984ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:32 | 200 | 2.370719ms | ::1 | GET /data/get/ip
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:32] "GET /data/get/china HTTP/1.1 200 9.04339ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:32 | 200 | 9.112501ms | ::1 | GET /data/get/china
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:32] "GET /data/get/type HTTP/1.1 200 5.145298ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:32 | 200 | 5.733475ms | ::1 | GET /data/get/type
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:32] "GET /data/get/account HTTP/1.1 200 4.478348ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:32 | 200 | 7.276454ms | ::1 | GET /data/get/account
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:32] "GET /data/get/info HTTP/1.1 200 1.755113ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:32 | 200 | 1.79309ms | ::1 | GET /data/get/info
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:32] "GET /data/get/word HTTP/1.1 200 25.235758ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:32 | 200 | 25.307958ms | ::1 | GET /data/get/word
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:32] "GET /data/get/password HTTP/1.1 200 31.900541ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:32 | 200 | 31.95225ms | ::1 | GET /data/get/password
|
|
||||||
[HFish] ::1 - [2020-05-12 15:39:33] "GET /static/favicon.ico HTTP/1.1 200 154.177µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:39:33 | 200 | 197.01µs | ::1 | GET /static/favicon.ico
|
|
||||||
[SSH] 127.0.0.1 - [2020-05-12 15:39:39] 已经连接 []
|
|
||||||
[SSH] 127.0.0.1 - [2020-05-12 15:39:41] 已经连接 []
|
|
||||||
[SSH] 127.0.0.1 - [2020-05-12 15:39:42] 已经连接 []
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /data HTTP/1.1 200 6.613061ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 7.020465ms | ::1 | GET /data
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /data/ws HTTP/1.1 200 50.794251861s "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 50.794314799s | ::1 | GET /data/ws
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /static/data/css/app.css HTTP/1.1 200 1.013027ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 1.085255ms | ::1 | GET /static/data/css/app.css
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /static/data/css/bootstrap/css/bootstrap.min.css HTTP/1.1 200 1.491827ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 1.544393ms | ::1 | GET /static/data/css/bootstrap/css/bootstrap.min.css
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /static/data/img/panel.png HTTP/1.1 200 368.938µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 409.515µs | ::1 | GET /static/data/img/panel.png
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /static/data/css/bootstrap/fonts/glyphicons-halflings-regular.woff2 HTTP/1.1 200 351.47µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 386.765µs | ::1 | GET /static/data/css/bootstrap/fonts/glyphicons-halflings-regular.woff2
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /static/data/img/header.png HTTP/1.1 200 919.657µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 987.595µs | ::1 | GET /static/data/img/header.png
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /static/data/img/bg01.png HTTP/1.1 200 1.508233ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 1.551086ms | ::1 | GET /static/data/img/bg01.png
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /static/data/js/jquery-3.3.1.min.js HTTP/1.1 200 3.615004ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 3.651557ms | ::1 | GET /static/data/js/jquery-3.3.1.min.js
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /static/data/js/dark.js HTTP/1.1 200 1.991478ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 2.056049ms | ::1 | GET /static/data/js/dark.js
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /static/js/xss.min.js HTTP/1.1 200 1.752598ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 1.787299ms | ::1 | GET /static/js/xss.min.js
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /static/data/js/echarts-wordcloud.min.js HTTP/1.1 200 1.551649ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 1.600502ms | ::1 | GET /static/data/js/echarts-wordcloud.min.js
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /static/data/js/echarts-3.8.5.min.js HTTP/1.1 200 4.831557ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 4.866948ms | ::1 | GET /static/data/js/echarts-3.8.5.min.js
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /static/data/js/data.js HTTP/1.1 200 176.58µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 204.944µs | ::1 | GET /static/data/js/data.js
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /static/data/js/echarts-map-world.js HTTP/1.1 200 10.200741ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 10.26137ms | ::1 | GET /static/data/js/echarts-map-world.js
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /data/get/china HTTP/1.1 200 872.075µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 928.568µs | ::1 | GET /data/get/china
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /data/get/country HTTP/1.1 200 1.008534ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 1.038357ms | ::1 | GET /data/get/country
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /data/get/ip HTTP/1.1 200 1.249247ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 1.305061ms | ::1 | GET /data/get/ip
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /data/get/type HTTP/1.1 200 859.32µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 889.269µs | ::1 | GET /data/get/type
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /data/get/account HTTP/1.1 200 1.684763ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 1.720029ms | ::1 | GET /data/get/account
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /data/get/word HTTP/1.1 200 1.721855ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 1.759759ms | ::1 | GET /data/get/word
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /data/get/password HTTP/1.1 200 3.006602ms "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 3.056834ms | ::1 | GET /data/get/password
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /data/get/info HTTP/1.1 200 656.323µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 687.672µs | ::1 | GET /data/get/info
|
|
||||||
[HFish] ::1 - [2020-05-12 15:40:23] "GET /static/favicon.ico HTTP/1.1 200 139.708µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "
|
|
||||||
[GIN] 2020/05/12 - 15:40:23 | 200 | 193.932µs | ::1 | GET /static/favicon.ico
|
|
||||||
[SSH] 127.0.0.1 - [2020-05-12 15:40:27] 已经连接 []
|
|
||||||
[SSH] 127.0.0.1 - [2020-05-12 15:40:28] 已经连接 []
|
|
||||||
[SSH] 127.0.0.1 - [2020-05-12 15:40:28] 已经连接 []
|
|
||||||
|
7
main.go
7
main.go
@ -2,8 +2,9 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"HFish/utils/setting"
|
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"HFish/utils/setting"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@ -14,10 +15,8 @@ func main() {
|
|||||||
} else {
|
} else {
|
||||||
if args[1] == "help" || args[1] == "--help" {
|
if args[1] == "help" || args[1] == "--help" {
|
||||||
setting.Help()
|
setting.Help()
|
||||||
} else if args[1] == "init" || args[1] == "--init" {
|
|
||||||
setting.Init()
|
|
||||||
} else if args[1] == "version" || args[1] == "--version" {
|
} else if args[1] == "version" || args[1] == "--version" {
|
||||||
fmt.Println("v0.6.3")
|
fmt.Println("v0.6.4")
|
||||||
} else if args[1] == "run" || args[1] == "--run" {
|
} else if args[1] == "run" || args[1] == "--run" {
|
||||||
setting.Run()
|
setting.Run()
|
||||||
} else {
|
} else {
|
||||||
|
8
static/css/bootstrap-flex.css
vendored
8
static/css/bootstrap-flex.css
vendored
@ -2271,9 +2271,11 @@ input[type="button"].btn-block {
|
|||||||
|
|
||||||
.fade {
|
.fade {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transition: opacity .15s linear; }
|
transition: opacity .15s linear;
|
||||||
.fade.in {
|
}
|
||||||
opacity: 1; }
|
.fade.in {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
.collapse {
|
.collapse {
|
||||||
display: none; }
|
display: none; }
|
||||||
|
568
static/css/jquery.datetimepicker.css
Normal file
568
static/css/jquery.datetimepicker.css
Normal file
@ -0,0 +1,568 @@
|
|||||||
|
.xdsoft_datetimepicker {
|
||||||
|
box-shadow: 0 5px 15px -5px rgba(0, 0, 0, 0.506);
|
||||||
|
background: #fff;
|
||||||
|
border-bottom: 1px solid #bbb;
|
||||||
|
border-left: 1px solid #ccc;
|
||||||
|
border-right: 1px solid #ccc;
|
||||||
|
border-top: 1px solid #ccc;
|
||||||
|
color: #333;
|
||||||
|
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||||
|
padding: 8px;
|
||||||
|
padding-left: 0;
|
||||||
|
padding-top: 2px;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 9999;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_rtl {
|
||||||
|
padding: 8px 0 8px 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker iframe {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 75px;
|
||||||
|
height: 210px;
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*For IE8 or lower*/
|
||||||
|
.xdsoft_datetimepicker button {
|
||||||
|
border: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_noselect {
|
||||||
|
-webkit-touch-callout: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-khtml-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
-o-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_noselect::selection { background: transparent }
|
||||||
|
.xdsoft_noselect::-moz-selection { background: transparent }
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker.xdsoft_inline {
|
||||||
|
display: inline-block;
|
||||||
|
position: static;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker * {
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_datepicker, .xdsoft_datetimepicker .xdsoft_timepicker {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_datepicker.active, .xdsoft_datetimepicker .xdsoft_timepicker.active {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_datepicker {
|
||||||
|
width: 224px;
|
||||||
|
float: left;
|
||||||
|
margin-left: 8px;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_rtl .xdsoft_datepicker {
|
||||||
|
float: right;
|
||||||
|
margin-right: 8px;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker.xdsoft_showweeks .xdsoft_datepicker {
|
||||||
|
width: 256px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_timepicker {
|
||||||
|
width: 58px;
|
||||||
|
float: left;
|
||||||
|
text-align: center;
|
||||||
|
margin-left: 8px;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_rtl .xdsoft_timepicker {
|
||||||
|
float: right;
|
||||||
|
margin-right: 8px;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_datepicker.active+.xdsoft_timepicker {
|
||||||
|
margin-top: 8px;
|
||||||
|
margin-bottom: 3px
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_monthpicker {
|
||||||
|
position: relative;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_label i,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_prev,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_next,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_today_button {
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAeCAYAAADaW7vzAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0NBRjI1NjM0M0UwMTFFNDk4NkFGMzJFQkQzQjEwRUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0NBRjI1NjQ0M0UwMTFFNDk4NkFGMzJFQkQzQjEwRUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDQ0FGMjU2MTQzRTAxMUU0OTg2QUYzMkVCRDNCMTBFQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDQ0FGMjU2MjQzRTAxMUU0OTg2QUYzMkVCRDNCMTBFQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoNEP54AAAIOSURBVHja7Jq9TsMwEMcxrZD4WpBYeKUCe+kTMCACHZh4BFfHO/AAIHZGFhYkBBsSEqxsLCAgXKhbXYOTxh9pfJVP+qutnZ5s/5Lz2Y5I03QhWji2GIcgAokWgfCxNvcOCCGKqiSqhUp0laHOne05vdEyGMfkdxJDVjgwDlEQgYQBgx+ULJaWSXXS6r/ER5FBVR8VfGftTKcITNs+a1XpcFoExREIDF14AVIFxgQUS+h520cdud6wNkC0UBw6BCO/HoCYwBhD8QCkQ/x1mwDyD4plh4D6DDV0TAGyo4HcawLIBBSLDkHeH0Mg2yVP3l4TQMZQDDsEOl/MgHQqhMNuE0D+oBh0CIr8MAKyazBH9WyBuKxDWgbXfjNf32TZ1KWm/Ap1oSk/R53UtQ5xTh3LUlMmT8gt6g51Q9p+SobxgJQ/qmsfZhWywGFSl0yBjCLJCMgXail3b7+rumdVJ2YRss4cN+r6qAHDkPWjPjdJCF4n9RmAD/V9A/Wp4NQassDjwlB6XBiCxcJQWmZZb8THFilfy/lfrTvLghq2TqTHrRMTKNJ0sIhdo15RT+RpyWwFdY96UZ/LdQKBGjcXpcc1AlSFEfLmouD+1knuxBDUVrvOBmoOC/rEcN7OQxKVeJTCiAdUzUJhA2Oez9QTkp72OTVcxDcXY8iKNkxGAJXmJCOQwOa6dhyXsOa6XwEGAKdeb5ET3rQdAAAAAElFTkSuQmCC);
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_label i {
|
||||||
|
opacity: 0.5;
|
||||||
|
background-position: -92px -19px;
|
||||||
|
display: inline-block;
|
||||||
|
width: 9px;
|
||||||
|
height: 20px;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_prev {
|
||||||
|
float: left;
|
||||||
|
background-position: -20px 0;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_today_button {
|
||||||
|
float: left;
|
||||||
|
background-position: -70px 0;
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_next {
|
||||||
|
float: right;
|
||||||
|
background-position: 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_next,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_prev ,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_today_button {
|
||||||
|
background-color: transparent;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
border: 0 none;
|
||||||
|
cursor: pointer;
|
||||||
|
display: block;
|
||||||
|
height: 30px;
|
||||||
|
opacity: 0.5;
|
||||||
|
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
|
||||||
|
outline: medium none;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 0;
|
||||||
|
position: relative;
|
||||||
|
text-indent: 100%;
|
||||||
|
white-space: nowrap;
|
||||||
|
width: 20px;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_prev,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_next {
|
||||||
|
float: none;
|
||||||
|
background-position: -40px -15px;
|
||||||
|
height: 15px;
|
||||||
|
width: 30px;
|
||||||
|
display: block;
|
||||||
|
margin-left: 14px;
|
||||||
|
margin-top: 7px;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_rtl .xdsoft_timepicker .xdsoft_prev,
|
||||||
|
.xdsoft_datetimepicker.xdsoft_rtl .xdsoft_timepicker .xdsoft_next {
|
||||||
|
float: none;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_prev {
|
||||||
|
background-position: -40px 0;
|
||||||
|
margin-bottom: 7px;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box {
|
||||||
|
height: 151px;
|
||||||
|
overflow: hidden;
|
||||||
|
border-bottom: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div >div {
|
||||||
|
background: #f5f5f5;
|
||||||
|
border-top: 1px solid #ddd;
|
||||||
|
color: #666;
|
||||||
|
font-size: 12px;
|
||||||
|
text-align: center;
|
||||||
|
border-collapse: collapse;
|
||||||
|
cursor: pointer;
|
||||||
|
border-bottom-width: 0;
|
||||||
|
height: 25px;
|
||||||
|
line-height: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div > div:first-child {
|
||||||
|
border-top-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_today_button:hover,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_next:hover,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_prev:hover {
|
||||||
|
opacity: 1;
|
||||||
|
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_label {
|
||||||
|
display: inline;
|
||||||
|
position: relative;
|
||||||
|
z-index: 9999;
|
||||||
|
margin: 0;
|
||||||
|
padding: 5px 3px;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 20px;
|
||||||
|
font-weight: bold;
|
||||||
|
background-color: #fff;
|
||||||
|
float: left;
|
||||||
|
width: 182px;
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_label:hover>span {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_label:hover i {
|
||||||
|
opacity: 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select {
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 30px;
|
||||||
|
z-index: 101;
|
||||||
|
display: none;
|
||||||
|
background: #fff;
|
||||||
|
max-height: 160px;
|
||||||
|
overflow-y: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select.xdsoft_monthselect{ right: -7px }
|
||||||
|
.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select.xdsoft_yearselect{ right: 2px }
|
||||||
|
.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option:hover {
|
||||||
|
color: #fff;
|
||||||
|
background: #ff8000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option {
|
||||||
|
padding: 2px 10px 2px 5px;
|
||||||
|
text-decoration: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option.xdsoft_current {
|
||||||
|
background: #33aaff;
|
||||||
|
box-shadow: #178fe5 0 1px 3px 0 inset;
|
||||||
|
color: #fff;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_month {
|
||||||
|
width: 100px;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_year{
|
||||||
|
width: 48px;
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td > div {
|
||||||
|
padding-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar th {
|
||||||
|
height: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td,.xdsoft_datetimepicker .xdsoft_calendar th {
|
||||||
|
width: 14.2857142%;
|
||||||
|
background: #f5f5f5;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
color: #666;
|
||||||
|
font-size: 12px;
|
||||||
|
text-align: right;
|
||||||
|
vertical-align: middle;
|
||||||
|
padding: 0;
|
||||||
|
border-collapse: collapse;
|
||||||
|
cursor: pointer;
|
||||||
|
height: 25px;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_showweeks .xdsoft_calendar td,.xdsoft_datetimepicker.xdsoft_showweeks .xdsoft_calendar th {
|
||||||
|
width: 12.5%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar th {
|
||||||
|
background: #f1f1f1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_today {
|
||||||
|
color: #33aaff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_highlighted_default {
|
||||||
|
background: #ffe9d2;
|
||||||
|
box-shadow: #ffb871 0 1px 4px 0 inset;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_highlighted_mint {
|
||||||
|
background: #c1ffc9;
|
||||||
|
box-shadow: #00dd1c 0 1px 4px 0 inset;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_default,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_current,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div >div.xdsoft_current {
|
||||||
|
background: #33aaff;
|
||||||
|
box-shadow: #178fe5 0 1px 3px 0 inset;
|
||||||
|
color: #fff;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_other_month,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_time_box >div >div.xdsoft_disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_other_month.xdsoft_disabled {
|
||||||
|
opacity: 0.2;
|
||||||
|
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td:hover,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div >div:hover {
|
||||||
|
color: #fff !important;
|
||||||
|
background: #ff8000 !important;
|
||||||
|
box-shadow: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_current.xdsoft_disabled:hover,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box>div>div.xdsoft_current.xdsoft_disabled:hover {
|
||||||
|
background: #33aaff !important;
|
||||||
|
box-shadow: #178fe5 0 1px 3px 0 inset !important;
|
||||||
|
color: #fff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled:hover,
|
||||||
|
.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div >div.xdsoft_disabled:hover {
|
||||||
|
color: inherit !important;
|
||||||
|
background: inherit !important;
|
||||||
|
box-shadow: inherit !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_calendar th {
|
||||||
|
font-weight: 700;
|
||||||
|
text-align: center;
|
||||||
|
color: #999;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_copyright {
|
||||||
|
color: #ccc !important;
|
||||||
|
font-size: 10px;
|
||||||
|
clear: both;
|
||||||
|
float: none;
|
||||||
|
margin-left: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker .xdsoft_copyright a { color: #eee !important }
|
||||||
|
.xdsoft_datetimepicker .xdsoft_copyright a:hover { color: #aaa !important }
|
||||||
|
|
||||||
|
.xdsoft_time_box {
|
||||||
|
position: relative;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
.xdsoft_scrollbar >.xdsoft_scroller {
|
||||||
|
background: #ccc !important;
|
||||||
|
height: 20px;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
.xdsoft_scrollbar {
|
||||||
|
position: absolute;
|
||||||
|
width: 7px;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_rtl .xdsoft_scrollbar {
|
||||||
|
left: 0;
|
||||||
|
right: auto;
|
||||||
|
}
|
||||||
|
.xdsoft_scroller_box {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark {
|
||||||
|
box-shadow: 0 5px 15px -5px rgba(255, 255, 255, 0.506);
|
||||||
|
background: #000;
|
||||||
|
border-bottom: 1px solid #444;
|
||||||
|
border-left: 1px solid #333;
|
||||||
|
border-right: 1px solid #333;
|
||||||
|
border-top: 1px solid #333;
|
||||||
|
color: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box {
|
||||||
|
border-bottom: 1px solid #222;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box >div >div {
|
||||||
|
background: #0a0a0a;
|
||||||
|
border-top: 1px solid #222;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label {
|
||||||
|
background-color: #000;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label > .xdsoft_select {
|
||||||
|
border: 1px solid #333;
|
||||||
|
background: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label > .xdsoft_select > div > .xdsoft_option:hover {
|
||||||
|
color: #000;
|
||||||
|
background: #007fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label > .xdsoft_select > div > .xdsoft_option.xdsoft_current {
|
||||||
|
background: #cc5500;
|
||||||
|
box-shadow: #b03e00 0 1px 3px 0 inset;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label i,
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_prev,
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_next,
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_today_button {
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAeCAYAAADaW7vzAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUExQUUzOTA0M0UyMTFFNDlBM0FFQTJENTExRDVBODYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUExQUUzOTE0M0UyMTFFNDlBM0FFQTJENTExRDVBODYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQTFBRTM4RTQzRTIxMUU0OUEzQUVBMkQ1MTFENUE4NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQTFBRTM4RjQzRTIxMUU0OUEzQUVBMkQ1MTFENUE4NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pp0VxGEAAAIASURBVHja7JrNSgMxEMebtgh+3MSLr1T1Xn2CHoSKB08+QmR8Bx9A8e7RixdB9CKCoNdexIugxFlJa7rNZneTbLIpM/CnNLsdMvNjM8l0mRCiQ9Ye61IKCAgZAUnH+mU3MMZaHYChBnJUDzWOFZdVfc5+ZFLbrWDeXPwbxIqrLLfaeS0hEBVGIRQCEiZoHQwtlGSByCCdYBl8g8egTTAWoKQMRBRBcZxYlhzhKegqMOageErsCHVkk3hXIFooDgHB1KkHIHVgzKB4ADJQ/A1jAFmAYhkQqA5TOBtocrKrgXwQA8gcFIuAIO8sQSA7hidvPwaQGZSaAYHOUWJABhWWw2EMIH9QagQERU4SArJXo0ZZL18uvaxejXt/Em8xjVBXmvFr1KVm/AJ10tRe2XnraNqaJvKE3KHuUbfK1E+VHB0q40/y3sdQSxY4FHWeKJCunP8UyDdqJZenT3ntVV5jIYCAh20vT7ioP8tpf6E2lfEMwERe+whV1MHjwZB7PBiCxcGQWwKZKD62lfGNnP/1poFAA60T7rF1UgcKd2id3KDeUS+oLWV8DfWAepOfq00CgQabi9zjcgJVYVD7PVzQUAUGAQkbNJTBICDhgwYTjDYD6XeW08ZKh+A4pYkzenOxXUbvZcWz7E8ykRMnIHGX1XPl+1m2vPYpL+2qdb8CDAARlKFEz/ZVkAAAAABJRU5ErkJggg==);
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td,
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar th {
|
||||||
|
background: #0a0a0a;
|
||||||
|
border: 1px solid #222;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar th {
|
||||||
|
background: #0e0e0e;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_today {
|
||||||
|
color: #cc5500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_highlighted_default {
|
||||||
|
background: #ffe9d2;
|
||||||
|
box-shadow: #ffb871 0 1px 4px 0 inset;
|
||||||
|
color:#000;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_highlighted_mint {
|
||||||
|
background: #c1ffc9;
|
||||||
|
box-shadow: #00dd1c 0 1px 4px 0 inset;
|
||||||
|
color:#000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_default,
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_current,
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box >div >div.xdsoft_current {
|
||||||
|
background: #cc5500;
|
||||||
|
box-shadow: #b03e00 0 1px 3px 0 inset;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td:hover,
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box >div >div:hover {
|
||||||
|
color: #000 !important;
|
||||||
|
background: #007fff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar th {
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_copyright { color: #333 !important }
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_copyright a { color: #111 !important }
|
||||||
|
.xdsoft_datetimepicker.xdsoft_dark .xdsoft_copyright a:hover { color: #555 !important }
|
||||||
|
|
||||||
|
.xdsoft_dark .xdsoft_time_box {
|
||||||
|
border: 1px solid #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.xdsoft_dark .xdsoft_scrollbar >.xdsoft_scroller {
|
||||||
|
background: #333 !important;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .xdsoft_save_selected {
|
||||||
|
display: block;
|
||||||
|
border: 1px solid #dddddd !important;
|
||||||
|
margin-top: 5px;
|
||||||
|
width: 100%;
|
||||||
|
color: #454551;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .blue-gradient-button {
|
||||||
|
font-family: "museo-sans", "Book Antiqua", sans-serif;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 300;
|
||||||
|
color: #82878c;
|
||||||
|
height: 28px;
|
||||||
|
position: relative;
|
||||||
|
padding: 4px 17px 4px 33px;
|
||||||
|
border: 1px solid #d7d8da;
|
||||||
|
background: -moz-linear-gradient(top, #fff 0%, #f4f8fa 73%);
|
||||||
|
/* FF3.6+ */
|
||||||
|
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(73%, #f4f8fa));
|
||||||
|
/* Chrome,Safari4+ */
|
||||||
|
background: -webkit-linear-gradient(top, #fff 0%, #f4f8fa 73%);
|
||||||
|
/* Chrome10+,Safari5.1+ */
|
||||||
|
background: -o-linear-gradient(top, #fff 0%, #f4f8fa 73%);
|
||||||
|
/* Opera 11.10+ */
|
||||||
|
background: -ms-linear-gradient(top, #fff 0%, #f4f8fa 73%);
|
||||||
|
/* IE10+ */
|
||||||
|
background: linear-gradient(to bottom, #fff 0%, #f4f8fa 73%);
|
||||||
|
/* W3C */
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff', endColorstr='#f4f8fa',GradientType=0 );
|
||||||
|
/* IE6-9 */
|
||||||
|
}
|
||||||
|
.xdsoft_datetimepicker .blue-gradient-button:hover, .xdsoft_datetimepicker .blue-gradient-button:focus, .xdsoft_datetimepicker .blue-gradient-button:hover span, .xdsoft_datetimepicker .blue-gradient-button:focus span {
|
||||||
|
color: #454551;
|
||||||
|
background: -moz-linear-gradient(top, #f4f8fa 0%, #FFF 73%);
|
||||||
|
/* FF3.6+ */
|
||||||
|
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f4f8fa), color-stop(73%, #FFF));
|
||||||
|
/* Chrome,Safari4+ */
|
||||||
|
background: -webkit-linear-gradient(top, #f4f8fa 0%, #FFF 73%);
|
||||||
|
/* Chrome10+,Safari5.1+ */
|
||||||
|
background: -o-linear-gradient(top, #f4f8fa 0%, #FFF 73%);
|
||||||
|
/* Opera 11.10+ */
|
||||||
|
background: -ms-linear-gradient(top, #f4f8fa 0%, #FFF 73%);
|
||||||
|
/* IE10+ */
|
||||||
|
background: linear-gradient(to bottom, #f4f8fa 0%, #FFF 73%);
|
||||||
|
/* W3C */
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f8fa', endColorstr='#FFF',GradientType=0 );
|
||||||
|
/* IE6-9 */
|
||||||
|
}
|
@ -761,7 +761,7 @@ function main7_data() {
|
|||||||
formatter: function (params, ticket, callback) {
|
formatter: function (params, ticket, callback) {
|
||||||
var res = "";
|
var res = "";
|
||||||
var name = params.name;
|
var name = params.name;
|
||||||
var value = params.value[params.seriesIndex + 1];
|
var value = typeof(params.value[params.seriesIndex + 1]) == "undefined" ? 0 : params.value[params.seriesIndex + 1];
|
||||||
res =
|
res =
|
||||||
"<span style='color:#fff;'>" +
|
"<span style='color:#fff;'>" +
|
||||||
name +
|
name +
|
||||||
@ -886,4 +886,4 @@ function formatDate(d) {
|
|||||||
return datex
|
return datex
|
||||||
}
|
}
|
||||||
|
|
||||||
setInterval(getTime, 1000);
|
setInterval(getTime, 1000);
|
||||||
|
19
static/images/copy1.svg
Normal file
19
static/images/copy1.svg
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<defs>
|
||||||
|
<polygon id="path-1" points="0.0002 0.0002 14 0.0002 14 14 0.0002 14"></polygon>
|
||||||
|
</defs>
|
||||||
|
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="分组-copy-6">
|
||||||
|
<g id="分组">
|
||||||
|
<mask id="mask-2" fill="white">
|
||||||
|
<use xlink:href="#path-1"></use>
|
||||||
|
</mask>
|
||||||
|
<g id="Clip-2"></g>
|
||||||
|
<path d="M7.0002,0.0002 C3.1342,0.0002 0.0002,3.1342 0.0002,7.0002 C0.0002,10.8662 3.1342,14.0002 7.0002,14.0002 C10.8662,14.0002 14.0002,10.8662 14.0002,7.0002 C14.0002,3.1342 10.8662,0.0002 7.0002,0.0002 M7.0002,1.0002 C10.3082,1.0002 13.0002,3.6912 13.0002,7.0002 C13.0002,10.3082 10.3082,13.0002 7.0002,13.0002 C3.6912,13.0002 1.0002,10.3082 1.0002,7.0002 C1.0002,3.6912 3.6912,1.0002 7.0002,1.0002" id="Fill-1" fill="#888890" mask="url(#mask-2)"></path>
|
||||||
|
</g>
|
||||||
|
<path d="M6.947,10.5403 C6.608,10.5403 6.33,10.2623 6.33,9.9223 C6.33,9.5833 6.608,9.3053 6.947,9.3053 C7.287,9.3053 7.565,9.5833 7.565,9.9223 C7.565,10.2623 7.287,10.5403 6.947,10.5403" id="Fill-3" fill="#888890"></path>
|
||||||
|
<path d="M8.7097,4.0046 C8.2977,3.6346 7.7517,3.4596 7.0837,3.4596 C6.3217,3.4596 5.7247,3.6756 5.2827,4.1076 C4.9857,4.3906 4.7917,4.7436 4.6917,5.1666 C4.6907,5.1716 4.6917,5.1736 4.6917,5.1776 C4.6807,5.2226 4.6727,5.2676 4.6727,5.3156 C4.6727,5.6356 4.9357,5.8986 5.2557,5.8986 C5.5397,5.8986 5.7767,5.6926 5.8277,5.4236 C5.8677,5.2106 5.9387,5.0316 6.0437,4.8896 C6.2397,4.6016 6.5587,4.4676 7.0117,4.4676 C7.3607,4.4676 7.6387,4.5606 7.8347,4.7566 C8.0197,4.9516 8.1227,5.2196 8.1227,5.5586 C8.1227,5.8166 8.0297,6.0636 7.8447,6.2896 L7.7217,6.4336 C7.0527,7.0306 6.6507,7.4626 6.5177,7.7406 C6.4547,7.8626 6.4067,7.9966 6.3737,8.1406 C6.3717,8.1476 6.3737,8.1536 6.3727,8.1606 C6.3617,8.2056 6.3547,8.2526 6.3547,8.3006 C6.3547,8.6266 6.6217,8.8936 6.9467,8.8936 C7.2287,8.8936 7.4647,8.6936 7.5247,8.4296 C7.5257,8.4276 7.5277,8.4266 7.5277,8.4246 C7.5537,8.3046 7.5937,8.1916 7.6487,8.0806 C7.7417,7.8956 7.8757,7.7206 8.0617,7.5666 C8.5547,7.1336 8.8537,6.8556 8.9457,6.7526 C9.1927,6.4236 9.3267,6.0016 9.3267,5.4866 C9.3267,4.8586 9.1207,4.3646 8.7097,4.0046" id="Fill-5" fill="#888890"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
12
static/images/copy12.svg
Normal file
12
static/images/copy12.svg
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<!-- Generator: Sketch 52.6 (67491) - http://www.bohemiancoding.com/sketch -->
|
||||||
|
<title>编组备份 copy 12</title>
|
||||||
|
<desc>Created with Sketch.</desc>
|
||||||
|
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="编组备份-copy-12">
|
||||||
|
<circle id="椭圆形" fill="#62B929" cx="10" cy="10" r="10"></circle>
|
||||||
|
<polyline id="路径" stroke="#FFFFFF" stroke-width="2" points="4.75347188 9.55842607 8.58952288 13.3655953 15.2585633 6.66666667"></polyline>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 732 B |
18
static/images/copy6.svg
Normal file
18
static/images/copy6.svg
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<!-- Generator: Sketch 52.6 (67491) - http://www.bohemiancoding.com/sketch -->
|
||||||
|
<title>分组 copy 6</title>
|
||||||
|
<desc>Created with Sketch.</desc>
|
||||||
|
<defs>
|
||||||
|
<polygon id="path-1" points="0 0 14 0 14 13.9997812 0 13.9997812"></polygon>
|
||||||
|
</defs>
|
||||||
|
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="分组-copy-6">
|
||||||
|
<mask id="mask-2" fill="white">
|
||||||
|
<use xlink:href="#path-1"></use>
|
||||||
|
</mask>
|
||||||
|
<g id="Clip-2"></g>
|
||||||
|
<path d="M1.75,6.5625 C1.75,3.908625 3.908625,1.75 6.5625,1.75 C9.216375,1.75 11.375,3.908625 11.375,6.5625 C11.375,9.216375 9.216375,11.375 6.5625,11.375 C3.908625,11.375 1.75,9.216375 1.75,6.5625 M13.7445,12.50725 L11.769625,10.532375 C12.61575,9.42725 13.125,8.0535 13.125,6.5625 C13.125,2.953125 10.171875,0 6.5625,0 C2.953125,0 0,2.953125 0,6.5625 C0,10.171875 2.953125,13.125 6.5625,13.125 C8.0535,13.125 9.42725,12.61575 10.532375,11.769625 L12.50725,13.7445 C12.847625,14.084875 13.404125,14.084875 13.7445,13.7445 C14.08575,13.404125 14.08575,12.847625 13.7445,12.50725" id="Fill-1" fill="#585964" mask="url(#mask-2)"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
18
static/images/copy7.svg
Normal file
18
static/images/copy7.svg
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<!-- Generator: Sketch 52.6 (67491) - http://www.bohemiancoding.com/sketch -->
|
||||||
|
<title>Fill 1</title>
|
||||||
|
<desc>Created with Sketch.</desc>
|
||||||
|
<defs>
|
||||||
|
<polygon id="path-1" points="0 0 14 0 14 13.9997812 0 13.9997812"></polygon>
|
||||||
|
</defs>
|
||||||
|
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="分组-copy-10">
|
||||||
|
<mask id="mask-2" fill="white">
|
||||||
|
<use xlink:href="#path-1"></use>
|
||||||
|
</mask>
|
||||||
|
<g id="Clip-2"></g>
|
||||||
|
<path d="M1.75,6.5625 C1.75,3.908625 3.908625,1.75 6.5625,1.75 C9.216375,1.75 11.375,3.908625 11.375,6.5625 C11.375,9.216375 9.216375,11.375 6.5625,11.375 C3.908625,11.375 1.75,9.216375 1.75,6.5625 M13.7445,12.50725 L11.769625,10.532375 C12.61575,9.42725 13.125,8.0535 13.125,6.5625 C13.125,2.953125 10.171875,0 6.5625,0 C2.953125,0 0,2.953125 0,6.5625 C0,10.171875 2.953125,13.125 6.5625,13.125 C8.0535,13.125 9.42725,12.61575 10.532375,11.769625 L12.50725,13.7445 C12.847625,14.084875 13.404125,14.084875 13.7445,13.7445 C14.08575,13.404125 14.08575,12.847625 13.7445,12.50725" id="Fill-1" fill="#FFFFFF" mask="url(#mask-2)"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
1
static/js/jquery.datetimepicker.full.min.js
vendored
Normal file
1
static/js/jquery.datetimepicker.full.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
static/js/jquery.min.map
Normal file
1
static/js/jquery.min.map
Normal file
File diff suppressed because one or more lines are too long
15
utils/geo/geo.go
Normal file
15
utils/geo/geo.go
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
package geo
|
||||||
|
|
||||||
|
func Format(country, region, city, space string) string {
|
||||||
|
var geo string
|
||||||
|
if country != "" {
|
||||||
|
geo = country
|
||||||
|
}
|
||||||
|
if region != "" && region != country {
|
||||||
|
geo += space + region
|
||||||
|
}
|
||||||
|
if city != "" && city != country && city != region {
|
||||||
|
geo += space + city
|
||||||
|
}
|
||||||
|
return geo
|
||||||
|
}
|
@ -1,35 +1,25 @@
|
|||||||
package send
|
package send
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gopkg.in/gomail.v2"
|
|
||||||
"strconv"
|
|
||||||
"HFish/utils/log"
|
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
|
"strconv"
|
||||||
|
"gopkg.in/gomail.v2"
|
||||||
|
"HFish/utils/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
func SendMail(mailTo []string, subject string, body string, config []string) error {
|
func SendMail(mailTo []string, subject string, body string, config []string) error {
|
||||||
port, _ := strconv.Atoi(config[1])
|
port, _ := strconv.Atoi(config[2])
|
||||||
m := gomail.NewMessage()
|
m := gomail.NewMessage()
|
||||||
|
|
||||||
m.SetHeader("From", "<"+config[2]+">")
|
m.SetHeader("From", "<"+config[3]+">")
|
||||||
m.SetHeader("To", mailTo...) //发送给多个用户
|
m.SetHeader("To", mailTo...) //发送给多个用户
|
||||||
m.SetHeader("Subject", subject) //设置邮件主题
|
m.SetHeader("Subject", subject) //设置邮件主题
|
||||||
m.SetBody("text/html", body) //设置邮件正文
|
m.SetBody("text/html", body) //设置邮件正文
|
||||||
|
|
||||||
//d := &gomail.Dialer{
|
d := gomail.NewDialer(config[0], port, config[3], config[4])
|
||||||
// Host: config[0],
|
|
||||||
// Port: port,
|
|
||||||
// Username: config[2],
|
|
||||||
// Password: config[3],
|
|
||||||
// SSL: false,
|
|
||||||
//}
|
|
||||||
|
|
||||||
d := gomail.NewDialer(config[0], port, config[2], config[3])
|
|
||||||
|
|
||||||
d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
|
d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
|
||||||
|
|
||||||
err := d.DialAndSend(m)
|
err := d.DialAndSend(m)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Pr("HFish", "127.0.0.1", "发送邮件通知失败", err)
|
log.Pr("HFish", "127.0.0.1", "发送邮件通知失败", err)
|
||||||
} else {
|
} else {
|
||||||
@ -38,3 +28,21 @@ func SendMail(mailTo []string, subject string, body string, config []string) err
|
|||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMail(addr, protocol, port, account, password string, receivers []string) error {
|
||||||
|
intPort, err := strconv.Atoi(port)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
m := gomail.NewMessage()
|
||||||
|
m.SetHeader("From", "<"+account+">")
|
||||||
|
m.SetHeader("To", receivers...) //发送给多个用户
|
||||||
|
m.SetHeader("Subject", "HFish测试邮件") //设置邮件主题
|
||||||
|
m.SetBody("text/html", "Hello, 这是HFish蜜罐测试邮件!") //设置邮件正文
|
||||||
|
|
||||||
|
d := gomail.NewDialer(addr, intPort, account, password)
|
||||||
|
d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
|
||||||
|
|
||||||
|
return d.DialAndSend(m)
|
||||||
|
}
|
34
utils/send/gosyslog.go
Normal file
34
utils/send/gosyslog.go
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package send
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/hashicorp/go-syslog"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func SendSyslog(protocol, addr, port, text string) error {
|
||||||
|
network := strings.ToLower(protocol)
|
||||||
|
remote := addr + ":" + port
|
||||||
|
sysLog, err := gsyslog.DialLogger(network, remote, gsyslog.LOG_ERR, "USER","HFish")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = sysLog.WriteLevel(gsyslog.LOG_WARNING, []byte(text))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSyslog(protocol, addr, port string) error {
|
||||||
|
network := strings.ToLower(protocol)
|
||||||
|
remote := addr + ":" + port
|
||||||
|
sysLog, err := gsyslog.DialLogger(network, remote, gsyslog.LOG_ERR, "USER", "HFish")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = sysLog.WriteLevel(gsyslog.LOG_WARNING, []byte("test syslog"))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
@ -155,6 +155,8 @@ func initCahe() {
|
|||||||
resultHook, _ := dbUtil.DB().Table("hfish_setting").Fields("status", "info").Where("type", "=", "webHook").First()
|
resultHook, _ := dbUtil.DB().Table("hfish_setting").Fields("status", "info").Where("type", "=", "webHook").First()
|
||||||
resultIp, _ := dbUtil.DB().Table("hfish_setting").Fields("status", "info").Where("type", "=", "whiteIp").First()
|
resultIp, _ := dbUtil.DB().Table("hfish_setting").Fields("status", "info").Where("type", "=", "whiteIp").First()
|
||||||
resultPasswd, _ := dbUtil.DB().Table("hfish_setting").Fields("status", "info").Where("type", "=", "passwdTM").First()
|
resultPasswd, _ := dbUtil.DB().Table("hfish_setting").Fields("status", "info").Where("type", "=", "passwdTM").First()
|
||||||
|
resultApikey, _ := dbUtil.DB().Table("hfish_setting").Fields("status", "info").Where("type", "=", "apikey").First()
|
||||||
|
resultSyslog, _ := dbUtil.DB().Table("hfish_setting").Fields("status", "info").Where("type", "=", "syslog").First()
|
||||||
|
|
||||||
cache.Setx("MailConfigStatus", strconv.FormatInt(resultMail["status"].(int64), 10))
|
cache.Setx("MailConfigStatus", strconv.FormatInt(resultMail["status"].(int64), 10))
|
||||||
cache.Setx("MailConfigInfo", resultMail["info"])
|
cache.Setx("MailConfigInfo", resultMail["info"])
|
||||||
@ -167,6 +169,12 @@ func initCahe() {
|
|||||||
|
|
||||||
cache.Setx("PasswdConfigStatus", strconv.FormatInt(resultPasswd["status"].(int64), 10))
|
cache.Setx("PasswdConfigStatus", strconv.FormatInt(resultPasswd["status"].(int64), 10))
|
||||||
cache.Setx("PasswdConfigInfo", resultPasswd["info"])
|
cache.Setx("PasswdConfigInfo", resultPasswd["info"])
|
||||||
|
|
||||||
|
cache.Setx("ApikeyStatus", strconv.FormatInt(resultApikey["status"].(int64), 10))
|
||||||
|
cache.Setx("ApikeyInfo", resultApikey["info"])
|
||||||
|
|
||||||
|
cache.Setx("SyslogConfigStatus", strconv.FormatInt(resultSyslog["status"].(int64), 10))
|
||||||
|
cache.Setx("SyslogConfigInfo", resultSyslog["info"])
|
||||||
}
|
}
|
||||||
|
|
||||||
func Run() {
|
func Run() {
|
||||||
@ -406,10 +414,6 @@ func Run() {
|
|||||||
serverAdmin.ListenAndServe()
|
serverAdmin.ListenAndServe()
|
||||||
}
|
}
|
||||||
|
|
||||||
func Init() {
|
|
||||||
fmt.Println("test")
|
|
||||||
}
|
|
||||||
|
|
||||||
func Help() {
|
func Help() {
|
||||||
exec.Execute("clear")
|
exec.Execute("clear")
|
||||||
logo := ` o
|
logo := ` o
|
||||||
@ -422,7 +426,7 @@ func Help() {
|
|||||||
{K || __ _______ __
|
{K || __ _______ __
|
||||||
| PP / // / __(_)__ / /
|
| PP / // / __(_)__ / /
|
||||||
| || / _ / _// (_-</ _ \
|
| || / _ / _// (_-</ _ \
|
||||||
(__\\ /_//_/_/ /_/___/_//_/ v0.6.1
|
(__\\ /_//_/_/ /_/___/_//_/ v0.6.4
|
||||||
`
|
`
|
||||||
fmt.Println(color.Yellow(logo))
|
fmt.Println(color.Yellow(logo))
|
||||||
fmt.Println(color.White(" A Safe and Active Attack Honeypot Fishing Framework System for Enterprises."))
|
fmt.Println(color.White(" A Safe and Active Attack Honeypot Fishing Framework System for Enterprises."))
|
||||||
|
@ -1,16 +1,15 @@
|
|||||||
package api
|
package api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net/http"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"HFish/core/report"
|
"HFish/core/report"
|
||||||
"net/http"
|
|
||||||
"HFish/error"
|
|
||||||
"HFish/utils/conf"
|
|
||||||
"HFish/core/dbUtil"
|
"HFish/core/dbUtil"
|
||||||
"HFish/core/rpc/client"
|
"HFish/core/rpc/client"
|
||||||
|
"HFish/error"
|
||||||
|
"HFish/utils/conf"
|
||||||
"HFish/utils/is"
|
"HFish/utils/is"
|
||||||
"HFish/utils/log"
|
"HFish/utils/log"
|
||||||
"fmt"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// 上报WEB蜜罐
|
// 上报WEB蜜罐
|
||||||
@ -27,11 +26,7 @@ func ReportWeb(c *gin.Context) {
|
|||||||
apiSecKey := conf.Get("api", "report_key")
|
apiSecKey := conf.Get("api", "report_key")
|
||||||
|
|
||||||
if secKey != apiSecKey {
|
if secKey != apiSecKey {
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrFailApiKey)
|
||||||
"code": error.ErrFailApiKeyCode,
|
|
||||||
"msg": error.ErrFailApiKeyMsg,
|
|
||||||
})
|
|
||||||
|
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
@ -42,10 +37,7 @@ func ReportWeb(c *gin.Context) {
|
|||||||
go report.ReportWeb(name, "本机", ip, info)
|
go report.ReportWeb(name, "本机", ip, info)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccess)
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,11 +55,7 @@ func ReportDeepWeb(c *gin.Context) {
|
|||||||
apiSecKey := conf.Get("api", "report_key")
|
apiSecKey := conf.Get("api", "report_key")
|
||||||
|
|
||||||
if secKey != apiSecKey {
|
if secKey != apiSecKey {
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrFailApiKey)
|
||||||
"code": error.ErrFailApiKeyCode,
|
|
||||||
"msg": error.ErrFailApiKeyMsg,
|
|
||||||
})
|
|
||||||
|
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
@ -78,10 +66,7 @@ func ReportDeepWeb(c *gin.Context) {
|
|||||||
go report.ReportDeepWeb(name, "本机", ip, info)
|
go report.ReportDeepWeb(name, "本机", ip, info)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccess)
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,12 +83,11 @@ func ReportPlugWeb(c *gin.Context) {
|
|||||||
err := c.BindJSON(&info)
|
err := c.BindJSON(&info)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
|
||||||
log.Pr("HFish", "127.0.0.1", "插件上报信息错误", err)
|
log.Pr("HFish", "127.0.0.1", "插件上报信息错误", err)
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, gin.H{
|
||||||
"code": error.ErrFailPlugCode,
|
"code": error.ErrFailPlug["code"],
|
||||||
"msg": error.ErrFailPlugMsg,
|
"msg": error.ErrFailPlug["msg"],
|
||||||
"data": err,
|
"data": err,
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
@ -126,11 +110,7 @@ func ReportPlugWeb(c *gin.Context) {
|
|||||||
apiSecKey := conf.Get("api", "report_key")
|
apiSecKey := conf.Get("api", "report_key")
|
||||||
|
|
||||||
if info.SecKey != apiSecKey {
|
if info.SecKey != apiSecKey {
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrFailApiKey)
|
||||||
"code": error.ErrFailApiKeyCode,
|
|
||||||
"msg": error.ErrFailApiKeyMsg,
|
|
||||||
})
|
|
||||||
|
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
@ -141,10 +121,7 @@ func ReportPlugWeb(c *gin.Context) {
|
|||||||
go report.ReportPlugWeb(info.Name, "本机", info.Ip, data)
|
go report.ReportPlugWeb(info.Name, "本机", info.Ip, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccess)
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -155,11 +132,7 @@ func GetIpList(c *gin.Context) {
|
|||||||
apiSecKey := conf.Get("api", "query_key")
|
apiSecKey := conf.Get("api", "query_key")
|
||||||
|
|
||||||
if key != apiSecKey {
|
if key != apiSecKey {
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrFailApiKey)
|
||||||
"code": error.ErrFailApiKeyCode,
|
|
||||||
"msg": error.ErrFailApiKeyMsg,
|
|
||||||
})
|
|
||||||
|
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
result, err := dbUtil.DB().Table("hfish_info").Fields("ip").GroupBy("ip").Get()
|
result, err := dbUtil.DB().Table("hfish_info").Fields("ip").GroupBy("ip").Get()
|
||||||
@ -168,11 +141,7 @@ func GetIpList(c *gin.Context) {
|
|||||||
log.Pr("API", "127.0.0.1", "查询黑名单IP列表失败", err)
|
log.Pr("API", "127.0.0.1", "查询黑名单IP列表失败", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(result))
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
"data": result,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -183,11 +152,7 @@ func GetFishInfo(c *gin.Context) {
|
|||||||
apiSecKey := conf.Get("api", "query_key")
|
apiSecKey := conf.Get("api", "query_key")
|
||||||
|
|
||||||
if key != apiSecKey {
|
if key != apiSecKey {
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrFailApiKey)
|
||||||
"code": error.ErrFailApiKeyCode,
|
|
||||||
"msg": error.ErrFailApiKeyMsg,
|
|
||||||
})
|
|
||||||
|
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
result, err := dbUtil.DB().Table("hfish_info").OrderBy("id desc").Get()
|
result, err := dbUtil.DB().Table("hfish_info").OrderBy("id desc").Get()
|
||||||
@ -196,11 +161,7 @@ func GetFishInfo(c *gin.Context) {
|
|||||||
log.Pr("API", "127.0.0.1", "获取钓鱼列表失败", err)
|
log.Pr("API", "127.0.0.1", "获取钓鱼列表失败", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(result))
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
"data": result,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,11 +172,7 @@ func GetAccountPasswdInfo(c *gin.Context) {
|
|||||||
apiSecKey := conf.Get("api", "query_key")
|
apiSecKey := conf.Get("api", "query_key")
|
||||||
|
|
||||||
if key != apiSecKey {
|
if key != apiSecKey {
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrFailApiKey)
|
||||||
"code": error.ErrFailApiKeyCode,
|
|
||||||
"msg": error.ErrFailApiKeyMsg,
|
|
||||||
})
|
|
||||||
|
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
result, err := dbUtil.DB().Table("hfish_passwd").OrderBy("id desc").Get()
|
result, err := dbUtil.DB().Table("hfish_passwd").OrderBy("id desc").Get()
|
||||||
@ -224,10 +181,6 @@ func GetAccountPasswdInfo(c *gin.Context) {
|
|||||||
log.Pr("API", "127.0.0.1", "获取账号密码列表失败", err)
|
log.Pr("API", "127.0.0.1", "获取账号密码列表失败", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(result))
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
"data": result,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package colony
|
package colony
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
"HFish/core/dbUtil"
|
"HFish/core/dbUtil"
|
||||||
"HFish/error"
|
"HFish/error"
|
||||||
"HFish/utils/log"
|
"HFish/utils/log"
|
||||||
@ -20,11 +20,7 @@ func GetColony(c *gin.Context) {
|
|||||||
log.Pr("HFish", "127.0.0.1", "获取蜜罐集群列表失败", err)
|
log.Pr("HFish", "127.0.0.1", "获取蜜罐集群列表失败", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(result))
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
"data": result,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除集群
|
// 删除集群
|
||||||
@ -37,8 +33,5 @@ func PostColonyDel(c *gin.Context) {
|
|||||||
log.Pr("HFish", "127.0.0.1", "删除集群失败", err)
|
log.Pr("HFish", "127.0.0.1", "删除集群失败", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccess)
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
package dashboard
|
package dashboard
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"HFish/core/dbUtil"
|
|
||||||
"HFish/utils/conf"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"HFish/core/dbUtil"
|
||||||
"HFish/error"
|
"HFish/error"
|
||||||
|
"HFish/utils/conf"
|
||||||
"HFish/utils/log"
|
"HFish/utils/log"
|
||||||
"HFish/utils/cache"
|
"HFish/utils/cache"
|
||||||
)
|
)
|
||||||
@ -525,11 +525,7 @@ func GetFishData(c *gin.Context) {
|
|||||||
cache.Set("DashboardZxDq", data)
|
cache.Set("DashboardZxDq", data)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(data))
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
"data": data,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 仪表盘攻击饼图统计
|
// 仪表盘攻击饼图统计
|
||||||
@ -581,9 +577,5 @@ func GetFishPieData(c *gin.Context) {
|
|||||||
cache.Set("DashboardBarDq", data)
|
cache.Set("DashboardBarDq", data)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(data))
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
"data": data,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
package data
|
package data
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
"net/http"
|
|
||||||
"fmt"
|
|
||||||
"HFish/core/dbUtil"
|
"HFish/core/dbUtil"
|
||||||
"strconv"
|
|
||||||
"HFish/utils/log"
|
|
||||||
"HFish/error"
|
"HFish/error"
|
||||||
|
"HFish/utils/log"
|
||||||
"HFish/utils/conf"
|
"HFish/utils/conf"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -40,11 +40,7 @@ func GetChina(c *gin.Context) {
|
|||||||
"regionList": regionList,
|
"regionList": regionList,
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(data))
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
"data": data,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 统计国家攻击地区
|
// 统计国家攻击地区
|
||||||
@ -68,11 +64,7 @@ func GetCountry(c *gin.Context) {
|
|||||||
"regionList": regionList,
|
"regionList": regionList,
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(data))
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
"data": data,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 统计攻击IP地区
|
// 统计攻击IP地区
|
||||||
@ -97,11 +89,7 @@ func GetIp(c *gin.Context) {
|
|||||||
"ipList": ipList,
|
"ipList": ipList,
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(data))
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
"data": data,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 统计攻击类型
|
// 统计攻击类型
|
||||||
@ -126,11 +114,7 @@ func GetType(c *gin.Context) {
|
|||||||
"typeList": typeList,
|
"typeList": typeList,
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(data))
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
"data": data,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取最新数据流
|
// 获取最新数据流
|
||||||
@ -147,11 +131,7 @@ func GetNewInfo(c *gin.Context) {
|
|||||||
"result": result,
|
"result": result,
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(data))
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
"data": data,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取统计账号
|
// 获取统计账号
|
||||||
@ -172,11 +152,7 @@ func GetAccountInfo(c *gin.Context) {
|
|||||||
resultMap = append(resultMap, rMap)
|
resultMap = append(resultMap, rMap)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(resultMap))
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
"data": resultMap,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取统计密码
|
// 获取统计密码
|
||||||
@ -197,11 +173,7 @@ func GetPasswdInfo(c *gin.Context) {
|
|||||||
resultMap = append(resultMap, rMap)
|
resultMap = append(resultMap, rMap)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(resultMap))
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
"data": resultMap,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取全球攻击数量
|
// 获取全球攻击数量
|
||||||
@ -222,11 +194,7 @@ func GetWordInfo(c *gin.Context) {
|
|||||||
resultMap = append(resultMap, rMap)
|
resultMap = append(resultMap, rMap)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(resultMap))
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
"data": resultMap,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 往下是 Web Socket 代码
|
// 往下是 Web Socket 代码
|
||||||
|
@ -1,31 +1,120 @@
|
|||||||
package fish
|
package fish
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gin-gonic/gin"
|
"bytes"
|
||||||
|
"encoding/csv"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"HFish/core/dbUtil"
|
|
||||||
"HFish/error"
|
|
||||||
"HFish/utils/page"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"HFish/core/dbUtil"
|
||||||
|
"HFish/error"
|
||||||
"HFish/utils/log"
|
"HFish/utils/log"
|
||||||
|
"HFish/utils/page"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var header = []string{"编号", "蜜罐类型", "蜜罐名称", "集群名称", "攻击IP", "地理信息", "威胁情报", "详情信息", "详情长度", "攻击时间"}
|
||||||
|
|
||||||
|
var judgmentMap = map[string]string{
|
||||||
|
"C2": "远控",
|
||||||
|
"Botnet": "僵尸网络",
|
||||||
|
"Hijacked": "劫持",
|
||||||
|
"Phishing": "钓鱼",
|
||||||
|
"Malware": "恶意软件",
|
||||||
|
"Exploit": "漏洞利用",
|
||||||
|
"Scanner": "扫描",
|
||||||
|
"Zombie": "傀儡机",
|
||||||
|
"Spam": "垃圾邮件",
|
||||||
|
"Suspicious": "可疑",
|
||||||
|
"Compromised": "失陷主机",
|
||||||
|
"Whitelist": "白名单",
|
||||||
|
"Brute Force": "暴力破解",
|
||||||
|
"Proxy": "代理",
|
||||||
|
"Info": "基础信息",
|
||||||
|
"MiningPool": "矿池",
|
||||||
|
"CoinMiner": "私有矿池",
|
||||||
|
"Sinkhole C2": "安全机构接管C2",
|
||||||
|
"SSH Brute Force": "SSH 暴力破解",
|
||||||
|
"FTP Brute Force": "FTP 暴力破解",
|
||||||
|
"SMTP Brute Force": "SMTP 暴力破解",
|
||||||
|
"Http Brute Force": "HTTP AUTH 暴力破解",
|
||||||
|
"Web Login Brute Force": "撞库",
|
||||||
|
"HTTP Proxy": "HTTP Proxy",
|
||||||
|
"HTTP Proxy In": "HTTP 代理入口",
|
||||||
|
"HTTP Proxy Out": "HTTP 代理出口",
|
||||||
|
"Socks Proxy": "Socks 代理",
|
||||||
|
"Socks Proxy In": "Socks 代理入口",
|
||||||
|
"Socks Proxy Out": "Socks 代理出口",
|
||||||
|
"VPN": "VPN 代理",
|
||||||
|
"VPN In": "VPN 代理入口",
|
||||||
|
"VPN Out": "VPN 代理出口",
|
||||||
|
"Tor": "Tor 代理",
|
||||||
|
"Tor Proxy In": "Tor入口",
|
||||||
|
"Tor Proxy Out": "Tor出口",
|
||||||
|
"Bogon": "保留地址",
|
||||||
|
"FullBogon": "未启用IP",
|
||||||
|
"Gateway": "网关",
|
||||||
|
"IDC": "IDC 服务器",
|
||||||
|
"Dynamic IP": "动态IP",
|
||||||
|
"Edu": "教育",
|
||||||
|
"DDNS": "动态域名",
|
||||||
|
"Mobile": "移动基站",
|
||||||
|
"Search Engine Crawler": "搜索引擎爬虫",
|
||||||
|
"CDN": "CDN 服务器",
|
||||||
|
"Advertisement": "广告",
|
||||||
|
"DNS": "DNS 服务器",
|
||||||
|
"BTtracker": "BT 服务器",
|
||||||
|
"Backbone": "骨干网",
|
||||||
|
}
|
||||||
|
|
||||||
// 蜜罐 页面
|
// 蜜罐 页面
|
||||||
func Html(c *gin.Context) {
|
func Html(c *gin.Context) {
|
||||||
c.HTML(http.StatusOK, "fish.html", gin.H{})
|
c.HTML(http.StatusOK, "fish.html", gin.H{})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取蜜罐列表
|
func isCondition(condition string) bool {
|
||||||
|
if condition == ">" || condition == "<" ||
|
||||||
|
condition == ">=" || condition == "<=" ||
|
||||||
|
condition == "=" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertJudgment(judgmentArray []interface{}) string {
|
||||||
|
var judgments string
|
||||||
|
for _, j := range judgmentArray {
|
||||||
|
js := j.(string)
|
||||||
|
judgment, ok := judgmentMap[js]
|
||||||
|
if !ok {
|
||||||
|
judgment = js
|
||||||
|
}
|
||||||
|
if len(judgments) == 0 {
|
||||||
|
judgments = judgment
|
||||||
|
} else {
|
||||||
|
judgments += " " + judgment
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return judgments
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取上钩列表
|
||||||
func GetFishList(c *gin.Context) {
|
func GetFishList(c *gin.Context) {
|
||||||
p, _ := c.GetQuery("page")
|
pageNo, _ := c.GetQuery("page_no")
|
||||||
pageSize, _ := c.GetQuery("pageSize")
|
pageSize, _ := c.GetQuery("page_size")
|
||||||
typex, _ := c.GetQuery("type")
|
typex, _ := c.GetQuery("type")
|
||||||
colony, _ := c.GetQuery("colony")
|
colony, _ := c.GetQuery("colony")
|
||||||
soText, _ := c.GetQuery("so_text")
|
soText, _ := c.GetQuery("so_text")
|
||||||
|
condition, _ := c.GetQuery("condition")
|
||||||
|
length, _ := c.GetQuery("length")
|
||||||
|
startTime, _ := c.GetQuery("start_time")
|
||||||
|
endTime, _ := c.GetQuery("end_time")
|
||||||
|
|
||||||
// 拼接 SQL
|
// 拼接 SQL
|
||||||
db := dbUtil.DB().Table("hfish_info").Fields("id", "type", "project_name", "agent", "ip", "country", "region", "city", "create_time", "info")
|
db := dbUtil.DB().Table("hfish_info").Fields("id", "type", "project_name", "agent", "ip", "country", "region", "city", "intelligence", "create_time", "info", "info_len")
|
||||||
dbCount := dbUtil.DB().Table("hfish_info")
|
dbCount := dbUtil.DB().Table("hfish_info")
|
||||||
|
|
||||||
if typex != "all" {
|
if typex != "all" {
|
||||||
@ -38,11 +127,29 @@ func GetFishList(c *gin.Context) {
|
|||||||
dbCount.Where("agent", "=", colony)
|
dbCount.Where("agent", "=", colony)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if isCondition(condition) && length != "" {
|
||||||
|
db.Where("info_len", condition, length)
|
||||||
|
dbCount.Where("info_len", condition, length)
|
||||||
|
}
|
||||||
|
|
||||||
|
if startTime != "" && endTime != "" {
|
||||||
|
stInt, err1 := strconv.ParseInt(startTime, 10, 64)
|
||||||
|
etInt, err2 := strconv.ParseInt(endTime, 10, 64)
|
||||||
|
if err1 == nil && err2 == nil {
|
||||||
|
st := time.Unix(stInt, 0).Format("2006-01-02 15:04:05")
|
||||||
|
et := time.Unix(etInt, 0).Format("2006-01-02 15:04:05")
|
||||||
|
db.Where("create_time", ">=", st).Where("create_time", "<=", et)
|
||||||
|
dbCount.Where("create_time", ">=", st).Where("create_time", "<=", et)
|
||||||
|
} else {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "parseInt startTime err", err1)
|
||||||
|
log.Pr("HFish", "127.0.0.1", "parseInt endTime err", err2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if soText != "" {
|
if soText != "" {
|
||||||
db.Where("project_name", "like", "%"+soText+"%").OrWhere("ip", "like", "%"+soText+"%")
|
db.Where("project_name", "like", "%"+soText+"%").OrWhere("ip", "like", "%"+soText+"%")
|
||||||
dbCount.Where("project_name", "like", "%"+soText+"%").OrWhere("ip", "like", "%"+soText+"%")
|
dbCount.Where("project_name", "like", "%"+soText+"%").OrWhere("ip", "like", "%"+soText+"%")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 统计查询数量
|
// 统计查询数量
|
||||||
totalCount, errCount := dbCount.Count()
|
totalCount, errCount := dbCount.Count()
|
||||||
|
|
||||||
@ -51,9 +158,9 @@ func GetFishList(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 查询列表
|
// 查询列表
|
||||||
pInt, _ := strconv.Atoi(p)
|
pageNoInt, _ := strconv.Atoi(pageNo)
|
||||||
pageSizeInt, _ := strconv.Atoi(pageSize)
|
pageSizeInt, _ := strconv.Atoi(pageSize)
|
||||||
pageStart := page.Start(pInt, pageSizeInt)
|
pageStart := page.Start(pageNoInt, pageSizeInt)
|
||||||
|
|
||||||
result, err := db.OrderBy("id desc").Limit(pageSizeInt).Offset(pageStart).Get()
|
result, err := db.OrderBy("id desc").Limit(pageSizeInt).Offset(pageStart).Get()
|
||||||
|
|
||||||
@ -66,18 +173,133 @@ func GetFishList(c *gin.Context) {
|
|||||||
|
|
||||||
pageCount := page.TotalPage(totalCountInt, pageSizeInt)
|
pageCount := page.TotalPage(totalCountInt, pageSizeInt)
|
||||||
|
|
||||||
|
for i, info := range result {
|
||||||
|
intelligence, ok := info["intelligence"].(string)
|
||||||
|
if !ok || len(intelligence) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var intelligenceData json.RawMessage
|
||||||
|
err := json.Unmarshal([]byte(intelligence), &intelligenceData)
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "json unmarshal err", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
result[i]["intelligence"] = intelligenceData
|
||||||
|
}
|
||||||
|
|
||||||
data := map[string]interface{}{
|
data := map[string]interface{}{
|
||||||
"result": result,
|
"result": result,
|
||||||
"pageCount": pageCount,
|
"pageCount": pageCount,
|
||||||
"totalCount": totalCount,
|
"totalCount": totalCount,
|
||||||
"page": p,
|
"page": pageNo,
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(data))
|
||||||
"code": error.ErrSuccessCode,
|
}
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
"data": data,
|
// 批量导出蜜罐数据
|
||||||
})
|
func ExportFishList(c *gin.Context) {
|
||||||
|
typex, _ := c.GetQuery("type")
|
||||||
|
colony, _ := c.GetQuery("colony")
|
||||||
|
soText, _ := c.GetQuery("so_text")
|
||||||
|
condition, _ := c.GetQuery("condition")
|
||||||
|
length, _ := c.GetQuery("length")
|
||||||
|
startTime, _ := c.GetQuery("start_time")
|
||||||
|
endTime, _ := c.GetQuery("end_time")
|
||||||
|
|
||||||
|
// 拼接 SQL
|
||||||
|
db := dbUtil.DB().Table("hfish_info").Fields("id", "type", "project_name", "agent", "ip", "country", "region", "city", "intelligence", "create_time", "info", "info_len")
|
||||||
|
|
||||||
|
if typex != "all" {
|
||||||
|
db.Where("type", "=", typex)
|
||||||
|
}
|
||||||
|
|
||||||
|
if colony != "all" {
|
||||||
|
db.Where("agent", "=", colony)
|
||||||
|
}
|
||||||
|
|
||||||
|
if isCondition(condition) && length != "" {
|
||||||
|
db.Where("info_len", condition, length)
|
||||||
|
}
|
||||||
|
|
||||||
|
if startTime != "" && endTime != "" {
|
||||||
|
stInt, err1 := strconv.ParseInt(startTime, 10, 64)
|
||||||
|
etInt, err2 := strconv.ParseInt(endTime, 10, 64)
|
||||||
|
if err1 == nil && err2 == nil {
|
||||||
|
st := time.Unix(stInt, 0).Format("2006-01-02 15:04:05")
|
||||||
|
et := time.Unix(etInt, 0).Format("2006-01-02 15:04:05")
|
||||||
|
db.Where("create_time", ">=", st).Where("create_time", "<=", et)
|
||||||
|
} else {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "parseInt startTime err", err1)
|
||||||
|
log.Pr("HFish", "127.0.0.1", "parseInt endTime err", err2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if soText != "" {
|
||||||
|
db.Where("project_name", "like", "%"+soText+"%").OrWhere("ip", "like", "%"+soText+"%")
|
||||||
|
}
|
||||||
|
result, err := db.OrderBy("id desc").Get()
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "查询上钩信息列表失败", err)
|
||||||
|
c.JSON(http.StatusOK, error.ErrExportData)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
b := &bytes.Buffer{}
|
||||||
|
wr := csv.NewWriter(b)
|
||||||
|
wr.Write(header)
|
||||||
|
for i, info := range result {
|
||||||
|
id := fmt.Sprintf("%d", i+1)
|
||||||
|
ip := info["ip"].(string)
|
||||||
|
|
||||||
|
var infoLen string
|
||||||
|
iLen, ok := info["info_len"].(int64)
|
||||||
|
if ok {
|
||||||
|
infoLen = fmt.Sprintf("%d", iLen)
|
||||||
|
}
|
||||||
|
|
||||||
|
var intelligenceResult string
|
||||||
|
intelligenceData := make(map[string]map[string]interface{})
|
||||||
|
intelligence, _ := info["intelligence"].(string)
|
||||||
|
if len(intelligence) > 20 { // 没有威胁情报的就不用反序列化了
|
||||||
|
if err := json.Unmarshal([]byte(intelligence), &intelligenceData); err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "intelligence json unmarshal err", err)
|
||||||
|
intelligenceResult = intelligence
|
||||||
|
} else {
|
||||||
|
judgments, ok := intelligenceData[ip]["judgments"].([]interface{})
|
||||||
|
if ok {
|
||||||
|
intelligenceResult = convertJudgment(judgments)
|
||||||
|
} else {
|
||||||
|
intelligenceResult = intelligence
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
intelligenceResult = intelligence
|
||||||
|
}
|
||||||
|
|
||||||
|
var geo string
|
||||||
|
country, ok := info["country"].(string)
|
||||||
|
if ok && country != "" {
|
||||||
|
geo = country
|
||||||
|
}
|
||||||
|
region, ok := info["region"].(string)
|
||||||
|
if ok && region != "" && region != country {
|
||||||
|
geo += "-" + region
|
||||||
|
}
|
||||||
|
city, ok := info["city"].(string)
|
||||||
|
if ok && city != "" && city != country && city != region {
|
||||||
|
geo += "-" + city
|
||||||
|
}
|
||||||
|
|
||||||
|
data := []string{id, info["type"].(string), info["project_name"].(string),
|
||||||
|
info["agent"].(string), info["ip"].(string), geo, intelligenceResult,
|
||||||
|
info["info"].(string), infoLen, info["create_time"].(string)}
|
||||||
|
wr.Write(data)
|
||||||
|
}
|
||||||
|
wr.Flush()
|
||||||
|
c.Writer.Header().Set("Content-Type", "text/csv")
|
||||||
|
c.Writer.Header().Set("Content-Disposition", "attachment;filename=hfish.csv")
|
||||||
|
c.String(http.StatusOK, b.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除蜜罐
|
// 删除蜜罐
|
||||||
@ -97,10 +319,7 @@ func PostFishDel(c *gin.Context) {
|
|||||||
log.Pr("HFish", "127.0.0.1", "删除蜜罐失败", err)
|
log.Pr("HFish", "127.0.0.1", "删除蜜罐失败", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccess)
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取蜜罐信息
|
// 获取蜜罐信息
|
||||||
@ -113,11 +332,7 @@ func GetFishInfo(c *gin.Context) {
|
|||||||
log.Pr("HFish", "127.0.0.1", "获取蜜罐信息失败", err)
|
log.Pr("HFish", "127.0.0.1", "获取蜜罐信息失败", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(result))
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
"data": result,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取蜜罐分类信息,集群信息
|
// 获取蜜罐分类信息,集群信息
|
||||||
@ -139,9 +354,5 @@ func GetFishTypeInfo(c *gin.Context) {
|
|||||||
"resultColonyName": resultAgent,
|
"resultColonyName": resultAgent,
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(data))
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
"data": data,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
package login
|
package login
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/gin-contrib/sessions"
|
"github.com/gin-contrib/sessions"
|
||||||
"net/http"
|
|
||||||
"HFish/error"
|
"HFish/error"
|
||||||
"HFish/utils/conf"
|
"HFish/utils/conf"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func Html(c *gin.Context) {
|
func Html(c *gin.Context) {
|
||||||
@ -41,19 +41,12 @@ func Login(c *gin.Context) {
|
|||||||
session.Set("time", time.Now().Format("2006-01-02 15:04:05"))
|
session.Set("time", time.Now().Format("2006-01-02 15:04:05"))
|
||||||
session.Save()
|
session.Save()
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccess)
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
})
|
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrFailLogin)
|
||||||
"code": error.ErrFailLoginCode,
|
|
||||||
"msg": error.ErrFailLoginMsg,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func Logout(c *gin.Context) {
|
func Logout(c *gin.Context) {
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
package mail
|
package mail
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
|
||||||
"HFish/core/dbUtil"
|
|
||||||
"HFish/utils/send"
|
|
||||||
"HFish/error"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"HFish/core/dbUtil"
|
||||||
|
"HFish/error"
|
||||||
"HFish/utils/log"
|
"HFish/utils/log"
|
||||||
|
"HFish/utils/send"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Html(c *gin.Context) {
|
func Html(c *gin.Context) {
|
||||||
@ -36,14 +36,8 @@ func SendEmailToUsers(c *gin.Context) {
|
|||||||
if status == "1" {
|
if status == "1" {
|
||||||
send.SendMail(eArr, title, content, config)
|
send.SendMail(eArr, title, content, config)
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrSuccess)
|
||||||
"code": error.ErrSuccessCode,
|
|
||||||
"msg": error.ErrSuccessMsg,
|
|
||||||
})
|
|
||||||
} else {
|
} else {
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, error.ErrFailMail)
|
||||||
"code": error.ErrFailMailCode,
|
|
||||||
"msg": error.ErrFailMailMsg,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
222
view/setting/alert/view.go
Normal file
222
view/setting/alert/view.go
Normal file
@ -0,0 +1,222 @@
|
|||||||
|
package alert
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"HFish/core/dbUtil"
|
||||||
|
"HFish/error"
|
||||||
|
"HFish/utils/cache"
|
||||||
|
"HFish/utils/log"
|
||||||
|
"HFish/utils/send"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 渲染告警通知页面
|
||||||
|
func Html(c *gin.Context) {
|
||||||
|
// 获取配置列表
|
||||||
|
result, err := dbUtil.DB().Table("hfish_setting").
|
||||||
|
Fields("type", "info", "status").
|
||||||
|
Where("type", "alertMail").
|
||||||
|
OrWhere("type", "webHook").
|
||||||
|
OrWhere("type", "syslog").
|
||||||
|
Get()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "获取告警通知配置信息失败", err)
|
||||||
|
c.HTML(http.StatusOK, "setting.html", gin.H{
|
||||||
|
"syslog_status": 0,
|
||||||
|
"syslog_info": "",
|
||||||
|
"email_status": 0,
|
||||||
|
"email_info": "",
|
||||||
|
"webhook_status": 0,
|
||||||
|
"webhook_info": "",
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dataMap := make(map[string]map[string]interface{})
|
||||||
|
for _, config := range result {
|
||||||
|
cType, ok := config["type"].(string)
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
dataMap[cType] = make(map[string]interface{})
|
||||||
|
dataMap[cType]["status"] = config["status"]
|
||||||
|
dataMap[cType]["info"] = config["info"]
|
||||||
|
}
|
||||||
|
|
||||||
|
c.HTML(http.StatusOK, "setting.html", gin.H{
|
||||||
|
"syslog_status": dataMap["syslog"]["status"],
|
||||||
|
"syslog_info": dataMap["syslog"]["info"],
|
||||||
|
"email_status": dataMap["alertMail"]["status"],
|
||||||
|
"email_info": dataMap["alertMail"]["info"],
|
||||||
|
"webhook_status": dataMap["webHook"]["status"],
|
||||||
|
"webhook_info": dataMap["webHook"]["info"],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取告警通知配置信息
|
||||||
|
func GetAlertData(c *gin.Context) {
|
||||||
|
// 获取配置列表
|
||||||
|
result, err := dbUtil.DB().Table("hfish_setting").
|
||||||
|
Fields("type", "info", "status").
|
||||||
|
Where("type", "alertMail").
|
||||||
|
OrWhere("type", "webHook").
|
||||||
|
OrWhere("type", "syslog").
|
||||||
|
Get()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "获取告警通知配置信息失败", err)
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"syslog_status": 0,
|
||||||
|
"syslog_info": "",
|
||||||
|
"email_status": 0,
|
||||||
|
"email_info": "",
|
||||||
|
"webhook_status": 0,
|
||||||
|
"webhook_info": "",
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dataMap := make(map[string]map[string]interface{})
|
||||||
|
for _, config := range result {
|
||||||
|
cType, ok := config["type"].(string)
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
dataMap[cType] = make(map[string]interface{})
|
||||||
|
dataMap[cType]["status"] = config["status"]
|
||||||
|
dataMap[cType]["info"] = config["info"]
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(gin.H{
|
||||||
|
"syslog_status": dataMap["syslog"]["status"],
|
||||||
|
"syslog_info": dataMap["syslog"]["info"],
|
||||||
|
"email_status": dataMap["alertMail"]["status"],
|
||||||
|
"email_info": dataMap["alertMail"]["info"],
|
||||||
|
"webhook_status": dataMap["webHook"]["status"],
|
||||||
|
"webhook_info": dataMap["webHook"]["info"],
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新告警通知配置信息
|
||||||
|
func UpdateAlertData(c *gin.Context) {
|
||||||
|
syslogStatus := c.PostForm("syslog_status")
|
||||||
|
syslogInfo := c.PostForm("syslog_info")
|
||||||
|
emailStatus := c.PostForm("email_status")
|
||||||
|
emailInfo := c.PostForm("email_info")
|
||||||
|
webhookStatus := c.PostForm("webhook_status")
|
||||||
|
webhookInfo := c.PostForm("webhook_info")
|
||||||
|
|
||||||
|
syslogInfos := strings.Split(syslogInfo, "&&")
|
||||||
|
if (syslogStatus != "0" && syslogStatus != "1") || (syslogStatus == "1" && len(syslogInfos) == 0) || (syslogStatus == "1" && len(syslogInfos) > 3) {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "请求数据非法", syslogInfo)
|
||||||
|
c.JSON(http.StatusOK, error.ErrInputData)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
emailInfos := strings.Split(emailInfo, "&&")
|
||||||
|
if (emailStatus != "0" && emailStatus != "1") || (emailStatus == "1" && len(emailInfos) < 6) {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "请求数据非法", emailInfo)
|
||||||
|
c.JSON(http.StatusOK, error.ErrInputData)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (webhookStatus != "0" && webhookStatus != "1") || (webhookStatus == "1" && len(webhookStatus) == 0) {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "请求数据非法", webhookInfo)
|
||||||
|
c.JSON(http.StatusOK, error.ErrInputData)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
nowTime := time.Now().Format("2006-01-02 15:04")
|
||||||
|
// 更新syslog通知
|
||||||
|
_, err := dbUtil.DB().
|
||||||
|
Table("hfish_setting").
|
||||||
|
Data(map[string]interface{}{"status": syslogStatus, "info": syslogInfo, "update_time": nowTime}).
|
||||||
|
Where("type", "syslog").
|
||||||
|
Update()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "更新syslog告警通知配置信息失败", err)
|
||||||
|
c.JSON(http.StatusOK, error.ErrUpdateData)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新email通知
|
||||||
|
_, err = dbUtil.DB().
|
||||||
|
Table("hfish_setting").
|
||||||
|
Data(map[string]interface{}{"status": emailStatus, "info": emailInfo, "update_time": nowTime}).
|
||||||
|
Where("type", "alertMail").
|
||||||
|
Update()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "更新邮件告警通知配置信息失败", err)
|
||||||
|
c.JSON(http.StatusOK, error.ErrUpdateData)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新webhook通知
|
||||||
|
_, err = dbUtil.DB().
|
||||||
|
Table("hfish_setting").
|
||||||
|
Data(map[string]interface{}{"status": webhookStatus, "info": webhookInfo, "update_time": nowTime}).
|
||||||
|
Where("type", "webHook").
|
||||||
|
Update()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "更新webhook告警通知配置信息失败", err)
|
||||||
|
c.JSON(http.StatusOK, error.ErrUpdateData)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新syslog告警缓存
|
||||||
|
cache.Setx("SyslogConfigStatus", syslogStatus)
|
||||||
|
cache.Setx("SyslogConfigInfo", syslogInfo)
|
||||||
|
|
||||||
|
// 更新邮件告警缓存
|
||||||
|
cache.Setx("MailConfigStatus", emailStatus)
|
||||||
|
cache.Setx("MailConfigInfo", emailInfo)
|
||||||
|
|
||||||
|
// 更新webhook告警缓存
|
||||||
|
cache.Setx("HookConfigStatus", webhookStatus)
|
||||||
|
cache.Setx("HookConfigInfo", webhookInfo)
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, error.ErrSuccess)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 测试syslog服务器地址是否正常连通
|
||||||
|
func TestSyslog(c *gin.Context) {
|
||||||
|
addr := c.PostForm("addr")
|
||||||
|
protocol := c.PostForm("protocol")
|
||||||
|
port := c.PostForm("port")
|
||||||
|
|
||||||
|
err := send.TestSyslog(protocol, addr, port)
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "测试syslog发送失败, 错误信息:", err)
|
||||||
|
c.JSON(http.StatusOK, error.ErrTestSyslog)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, error.ErrSuccess)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 测试邮件服务器地址是否正常连通
|
||||||
|
func TestEmail(c *gin.Context) {
|
||||||
|
addr := c.PostForm("addr")
|
||||||
|
protocol := c.PostForm("protocol")
|
||||||
|
port := c.PostForm("port")
|
||||||
|
account := c.PostForm("account")
|
||||||
|
password := c.PostForm("password")
|
||||||
|
emails := c.PostForm("emails")
|
||||||
|
|
||||||
|
receivers := strings.Split(emails, ",")
|
||||||
|
|
||||||
|
err := send.TestMail(addr, protocol, port, account, password, receivers)
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "测试邮件发送失败, 错误信息:", err)
|
||||||
|
c.JSON(http.StatusOK, error.ErrTestEmail)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, error.ErrSuccess)
|
||||||
|
}
|
190
view/setting/intelligence/view.go
Normal file
190
view/setting/intelligence/view.go
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
package intelligence
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"encoding/json"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"HFish/core/dbUtil"
|
||||||
|
merror "HFish/error"
|
||||||
|
"HFish/utils/cache"
|
||||||
|
"HFish/utils/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 渲染威胁情报页面
|
||||||
|
func Html(c *gin.Context) {
|
||||||
|
// 获取配置列表
|
||||||
|
result, err := dbUtil.DB().Table("hfish_setting").
|
||||||
|
Fields("type", "info", "status").
|
||||||
|
Where("type", "apikey").
|
||||||
|
OrWhere("type", "whiteIp").
|
||||||
|
Get()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "获取配置列表失败", err)
|
||||||
|
c.HTML(http.StatusOK, "setting.html", gin.H{
|
||||||
|
"cloud_status": 0,
|
||||||
|
"cloud_apikey": "",
|
||||||
|
"local_status": 0,
|
||||||
|
"local_iplist": "",
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dataMap := make(map[string]map[string]interface{})
|
||||||
|
for _, config := range result {
|
||||||
|
cType, ok := config["type"].(string)
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
dataMap[cType] = make(map[string]interface{})
|
||||||
|
dataMap[cType]["status"] = config["status"]
|
||||||
|
dataMap[cType]["info"] = config["info"]
|
||||||
|
}
|
||||||
|
|
||||||
|
c.HTML(http.StatusOK, "setting.html", gin.H{
|
||||||
|
"cloud_status": dataMap["apikey"]["status"],
|
||||||
|
"cloud_apikey": dataMap["apikey"]["info"],
|
||||||
|
"local_status": dataMap["whiteIp"]["status"],
|
||||||
|
"local_iplist": dataMap["whiteIp"]["info"],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取威胁情报配置信息
|
||||||
|
func GetIntelligence(c *gin.Context) {
|
||||||
|
// 获取配置列表
|
||||||
|
result, err := dbUtil.DB().Table("hfish_setting").
|
||||||
|
Fields("type", "info", "status").
|
||||||
|
Where("type", "apikey").
|
||||||
|
OrWhere("type", "whiteIp").
|
||||||
|
Get()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "获取配置列表失败", err)
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"cloud_status": 0,
|
||||||
|
"cloud_apikey": "",
|
||||||
|
"local_status": 0,
|
||||||
|
"local_iplist": "",
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dataMap := make(map[string]map[string]interface{})
|
||||||
|
for _, config := range result {
|
||||||
|
cType, ok := config["type"].(string)
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
dataMap[cType] = make(map[string]interface{})
|
||||||
|
dataMap[cType]["status"] = config["status"]
|
||||||
|
dataMap[cType]["info"] = config["info"]
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, merror.ErrSuccessWithData(gin.H{
|
||||||
|
"cloud_status": dataMap["apikey"]["status"],
|
||||||
|
"cloud_apikey": dataMap["apikey"]["info"],
|
||||||
|
"local_status": dataMap["whiteIp"]["status"],
|
||||||
|
"local_iplist": dataMap["whiteIp"]["info"],
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新威胁情报配置信息
|
||||||
|
func UpdateIntelligence(c *gin.Context) {
|
||||||
|
cloudStatus := c.PostForm("cloud_status")
|
||||||
|
cloudApikey := c.PostForm("cloud_apikey")
|
||||||
|
localStatus := c.PostForm("local_status")
|
||||||
|
localIpList := c.PostForm("local_iplist")
|
||||||
|
|
||||||
|
if (cloudStatus != "0" && cloudStatus != "1") || (cloudStatus == "1" && len(cloudApikey) != 64) {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "请求数据非法", cloudApikey)
|
||||||
|
c.JSON(http.StatusOK, merror.ErrInputData)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
localIpLists := strings.Split(localIpList, "&&")
|
||||||
|
if (localStatus != "0" && localStatus != "1") || (localStatus == "1" && len(localIpLists) == 0) {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "请求数据非法", localIpList)
|
||||||
|
c.JSON(http.StatusOK, merror.ErrInputData)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
nowTime := time.Now().Format("2006-01-02 15:04")
|
||||||
|
// 更新
|
||||||
|
_, err := dbUtil.DB().
|
||||||
|
Table("hfish_setting").
|
||||||
|
Data(map[string]interface{}{"status": cloudStatus, "info": cloudApikey, "update_time": nowTime}).
|
||||||
|
Where("type", "apikey").
|
||||||
|
Update()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "更新威胁情报云端配置信息失败", err)
|
||||||
|
c.JSON(http.StatusOK, merror.ErrUpdateData)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = dbUtil.DB().
|
||||||
|
Table("hfish_setting").
|
||||||
|
Data(map[string]interface{}{"status": localStatus, "info": localIpList, "update_time": nowTime}).
|
||||||
|
Where("type", "whiteIp").
|
||||||
|
Update()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "更新威胁情报IP白名单配置信息失败", err)
|
||||||
|
c.JSON(http.StatusOK, merror.ErrUpdateData)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
cache.Setx("ApikeyStatus", cloudStatus)
|
||||||
|
cache.Setx("ApikeyInfo", cloudApikey)
|
||||||
|
cache.Setx("IpConfigStatus", localStatus)
|
||||||
|
cache.Setx("IpConfigInfo", localIpList)
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, merror.ErrSuccess)
|
||||||
|
}
|
||||||
|
|
||||||
|
func httpGet(apikey string) error {
|
||||||
|
url := fmt.Sprintf("https://api.threatbook.cn/v3/scene/ip_reputation?apikey=%s&resource=159.203.93.255", apikey)
|
||||||
|
resp, err := http.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var result struct {
|
||||||
|
ResponseCode int `json:"response_code"`
|
||||||
|
VerboseMsg string `json:"verbose_msg"`
|
||||||
|
}
|
||||||
|
if err := json.Unmarshal(body, &result); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if result.ResponseCode != 0 {
|
||||||
|
return fmt.Errorf("%s:%d", result.VerboseMsg, result.ResponseCode)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 测试获取云端威胁情报apikey是否有效
|
||||||
|
func TestIntelligence(c *gin.Context) {
|
||||||
|
apikey := c.PostForm("apikey")
|
||||||
|
|
||||||
|
err := httpGet(apikey)
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "测试获取云端威胁情报失败", err)
|
||||||
|
response := gin.H{
|
||||||
|
"code": merror.ErrTestIntelligence["code"],
|
||||||
|
"msg": merror.ErrTestIntelligence["msg"],
|
||||||
|
"data": err.Error(),
|
||||||
|
}
|
||||||
|
c.JSON(http.StatusOK, response)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.JSON(http.StatusOK, merror.ErrSuccess)
|
||||||
|
}
|
86
view/setting/massset/view.go
Normal file
86
view/setting/massset/view.go
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
package massset
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"HFish/core/dbUtil"
|
||||||
|
"HFish/error"
|
||||||
|
"HFish/utils/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 渲染群发设置页面
|
||||||
|
func Html(c *gin.Context) {
|
||||||
|
// 获取配置列表
|
||||||
|
result, err := dbUtil.DB().Table("hfish_setting").
|
||||||
|
Fields("info", "status").
|
||||||
|
Where("type", "mail").
|
||||||
|
First()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "获取群发设置配置信息失败", err)
|
||||||
|
c.HTML(http.StatusOK, "setting.html", gin.H{
|
||||||
|
"email_status": 0,
|
||||||
|
"email_info": "",
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.HTML(http.StatusOK, "setting.html", gin.H{
|
||||||
|
"email_status": result["status"],
|
||||||
|
"email_info": result["info"],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取群发设置配置信息
|
||||||
|
func GetMassSet(c *gin.Context) {
|
||||||
|
// 获取配置列表
|
||||||
|
result, err := dbUtil.DB().Table("hfish_setting").
|
||||||
|
Fields("info", "status").
|
||||||
|
Where("type", "mail").
|
||||||
|
First()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "获取群发设置配置信息失败", err)
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"mail_status": 0,
|
||||||
|
"mail_info": "",
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(gin.H{
|
||||||
|
"mail_status": result["status"],
|
||||||
|
"mail_info": result["info"],
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新群发设置配置信息
|
||||||
|
func UpdateMassSet(c *gin.Context) {
|
||||||
|
status := c.PostForm("mail_status")
|
||||||
|
info := c.PostForm("mail_info")
|
||||||
|
|
||||||
|
infos := strings.Split(info, "&&")
|
||||||
|
if (status != "0" && status != "1") || (status == "1" && len(infos) != 5){
|
||||||
|
log.Pr("HFish", "127.0.0.1", "请求数据非法", info)
|
||||||
|
c.JSON(http.StatusOK, error.ErrInputData)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新
|
||||||
|
nowTime := time.Now().Format("2006-01-02 15:04")
|
||||||
|
_, err := dbUtil.DB().
|
||||||
|
Table("hfish_setting").
|
||||||
|
Data(map[string]interface{}{"status": status, "info": info, "update_time": nowTime}).
|
||||||
|
Where("type", "mail").
|
||||||
|
Update()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "更新群发设置配置信息失败", err)
|
||||||
|
c.JSON(http.StatusOK, error.ErrUpdateData)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, error.ErrSuccess)
|
||||||
|
}
|
121
view/setting/secret/view.go
Normal file
121
view/setting/secret/view.go
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
package secret
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"HFish/core/dbUtil"
|
||||||
|
"HFish/error"
|
||||||
|
"HFish/utils/cache"
|
||||||
|
"HFish/utils/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 渲染数据合规页面
|
||||||
|
func Html(c *gin.Context) {
|
||||||
|
// 获取配置列表
|
||||||
|
result, err := dbUtil.DB().Table("hfish_setting").
|
||||||
|
Fields("info", "status").
|
||||||
|
Where("type", "passwdTM").
|
||||||
|
First()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "获取配置列表失败", err)
|
||||||
|
c.HTML(http.StatusOK, "setting.html", gin.H{
|
||||||
|
"passwd_status": 0,
|
||||||
|
"passwd_text": "",
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.HTML(http.StatusOK, "setting.html", gin.H{
|
||||||
|
"passwd_status": result["status"],
|
||||||
|
"passwd_text": result["info"],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取数据合规配置信息
|
||||||
|
func GetSecretData(c *gin.Context) {
|
||||||
|
// 获取配置列表
|
||||||
|
result, err := dbUtil.DB().Table("hfish_setting").
|
||||||
|
Fields("info", "status").
|
||||||
|
Where("type", "passwdTM").
|
||||||
|
First()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "获取配置列表失败", err)
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"passwd_status": 0,
|
||||||
|
"passwd_text": "",
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, error.ErrSuccessWithData(gin.H{
|
||||||
|
"passwd_status": result["status"],
|
||||||
|
"passwd_text": result["info"],
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新数据合规配置信息
|
||||||
|
func UpdateSecretData(c *gin.Context) {
|
||||||
|
status := c.PostForm("passwd_status")
|
||||||
|
text := c.PostForm("passwd_text")
|
||||||
|
|
||||||
|
if (status != "0" && status != "1") || (status == "1" && len(text) == 0) {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "请求数据非法", text)
|
||||||
|
c.JSON(http.StatusOK, error.ErrInputData)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新
|
||||||
|
nowTime := time.Now().Format("2006-01-02 15:04")
|
||||||
|
_, err := dbUtil.DB().
|
||||||
|
Table("hfish_setting").
|
||||||
|
Data(map[string]interface{}{"status": status, "info": text, "update_time": nowTime}).
|
||||||
|
Where("type", "passwdTM").
|
||||||
|
Update()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "更新数据合规配置信息失败", err)
|
||||||
|
c.JSON(http.StatusOK, error.ErrUpdateData)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
cache.Setx("PasswdConfigStatus", status)
|
||||||
|
cache.Setx("PasswdConfigInfo", text)
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, error.ErrSuccess)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清空数据
|
||||||
|
func ClearData(c *gin.Context) {
|
||||||
|
tyep := c.PostForm("type")
|
||||||
|
|
||||||
|
if tyep == "1" {
|
||||||
|
_, err := dbUtil.DB().Table("hfish_info").Force().Delete()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "清空上钩数据失败", err)
|
||||||
|
c.JSON(http.StatusOK, error.ErrDeleteData)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else if tyep == "2" {
|
||||||
|
_, err := dbUtil.DB().Table("hfish_colony").Force().Delete()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "清空集群数据失败", err)
|
||||||
|
c.JSON(http.StatusOK, error.ErrDeleteData)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else if tyep == "3" {
|
||||||
|
_, err := dbUtil.DB().Table("hfish_passwd").Force().Delete()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Pr("HFish", "127.0.0.1", "清空密码数据失败", err)
|
||||||
|
c.JSON(http.StatusOK, error.ErrDeleteData)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, error.ErrSuccess)
|
||||||
|
}
|
47
view/url.go
47
view/url.go
@ -1,16 +1,20 @@
|
|||||||
package view
|
package view
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
|
||||||
|
"HFish/utils/cors"
|
||||||
"HFish/view/api"
|
"HFish/view/api"
|
||||||
|
"HFish/view/colony"
|
||||||
|
"HFish/view/data"
|
||||||
"HFish/view/dashboard"
|
"HFish/view/dashboard"
|
||||||
"HFish/view/fish"
|
"HFish/view/fish"
|
||||||
"HFish/view/mail"
|
|
||||||
"HFish/view/colony"
|
|
||||||
"HFish/view/setting"
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"HFish/view/login"
|
"HFish/view/login"
|
||||||
"HFish/utils/cors"
|
"HFish/view/mail"
|
||||||
"HFish/view/data"
|
"HFish/view/setting/alert"
|
||||||
|
"HFish/view/setting/intelligence"
|
||||||
|
"HFish/view/setting/massset"
|
||||||
|
"HFish/view/setting/secret"
|
||||||
)
|
)
|
||||||
|
|
||||||
func LoadUrl(r *gin.Engine) {
|
func LoadUrl(r *gin.Engine) {
|
||||||
@ -29,6 +33,7 @@ func LoadUrl(r *gin.Engine) {
|
|||||||
// 蜜罐列表
|
// 蜜罐列表
|
||||||
r.GET("/fish", login.Jump, fish.Html)
|
r.GET("/fish", login.Jump, fish.Html)
|
||||||
r.GET("/get/fish/list", login.Jump, fish.GetFishList)
|
r.GET("/get/fish/list", login.Jump, fish.GetFishList)
|
||||||
|
r.GET("/get/fish/export", login.Jump, fish.ExportFishList)
|
||||||
r.GET("/get/fish/info", login.Jump, fish.GetFishInfo)
|
r.GET("/get/fish/info", login.Jump, fish.GetFishInfo)
|
||||||
r.GET("/get/fish/typeList", login.Jump, fish.GetFishTypeInfo)
|
r.GET("/get/fish/typeList", login.Jump, fish.GetFishTypeInfo)
|
||||||
r.POST("/post/fish/del", login.Jump, fish.PostFishDel)
|
r.POST("/post/fish/del", login.Jump, fish.PostFishDel)
|
||||||
@ -54,16 +59,26 @@ func LoadUrl(r *gin.Engine) {
|
|||||||
r.GET("/mail", login.Jump, mail.Html)
|
r.GET("/mail", login.Jump, mail.Html)
|
||||||
r.POST("/post/mail/sendEmail", login.Jump, mail.SendEmailToUsers)
|
r.POST("/post/mail/sendEmail", login.Jump, mail.SendEmailToUsers)
|
||||||
|
|
||||||
// 设置
|
// 系统设置->告警通知
|
||||||
r.GET("/setting", login.Jump, setting.Html)
|
r.GET("/setting", login.Jump, alert.Html)
|
||||||
r.GET("/get/setting/info", login.Jump, setting.GetSettingInfo)
|
r.GET("/get/setting/alert", login.Jump, alert.GetAlertData)
|
||||||
r.POST("/post/setting/update", login.Jump, setting.UpdateEmailInfo)
|
r.POST("/post/setting/alert", login.Jump, alert.UpdateAlertData)
|
||||||
r.POST("/post/setting/updateAlertMail", login.Jump, setting.UpdateAlertMail)
|
r.POST("/post/setting/syslog/test", login.Jump, alert.TestSyslog)
|
||||||
r.POST("/post/setting/checkSetting", login.Jump, setting.UpdateStatusSetting)
|
r.POST("/post/setting/email/test", login.Jump, alert.TestEmail)
|
||||||
r.POST("/post/setting/updateWebHook", login.Jump, setting.UpdateWebHook)
|
|
||||||
r.POST("/post/setting/updateWhiteIp", login.Jump, setting.UpdateWhiteIp)
|
// 系统设置->群发设置
|
||||||
r.POST("/post/setting/updatePasswdTM", login.Jump, setting.UpdatePasswdTM)
|
r.GET("/get/setting/massset", login.Jump, massset.GetMassSet)
|
||||||
r.POST("/post/setting/clearData", login.Jump, setting.ClearData)
|
r.POST("/post/setting/massset", login.Jump, massset.UpdateMassSet)
|
||||||
|
|
||||||
|
// 系统设置->威胁情报
|
||||||
|
r.GET("/get/setting/intelligence", login.Jump, intelligence.GetIntelligence)
|
||||||
|
r.POST("/post/setting/intelligence", login.Jump, intelligence.UpdateIntelligence)
|
||||||
|
r.POST("/post/setting/intelligence/test", login.Jump, intelligence.TestIntelligence)
|
||||||
|
|
||||||
|
// 系统设置->数据合规
|
||||||
|
r.GET("/get/setting/secret", login.Jump, secret.GetSecretData)
|
||||||
|
r.POST("/post/setting/secret", login.Jump, secret.UpdateSecretData)
|
||||||
|
r.POST("/post/setting/cleardata", login.Jump, secret.ClearData)
|
||||||
|
|
||||||
// API 接口
|
// API 接口
|
||||||
// 解决跨域问题
|
// 解决跨域问题
|
||||||
|
Loading…
Reference in New Issue
Block a user