github.com/Jeffail/benthos/v3@v3.65.0/internal/impl/maxmind/bloblang_geoip.go (about) 1 package maxmind 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "net" 8 9 "github.com/Jeffail/benthos/v3/internal/bloblang/query" 10 "github.com/Jeffail/benthos/v3/public/bloblang" 11 "github.com/oschwald/geoip2-golang" 12 ) 13 14 func registerMaxmindMethodSpec(name, entity string, fn func(*geoip2.Reader, net.IP) (interface{}, error)) { 15 if err := bloblang.RegisterMethodV2(name, 16 bloblang.NewPluginSpec(). 17 Category(string(query.MethodCategoryGeoIP)). 18 Description(fmt.Sprintf("EXPERIMENTAL: Looks up an IP address against a [MaxMind database file](https://www.maxmind.com/en/home) and, if found, returns an object describing the %v associated with it.", entity)). 19 Param(bloblang.NewStringParam("path").Description("A path to an mmdb (maxmind) file.")), 20 func(args *bloblang.ParsedParams) (bloblang.Method, error) { 21 path, err := args.GetString("path") 22 if err != nil { 23 return nil, err 24 } 25 db, err := geoip2.Open(path) 26 if err != nil { 27 return nil, err 28 } 29 return bloblang.StringMethod(func(s string) (interface{}, error) { 30 ip := net.ParseIP(s) 31 if ip == nil { 32 return nil, fmt.Errorf("value %v does not appear to be a valid v4 or v6 IP address", s) 33 } 34 v, err := fn(db, ip) 35 if err != nil { 36 return nil, err 37 } 38 jBytes, err := json.Marshal(v) 39 if err != nil { 40 return nil, err 41 } 42 dec := json.NewDecoder(bytes.NewReader(jBytes)) 43 dec.UseNumber() 44 var gV interface{} 45 err = dec.Decode(&gV) 46 return gV, err 47 }), nil 48 }); err != nil { 49 panic(err) 50 } 51 } 52 53 func init() { 54 registerMaxmindMethodSpec("geoip_city", "city", func(db *geoip2.Reader, ip net.IP) (interface{}, error) { 55 return db.City(ip) 56 }) 57 58 registerMaxmindMethodSpec("geoip_country", "country", func(db *geoip2.Reader, ip net.IP) (interface{}, error) { 59 return db.Country(ip) 60 }) 61 62 registerMaxmindMethodSpec("geoip_asn", "ASN", func(db *geoip2.Reader, ip net.IP) (interface{}, error) { 63 return db.ASN(ip) 64 }) 65 66 registerMaxmindMethodSpec("geoip_enterprise", "enterprise", func(db *geoip2.Reader, ip net.IP) (interface{}, error) { 67 return db.Enterprise(ip) 68 }) 69 70 registerMaxmindMethodSpec("geoip_anonymous_ip", "anonymous IP", func(db *geoip2.Reader, ip net.IP) (interface{}, error) { 71 return db.AnonymousIP(ip) 72 }) 73 74 registerMaxmindMethodSpec("geoip_connection_type", "connection type", func(db *geoip2.Reader, ip net.IP) (interface{}, error) { 75 return db.ConnectionType(ip) 76 }) 77 78 registerMaxmindMethodSpec("geoip_domain", "domain", func(db *geoip2.Reader, ip net.IP) (interface{}, error) { 79 return db.Domain(ip) 80 }) 81 82 registerMaxmindMethodSpec("geoip_isp", "ISP", func(db *geoip2.Reader, ip net.IP) (interface{}, error) { 83 return db.ISP(ip) 84 }) 85 }