123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- package geodata
- import (
- "context"
- "fmt"
- "io"
- "net/http"
- "os"
- "time"
- mihomoHttp "github.com/metacubex/mihomo/component/http"
- "github.com/metacubex/mihomo/component/mmdb"
- C "github.com/metacubex/mihomo/constant"
- "github.com/metacubex/mihomo/log"
- )
- var (
- initGeoSite bool
- initGeoIP int
- initASN bool
- )
- func InitGeoSite() error {
- 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 {
- return fmt.Errorf("can't download GeoSite.dat: %s", err.Error())
- }
- log.Infoln("Download GeoSite.dat finish")
- initGeoSite = false
- }
- if !initGeoSite {
- if err := Verify(C.GeositeName); err != nil {
- log.Warnln("GeoSite.dat invalid, remove and download: %s", err)
- 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 {
- return fmt.Errorf("can't download GeoSite.dat: %s", err.Error())
- }
- }
- initGeoSite = true
- }
- 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 {
- 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 {
- return fmt.Errorf("can't download GeoIP.dat: %s", err.Error())
- }
- log.Infoln("Download GeoIP.dat finish")
- initGeoIP = 0
- }
- if initGeoIP != 1 {
- if err := Verify(C.GeoipName); err != nil {
- log.Warnln("GeoIP.dat invalid, remove and download: %s", err)
- 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 {
- return fmt.Errorf("can't download GeoIP.dat: %s", err.Error())
- }
- }
- initGeoIP = 1
- }
- return nil
- }
- 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 {
- return fmt.Errorf("can't download MMDB: %s", err.Error())
- }
- }
- if initGeoIP != 2 {
- if !mmdb.Verify(C.Path.MMDB()) {
- log.Warnln("MMDB invalid, remove and download")
- 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 {
- return fmt.Errorf("can't download MMDB: %s", err.Error())
- }
- }
- initGeoIP = 2
- }
- return nil
- }
- func InitASN() error {
- 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 {
- return fmt.Errorf("can't download ASN.mmdb: %s", err.Error())
- }
- log.Infoln("Download ASN.mmdb finish")
- initASN = false
- }
- if !initASN {
- if !mmdb.Verify(C.Path.ASN()) {
- log.Warnln("ASN invalid, remove and download")
- 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 {
- return fmt.Errorf("can't download ASN: %s", err.Error())
- }
- }
- initASN = true
- }
- return nil
- }
|