Clash.Meta/component/mmdb/mmdb.go

97 lines
1.8 KiB
Go
Raw Normal View History

2022-03-15 01:30:17 +08:00
package mmdb
import (
"sync"
2024-03-05 10:57:25 +08:00
mihomoOnce "github.com/metacubex/mihomo/common/once"
2023-11-03 21:01:45 +08:00
C "github.com/metacubex/mihomo/constant"
"github.com/metacubex/mihomo/log"
2023-04-10 21:03:31 +08:00
2023-07-14 22:28:24 +08:00
"github.com/oschwald/maxminddb-golang"
)
type databaseType = uint8
const (
typeMaxmind databaseType = iota
typeSing
typeMetaV0
2022-03-15 01:30:17 +08:00
)
var (
2024-09-09 16:08:48 +08:00
ipReader IPReader
asnReader ASNReader
ipOnce sync.Once
asnOnce sync.Once
2022-03-15 01:30:17 +08:00
)
func LoadFromBytes(buffer []byte) {
2024-09-09 16:08:48 +08:00
ipOnce.Do(func() {
2023-07-14 22:28:24 +08:00
mmdb, err := maxminddb.FromBytes(buffer)
2022-03-15 01:30:17 +08:00
if err != nil {
log.Fatalln("Can't load mmdb: %s", err.Error())
}
2024-09-09 16:08:48 +08:00
ipReader = IPReader{Reader: mmdb}
switch mmdb.Metadata.DatabaseType {
case "sing-geoip":
2024-09-09 16:08:48 +08:00
ipReader.databaseType = typeSing
case "Meta-geoip0":
2024-09-09 16:08:48 +08:00
ipReader.databaseType = typeMetaV0
default:
2024-09-09 16:08:48 +08:00
ipReader.databaseType = typeMaxmind
2023-07-14 22:28:24 +08:00
}
2022-03-15 01:30:17 +08:00
})
}
2024-03-12 03:14:25 +08:00
func Verify(path string) bool {
instance, err := maxminddb.Open(path)
2022-03-15 01:30:17 +08:00
if err == nil {
instance.Close()
}
return err == nil
}
2024-03-12 03:14:25 +08:00
func IPInstance() IPReader {
2024-09-09 16:08:48 +08:00
ipOnce.Do(func() {
mmdbPath := C.Path.MMDB()
2024-02-21 21:56:20 +08:00
log.Infoln("Load MMDB file: %s", mmdbPath)
mmdb, err := maxminddb.Open(mmdbPath)
2022-03-15 01:30:17 +08:00
if err != nil {
log.Fatalln("Can't load MMDB: %s", err.Error())
2022-03-15 01:30:17 +08:00
}
2024-09-09 16:08:48 +08:00
ipReader = IPReader{Reader: mmdb}
switch mmdb.Metadata.DatabaseType {
case "sing-geoip":
2024-09-09 16:08:48 +08:00
ipReader.databaseType = typeSing
case "Meta-geoip0":
2024-09-09 16:08:48 +08:00
ipReader.databaseType = typeMetaV0
default:
2024-09-09 16:08:48 +08:00
ipReader.databaseType = typeMaxmind
2023-07-14 22:28:24 +08:00
}
2022-03-15 01:30:17 +08:00
})
2024-09-09 16:08:48 +08:00
return ipReader
2023-01-09 21:07:31 +08:00
}
2024-02-21 21:56:20 +08:00
2024-03-12 03:14:25 +08:00
func ASNInstance() ASNReader {
2024-09-09 16:08:48 +08:00
asnOnce.Do(func() {
2024-03-12 03:14:25 +08:00
ASNPath := C.Path.ASN()
log.Infoln("Load ASN file: %s", ASNPath)
asn, err := maxminddb.Open(ASNPath)
if err != nil {
log.Fatalln("Can't load ASN: %s", err.Error())
}
2024-09-09 16:08:48 +08:00
asnReader = ASNReader{Reader: asn}
2024-03-12 03:14:25 +08:00
})
2024-09-09 16:08:48 +08:00
return asnReader
2024-03-12 03:14:25 +08:00
}
func ReloadIP() {
2024-09-09 16:08:48 +08:00
mihomoOnce.Reset(&ipOnce)
2024-03-12 03:14:25 +08:00
}
func ReloadASN() {
2024-09-09 16:08:48 +08:00
mihomoOnce.Reset(&asnOnce)
2024-02-21 21:56:20 +08:00
}