!1 合并V0.6.4代码到主线

* [UPD]更新到V0.6.4版本 1.新增获取威胁情报数据以及批量导出数据,2.系统设置页面整体调整。可以配置获取威胁情报API key以及syslog告警推送
This commit is contained in:
三斤 2020-12-03 11:21:22 +08:00
parent 5a1f7cf616
commit 236d2aaf2a
48 changed files with 4517 additions and 1206 deletions

View File

@ -50,11 +50,21 @@
color: #dc0e0e;
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>
<div class="row">
<div class="col-sm-12">
<h4 class="page-title">分布式集群</h4>
</div>
<div class="row">
<h4 class="title">分布式集群</h4>
</div>
<div class="col-sm-12">
<div class="card-box table-responsive">

View File

@ -11,7 +11,16 @@
color: #ff0101;
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 {
background: #3dd209;
width: 10px;
@ -107,8 +116,11 @@
切换大屏 <i class="ion-log-in"></i>
</a>
</div>
<h4 class="page-title">仪表盘</h4>
<div class="row">
<h4 class="title_1">仪表盘</h4>
</div>
</div>
<!--仪表盘-->
<div class="col-xs-12 col-md-6 col-lg-6 col-xl-2">
<div class="card-box tilebox-two">
<i class="icon-ghost pull-xs-right text-muted"></i>
@ -214,6 +226,7 @@
</div>
</div>
<!--折线图-->
<div class="col-md-12">
<div class="card-box">
<p class="titlea">最近24小时</p>
@ -388,6 +401,7 @@
<script>
// $('#myRegInfo').modal('show');
// 数字的初始化
var m = moment(new Date());
var arr = new Array();
@ -757,7 +771,7 @@
];
var myChart = echarts.init(document.getElementById('myChart'));
// 获取数据并填充
$.ajax({
type: "GET",
url: "/get/dashboard/data",
@ -1120,6 +1134,7 @@
}
});
// echarts中的图标自适应
window.onresize = function () {
myChart.resize();
myChar1.resize();

File diff suppressed because it is too large Load Diff

View File

@ -1,17 +1,15 @@
{{define "footer"}}
<!-- Footer -->
<footer class="footer text-right">
<!-- <footer class="footer text-right">
<div class="container">
<div class="row">
<div class="col-xs-12">
Copyright 2019 © <a href="https://hfish.io" target="_blank">HFish</a> - <a
href="https://hack.lc"
target="_blank">HackLC</a>
Copyright 2019 © <a href="https://hfish.io" target="_blank">HFish</a>
</div>
</div>
</div>
</footer>
</footer> -->
</div>
<div class="side-bar right-bar">
<div class="nicescroll">
@ -119,7 +117,8 @@
<script src="/static/libs/waypoints/lib/jquery.waypoints.js"></script>
<script src="/static/libs/counterup/jquery.counterup.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 -->
<script src="/static/js/jquery.core.js"></script>
<script src="/static/js/jquery.app.js"></script>

View File

@ -10,6 +10,8 @@
<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/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>
<body>
@ -47,9 +49,9 @@
<div class="menu-extras">
<ul class="nav navbar-nav pull-right">
<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>
</a>
</a> -->
</li>
<li class="nav-item dropdown notification-list">
<a class="nav-link dropdown-toggle arrow-none waves-effect waves-light nav-user"
@ -57,8 +59,7 @@
aria-haspopup="false" aria-expanded="false">
<img src="/static/images/avatar.jpg" alt="user" class="img-circle avatarx">
</a>
<div class="dropdown-menu dropdown-menu-right dropdown-arrow profile-dropdown "
aria-labelledby="Preview">
<div class="dropdown-menu dropdown-menu-right dropdown-arrow profile-dropdown "aria-labelledby="Preview">
<!-- item-->
<div class="dropdown-item noti-title">
<h5 class="text-overflow">

View File

@ -56,9 +56,7 @@
</div>
</div>
<div style="text-align: center;color: #ececec;">
Copyright 2019 © <a href="https://github.com/hacklcx/HFish" target="_blank" style="color: #fff">HFish</a> - <a
href="https://hack.lc"
target="_blank" style="color: #fff">HackLC</a>
Copyright 2019 © <a href="https://github.com/hacklcx/HFish" target="_blank" style="color: #fff">HFish</a>
</div>
</div>
</body>

View File

@ -1,6 +1,16 @@
{{template "header"}}
<script type="text/javascript" src="/static/libs/wangeditor3/wangEditor.css"></script>
<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 {
padding: 0px;
}
@ -51,10 +61,9 @@
<div class="row">
<!-- Page-Title -->
<div class="col-sm-12">
<h4 class="page-title">邮件群发</h4>
<div class="row">
<h4 class="title_1">邮件群发</h4>
</div>
<div class="col-sm-12">
<div class="card-box pdbox">
<div class="img">

File diff suppressed because it is too large Load Diff

View File

@ -1,20 +1,69 @@
package alert
import (
"HFish/utils/try"
"strings"
"HFish/utils/send"
"bytes"
"net/http"
"HFish/utils/log"
"encoding/json"
"HFish/view/data"
"github.com/gin-gonic/gin"
"fmt"
"net/http"
"strings"
"HFish/error"
"HFish/utils/cache"
"HFish/utils/geo"
"HFish/utils/log"
"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) {
// 判断邮件通知
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 := `
<div><b>Hi上钩了</b></div>
<div><b><br /></b></div>
<div><b>集群名称</b>` + agent + `</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><br /></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() {
@ -128,10 +178,6 @@ func AlertDataWs(model string, typex string, projectName string, agent string, i
})
// 发送到客户端
data.Send(gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": d,
})
data.Send(error.ErrSuccessWithData(d))
}
}

View File

@ -3,9 +3,9 @@ package dbUtil
import (
_ "github.com/go-sql-driver/mysql"
_ "github.com/mattn/go-sqlite3"
"github.com/gohouse/gorose"
"HFish/utils/conf"
"HFish/utils/log"
"github.com/gohouse/gorose"
)
var engin *gorose.Engin

View File

@ -1,8 +1,8 @@
package exec
import (
"os/exec"
"bytes"
"os/exec"
)
func Execute(shell string) (string, error) {

View File

@ -1,19 +1,18 @@
package custom
import (
"net"
"HFish/core/pool"
"time"
"fmt"
"net"
"time"
"strings"
"HFish/core/pool"
"HFish/core/report"
"HFish/core/rpc/client"
"HFish/utils/conf"
"HFish/utils/is"
"HFish/core/rpc/client"
"HFish/core/report"
)
func Start(name string, addr string, info string) {
fmt.Println(444444)
netListen, _ := net.Listen("tcp", addr)
defer netListen.Close()
@ -49,15 +48,10 @@ func StartCustom() {
names := conf.GetCustomName()
for i := 0; i < len(names); i++ {
status := conf.Get(string(names[i]), "status")
fmt.Println(1111111)
if status != "0" {
fmt.Println(22222)
addr := conf.Get(string(names[i]), "addr")
info := conf.Get(string(names[i]), "info")
fmt.Println(33333333)
go Start(names[i], addr, info)
}
}

View File

@ -5,9 +5,9 @@ import (
"net/http"
"time"
"strings"
"HFish/utils/is"
"HFish/core/rpc/client"
"HFish/core/report"
"HFish/core/rpc/client"
"HFish/utils/is"
)
// Config represents the configuration information.

119
core/report/intelligence.go Normal file
View 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
}

View File

@ -1,17 +1,19 @@
package report
import (
"HFish/core/dbUtil"
"time"
"HFish/utils/log"
"HFish/utils/ip"
"fmt"
"strconv"
"HFish/utils/try"
"strings"
"time"
"HFish/core/alert"
"HFish/utils/conf"
"HFish/core/dbUtil"
"HFish/core/pool"
"HFish/utils/cache"
"HFish/utils/conf"
"HFish/utils/geo"
"HFish/utils/ip"
"HFish/utils/log"
"HFish/utils/try"
)
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) {
// Syslog通知
alert.AlertSyslog(model, projectName, typex, agent, ipx, country, region, city, infox, timex)
// 邮件通知
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 {
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{}{
"type": typex,
@ -126,8 +141,10 @@ func insertInfo(typex string, projectName string, agent string, ipx string, coun
"country": country,
"region": region,
"city": city,
"intelligence": intelligence,
"info": info,
"create_time": time.Now().Format("2006-01-02 15:04:05"),
"info_len": len(info),
"create_time": timex,
}).InsertGetId()
if err != nil {

View File

@ -38,10 +38,12 @@ CREATE TABLE `hfish_info` (
`project_name` varchar(20) NOT NULL DEFAULT '',
`agent` varchar(20) NOT NULL DEFAULT '',
`ip` varchar(20) NOT NULL DEFAULT '',
`intelligence` text NOT NULL DEFAULT '';
`country` varchar(10) NOT NULL DEFAULT '',
`region` varchar(10) NOT NULL DEFAULT '',
`city` varchar(10) NOT NULL,
`info` text NOT NULL,
`info_len` int(11) NOT NULL,
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `info_index_1` (`type`) USING BTREE,
@ -87,7 +89,7 @@ CREATE TABLE `hfish_setting` (
-- Records of `hfish_setting`
-- ----------------------------
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;
SET FOREIGN_KEY_CHECKS = 1;

24
docker-compose.yml Normal file
View 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"

View File

@ -1,7 +1,8 @@
FROM alpine:latest
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
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 && \
tar -zxvf /tmp/HFish.tar.gz -C /tmp && \
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

View File

@ -2,28 +2,29 @@ package error
import (
"fmt"
"github.com/gin-gonic/gin"
)
const (
ErrSuccessCode = 200
ErrSuccessMsg = "success"
ErrFailApiKeyCode = 1001
ErrFailApiKeyMsg = "秘钥不正确"
ErrFailLoginCode = 1002
ErrFailLoginMsg = "账号密码不正确"
ErrFailMailCode = 1003
ErrFailMailMsg = "邮箱未启用"
ErrFailConfigCode = 1004
ErrFailConfigMsg = "请配置后在启用"
ErrFailPlugCode = 1005
ErrFailPlugMsg = "上报信息错误"
var (
ErrSuccess = gin.H{"code": 200, "msg": "成功"}
ErrFailApiKey = gin.H{"code": 1001, "msg": "秘钥不正确"}
ErrFailLogin = gin.H{"code": 1002, "msg": "账号密码不正确"}
ErrFailMail = gin.H{"code": 1003, "msg": "邮箱未启用"}
ErrFailConfig = gin.H{"code": 1004, "msg": "请配置后再启用"}
ErrFailPlug = gin.H{"code": 1005, "msg": "上报信息错误"}
ErrInputData = gin.H{"code": 1006, "msg": "请求数据非法"}
ErrUpdateData = gin.H{"code": 1007, "msg": "数据更新失败"}
ErrDeleteData = gin.H{"code": 1008, "msg": "数据清除失败"}
ErrTestSyslog = gin.H{"code": 1009, "msg": "测试Syslog发送失败"}
ErrTestEmail = gin.H{"code": 1010, "msg": "测试邮件发送失败"}
ErrTestIntelligence = gin.H{"code": 1011, "msg": "测试获取威胁情报失败"}
ErrExportData = gin.H{"code": 1012, "msg": "数据导出失败"}
)
func ErrSuccessWithData(data interface{}) gin.H {
return gin.H{"code": 200, "msg": "success", "data": data}
}
func Check(e error, tips string) {
if e != nil {
fmt.Println(tips)

1
go.mod
View File

@ -16,6 +16,7 @@ require (
github.com/go-sql-driver/mysql v1.4.1
github.com/gohouse/gorose v0.0.0-20190830103550-ad3ce0985b9e
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/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869
github.com/kr/pretty v0.1.0 // indirect

30
go.sum
View File

@ -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/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/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/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/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/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/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/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/gin-contrib/sessions v0.0.1 h1:xr9V/u3ERQnkugKSY/u36cNnC4US4bHJpdxcB6eIZLk=
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-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/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
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/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/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
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/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=
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/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
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/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/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/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/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/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/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc=
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/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
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/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
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/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/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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
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/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/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/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/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
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/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw=
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-20190605123033-f99c8df09eb5 h1:58fnuSXlxZmFdJyvtTFVmVhcMLU6v5fEb/ok4wyqtNU=
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-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-20190603091049-60506f45cf65 h1:+rhAzEzT3f4JtomfC371qB+0Ola2caSKcY69NUBZrRQ=
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/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-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/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.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-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
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=
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/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/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/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ=
gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y=

View File

@ -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" "
[GIN] 2020/05/12 - 15:38:15 | 200 | 2.509664ms | ::1 | GET /data
[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" "
[GIN] 2020/05/12 - 15:38:15 | 304 | 344.02µs | ::1 | GET /static/data/js/data.js
[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" "
[GIN] 2020/05/12 - 15:38:15 | 200 | 6.820082ms | ::1 | GET /data/get/china
[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" "
[GIN] 2020/05/12 - 15:38:15 | 200 | 4.575423ms | ::1 | GET /static/favicon.ico
[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" "
[GIN] 2020/05/12 - 15:38:15 | 200 | 5.640788ms | ::1 | GET /data/get/country
[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" "
[GIN] 2020/05/12 - 15:38:15 | 200 | 7.189286ms | ::1 | GET /data/get/ip
[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" "
[GIN] 2020/05/12 - 15:38:15 | 200 | 1.026445ms | ::1 | GET /data/get/info
[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" "
[GIN] 2020/05/12 - 15:38:15 | 200 | 8.269832ms | ::1 | GET /data/get/type
[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" "
[GIN] 2020/05/12 - 15:38:15 | 200 | 8.32347ms | ::1 | GET /data/get/account
[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" "
[GIN] 2020/05/12 - 15:38:15 | 200 | 24.499375ms | ::1 | GET /data/get/word
[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" "
[GIN] 2020/05/12 - 15:38:15 | 200 | 24.791455ms | ::1 | GET /data/get/password
[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" "
[GIN] 2020/05/12 - 15:38:17 | 200 | 2.006766ms | ::1 | GET /data
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 2.659738826s | ::1 | GET /data/ws
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 902.515µs | ::1 | GET /static/data/css/bootstrap/css/bootstrap.min.css
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 334.387µs | ::1 | GET /static/data/css/app.css
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 450.933µs | ::1 | GET /static/data/js/dark.js
[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-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/05/12 - 15:38:18 | 200 | 586.17µs | ::1 | GET /static/data/js/data.js
[GIN] 2020/05/12 - 15:38:18 | 200 | 1.072769ms | ::1 | GET /static/data/js/echarts-wordcloud.min.js
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 1.137992ms | ::1 | GET /static/js/xss.min.js
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 2.69818ms | ::1 | GET /static/data/js/echarts-3.8.5.min.js
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 2.144618ms | ::1 | GET /static/data/js/jquery-3.3.1.min.js
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 19.121825ms | ::1 | GET /static/data/js/echarts-map-world.js
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 4.898637ms | ::1 | GET /static/data/img/bg01.png
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 1.767635ms | ::1 | GET /static/data/img/panel.png
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 2.841579ms | ::1 | GET /static/data/img/header.png
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 675.684µs | ::1 | GET /static/data/css/bootstrap/fonts/glyphicons-halflings-regular.woff2
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 2.269335ms | ::1 | GET /data/get/china
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 926.024µs | ::1 | GET /data/get/country
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 904.238µs | ::1 | GET /data/get/ip
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 746.803µs | ::1 | GET /data/get/type
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 1.680522ms | ::1 | GET /data/get/account
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 3.225945ms | ::1 | GET /data/get/password
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 1.610624ms | ::1 | GET /data/get/word
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 805.17µs | ::1 | GET /data/get/info
[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" "
[GIN] 2020/05/12 - 15:38:18 | 200 | 203.745µs | ::1 | GET /static/favicon.ico
[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" "
[GIN] 2020/05/12 - 15:38:45 | 200 | 3.281593ms | ::1 | GET /data
[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" "
[GIN] 2020/05/12 - 15:38:45 | 200 | 26.942416279s | ::1 | GET /data/ws
[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" "
[GIN] 2020/05/12 - 15:38:45 | 200 | 239.294µs | ::1 | GET /static/data/js/data.js
[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] 已经连接 []
[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/12/02 - 22:41:48 | 200 | 6.9816ms | ::1 | GET /
[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/12/02 - 22:41:49 | 200 | 2.9911ms | ::1 | GET /get/dashboard/pie_data
[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/12/02 - 22:41:49 | 200 | 0s | ::1 | GET /data/get/password
[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/12/02 - 22:41:49 | 200 | 4.9493ms | ::1 | GET /get/dashboard/data
[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/12/02 - 22:41:49 | 200 | 3.989ms | ::1 | GET /data/get/account
[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/12/02 - 22:41:50 | 200 | 4.9877ms | ::1 | GET /setting
[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/12/02 - 22:41:50 | 200 | 995.9µs | ::1 | GET /get/setting/alert
[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/12/02 - 22:41:53 | 200 | 51.8621ms | ::1 | GET /static/js/jquery.min.map
[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/12/02 - 22:41:53 | 200 | 26.9286ms | ::1 | GET /static/css/style.css.map
[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/12/02 - 22:42:04 | 200 | 6.9792ms | ::1 | GET /fish
[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/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-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/12/02 - 22:42:04 | 200 | 0s | ::1 | GET /get/fish/typeList
[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/12/02 - 22:42:06 | 200 | 4.9868ms | ::1 | GET /dashboard
[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/12/02 - 22:42:06 | 200 | 0s | ::1 | GET /get/dashboard/data
[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/12/02 - 22:42:06 | 200 | 0s | ::1 | GET /get/dashboard/pie_data
[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/12/02 - 22:42:06 | 200 | 998.9µs | ::1 | GET /data/get/account
[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" "
[GIN] 2020/12/02 - 22:42:06 | 200 | 996µs | ::1 | GET /data/get/password
[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/12/02 - 22:42:08 | 200 | 4.9588ms | ::1 | GET /fish
[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/12/02 - 22:42:08 | 200 | 999.1µs | ::1 | GET /get/fish/typeList
[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/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-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/12/02 - 22:42:09 | 200 | 4.9876ms | ::1 | GET /fish
[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/12/02 - 22:42:09 | 200 | 996.5µs | ::1 | GET /get/fish/typeList
[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/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-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/12/02 - 22:42:10 | 200 | 5.0045ms | ::1 | GET /dashboard
[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/12/02 - 22:42:10 | 200 | 998.7µs | ::1 | GET /get/dashboard/data
[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/12/02 - 22:42:10 | 200 | 0s | ::1 | GET /get/dashboard/pie_data
[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/12/02 - 22:42:10 | 200 | 998µs | ::1 | GET /data/get/account
[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/12/02 - 22:42:10 | 200 | 997.3µs | ::1 | GET /data/get/password
[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/12/02 - 22:43:29 | 200 | 4.9887ms | ::1 | GET /setting
[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/12/02 - 22:43:29 | 200 | 997µs | ::1 | GET /get/setting/alert
[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/12/02 - 22:43:31 | 200 | 2.9929ms | ::1 | GET /mail
[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/12/02 - 22:43:32 | 200 | 2.9929ms | ::1 | GET /colony
[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/12/02 - 22:43:32 | 200 | 0s | ::1 | GET /get/colony/list
[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/12/02 - 22:43:33 | 200 | 4.9862ms | ::1 | GET /fish
[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/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-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/12/02 - 22:43:33 | 200 | 0s | ::1 | GET /get/fish/typeList
[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/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-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/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=

View File

@ -2,8 +2,9 @@ package main
import (
"fmt"
"HFish/utils/setting"
"os"
"HFish/utils/setting"
)
func main() {
@ -14,10 +15,8 @@ func main() {
} else {
if args[1] == "help" || args[1] == "--help" {
setting.Help()
} else if args[1] == "init" || args[1] == "--init" {
setting.Init()
} 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" {
setting.Run()
} else {

View File

@ -2271,9 +2271,11 @@ input[type="button"].btn-block {
.fade {
opacity: 0;
transition: opacity .15s linear; }
.fade.in {
opacity: 1; }
transition: opacity .15s linear;
}
.fade.in {
opacity: 1;
}
.collapse {
display: none; }

View 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 */
}

View File

@ -761,7 +761,7 @@ function main7_data() {
formatter: function (params, ticket, callback) {
var res = "";
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 =
"<span style='color:#fff;'>" +
name +

19
static/images/copy1.svg Normal file
View 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
View 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
View 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
View 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

File diff suppressed because one or more lines are too long

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
View 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
}

View File

@ -1,35 +1,25 @@
package send
import (
"gopkg.in/gomail.v2"
"strconv"
"HFish/utils/log"
"crypto/tls"
"strconv"
"gopkg.in/gomail.v2"
"HFish/utils/log"
)
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.SetHeader("From", "<"+config[2]+">")
m.SetHeader("From", "<"+config[3]+">")
m.SetHeader("To", mailTo...) //发送给多个用户
m.SetHeader("Subject", subject) //设置邮件主题
m.SetBody("text/html", body) //设置邮件正文
//d := &gomail.Dialer{
// Host: config[0],
// Port: port,
// Username: config[2],
// Password: config[3],
// SSL: false,
//}
d := gomail.NewDialer(config[0], port, config[2], config[3])
d := gomail.NewDialer(config[0], port, config[3], config[4])
d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
err := d.DialAndSend(m)
if err != nil {
log.Pr("HFish", "127.0.0.1", "发送邮件通知失败", err)
} else {
@ -38,3 +28,21 @@ func SendMail(mailTo []string, subject string, body string, config []string) 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
View 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
}

View File

@ -155,6 +155,8 @@ func initCahe() {
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()
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("MailConfigInfo", resultMail["info"])
@ -167,6 +169,12 @@ func initCahe() {
cache.Setx("PasswdConfigStatus", strconv.FormatInt(resultPasswd["status"].(int64), 10))
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() {
@ -406,10 +414,6 @@ func Run() {
serverAdmin.ListenAndServe()
}
func Init() {
fmt.Println("test")
}
func Help() {
exec.Execute("clear")
logo := ` o
@ -422,7 +426,7 @@ func Help() {
{K || __ _______ __
| PP / // / __(_)__ / /
| || / _ / _// (_-</ _ \
(__\\ /_//_/_/ /_/___/_//_/ v0.6.1
(__\\ /_//_/_/ /_/___/_//_/ v0.6.4
`
fmt.Println(color.Yellow(logo))
fmt.Println(color.White(" A Safe and Active Attack Honeypot Fishing Framework System for Enterprises."))

View File

@ -1,16 +1,15 @@
package api
import (
"net/http"
"github.com/gin-gonic/gin"
"HFish/core/report"
"net/http"
"HFish/error"
"HFish/utils/conf"
"HFish/core/dbUtil"
"HFish/core/rpc/client"
"HFish/error"
"HFish/utils/conf"
"HFish/utils/is"
"HFish/utils/log"
"fmt"
)
// 上报WEB蜜罐
@ -27,11 +26,7 @@ func ReportWeb(c *gin.Context) {
apiSecKey := conf.Get("api", "report_key")
if secKey != apiSecKey {
c.JSON(http.StatusOK, gin.H{
"code": error.ErrFailApiKeyCode,
"msg": error.ErrFailApiKeyMsg,
})
c.JSON(http.StatusOK, error.ErrFailApiKey)
return
} else {
@ -42,10 +37,7 @@ func ReportWeb(c *gin.Context) {
go report.ReportWeb(name, "本机", ip, info)
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
})
c.JSON(http.StatusOK, error.ErrSuccess)
}
}
@ -63,11 +55,7 @@ func ReportDeepWeb(c *gin.Context) {
apiSecKey := conf.Get("api", "report_key")
if secKey != apiSecKey {
c.JSON(http.StatusOK, gin.H{
"code": error.ErrFailApiKeyCode,
"msg": error.ErrFailApiKeyMsg,
})
c.JSON(http.StatusOK, error.ErrFailApiKey)
return
} else {
@ -78,10 +66,7 @@ func ReportDeepWeb(c *gin.Context) {
go report.ReportDeepWeb(name, "本机", ip, info)
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
})
c.JSON(http.StatusOK, error.ErrSuccess)
}
}
@ -98,12 +83,11 @@ func ReportPlugWeb(c *gin.Context) {
err := c.BindJSON(&info)
if err != nil {
fmt.Println(err)
log.Pr("HFish", "127.0.0.1", "插件上报信息错误", err)
c.JSON(http.StatusOK, gin.H{
"code": error.ErrFailPlugCode,
"msg": error.ErrFailPlugMsg,
"code": error.ErrFailPlug["code"],
"msg": error.ErrFailPlug["msg"],
"data": err,
})
return
@ -126,11 +110,7 @@ func ReportPlugWeb(c *gin.Context) {
apiSecKey := conf.Get("api", "report_key")
if info.SecKey != apiSecKey {
c.JSON(http.StatusOK, gin.H{
"code": error.ErrFailApiKeyCode,
"msg": error.ErrFailApiKeyMsg,
})
c.JSON(http.StatusOK, error.ErrFailApiKey)
return
} else {
@ -141,10 +121,7 @@ func ReportPlugWeb(c *gin.Context) {
go report.ReportPlugWeb(info.Name, "本机", info.Ip, data)
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
})
c.JSON(http.StatusOK, error.ErrSuccess)
}
}
@ -155,11 +132,7 @@ func GetIpList(c *gin.Context) {
apiSecKey := conf.Get("api", "query_key")
if key != apiSecKey {
c.JSON(http.StatusOK, gin.H{
"code": error.ErrFailApiKeyCode,
"msg": error.ErrFailApiKeyMsg,
})
c.JSON(http.StatusOK, error.ErrFailApiKey)
return
} else {
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)
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": result,
})
c.JSON(http.StatusOK, error.ErrSuccessWithData(result))
}
}
@ -183,11 +152,7 @@ func GetFishInfo(c *gin.Context) {
apiSecKey := conf.Get("api", "query_key")
if key != apiSecKey {
c.JSON(http.StatusOK, gin.H{
"code": error.ErrFailApiKeyCode,
"msg": error.ErrFailApiKeyMsg,
})
c.JSON(http.StatusOK, error.ErrFailApiKey)
return
} else {
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)
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": result,
})
c.JSON(http.StatusOK, error.ErrSuccessWithData(result))
}
}
@ -211,11 +172,7 @@ func GetAccountPasswdInfo(c *gin.Context) {
apiSecKey := conf.Get("api", "query_key")
if key != apiSecKey {
c.JSON(http.StatusOK, gin.H{
"code": error.ErrFailApiKeyCode,
"msg": error.ErrFailApiKeyMsg,
})
c.JSON(http.StatusOK, error.ErrFailApiKey)
return
} else {
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)
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": result,
})
c.JSON(http.StatusOK, error.ErrSuccessWithData(result))
}
}

View File

@ -1,8 +1,8 @@
package colony
import (
"github.com/gin-gonic/gin"
"net/http"
"github.com/gin-gonic/gin"
"HFish/core/dbUtil"
"HFish/error"
"HFish/utils/log"
@ -20,11 +20,7 @@ func GetColony(c *gin.Context) {
log.Pr("HFish", "127.0.0.1", "获取蜜罐集群列表失败", err)
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": result,
})
c.JSON(http.StatusOK, error.ErrSuccessWithData(result))
}
// 删除集群
@ -37,8 +33,5 @@ func PostColonyDel(c *gin.Context) {
log.Pr("HFish", "127.0.0.1", "删除集群失败", err)
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
})
c.JSON(http.StatusOK, error.ErrSuccess)
}

View File

@ -1,12 +1,12 @@
package dashboard
import (
"github.com/gin-gonic/gin"
"net/http"
"HFish/core/dbUtil"
"HFish/utils/conf"
"strconv"
"github.com/gin-gonic/gin"
"HFish/core/dbUtil"
"HFish/error"
"HFish/utils/conf"
"HFish/utils/log"
"HFish/utils/cache"
)
@ -525,11 +525,7 @@ func GetFishData(c *gin.Context) {
cache.Set("DashboardZxDq", data)
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": data,
})
c.JSON(http.StatusOK, error.ErrSuccessWithData(data))
}
// 仪表盘攻击饼图统计
@ -581,9 +577,5 @@ func GetFishPieData(c *gin.Context) {
cache.Set("DashboardBarDq", data)
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": data,
})
c.JSON(http.StatusOK, error.ErrSuccessWithData(data))
}

View File

@ -1,14 +1,14 @@
package data
import (
"fmt"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
"net/http"
"fmt"
"HFish/core/dbUtil"
"strconv"
"HFish/utils/log"
"HFish/error"
"HFish/utils/log"
"HFish/utils/conf"
)
@ -40,11 +40,7 @@ func GetChina(c *gin.Context) {
"regionList": regionList,
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": data,
})
c.JSON(http.StatusOK, error.ErrSuccessWithData(data))
}
// 统计国家攻击地区
@ -68,11 +64,7 @@ func GetCountry(c *gin.Context) {
"regionList": regionList,
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": data,
})
c.JSON(http.StatusOK, error.ErrSuccessWithData(data))
}
// 统计攻击IP地区
@ -97,11 +89,7 @@ func GetIp(c *gin.Context) {
"ipList": ipList,
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": data,
})
c.JSON(http.StatusOK, error.ErrSuccessWithData(data))
}
// 统计攻击类型
@ -126,11 +114,7 @@ func GetType(c *gin.Context) {
"typeList": typeList,
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": data,
})
c.JSON(http.StatusOK, error.ErrSuccessWithData(data))
}
// 获取最新数据流
@ -147,11 +131,7 @@ func GetNewInfo(c *gin.Context) {
"result": result,
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": data,
})
c.JSON(http.StatusOK, error.ErrSuccessWithData(data))
}
// 获取统计账号
@ -172,11 +152,7 @@ func GetAccountInfo(c *gin.Context) {
resultMap = append(resultMap, rMap)
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": resultMap,
})
c.JSON(http.StatusOK, error.ErrSuccessWithData(resultMap))
}
// 获取统计密码
@ -197,11 +173,7 @@ func GetPasswdInfo(c *gin.Context) {
resultMap = append(resultMap, rMap)
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": resultMap,
})
c.JSON(http.StatusOK, error.ErrSuccessWithData(resultMap))
}
// 获取全球攻击数量
@ -222,11 +194,7 @@ func GetWordInfo(c *gin.Context) {
resultMap = append(resultMap, rMap)
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": resultMap,
})
c.JSON(http.StatusOK, error.ErrSuccessWithData(resultMap))
}
// 往下是 Web Socket 代码

View File

@ -1,31 +1,120 @@
package fish
import (
"github.com/gin-gonic/gin"
"bytes"
"encoding/csv"
"encoding/json"
"fmt"
"net/http"
"HFish/core/dbUtil"
"HFish/error"
"HFish/utils/page"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
"HFish/core/dbUtil"
"HFish/error"
"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) {
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) {
p, _ := c.GetQuery("page")
pageSize, _ := c.GetQuery("pageSize")
pageNo, _ := c.GetQuery("page_no")
pageSize, _ := c.GetQuery("page_size")
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", "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")
if typex != "all" {
@ -38,11 +127,29 @@ func GetFishList(c *gin.Context) {
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 != "" {
db.Where("project_name", "like", "%"+soText+"%").OrWhere("ip", "like", "%"+soText+"%")
dbCount.Where("project_name", "like", "%"+soText+"%").OrWhere("ip", "like", "%"+soText+"%")
}
// 统计查询数量
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)
pageStart := page.Start(pInt, pageSizeInt)
pageStart := page.Start(pageNoInt, pageSizeInt)
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)
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{}{
"result": result,
"pageCount": pageCount,
"totalCount": totalCount,
"page": p,
"page": pageNo,
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": data,
})
c.JSON(http.StatusOK, error.ErrSuccessWithData(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)
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
})
c.JSON(http.StatusOK, error.ErrSuccess)
}
// 获取蜜罐信息
@ -113,11 +332,7 @@ func GetFishInfo(c *gin.Context) {
log.Pr("HFish", "127.0.0.1", "获取蜜罐信息失败", err)
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": result,
})
c.JSON(http.StatusOK, error.ErrSuccessWithData(result))
}
// 获取蜜罐分类信息,集群信息
@ -139,9 +354,5 @@ func GetFishTypeInfo(c *gin.Context) {
"resultColonyName": resultAgent,
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": data,
})
c.JSON(http.StatusOK, error.ErrSuccessWithData(data))
}

View File

@ -1,12 +1,12 @@
package login
import (
"net/http"
"time"
"github.com/gin-gonic/gin"
"github.com/gin-contrib/sessions"
"net/http"
"HFish/error"
"HFish/utils/conf"
"time"
)
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.Save()
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
})
c.JSON(http.StatusOK, error.ErrSuccess)
return
}
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrFailLoginCode,
"msg": error.ErrFailLoginMsg,
})
c.JSON(http.StatusOK, error.ErrFailLogin)
}
func Logout(c *gin.Context) {

View File

@ -1,14 +1,14 @@
package mail
import (
"github.com/gin-gonic/gin"
"net/http"
"strings"
"HFish/core/dbUtil"
"HFish/utils/send"
"HFish/error"
"strconv"
"strings"
"github.com/gin-gonic/gin"
"HFish/core/dbUtil"
"HFish/error"
"HFish/utils/log"
"HFish/utils/send"
)
func Html(c *gin.Context) {
@ -36,14 +36,8 @@ func SendEmailToUsers(c *gin.Context) {
if status == "1" {
send.SendMail(eArr, title, content, config)
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
})
c.JSON(http.StatusOK, error.ErrSuccess)
} else {
c.JSON(http.StatusOK, gin.H{
"code": error.ErrFailMailCode,
"msg": error.ErrFailMailMsg,
})
c.JSON(http.StatusOK, error.ErrFailMail)
}
}

222
view/setting/alert/view.go Normal file
View 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)
}

View 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)
}

View 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
View 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)
}

View File

@ -1,16 +1,20 @@
package view
import (
"github.com/gin-gonic/gin"
"HFish/utils/cors"
"HFish/view/api"
"HFish/view/colony"
"HFish/view/data"
"HFish/view/dashboard"
"HFish/view/fish"
"HFish/view/mail"
"HFish/view/colony"
"HFish/view/setting"
"github.com/gin-gonic/gin"
"HFish/view/login"
"HFish/utils/cors"
"HFish/view/data"
"HFish/view/mail"
"HFish/view/setting/alert"
"HFish/view/setting/intelligence"
"HFish/view/setting/massset"
"HFish/view/setting/secret"
)
func LoadUrl(r *gin.Engine) {
@ -29,6 +33,7 @@ func LoadUrl(r *gin.Engine) {
// 蜜罐列表
r.GET("/fish", login.Jump, fish.Html)
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/typeList", login.Jump, fish.GetFishTypeInfo)
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.POST("/post/mail/sendEmail", login.Jump, mail.SendEmailToUsers)
// 设置
r.GET("/setting", login.Jump, setting.Html)
r.GET("/get/setting/info", login.Jump, setting.GetSettingInfo)
r.POST("/post/setting/update", login.Jump, setting.UpdateEmailInfo)
r.POST("/post/setting/updateAlertMail", login.Jump, setting.UpdateAlertMail)
r.POST("/post/setting/checkSetting", login.Jump, setting.UpdateStatusSetting)
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.POST("/post/setting/clearData", login.Jump, setting.ClearData)
// 系统设置->告警通知
r.GET("/setting", login.Jump, alert.Html)
r.GET("/get/setting/alert", login.Jump, alert.GetAlertData)
r.POST("/post/setting/alert", login.Jump, alert.UpdateAlertData)
r.POST("/post/setting/syslog/test", login.Jump, alert.TestSyslog)
r.POST("/post/setting/email/test", login.Jump, alert.TestEmail)
// 系统设置->群发设置
r.GET("/get/setting/massset", login.Jump, massset.GetMassSet)
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 接口
// 解决跨域问题