diff --git a/config/initial.go b/config/initial.go new file mode 100644 index 00000000..b13eefd0 --- /dev/null +++ b/config/initial.go @@ -0,0 +1,72 @@ +package config + +import ( + "archive/tar" + "compress/gzip" + "io" + "net/http" + "os" + "strings" + + C "github.com/Dreamacro/clash/constant" + + log "github.com/sirupsen/logrus" +) + +func downloadMMDB(path string) (err error) { + resp, err := http.Get("http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.tar.gz") + if err != nil { + return + } + defer resp.Body.Close() + + gr, err := gzip.NewReader(resp.Body) + if err != nil { + return + } + defer gr.Close() + + tr := tar.NewReader(gr) + for { + h, err := tr.Next() + if err == io.EOF { + break + } else if err != nil { + return err + } + + if !strings.HasSuffix(h.Name, "GeoLite2-Country.mmdb") { + continue + } + + f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + return err + } + defer f.Close() + _, err = io.Copy(f, tr) + if err != nil { + return err + } + } + + return nil +} + +// Init prepare necessary files +func Init() { + // initial config.ini + if _, err := os.Stat(C.ConfigPath); os.IsNotExist(err) { + log.Info("Can't find config, create a empty file") + os.OpenFile(C.ConfigPath, os.O_CREATE|os.O_WRONLY, 0644) + } + + // initial mmdb + if _, err := os.Stat(C.MMDBPath); os.IsNotExist(err) { + log.Info("Can't find MMDB, start download") + err := downloadMMDB(C.MMDBPath) + if err != nil { + log.Fatalf("Can't download MMDB: %s", err.Error()) + } + } +} diff --git a/constant/config.go b/constant/config.go index c12c208b..b090edfb 100644 --- a/constant/config.go +++ b/constant/config.go @@ -1,14 +1,9 @@ package constant import ( - "archive/tar" - "compress/gzip" - "io" - "net/http" "os" "os/user" "path" - "strings" log "github.com/sirupsen/logrus" ) @@ -52,57 +47,5 @@ func init() { } ConfigPath = path.Join(dirPath, "config.ini") - if _, err := os.Stat(ConfigPath); os.IsNotExist(err) { - log.Info("Can't find config, create a empty file") - os.OpenFile(ConfigPath, os.O_CREATE|os.O_WRONLY, 0644) - } - MMDBPath = path.Join(dirPath, "Country.mmdb") - if _, err := os.Stat(MMDBPath); os.IsNotExist(err) { - log.Info("Can't find MMDB, start download") - err := downloadMMDB(MMDBPath) - if err != nil { - log.Fatalf("Can't download MMDB: %s", err.Error()) - } - } -} - -func downloadMMDB(path string) (err error) { - resp, err := http.Get("http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.tar.gz") - if err != nil { - return - } - defer resp.Body.Close() - - gr, err := gzip.NewReader(resp.Body) - if err != nil { - return - } - defer gr.Close() - - tr := tar.NewReader(gr) - for { - h, err := tr.Next() - if err == io.EOF { - break - } else if err != nil { - return err - } - - if !strings.HasSuffix(h.Name, "GeoLite2-Country.mmdb") { - continue - } - - f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0644) - if err != nil { - return err - } - defer f.Close() - _, err = io.Copy(f, tr) - if err != nil { - return err - } - } - - return nil } diff --git a/main.go b/main.go index 7bb6d8b6..57e834c2 100644 --- a/main.go +++ b/main.go @@ -18,6 +18,7 @@ func main() { proxy.Instance().Run() hub.Run() + config.Init() err := config.Instance().Parse() if err != nil { log.Fatalf("Parse config error: %s", err.Error())