/api/ip.go

https://gitlab.com/voxxit/gogeoip2 · Go · 98 lines · 87 code · 11 blank · 0 comment · 4 complexity · 7c68c32ec60cf2d930d72b2c3f4672de MD5 · raw file

  1. package api
  2. import (
  3. "fmt"
  4. "net"
  5. )
  6. type IPConfig struct {
  7. Addr string
  8. RequestLatitude string
  9. RequestLongitude string
  10. }
  11. type IP struct {
  12. IP string `json:"ip"`
  13. Scores *Scores `json:"scores"`
  14. ASNum uint `json:"asnum,omitempty"`
  15. City string `json:"city"`
  16. Country string `json:"country"`
  17. CountryISO string `json:"country-iso"`
  18. Continent string `json:"continent"`
  19. Latitude float64 `json:"lat"`
  20. Longitude float64 `json:"lng"`
  21. TimeZone string `json:"time-zone"`
  22. Distance float64 `json:"distance,omitempty"`
  23. Hostnames []string `json:"hostnames,omitempty"`
  24. ASOrg string `json:"asorg,omitempty"`
  25. ISP string `json:"isp,omitempty"`
  26. Org string `json:"org,omitempty"`
  27. CIDRReport string `json:"cidr-report"`
  28. CleanTalkReport string `json:"cleantalk-report"`
  29. IPInfoReport string `json:"ipinfo-report"`
  30. PeeringDBReport string `json:"peering-db-report"`
  31. }
  32. func LookupIP(db *IPDatabase, config *IPConfig) (*IP, error) {
  33. parsedIP := net.ParseIP(config.Addr)
  34. record, err := db.Isp.ISP(parsedIP)
  35. if err != nil {
  36. return nil, err
  37. }
  38. location, err := db.City.City(parsedIP)
  39. if err != nil {
  40. return nil, err
  41. }
  42. hostnames, _ := net.LookupAddr(config.Addr)
  43. distance := distanceTo(
  44. location.Location.Latitude,
  45. location.Location.Longitude,
  46. config.RequestLatitude,
  47. config.RequestLongitude,
  48. )
  49. scores := NewScores(&ScoresInput{
  50. Distance: distance,
  51. CountryCode: location.Country.IsoCode,
  52. })
  53. ip := &IP{
  54. Scores: scores,
  55. Latitude: location.Location.Latitude,
  56. Longitude: location.Location.Longitude,
  57. IP: config.Addr,
  58. Distance: distance,
  59. TimeZone: location.Location.TimeZone,
  60. City: location.City.Names["en"],
  61. Country: location.Country.Names["en"],
  62. CountryISO: location.Country.IsoCode,
  63. Continent: location.Continent.Code,
  64. Hostnames: hostnames,
  65. ASNum: record.AutonomousSystemNumber,
  66. ASOrg: record.AutonomousSystemOrganization,
  67. ISP: record.ISP,
  68. Org: record.Organization,
  69. CIDRReport: fmt.Sprintf(
  70. "http://www.cidr-report.org/cgi-bin/as-report?as=AS%d&view=2.0",
  71. record.AutonomousSystemNumber,
  72. ),
  73. CleanTalkReport: fmt.Sprintf(
  74. "https://cleantalk.org/blacklists/AS%d",
  75. record.AutonomousSystemNumber,
  76. ),
  77. IPInfoReport: fmt.Sprintf(
  78. "http://ipinfo.io/AS%d",
  79. record.AutonomousSystemNumber,
  80. ),
  81. PeeringDBReport: fmt.Sprintf(
  82. "https://beta.peeringdb.com/api/asn/%d",
  83. record.AutonomousSystemNumber,
  84. ),
  85. }
  86. return ip, nil
  87. }