diff --git a/README.md b/README.md index 4d487475..8a8372f4 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ However the C version has too few functions, and the js version is too big and t - Interactive query - Offline query - Both ipv4 and ipv6 supported +- Multilingual support - CDN provider query - Full platform support - Color print @@ -193,7 +194,7 @@ Flags: Use "nali [command] --help" for more information about a command. ``` -### Update chunzhen IP database +### Update database ``` $ nali update @@ -201,9 +202,9 @@ $ nali update 2020/07/17 12:54:05 已将最新的纯真 IP 库保存到本地 /root/.nali/qqwry.dat ``` -### Use other database +### Select database -Set environment variables `NALI_DB` +Users can specify which database to use, set environment variables `NALI_DB_IP4`, `NALI_DB_IP6` or both. supported database: @@ -216,21 +217,21 @@ supported database: ##### Use geoip db ``` -set NALI_DB=geoip +set NALI_DB_IP4=geoip or use powershell -$env:NALI_DB="geoip" +$env:NALI_DB_IP4="geoip" ``` ##### Use ipip db ``` -set NALI_DB=ipip +set NALI_DB_IP6=ipip or use powershell -$env:NALI_DB="ipip" +$env:NALI_DB_IP6="ipip" ``` #### Linux @@ -238,13 +239,24 @@ $env:NALI_DB="ipip" ##### Use geoip db ``` -export NALI_DB=geoip +export NALI_DB_IP4=geoip ``` ##### Use ipip db ``` -export NALI_DB=ipip +export NALI_DB_IP6=ipip +``` + +### Multilingual support + +Specify the language to be used by modifying the environment variable `NALI_LANG`, when using a non-Chinese language only the GeoIP2 database is supported + +The values that can be set for this parameter can be found in the list of supported databases for GeoIP2 + +``` +# NALI_LANG=en nali 1.1.1.1 +1.1.1.1 [Australia] ``` ### Change database directory diff --git a/README_zh-CN.md b/README_zh-CN.md index 199e22a1..91fb40a4 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -35,8 +35,10 @@ - 支持管道处理 - 支持交互式查询 - 同时支持IPv4和IPv6 +- 支持多语言 - 查询完全离线 - 全平台支持 +- 支持彩色输出 ## 安装 @@ -159,28 +161,6 @@ Address: 2a00:1450:400e:809::200e [荷兰Amsterdam Google Inc. 服务器网段] 因为 CDN 服务通常使用 CNAME 的域名解析方式,所以推荐与 `nslookup` 或者 `dig` 配合使用,在已经知道 CNAME 后可单独使用 -#### 只查询 CDN 服务提供商 - -``` -$ nslookup www.gov.cn | nali cdn -Server: 127.0.0.53 -Address: 127.0.0.53#53 - -Non-authoritative answer: -www.gov.cn canonical name = www.gov.cn.bsgslb.cn [白山云 CDN]. -www.gov.cn.bsgslb.cn [白山云 CDN] canonical name = zgovweb.v.bsgslb.cn [白山云 CDN]. -Name: zgovweb.v.bsgslb.cn [白山云 CDN] -Address: 185.232.56.148 -Name: zgovweb.v.bsgslb.cn [白山云 CDN] -Address: 185.232.56.147 -Name: zgovweb.v.bsgslb.cn [白山云 CDN] -Address: 2001:428:6402:21b::6 -Name: zgovweb.v.bsgslb.cn [白山云 CDN] -Address: 2001:428:6402:21b::5 -``` - -#### 查询所有信息 - ``` $ nslookup www.gov.cn | nali Server: 127.0.0.53 [局域网 IP] @@ -197,14 +177,6 @@ Name: zgovweb.v.bsgslb.cn [白山云 CDN] Address: 2001:428:6402:21b::6 [美国Louisiana州Monroe Qwest Communications Company, LLC (CenturyLink)] ``` -#### 单独使用 - -需要提前查询到 CNAME 域名 - -``` -$ nali cdn cdn.somecdncname.com -``` - ## 用户交互 ### 查看帮助 @@ -216,9 +188,7 @@ Usage: nali [command] Available Commands: - cdn Query cdn service provider help Help about any command - parse Query IP information update update chunzhen ip database Flags: @@ -228,7 +198,7 @@ Flags: Use "nali [command] --help" for more information about a command. ``` -### 更新纯真数据库 +### 更新数据库 ``` $ nali update @@ -236,35 +206,36 @@ $ nali update 2020/07/17 12:54:05 已将最新的纯真 IP 库保存到本地 /root/.nali/qqwry.dat ``` -### 使用 Geoip2 数据库 +### 自选数据库 -需要设置环境变量: `NALI_DB` +用户可以指定使用哪个数据库,需要设置环境变量: `NALI_DB_IP4`、`NALI_DB_IP6` 或者两个同时设置 支持的变量内容: - Geoip2 `['geoip', 'geoip2', 'geo']` - Chunzhen `['chunzhen', 'qqip', 'qqwry']` +- IPIP `['ipip', 'ipipfree', 'ipip.net']` #### Windows平台 ##### 使用geoip数据库 ``` -set NALI_DB=geoip +set NALI_DB_IP4=geoip 或者使用 powershell -$env:NALI_DB="geoip" +$env:NALI_DB_IP4="geoip" ``` ##### 使用ipip数据库 ``` -set NALI_DB=ipip +set NALI_DB_IP6=ipip 或者使用 powershell -$env:NALI_DB="ipip" +$env:NALI_DB_IP6="ipip" ``` #### Linux平台 @@ -272,13 +243,24 @@ $env:NALI_DB="ipip" ##### 使用geoip数据库 ``` -export NALI_DB=geoip +export NALI_DB_IP4=geoip ``` ##### 使用ipip数据库 ``` -export NALI_DB=ipip +export NALI_DB_IP4=ipip +``` + +### 多语言支持 + +通过修改环境变量 `NALI_LANG` 来指定使用的语言,当使用非中文语言时仅支持GeoIP2这个数据库 + +该参数可设置的值见 GeoIP2 这个数据库的支持列表 + +``` +# NALI_LANG=en nali 1.1.1.1 +1.1.1.1 [Australia] ``` ### 更换数据库目录 diff --git a/internal/db/db.go b/internal/db/db.go index 48d68219..6d6ae186 100644 --- a/internal/db/db.go +++ b/internal/db/db.go @@ -1,8 +1,13 @@ package db import ( + "os" "path/filepath" + "github.com/zu1k/nali/pkg/ipip" + + "github.com/zu1k/nali/pkg/geoip" + "github.com/zu1k/nali/internal/constant" "github.com/zu1k/nali/pkg/cdn" "github.com/zu1k/nali/pkg/dbif" @@ -16,8 +21,29 @@ var ( GeoLite2CityPath = filepath.Join(constant.HomePath, "GeoLite2-City.mmdb") IPIPFreePath = filepath.Join(constant.HomePath, "ipipfree.ipdb") CDNPath = filepath.Join(constant.HomePath, "cdn.json") + + Language = "zh-CN" + IPv4DBSelected = "" + IPv6DBSelected = "" ) +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 + } +} + func GetDB(typ dbif.QueryType) (db dbif.DB) { if db, found := dbCache[typ]; found { return db @@ -25,21 +51,61 @@ func GetDB(typ dbif.QueryType) (db dbif.DB) { switch typ { case dbif.TypeIPv4: - db = qqwry.NewQQwry(QQWryPath) + if IPv4DBSelected != "" { + db = GetIPDBbyName(IPv4DBSelected) + } else { + if Language == "zh-CN" { + db = qqwry.NewQQwry(QQWryPath) + } else { + db = geoip.NewGeoIP(GeoLite2CityPath) + } + } case dbif.TypeIPv6: - db = zxipv6wry.NewZXwry(ZXIPv6WryPath) - // geoip2.NewGeoIP(GeoLite2CityPath) - // ipip.NewIPIPFree(IPIPFreePath) + if IPv6DBSelected != "" { + db = GetIPDBbyName(IPv6DBSelected) + } else { + if Language == "zh-CN" { + db = zxipv6wry.NewZXwry(ZXIPv6WryPath) + } else { + geoip.NewGeoIP(GeoLite2CityPath) + } + } case dbif.TypeDomain: db = cdn.NewCDN(CDNPath) default: panic("Query type not supported!") } + + dbCache[typ] = db return } +func GetIPDBbyName(name string) (db dbif.DB) { + 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) + default: + return qqwry.NewQQwry(QQWryPath) + } +} + func Update() { qqwry.Download(QQWryPath) zxipv6wry.Download(ZXIPv6WryPath) cdn.Download(CDNPath) } + +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 "" + } + return result.String() +} diff --git a/internal/db/find.go b/internal/db/find.go deleted file mode 100644 index 7e41cd32..00000000 --- a/internal/db/find.go +++ /dev/null @@ -1,17 +0,0 @@ -package db - -import ( - "github.com/zu1k/nali/pkg/dbif" -) - -func Find(typ dbif.QueryType, query string) string { - if result, found := queryCache[query]; found { - return result - } - result, err := GetDB(typ).Find(query) - if err != nil { - //log.Printf("Query [%s] error: %s\n", query, err) - return "" - } - return result.String() -} diff --git a/internal/db/ipdb.go b/internal/db/ipdb.go deleted file mode 100644 index a2f77998..00000000 --- a/internal/db/ipdb.go +++ /dev/null @@ -1,30 +0,0 @@ -package db - -import ( - "os" - "strings" -) - -// ip database type -type IPDBType int - -const ( - GEOIP2 = iota // geoip2 - QQIP // chunzhen - IPIP // ipip.net -) - -func GetIPDBType() IPDBType { - dbname := os.Getenv("NALI_DB") - dbname = strings.ToLower(dbname) - switch dbname { - case "geo", "geoip", "geoip2": - return GEOIP2 - case "chunzhen", "qqip", "qqwry": - return QQIP - case "ipip", "ipipfree", "ipip.net": - return IPIP - default: - return QQIP - } -} diff --git a/pkg/geoip/geoip.go b/pkg/geoip/geoip.go index 75426f97..1f75b05d 100644 --- a/pkg/geoip/geoip.go +++ b/pkg/geoip/geoip.go @@ -42,9 +42,16 @@ func (g GeoIP) Find(query string, params ...string) (result fmt.Stringer, err er return } + lang := "zh-CN" + if len(params) > 0 { + if _, ok := record.Country.Names[params[0]]; ok { + lang = params[0] + } + } + result = Result{ - Country: record.Country.Names["zh-CN"], - City: record.City.Names["zh-CN"], + Country: record.Country.Names[lang], + City: record.City.Names[lang], } return }