You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
2.4 KiB
113 lines
2.4 KiB
package cache
|
|
|
|
import (
|
|
"ehttp/http"
|
|
"epur-pay/pkg/logger"
|
|
"epur-pay/pkg/redis"
|
|
"errors"
|
|
"fmt"
|
|
"github.com/oschwald/geoip2-golang"
|
|
"net"
|
|
"reflect"
|
|
"runtime"
|
|
)
|
|
|
|
const IpStoreKey = "ipAA"
|
|
|
|
func NewIpLocation() {
|
|
go func() {
|
|
if err := LoadIpStore(); err != nil && err.Error() == "加载IP库失败,未找到IP库" {
|
|
_ = GetIpStore(Global.Caches.Config.Get("IpStoreRemoteAddr"))
|
|
}
|
|
}()
|
|
}
|
|
|
|
func LoadIpStore() (err error) {
|
|
|
|
conn := redis.RPool.Get()
|
|
|
|
defer func() {
|
|
if err1 := conn.Close(); err1 != nil {
|
|
logger.ErrorLogger.Infoln(err1.Error())
|
|
err = err1
|
|
}
|
|
}()
|
|
|
|
var reply interface{}
|
|
|
|
if reply, err = conn.Do("GET", IpStoreKey); err != nil {
|
|
logger.AccessLogger.Errorln("加载IP库失败:", err.Error())
|
|
return
|
|
} else if reply != nil {
|
|
if Global.IpLocation, err = geoip2.FromBytes(reply.([]byte)); err != nil {
|
|
logger.AccessLogger.Errorln("Error opening IP2Location database:", err)
|
|
return
|
|
}
|
|
logger.AccessLogger.Infoln("加载IP库成功...")
|
|
} else {
|
|
logger.AccessLogger.Warnln("加载IP库失败,未找到IP库")
|
|
err = errors.New("加载IP库失败,未找到IP库")
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
func GetIpStore(url string) (err error) {
|
|
|
|
logger.AccessLogger.Infoln("开始获取IP库数据...")
|
|
|
|
conn := redis.RPool.Get()
|
|
|
|
defer func() {
|
|
if err1 := conn.Close(); err1 != nil {
|
|
logger.ErrorLogger.Infoln(err1.Error())
|
|
err = err1
|
|
} else {
|
|
_ = LoadIpStore()
|
|
}
|
|
}()
|
|
|
|
req := http.New(
|
|
http.WithUrl(url),
|
|
http.WithMethod(http.GET),
|
|
)
|
|
if err = req.Do(); err != nil {
|
|
logger.AccessLogger.Errorln("获取远端IP失败:", err.Error())
|
|
return
|
|
}
|
|
if err = conn.Send("SET", IpStoreKey, req.Result); err != nil {
|
|
logger.AccessLogger.Errorln("获取远端IP失败:", err.Error())
|
|
return
|
|
}
|
|
if err = conn.Flush(); err != nil {
|
|
logger.AccessLogger.Errorln("获取远端IP失败:", err.Error())
|
|
return
|
|
}
|
|
logger.AccessLogger.Infoln("IP库数据获取完毕...")
|
|
|
|
return
|
|
}
|
|
|
|
func GetIpAddress(ip string) string {
|
|
|
|
defer func() {
|
|
err := recover()
|
|
if err != nil {
|
|
buf := make([]byte, 1<<16)
|
|
runtime.Stack(buf, true)
|
|
e := reflect.ValueOf(err)
|
|
logger.AccessLogger.Errorln(e.String())
|
|
}
|
|
}()
|
|
|
|
if len(ip) > 0 && Global.IpLocation != nil {
|
|
// 查询 IP 地址信息
|
|
record, err := Global.IpLocation.City(net.ParseIP(ip))
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
return fmt.Sprintf("%s %s", record.Country.Names["zh-CN"], record.City.Names["zh-CN"])
|
|
}
|
|
return ""
|
|
}
|