-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathregion.go
68 lines (61 loc) · 1.49 KB
/
region.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package main
import (
"io"
"net/http"
"os"
"sync"
"github.com/Rehtt/Kit/util"
"github.com/lionsoul2014/ip2region/binding/golang/xdb"
)
var (
regionSeracher *xdb.Searcher
regionSeracherInit sync.Once
)
func regionInit() {
regionSeracherInit.Do(func() {
info, err := util.GetGitHubFileInfo("zoujingli", "ip2region", "ip2region.xdb")
if err != nil {
log.Error("regionSeracherInit check xdb", "err", err)
return
}
downloadDB := func() error {
log.Info("download ip2region")
response, err := http.Get(info.DownloadUrl)
if err != nil {
return err
}
defer response.Body.Close()
f, err := os.OpenFile(*regionDBPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
if err != nil {
return err
}
defer f.Close()
io.Copy(f, response.Body)
log.Info("download ip2region done")
return nil
}
finfo, err := os.Stat(*regionDBPath)
if os.IsNotExist(err) || info.Size != int(finfo.Size()) {
if err := downloadDB(); err != nil {
log.Error("regionSeracherInit download xdb", "err", err)
return
}
} else if err != nil {
log.Error("regionSeracherInit open xdb", "err", err)
}
regionSeracher, err = xdb.NewWithFileOnly(*regionDBPath)
if err != nil {
log.Error("regionSeracherInit NewWithFileOnly", "err", err)
return
}
})
}
func ipRegion(ip string) (string, error) {
regionInit()
region, err := regionSeracher.SearchByStr(ip)
if err != nil {
log.Error("ipRegion SearchByStr", "err", err)
return "", err
}
return region, nil
}