HFish/view/dashboard/view.go
2019-10-28 22:25:40 +08:00

396 lines
8.4 KiB
Go

package dashboard
import (
"github.com/gin-gonic/gin"
"net/http"
"HFish/core/dbUtil"
"HFish/utils/conf"
"strconv"
"HFish/error"
"HFish/utils/log"
)
func Html(c *gin.Context) {
// 查询上钩数量
webSum, _ := dbUtil.DB().Table("hfish_info").Where("type", "=", "WEB").Count()
sshSum, _ := dbUtil.DB().Table("hfish_info").Where("type", "=", "SSH").Count()
redisSum, _ := dbUtil.DB().Table("hfish_info").Where("type", "=", "REDIS").Count()
mysqlSum, _ := dbUtil.DB().Table("hfish_info").Where("type", "=", "MYSQL").Count()
deepSum, _ := dbUtil.DB().Table("hfish_info").Where("type", "=", "DEEP").Count()
telnetSum, _ := dbUtil.DB().Table("hfish_info").Where("type", "=", "TELNET").Count()
ftpSum, _ := dbUtil.DB().Table("hfish_info").Where("type", "=", "FTP").Count()
memCacheSum, _ := dbUtil.DB().Table("hfish_info").Where("type", "=", "MEMCACHE").Count()
// 读取服务运行状态
mysqlStatus := conf.Get("mysql", "status")
redisStatus := conf.Get("redis", "status")
sshStatus := conf.Get("ssh", "status")
webStatus := conf.Get("web", "status")
apiStatus := conf.Get("api", "status")
deepStatus := conf.Get("deep", "status")
telnetStatus := conf.Get("telnet", "status")
ftpStatus := conf.Get("ftp", "status")
memCacheStatus := conf.Get("mem_cache", "status")
httpStatus := conf.Get("http", "status")
tftpStatus := conf.Get("tftp", "status")
esStatus := conf.Get("elasticsearch", "status")
vncStatus := conf.Get("vnc", "status")
c.HTML(http.StatusOK, "dashboard.html", gin.H{
"webSum": webSum,
"sshSum": sshSum,
"redisSum": redisSum,
"mysqlSum": mysqlSum,
"deepSum": deepSum,
"telnetSum": telnetSum,
"ftpSum": ftpSum,
"memCacheSum": memCacheSum,
"webStatus": webStatus,
"sshStatus": sshStatus,
"redisStatus": redisStatus,
"mysqlStatus": mysqlStatus,
"apiStatus": apiStatus,
"deepStatus": deepStatus,
"telnetStatus": telnetStatus,
"ftpStatus": ftpStatus,
"memCacheStatus": memCacheStatus,
"httpStatus": httpStatus,
"tftpStatus": tftpStatus,
"esStatus": esStatus,
"vncStatus": vncStatus,
})
}
func getData(sql string) map[string]interface{} {
var result []map[string]interface{}
err := dbUtil.DB().Table(&result).Query(sql)
if err != nil {
log.Pr("HFish", "127.0.0.1", "查询SQL失败", err)
}
resultMap := make(map[string]interface{})
for k := range result {
resultMap[result[k]["hour"].(string)] = result[k]["sum"]
}
return resultMap
}
// 仪表盘折线图 统计
func GetFishData(c *gin.Context) {
var sqlWeb string
var sqlSsh string
var sqlRedis string
var sqlMysql string
var sqlDeep string
var sqlFtp string
var sqlTelnet string
var sqlMemCache string
// 此处为了兼容 Mysql + Sqlite
dbType := conf.Get("admin", "db_type")
if dbType == "sqlite" {
// 统计 web
sqlWeb = `
SELECT
strftime("%H", create_time) AS hour,
sum(1) AS sum
FROM
hfish_info
WHERE
strftime('%s', datetime('now')) - strftime('%s', create_time) < (24 * 3600)
AND type="WEB"
GROUP BY
hour;
`
// 统计 ssh
sqlSsh = `
SELECT
strftime("%H", create_time) AS hour,
sum(1) AS sum
FROM
hfish_info
WHERE
strftime('%s', datetime('now')) - strftime('%s', create_time) < (24 * 3600)
AND type="SSH"
GROUP BY
hour;
`
// 统计 redis
sqlRedis = `
SELECT
strftime("%H", create_time) AS hour,
sum(1) AS sum
FROM
hfish_info
WHERE
strftime('%s', datetime('now')) - strftime('%s', create_time) < (24 * 3600)
AND type="REDIS"
GROUP BY
hour;
`
// 统计 mysql
sqlMysql = `
SELECT
strftime("%H", create_time) AS hour,
sum(1) AS sum
FROM
hfish_info
WHERE
strftime('%s', datetime('now')) - strftime('%s', create_time) < (24 * 3600)
AND type="MYSQL"
GROUP BY
hour;
`
// 统计 deep
sqlDeep = `
SELECT
strftime("%H", create_time) AS hour,
sum(1) AS sum
FROM
hfish_info
WHERE
strftime('%s', datetime('now')) - strftime('%s', create_time) < (24 * 3600)
AND type="DEEP"
GROUP BY
hour;
`
// 统计 ftp
sqlFtp = `
SELECT
strftime("%H", create_time) AS hour,
sum(1) AS sum
FROM
hfish_info
WHERE
strftime('%s', datetime('now')) - strftime('%s', create_time) < (24 * 3600)
AND type="FTP"
GROUP BY
hour;
`
// 统计 Telnet
sqlTelnet = `
SELECT
strftime("%H", create_time) AS hour,
sum(1) AS sum
FROM
hfish_info
WHERE
strftime('%s', datetime('now')) - strftime('%s', create_time) < (24 * 3600)
AND type="TELNET"
GROUP BY
hour;
`
// 统计 MemCache
sqlMemCache = `
SELECT
strftime("%H", create_time) AS hour,
sum(1) AS sum
FROM
hfish_info
WHERE
strftime('%s', datetime('now')) - strftime('%s', create_time) < (24 * 3600)
AND type="MEMCACHE"
GROUP BY
hour;
`
} else if dbType == "mysql" {
// 统计 web
sqlWeb = `
SELECT
DATE_FORMAT(create_time,"%H") AS hour,
sum(1) AS sum
FROM
hfish_info
WHERE
create_time >= (NOW() - INTERVAL 24 HOUR)
AND type = "WEB"
GROUP BY
hour;
`
// 统计 ssh
sqlSsh = `
SELECT
DATE_FORMAT(create_time,"%H") AS hour,
sum(1) AS sum
FROM
hfish_info
WHERE
create_time >= (NOW() - INTERVAL 24 HOUR)
AND type = "SSH"
GROUP BY
hour;
`
// 统计 redis
sqlRedis = `
SELECT
DATE_FORMAT(create_time,"%H") AS hour,
sum(1) AS sum
FROM
hfish_info
WHERE
create_time >= (NOW() - INTERVAL 24 HOUR)
AND type = "REDIS"
GROUP BY
hour;
`
// 统计 mysql
sqlMysql = `
SELECT
DATE_FORMAT(create_time,"%H") AS hour,
sum(1) AS sum
FROM
hfish_info
WHERE
create_time >= (NOW() - INTERVAL 24 HOUR)
AND type = "MYSQL"
GROUP BY
hour;
`
// 统计 deep
sqlDeep = `
SELECT
DATE_FORMAT(create_time,"%H") AS hour,
sum(1) AS sum
FROM
hfish_info
WHERE
create_time >= (NOW() - INTERVAL 24 HOUR)
AND type = "DEEP"
GROUP BY
hour;
`
// 统计 ftp
sqlFtp = `
SELECT
DATE_FORMAT(create_time,"%H") AS hour,
sum(1) AS sum
FROM
hfish_info
WHERE
create_time >= (NOW() - INTERVAL 24 HOUR)
AND type = "FTP"
GROUP BY
hour;
`
// 统计 Telnet
sqlTelnet = `
SELECT
DATE_FORMAT(create_time,"%H") AS hour,
sum(1) AS sum
FROM
hfish_info
WHERE
create_time >= (NOW() - INTERVAL 24 HOUR)
AND type = "TELNET"
GROUP BY
hour;
`
// 统计 MemCache
sqlMemCache = `
SELECT
DATE_FORMAT(create_time,"%H") AS hour,
sum(1) AS sum
FROM
hfish_info
WHERE
create_time >= (NOW() - INTERVAL 24 HOUR)
AND type = "MEMCACHE"
GROUP BY
hour;
`
}
webMap := getData(sqlWeb)
sshMap := getData(sqlSsh)
redisMap := getData(sqlRedis)
mysqlMap := getData(sqlMysql)
deepMap := getData(sqlDeep)
ftpMap := getData(sqlFtp)
telnetMap := getData(sqlTelnet)
memCacheMap := getData(sqlMemCache)
// 拼接 json
data := map[string]interface{}{
"web": webMap,
"ssh": sshMap,
"redis": redisMap,
"mysql": mysqlMap,
"deep": deepMap,
"ftp": ftpMap,
"telnet": telnetMap,
"memCache": memCacheMap,
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": data,
})
}
// 仪表盘攻击饼图统计
func GetFishPieData(c *gin.Context) {
// 统计攻击地区
resultRegion, errRegion := dbUtil.DB().Table("hfish_info").Fields("country", "count(1) AS sum").Where("country", "!=", "").GroupBy("country").OrderBy("sum desc").Limit(10).Get()
if errRegion != nil {
log.Pr("HFish", "127.0.0.1", "统计攻击地区失败", errRegion)
}
var regionList []map[string]string
for k := range resultRegion {
regionMap := make(map[string]string)
regionMap["name"] = resultRegion[k]["country"].(string)
regionMap["value"] = strconv.FormatInt(resultRegion[k]["sum"].(int64), 10)
regionList = append(regionList, regionMap)
}
// 统计攻击IP
resultIP, errIp := dbUtil.DB().Table("hfish_info").Fields("ip", "count(1) AS sum").Where("ip", "!=", "").GroupBy("ip").OrderBy("sum desc").Limit(10).Get()
if errIp != nil {
log.Pr("HFish", "127.0.0.1", "统计攻击IP失败", errIp)
}
var ipList []map[string]string
for k := range resultIP {
ipMap := make(map[string]string)
ipMap["name"] = resultIP[k]["ip"].(string)
ipMap["value"] = strconv.FormatInt(resultIP[k]["sum"].(int64), 10)
ipList = append(ipList, ipMap)
}
data := map[string]interface{}{
"regionList": regionList,
"ipList": ipList,
}
c.JSON(http.StatusOK, gin.H{
"code": error.ErrSuccessCode,
"msg": error.ErrSuccessMsg,
"data": data,
})
}