clash/component/geodata/utils.go

85 lines
1.6 KiB
Go
Raw Normal View History

2021-11-17 08:03:47 +00:00
package geodata
import (
"github.com/Dreamacro/clash/component/geodata/router"
2022-03-15 14:25:33 +00:00
C "github.com/Dreamacro/clash/constant"
"strings"
2021-11-17 08:03:47 +00:00
)
2022-02-04 16:51:06 +00:00
var geoLoaderName = "memconservative"
// geoLoaderName = "standard"
func LoaderName() string {
return geoLoaderName
}
func SetLoader(newLoader string) {
2022-04-11 05:23:59 +00:00
if newLoader == "memc" {
newLoader = "memconservative"
}
2022-02-04 16:51:06 +00:00
geoLoaderName = newLoader
}
2022-03-15 14:25:33 +00:00
func Verify(name string) bool {
switch name {
case C.GeositeName:
_, _, err := LoadGeoSiteMatcher("CN")
return err == nil
case C.GeoipName:
_, _, err := LoadGeoIPMatcher("CN")
return err == nil
default:
return false
}
}
2021-11-17 08:03:47 +00:00
func LoadGeoSiteMatcher(countryCode string) (*router.DomainMatcher, int, error) {
geoLoader, err := GetGeoDataLoader(geoLoaderName)
if err != nil {
return nil, 0, err
}
domains, err := geoLoader.LoadGeoSite(countryCode)
if err != nil {
return nil, 0, err
}
/**
linear: linear algorithm
matcher, err := router.NewDomainMatcher(domains)
mphminimal perfect hash algorithm
*/
matcher, err := router.NewMphMatcherGroup(domains)
if err != nil {
return nil, 0, err
}
return matcher, len(domains), nil
}
func LoadGeoIPMatcher(country string) (*router.GeoIPMatcher, int, error) {
geoLoader, err := GetGeoDataLoader(geoLoaderName)
if err != nil {
return nil, 0, err
}
records, err := geoLoader.LoadGeoIP(strings.ReplaceAll(country, "!", ""))
if err != nil {
return nil, 0, err
}
geoIP := &router.GeoIP{
CountryCode: country,
Cidr: records,
ReverseMatch: strings.Contains(country, "!"),
}
matcher, err := router.NewGeoIPMatcher(geoIP)
if err != nil {
return nil, 0, err
}
return matcher, len(records), nil
}