targeting.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package main
  2. import (
  3. "fmt"
  4. "net"
  5. "strings"
  6. )
  7. type TargetOptions int
  8. const (
  9. TargetGlobal = 1 << iota
  10. TargetContinent
  11. TargetCountry
  12. TargetRegionGroup
  13. TargetRegion
  14. TargetASN
  15. TargetIP
  16. )
  17. func (t TargetOptions) GetTargets(ip net.IP) ([]string, int) {
  18. targets := make([]string, 0)
  19. var country, continent, region, regionGroup, asn string
  20. var netmask int
  21. if t&TargetASN > 0 {
  22. asn, netmask = geoIP.GetASN(ip)
  23. }
  24. if t&TargetRegion > 0 || t&TargetRegionGroup > 0 {
  25. country, continent, regionGroup, region, netmask = geoIP.GetCountryRegion(ip)
  26. } else if t&TargetCountry > 0 || t&TargetContinent > 0 {
  27. country, continent, netmask = geoIP.GetCountry(ip)
  28. }
  29. if t&TargetIP > 0 {
  30. ipStr := ip.String()
  31. targets = append(targets, ipStr)
  32. dotIndex := strings.LastIndex(ipStr, ".")
  33. targets = append(targets, ipStr[:dotIndex]+".0")
  34. }
  35. if t&TargetASN > 0 && len(asn) > 0 {
  36. targets = append(targets, asn)
  37. }
  38. if t&TargetRegion > 0 && len(region) > 0 {
  39. targets = append(targets, region)
  40. }
  41. if t&TargetRegionGroup > 0 && len(regionGroup) > 0 {
  42. targets = append(targets, regionGroup)
  43. }
  44. if t&TargetCountry > 0 && len(country) > 0 {
  45. targets = append(targets, country)
  46. }
  47. if t&TargetContinent > 0 && len(continent) > 0 {
  48. targets = append(targets, continent)
  49. }
  50. if t&TargetGlobal > 0 {
  51. targets = append(targets, "@")
  52. }
  53. return targets, netmask
  54. }
  55. func (t TargetOptions) String() string {
  56. targets := make([]string, 0)
  57. if t&TargetGlobal > 0 {
  58. targets = append(targets, "@")
  59. }
  60. if t&TargetContinent > 0 {
  61. targets = append(targets, "continent")
  62. }
  63. if t&TargetCountry > 0 {
  64. targets = append(targets, "country")
  65. }
  66. if t&TargetRegionGroup > 0 {
  67. targets = append(targets, "regiongroup")
  68. }
  69. if t&TargetRegion > 0 {
  70. targets = append(targets, "region")
  71. }
  72. if t&TargetASN > 0 {
  73. targets = append(targets, "asn")
  74. }
  75. if t&TargetIP > 0 {
  76. targets = append(targets, "ip")
  77. }
  78. return strings.Join(targets, " ")
  79. }
  80. func parseTargets(v string) (tgt TargetOptions, err error) {
  81. targets := strings.Split(v, " ")
  82. for _, t := range targets {
  83. var x TargetOptions
  84. switch t {
  85. case "@":
  86. x = TargetGlobal
  87. case "country":
  88. x = TargetCountry
  89. case "continent":
  90. x = TargetContinent
  91. case "regiongroup":
  92. x = TargetRegionGroup
  93. case "region":
  94. x = TargetRegion
  95. case "asn":
  96. x = TargetASN
  97. case "ip":
  98. x = TargetIP
  99. default:
  100. err = fmt.Errorf("Unknown targeting option '%s'", t)
  101. }
  102. tgt = tgt | x
  103. }
  104. return
  105. }