mirror of
https://github.com/safing/portmaster
synced 2025-09-02 10:39:22 +00:00
55 lines
844 B
Go
55 lines
844 B
Go
package geoip
|
|
|
|
import (
|
|
"net"
|
|
|
|
"github.com/oschwald/maxminddb-golang"
|
|
"github.com/safing/portbase/log"
|
|
)
|
|
|
|
func getReader(ip net.IP) *maxminddb.Reader {
|
|
if v4 := ip.To4(); v4 != nil {
|
|
return geoDBv4Reader
|
|
}
|
|
return geoDBv6Reader
|
|
}
|
|
|
|
// GetLocation returns Location data of an IP address
|
|
func GetLocation(ip net.IP) (record *Location, err error) {
|
|
dbLock.Lock()
|
|
defer dbLock.Unlock()
|
|
|
|
err = prepDatabaseForUse()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
db := getReader(ip)
|
|
|
|
record = &Location{}
|
|
|
|
// fetch
|
|
err = db.Lookup(ip, record)
|
|
|
|
// retry
|
|
if err != nil {
|
|
// reprep
|
|
handleError(err)
|
|
err = prepDatabaseForUse()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
db = getReader(ip)
|
|
|
|
// refetch
|
|
err = db.Lookup(ip, record)
|
|
}
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
log.Tracef("geoip: record: %+v", record)
|
|
|
|
return record, nil
|
|
}
|