chinaip_gen.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // +build generate
  2. package main
  3. import (
  4. "bufio"
  5. "fmt"
  6. "log"
  7. "math"
  8. "net"
  9. "net/http"
  10. "os"
  11. "strconv"
  12. "strings"
  13. v2net "v2ray.com/core/common/net"
  14. )
  15. const (
  16. apnicFile = "http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest"
  17. )
  18. func main() {
  19. resp, err := http.Get(apnicFile)
  20. if err != nil {
  21. panic(err)
  22. }
  23. if resp.StatusCode != 200 {
  24. panic(fmt.Errorf("Unexpected status %d", resp.StatusCode))
  25. }
  26. defer resp.Body.Close()
  27. scanner := bufio.NewScanner(resp.Body)
  28. ipNet := v2net.NewIPNet()
  29. for scanner.Scan() {
  30. line := scanner.Text()
  31. line = strings.TrimSpace(line)
  32. parts := strings.Split(line, "|")
  33. if len(parts) < 5 {
  34. continue
  35. }
  36. if strings.ToLower(parts[1]) != "cn" || strings.ToLower(parts[2]) != "ipv4" {
  37. continue
  38. }
  39. ip := parts[3]
  40. count, err := strconv.Atoi(parts[4])
  41. if err != nil {
  42. continue
  43. }
  44. mask := 32 - int(math.Floor(math.Log2(float64(count))+0.5))
  45. cidr := fmt.Sprintf("%s/%d", ip, mask)
  46. _, t, err := net.ParseCIDR(cidr)
  47. if err != nil {
  48. panic(err)
  49. }
  50. ipNet.Add(t)
  51. }
  52. dump := ipNet.Serialize()
  53. file, err := os.OpenFile("chinaip_init.go", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644)
  54. if err != nil {
  55. log.Fatalf("Failed to generate chinaip_init.go: %v", err)
  56. }
  57. defer file.Close()
  58. fmt.Fprintln(file, "package rules")
  59. fmt.Fprintln(file, "import (")
  60. fmt.Fprintln(file, "v2net \"v2ray.com/core/common/net\"")
  61. fmt.Fprintln(file, ")")
  62. fmt.Fprintln(file, "var (")
  63. fmt.Fprintln(file, "chinaIPNet *v2net.IPNet")
  64. fmt.Fprintln(file, ")")
  65. fmt.Fprintln(file, "func init() {")
  66. fmt.Fprintln(file, "chinaIPNet = v2net.NewIPNetInitialValue(map[uint32]byte {")
  67. for i := 0; i < len(dump); i += 2 {
  68. fmt.Fprintln(file, dump[i], ": ", dump[i+1], ",")
  69. }
  70. fmt.Fprintln(file, "})")
  71. fmt.Fprintln(file, "}")
  72. }