@@ -25,56 +25,58 @@ const (
25
25
)
26
26
27
27
var (
28
- reader Reader
29
- once sync.Once
28
+ IPreader IPReader
29
+ ASNreader ASNReader
30
+ IPonce sync.Once
31
+ ASNonce sync.Once
30
32
)
31
33
32
34
func LoadFromBytes (buffer []byte ) {
33
- once .Do (func () {
35
+ IPonce .Do (func () {
34
36
mmdb , err := maxminddb .FromBytes (buffer )
35
37
if err != nil {
36
38
log .Fatalln ("Can't load mmdb: %s" , err .Error ())
37
39
}
38
- reader = Reader {Reader : mmdb }
40
+ IPreader = IPReader {Reader : mmdb }
39
41
switch mmdb .Metadata .DatabaseType {
40
42
case "sing-geoip" :
41
- reader .databaseType = typeSing
43
+ IPreader .databaseType = typeSing
42
44
case "Meta-geoip0" :
43
- reader .databaseType = typeMetaV0
45
+ IPreader .databaseType = typeMetaV0
44
46
default :
45
- reader .databaseType = typeMaxmind
47
+ IPreader .databaseType = typeMaxmind
46
48
}
47
49
})
48
50
}
49
51
50
- func Verify () bool {
51
- instance , err := maxminddb .Open (C . Path . MMDB () )
52
+ func Verify (path string ) bool {
53
+ instance , err := maxminddb .Open (path )
52
54
if err == nil {
53
55
instance .Close ()
54
56
}
55
57
return err == nil
56
58
}
57
59
58
- func Instance () Reader {
59
- once .Do (func () {
60
+ func IPInstance () IPReader {
61
+ IPonce .Do (func () {
60
62
mmdbPath := C .Path .MMDB ()
61
63
log .Infoln ("Load MMDB file: %s" , mmdbPath )
62
64
mmdb , err := maxminddb .Open (mmdbPath )
63
65
if err != nil {
64
66
log .Fatalln ("Can't load MMDB: %s" , err .Error ())
65
67
}
66
- reader = Reader {Reader : mmdb }
68
+ IPreader = IPReader {Reader : mmdb }
67
69
switch mmdb .Metadata .DatabaseType {
68
70
case "sing-geoip" :
69
- reader .databaseType = typeSing
71
+ IPreader .databaseType = typeSing
70
72
case "Meta-geoip0" :
71
- reader .databaseType = typeMetaV0
73
+ IPreader .databaseType = typeMetaV0
72
74
default :
73
- reader .databaseType = typeMaxmind
75
+ IPreader .databaseType = typeMaxmind
74
76
}
75
77
})
76
78
77
- return reader
79
+ return IPreader
78
80
}
79
81
80
82
func DownloadMMDB (path string ) (err error ) {
@@ -96,6 +98,43 @@ func DownloadMMDB(path string) (err error) {
96
98
return err
97
99
}
98
100
99
- func Reload () {
100
- mihomoOnce .Reset (& once )
101
+ func ASNInstance () ASNReader {
102
+ ASNonce .Do (func () {
103
+ ASNPath := C .Path .ASN ()
104
+ log .Infoln ("Load ASN file: %s" , ASNPath )
105
+ asn , err := maxminddb .Open (ASNPath )
106
+ if err != nil {
107
+ log .Fatalln ("Can't load ASN: %s" , err .Error ())
108
+ }
109
+ ASNreader = ASNReader {Reader : asn }
110
+ })
111
+
112
+ return ASNreader
113
+ }
114
+
115
+ func DownloadASN (path string ) (err error ) {
116
+ ctx , cancel := context .WithTimeout (context .Background (), time .Second * 90 )
117
+ defer cancel ()
118
+ resp , err := mihomoHttp .HttpRequest (ctx , C .ASNUrl , http .MethodGet , http.Header {"User-Agent" : {C .UA }}, nil )
119
+ if err != nil {
120
+ return
121
+ }
122
+ defer resp .Body .Close ()
123
+
124
+ f , err := os .OpenFile (path , os .O_CREATE | os .O_WRONLY , 0o644 )
125
+ if err != nil {
126
+ return err
127
+ }
128
+ defer f .Close ()
129
+ _ , err = io .Copy (f , resp .Body )
130
+
131
+ return err
132
+ }
133
+
134
+ func ReloadIP () {
135
+ mihomoOnce .Reset (& IPonce )
136
+ }
137
+
138
+ func ReloadASN () {
139
+ mihomoOnce .Reset (& ASNonce )
101
140
}
0 commit comments