| 
									
										
										
										
											2016-05-11 23:45:35 -07:00
										 |  |  | // +build generate | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-08 16:31:31 +00:00
										 |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"bufio" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2016-05-11 23:45:35 -07:00
										 |  |  | 	"log" | 
					
						
							| 
									
										
										
										
											2015-12-08 23:12:12 +01:00
										 |  |  | 	"math" | 
					
						
							| 
									
										
										
										
											2015-12-08 16:31:31 +00:00
										 |  |  | 	"net" | 
					
						
							| 
									
										
										
										
											2015-12-08 23:12:12 +01:00
										 |  |  | 	"net/http" | 
					
						
							| 
									
										
										
										
											2016-05-11 23:45:35 -07:00
										 |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2015-12-08 23:12:12 +01:00
										 |  |  | 	"strconv" | 
					
						
							| 
									
										
										
										
											2015-12-08 16:31:31 +00:00
										 |  |  | 	"strings" | 
					
						
							| 
									
										
										
										
											2016-10-17 16:35:18 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	"v2ray.com/core/app/router" | 
					
						
							|  |  |  | 	"v2ray.com/core/tools/geoip" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/golang/protobuf/proto" | 
					
						
							| 
									
										
										
										
											2015-12-08 16:31:31 +00:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-08 23:12:12 +01:00
										 |  |  | const ( | 
					
						
							|  |  |  | 	apnicFile = "http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-08 16:31:31 +00:00
										 |  |  | func main() { | 
					
						
							| 
									
										
										
										
											2015-12-08 23:12:12 +01:00
										 |  |  | 	resp, err := http.Get(apnicFile) | 
					
						
							| 
									
										
										
										
											2015-12-08 16:31:31 +00:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		panic(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-12-08 23:12:12 +01:00
										 |  |  | 	if resp.StatusCode != 200 { | 
					
						
							|  |  |  | 		panic(fmt.Errorf("Unexpected status %d", resp.StatusCode)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer resp.Body.Close() | 
					
						
							|  |  |  | 	scanner := bufio.NewScanner(resp.Body) | 
					
						
							| 
									
										
										
										
											2015-12-08 16:31:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-17 16:35:18 +02:00
										 |  |  | 	ips := &geoip.CountryIPRange{ | 
					
						
							| 
									
										
										
										
											2016-10-18 16:42:22 +02:00
										 |  |  | 		Ips: make([]*router.CIDR, 0, 8192), | 
					
						
							| 
									
										
										
										
											2016-10-17 16:35:18 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-12-08 16:31:31 +00:00
										 |  |  | 	for scanner.Scan() { | 
					
						
							|  |  |  | 		line := scanner.Text() | 
					
						
							|  |  |  | 		line = strings.TrimSpace(line) | 
					
						
							| 
									
										
										
										
											2015-12-08 23:12:12 +01:00
										 |  |  | 		parts := strings.Split(line, "|") | 
					
						
							|  |  |  | 		if len(parts) < 5 { | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if strings.ToLower(parts[1]) != "cn" || strings.ToLower(parts[2]) != "ipv4" { | 
					
						
							|  |  |  | 			continue | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		ip := parts[3] | 
					
						
							|  |  |  | 		count, err := strconv.Atoi(parts[4]) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			continue | 
					
						
							| 
									
										
										
										
											2015-12-08 16:31:31 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-10-11 23:02:44 +02:00
										 |  |  | 		mask := uint32(math.Floor(math.Log2(float64(count)) + 0.5)) | 
					
						
							|  |  |  | 		ipBytes := net.ParseIP(ip) | 
					
						
							|  |  |  | 		if len(ipBytes) == 0 { | 
					
						
							|  |  |  | 			panic("Invalid IP " + ip) | 
					
						
							| 
									
										
										
										
											2015-12-08 16:31:31 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-10-18 16:42:22 +02:00
										 |  |  | 		ips.Ips = append(ips.Ips, &router.CIDR{ | 
					
						
							|  |  |  | 			Ip:     []byte(ipBytes)[12:16], | 
					
						
							|  |  |  | 			Prefix: 32 - mask, | 
					
						
							| 
									
										
										
										
											2016-10-11 23:02:44 +02:00
										 |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2015-12-08 16:31:31 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-05-11 23:45:35 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-17 16:35:18 +02:00
										 |  |  | 	ipbytes, err := proto.Marshal(ips) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		log.Fatalf("Failed to marshal country IPs: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-17 14:35:13 +02:00
										 |  |  | 	file, err := os.OpenFile("geoip_data.go", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644) | 
					
						
							| 
									
										
										
										
											2016-05-11 23:45:35 -07:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2016-10-17 14:35:13 +02:00
										 |  |  | 		log.Fatalf("Failed to generate geoip_data.go: %v", err) | 
					
						
							| 
									
										
										
										
											2016-05-11 23:45:35 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	defer file.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-17 14:35:13 +02:00
										 |  |  | 	fmt.Fprintln(file, "package geoip") | 
					
						
							| 
									
										
										
										
											2016-05-11 23:45:35 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-17 16:35:18 +02:00
										 |  |  | 	fmt.Fprintln(file, "var ChinaIPs = "+formatArray(ipbytes)) | 
					
						
							| 
									
										
										
										
											2016-10-11 23:02:44 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func formatArray(a []byte) string { | 
					
						
							|  |  |  | 	r := "[]byte{" | 
					
						
							|  |  |  | 	for idx, v := range a { | 
					
						
							|  |  |  | 		if idx > 0 { | 
					
						
							|  |  |  | 			r += "," | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		r += fmt.Sprintf("%d", v) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	r += "}" | 
					
						
							|  |  |  | 	return r | 
					
						
							| 
									
										
										
										
											2015-12-08 16:31:31 +00:00
										 |  |  | } |