mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2026-02-26 16:57:08 +00:00
chore: cleanup geo internal code
This commit is contained in:
@@ -6,8 +6,10 @@ import (
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/metacubex/mihomo/common/atomic"
|
||||
mihomoHttp "github.com/metacubex/mihomo/component/http"
|
||||
"github.com/metacubex/mihomo/component/mmdb"
|
||||
C "github.com/metacubex/mihomo/constant"
|
||||
@@ -18,12 +20,79 @@ var (
|
||||
initGeoSite bool
|
||||
initGeoIP int
|
||||
initASN bool
|
||||
|
||||
initGeoSiteMutex sync.Mutex
|
||||
initGeoIPMutex sync.Mutex
|
||||
initASNMutex sync.Mutex
|
||||
|
||||
geoIpEnable atomic.Bool
|
||||
geoSiteEnable atomic.Bool
|
||||
asnEnable atomic.Bool
|
||||
|
||||
geoIpUrl string
|
||||
mmdbUrl string
|
||||
geoSiteUrl string
|
||||
asnUrl string
|
||||
)
|
||||
|
||||
func GeoIpUrl() string {
|
||||
return geoIpUrl
|
||||
}
|
||||
|
||||
func SetGeoIpUrl(url string) {
|
||||
geoIpUrl = url
|
||||
}
|
||||
|
||||
func MmdbUrl() string {
|
||||
return mmdbUrl
|
||||
}
|
||||
|
||||
func SetMmdbUrl(url string) {
|
||||
mmdbUrl = url
|
||||
}
|
||||
|
||||
func GeoSiteUrl() string {
|
||||
return geoSiteUrl
|
||||
}
|
||||
|
||||
func SetGeoSiteUrl(url string) {
|
||||
geoSiteUrl = url
|
||||
}
|
||||
|
||||
func ASNUrl() string {
|
||||
return asnUrl
|
||||
}
|
||||
|
||||
func SetASNUrl(url string) {
|
||||
asnUrl = url
|
||||
}
|
||||
|
||||
func downloadToPath(url string, path string) (err error) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), time.Second*90)
|
||||
defer cancel()
|
||||
resp, err := mihomoHttp.HttpRequest(ctx, url, http.MethodGet, nil, nil)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0o644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
_, err = io.Copy(f, resp.Body)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func InitGeoSite() error {
|
||||
geoSiteEnable.Store(true)
|
||||
initGeoSiteMutex.Lock()
|
||||
defer initGeoSiteMutex.Unlock()
|
||||
if _, err := os.Stat(C.Path.GeoSite()); os.IsNotExist(err) {
|
||||
log.Infoln("Can't find GeoSite.dat, start download")
|
||||
if err := downloadGeoSite(C.Path.GeoSite()); err != nil {
|
||||
if err := downloadToPath(GeoSiteUrl(), C.Path.GeoSite()); err != nil {
|
||||
return fmt.Errorf("can't download GeoSite.dat: %s", err.Error())
|
||||
}
|
||||
log.Infoln("Download GeoSite.dat finish")
|
||||
@@ -35,7 +104,7 @@ func InitGeoSite() error {
|
||||
if err := os.Remove(C.Path.GeoSite()); err != nil {
|
||||
return fmt.Errorf("can't remove invalid GeoSite.dat: %s", err.Error())
|
||||
}
|
||||
if err := downloadGeoSite(C.Path.GeoSite()); err != nil {
|
||||
if err := downloadToPath(GeoSiteUrl(), C.Path.GeoSite()); err != nil {
|
||||
return fmt.Errorf("can't download GeoSite.dat: %s", err.Error())
|
||||
}
|
||||
}
|
||||
@@ -44,49 +113,14 @@ func InitGeoSite() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func downloadGeoSite(path string) (err error) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), time.Second*90)
|
||||
defer cancel()
|
||||
resp, err := mihomoHttp.HttpRequest(ctx, C.GeoSiteUrl, http.MethodGet, http.Header{"User-Agent": {C.UA}}, nil)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0o644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
_, err = io.Copy(f, resp.Body)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func downloadGeoIP(path string) (err error) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), time.Second*90)
|
||||
defer cancel()
|
||||
resp, err := mihomoHttp.HttpRequest(ctx, C.GeoIpUrl, http.MethodGet, http.Header{"User-Agent": {C.UA}}, nil)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0o644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
_, err = io.Copy(f, resp.Body)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func InitGeoIP() error {
|
||||
if C.GeodataMode {
|
||||
geoIpEnable.Store(true)
|
||||
initGeoIPMutex.Lock()
|
||||
defer initGeoIPMutex.Unlock()
|
||||
if GeodataMode() {
|
||||
if _, err := os.Stat(C.Path.GeoIP()); os.IsNotExist(err) {
|
||||
log.Infoln("Can't find GeoIP.dat, start download")
|
||||
if err := downloadGeoIP(C.Path.GeoIP()); err != nil {
|
||||
if err := downloadToPath(GeoIpUrl(), C.Path.GeoIP()); err != nil {
|
||||
return fmt.Errorf("can't download GeoIP.dat: %s", err.Error())
|
||||
}
|
||||
log.Infoln("Download GeoIP.dat finish")
|
||||
@@ -99,7 +133,7 @@ func InitGeoIP() error {
|
||||
if err := os.Remove(C.Path.GeoIP()); err != nil {
|
||||
return fmt.Errorf("can't remove invalid GeoIP.dat: %s", err.Error())
|
||||
}
|
||||
if err := downloadGeoIP(C.Path.GeoIP()); err != nil {
|
||||
if err := downloadToPath(GeoIpUrl(), C.Path.GeoIP()); err != nil {
|
||||
return fmt.Errorf("can't download GeoIP.dat: %s", err.Error())
|
||||
}
|
||||
}
|
||||
@@ -110,7 +144,7 @@ func InitGeoIP() error {
|
||||
|
||||
if _, err := os.Stat(C.Path.MMDB()); os.IsNotExist(err) {
|
||||
log.Infoln("Can't find MMDB, start download")
|
||||
if err := mmdb.DownloadMMDB(C.Path.MMDB()); err != nil {
|
||||
if err := downloadToPath(MmdbUrl(), C.Path.MMDB()); err != nil {
|
||||
return fmt.Errorf("can't download MMDB: %s", err.Error())
|
||||
}
|
||||
}
|
||||
@@ -121,7 +155,7 @@ func InitGeoIP() error {
|
||||
if err := os.Remove(C.Path.MMDB()); err != nil {
|
||||
return fmt.Errorf("can't remove invalid MMDB: %s", err.Error())
|
||||
}
|
||||
if err := mmdb.DownloadMMDB(C.Path.MMDB()); err != nil {
|
||||
if err := downloadToPath(MmdbUrl(), C.Path.MMDB()); err != nil {
|
||||
return fmt.Errorf("can't download MMDB: %s", err.Error())
|
||||
}
|
||||
}
|
||||
@@ -131,9 +165,12 @@ func InitGeoIP() error {
|
||||
}
|
||||
|
||||
func InitASN() error {
|
||||
asnEnable.Store(true)
|
||||
initASNMutex.Lock()
|
||||
defer initASNMutex.Unlock()
|
||||
if _, err := os.Stat(C.Path.ASN()); os.IsNotExist(err) {
|
||||
log.Infoln("Can't find ASN.mmdb, start download")
|
||||
if err := mmdb.DownloadASN(C.Path.ASN()); err != nil {
|
||||
if err := downloadToPath(ASNUrl(), C.Path.ASN()); err != nil {
|
||||
return fmt.Errorf("can't download ASN.mmdb: %s", err.Error())
|
||||
}
|
||||
log.Infoln("Download ASN.mmdb finish")
|
||||
@@ -145,7 +182,7 @@ func InitASN() error {
|
||||
if err := os.Remove(C.Path.ASN()); err != nil {
|
||||
return fmt.Errorf("can't remove invalid ASN: %s", err.Error())
|
||||
}
|
||||
if err := mmdb.DownloadASN(C.Path.ASN()); err != nil {
|
||||
if err := downloadToPath(ASNUrl(), C.Path.ASN()); err != nil {
|
||||
return fmt.Errorf("can't download ASN: %s", err.Error())
|
||||
}
|
||||
}
|
||||
@@ -153,3 +190,15 @@ func InitASN() error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GeoIpEnable() bool {
|
||||
return geoIpEnable.Load()
|
||||
}
|
||||
|
||||
func GeoSiteEnable() bool {
|
||||
return geoSiteEnable.Load()
|
||||
}
|
||||
|
||||
func ASNEnable() bool {
|
||||
return asnEnable.Load()
|
||||
}
|
||||
|
||||
@@ -13,8 +13,6 @@ import (
|
||||
|
||||
var (
|
||||
geoMode bool
|
||||
AutoUpdate bool
|
||||
UpdateInterval int
|
||||
geoLoaderName = "memconservative"
|
||||
geoSiteMatcher = "succinct"
|
||||
)
|
||||
@@ -25,14 +23,6 @@ func GeodataMode() bool {
|
||||
return geoMode
|
||||
}
|
||||
|
||||
func GeoAutoUpdate() bool {
|
||||
return AutoUpdate
|
||||
}
|
||||
|
||||
func GeoUpdateInterval() int {
|
||||
return UpdateInterval
|
||||
}
|
||||
|
||||
func LoaderName() string {
|
||||
return geoLoaderName
|
||||
}
|
||||
@@ -44,12 +34,6 @@ func SiteMatcherName() string {
|
||||
func SetGeodataMode(newGeodataMode bool) {
|
||||
geoMode = newGeodataMode
|
||||
}
|
||||
func SetGeoAutoUpdate(newAutoUpdate bool) {
|
||||
AutoUpdate = newAutoUpdate
|
||||
}
|
||||
func SetGeoUpdateInterval(newGeoUpdateInterval int) {
|
||||
UpdateInterval = newGeoUpdateInterval
|
||||
}
|
||||
|
||||
func SetLoader(newLoader string) {
|
||||
if newLoader == "memc" {
|
||||
|
||||
Reference in New Issue
Block a user