1
0
mirror of https://github.com/zu1k/nali.git synced 2025-02-03 10:52:41 +08:00
nali/internal/db/db.go

143 lines
3.2 KiB
Go
Raw Normal View History

2021-08-02 12:01:25 +08:00
package db
import (
"log"
2021-08-11 10:02:54 +08:00
"os"
2021-08-02 12:01:25 +08:00
"path/filepath"
2021-10-26 13:23:05 +08:00
"strings"
2021-08-02 12:01:25 +08:00
"github.com/zu1k/nali/internal/constant"
"github.com/zu1k/nali/pkg/cdn"
"github.com/zu1k/nali/pkg/dbif"
2021-08-11 17:52:26 +08:00
"github.com/zu1k/nali/pkg/geoip"
"github.com/zu1k/nali/pkg/ip2region"
2021-08-11 17:52:26 +08:00
"github.com/zu1k/nali/pkg/ipip"
2021-08-02 12:01:25 +08:00
"github.com/zu1k/nali/pkg/qqwry"
"github.com/zu1k/nali/pkg/zxipv6wry"
)
var (
QQWryPath = filepath.Join(constant.HomePath, "qqwry.dat")
ZXIPv6WryPath = filepath.Join(constant.HomePath, "zxipv6wry.db")
GeoLite2CityPath = filepath.Join(constant.HomePath, "GeoLite2-City.mmdb")
IPIPFreePath = filepath.Join(constant.HomePath, "ipipfree.ipdb")
Ip2RegionPath = filepath.Join(constant.HomePath, "ip2region.db")
2021-08-02 12:01:25 +08:00
CDNPath = filepath.Join(constant.HomePath, "cdn.json")
2021-08-11 10:02:54 +08:00
Language = "zh-CN"
IPv4DBSelected = ""
IPv6DBSelected = ""
2021-08-02 12:01:25 +08:00
)
2021-08-11 10:02:54 +08:00
func init() {
lang := os.Getenv("NALI_LANG")
if lang != "" {
Language = lang
}
ipv4DB := os.Getenv("NALI_DB_IP4")
if ipv4DB != "" {
IPv4DBSelected = ipv4DB
}
ipv6DB := os.Getenv("NALI_DB_IP6")
if ipv6DB != "" {
IPv6DBSelected = ipv6DB
}
}
2021-08-02 12:01:25 +08:00
func GetDB(typ dbif.QueryType) (db dbif.DB) {
if db, found := dbCache[typ]; found {
return db
}
var err error
2021-08-02 12:01:25 +08:00
switch typ {
case dbif.TypeIPv4:
2021-08-11 10:02:54 +08:00
if IPv4DBSelected != "" {
db, err = GetIPDBbyName(IPv4DBSelected)
2021-08-11 10:02:54 +08:00
} else {
if Language == "zh-CN" {
db, err = qqwry.NewQQwry(QQWryPath)
2021-08-11 10:02:54 +08:00
} else {
db, err = geoip.NewGeoIP(GeoLite2CityPath)
2021-08-11 10:02:54 +08:00
}
}
2021-08-02 12:01:25 +08:00
case dbif.TypeIPv6:
2021-08-11 10:02:54 +08:00
if IPv6DBSelected != "" {
db, err = GetIPDBbyName(IPv6DBSelected)
2021-08-11 10:02:54 +08:00
} else {
if Language == "zh-CN" {
db, err = zxipv6wry.NewZXwry(ZXIPv6WryPath)
2021-08-11 10:02:54 +08:00
} else {
db, err = geoip.NewGeoIP(GeoLite2CityPath)
2021-08-11 10:02:54 +08:00
}
}
2021-08-02 12:01:25 +08:00
case dbif.TypeDomain:
db, err = cdn.NewCDN(CDNPath)
2021-08-02 12:01:25 +08:00
default:
panic("Query type not supported!")
}
2021-08-11 10:02:54 +08:00
if err != nil || db == nil {
log.Fatalln("Database init failed:", err)
}
2021-08-11 10:02:54 +08:00
dbCache[typ] = db
2021-08-02 12:01:25 +08:00
return
}
func GetIPDBbyName(name string) (dbif.DB, error) {
name = strings.ToLower(name)
2021-08-11 10:02:54 +08:00
switch name {
case "geo", "geoip", "geoip2":
return geoip.NewGeoIP(GeoLite2CityPath)
case "chunzhen", "qqip", "qqwry":
return qqwry.NewQQwry(QQWryPath)
case "ipip", "ipipfree", "ipip.net":
return ipip.NewIPIPFree(IPIPFreePath)
case "ip2region", "region", "i2r":
return ip2region.NewIp2Region(Ip2RegionPath)
2021-08-11 10:02:54 +08:00
default:
return qqwry.NewQQwry(QQWryPath)
}
}
func UpdateAllDB() {
log.Println("正在下载最新 纯真 IPv4数据库...")
_, err := qqwry.Download(QQWryPath)
if err != nil {
log.Fatalln("数据库 QQWry 下载失败:", err)
}
log.Println("正在下载最新 ZX IPv6数据库...")
_, err = zxipv6wry.Download(ZXIPv6WryPath)
if err != nil {
log.Fatalln("数据库 ZXIPv6Wry 下载失败:", err)
}
_, err = ip2region.Download(Ip2RegionPath)
if err != nil {
log.Fatalln("数据库 Ip2Region 下载失败:", err)
}
log.Println("正在下载最新 CDN服务提供商数据库...")
_, err = cdn.Download(CDNPath)
if err != nil {
log.Fatalln("数据库 CDN 下载失败:", err)
}
2021-08-02 12:01:25 +08:00
}
2021-08-11 10:02:54 +08:00
func Find(typ dbif.QueryType, query string) string {
if result, found := queryCache[query]; found {
return result
}
result, err := GetDB(typ).Find(query, Language)
if err != nil {
return ""
}
2021-10-26 13:23:05 +08:00
r := strings.Trim(result.String(), " ")
queryCache[query] = r
return r
2021-08-11 10:02:54 +08:00
}