12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- package mmdb
- import (
- "fmt"
- "net"
- "strings"
- "github.com/oschwald/maxminddb-golang"
- )
- type geoip2Country struct {
- Country struct {
- IsoCode string `maxminddb:"iso_code"`
- } `maxminddb:"country"`
- }
- type IPReader struct {
- *maxminddb.Reader
- databaseType
- }
- type ASNReader struct {
- *maxminddb.Reader
- }
- type ASNResult struct {
- AutonomousSystemNumber uint32 `maxminddb:"autonomous_system_number"`
- AutonomousSystemOrganization string `maxminddb:"autonomous_system_organization"`
- }
- func (r IPReader) LookupCode(ipAddress net.IP) []string {
- switch r.databaseType {
- case typeMaxmind:
- var country geoip2Country
- _ = r.Lookup(ipAddress, &country)
- if country.Country.IsoCode == "" {
- return []string{}
- }
- return []string{strings.ToLower(country.Country.IsoCode)}
- case typeSing:
- var code string
- _ = r.Lookup(ipAddress, &code)
- if code == "" {
- return []string{}
- }
- return []string{code}
- case typeMetaV0:
- var record any
- _ = r.Lookup(ipAddress, &record)
- switch record := record.(type) {
- case string:
- return []string{record}
- case []any: // lookup returned type of slice is []any
- result := make([]string, 0, len(record))
- for _, item := range record {
- result = append(result, item.(string))
- }
- return result
- }
- return []string{}
- default:
- panic(fmt.Sprint("unknown geoip database type:", r.databaseType))
- }
- }
- func (r ASNReader) LookupASN(ip net.IP) ASNResult {
- var result ASNResult
- r.Lookup(ip, &result)
- return result
- }
|