1
0
Fork 0
sgp-internet-ping/country.go

151 lines
2.9 KiB
Go
Raw Normal View History

2018-03-21 21:59:15 +08:00
package main
import (
2018-03-23 10:43:27 +08:00
"encoding/csv"
"encoding/json"
"flag"
"io/ioutil"
2018-03-22 22:52:45 +08:00
"log"
"os"
2018-03-24 23:11:19 +08:00
"sort"
2018-03-23 10:43:27 +08:00
"strconv"
"strings"
2018-03-21 21:59:15 +08:00
)
2018-03-23 10:43:27 +08:00
type geoRange struct {
Start uint32
End uint32
CC string
}
var flagIn = flag.String("in", "", "comma-seperated list of input files")
var flagOut = flag.String("out", "country.json", "output file")
var flagDB = flag.String("db", "iptocountry", "geographical database. either geolite or iptocountry")
2018-03-21 21:59:15 +08:00
func main() {
2018-03-23 10:43:27 +08:00
flag.Parse()
in := strings.Split(*flagIn, ",")
out := *flagOut
2018-03-23 13:05:07 +08:00
data := make(map[uint32]int, 0)
2018-03-23 10:43:27 +08:00
for _, fin := range in {
log.Println("Reading file " + fin)
raw, err := ioutil.ReadFile(fin)
if err != nil {
panic(err)
}
log.Println("Parsing file " + fin)
2018-03-23 13:05:07 +08:00
fdata := make(map[uint32]int, 0)
2018-03-23 10:43:27 +08:00
err = json.Unmarshal(raw, &fdata)
if err != nil {
panic(err)
}
log.Println("File " + fin + " read successfully")
2018-03-23 13:05:07 +08:00
for k, v := range fdata {
data[k] = v
}
2018-03-23 10:43:27 +08:00
}
geo := make([]geoRange, 0)
if *flagDB == "geolite" { /*
// incomplete
log.Println("Reading geolite files")
rangeFile, err := ioutil.ReadFile("data/GeoLite2-Country-Blocks-IPv4.csv")
if err != nil {
panic(err)
}
countryFile, err := ioutil.ReadFile("data/GeoLite2-Country-Locations-en.csv")
if err != nil {
panic(err)
}
countryLines := bytes.Split(countryFile, []byte{'\n'})
for i, line := range countryLines {
}*/
}
if *flagDB == "iptocountry" {
log.Println("Read iptocountry files")
countryFile, err := os.Open("data/Webnet77-IpToCountry.csv")
if err != nil {
panic(err)
}
r := csv.NewReader(countryFile)
records, err := r.ReadAll()
if err != nil {
panic(err)
}
for _, record := range records {
cc := record[4]
start, err := strconv.ParseUint(record[0], 10, 32)
if err != nil {
panic(err)
}
end, err := strconv.ParseUint(record[1], 10, 32)
if err != nil {
panic(err)
}
g := geoRange{
Start: uint32(start),
End: uint32(end),
CC: cc,
}
geo = append(geo, g)
}
}
2018-03-24 23:11:19 +08:00
log.Println("Sorting IP addresses")
keys := make([]int, 0)
for k, _ := range data {
keys = append(keys, int(k))
}
sort.Ints(keys)
2018-03-23 10:43:27 +08:00
log.Println("Grouping latencies by country")
odata := make(map[string][]int, 0)
2018-03-23 13:05:07 +08:00
j := 0
2018-03-24 23:11:19 +08:00
for _, k := range keys {
/*if rand.Intn(100) == 0 {
continue
}*/
ip := uint32(k)
ttl := data[ip]
2018-03-23 23:45:09 +08:00
2018-03-23 13:05:07 +08:00
for geo[j].End <= ip {
j += 1
2018-03-23 10:43:27 +08:00
}
2018-03-23 13:05:07 +08:00
if ip < geo[j].Start {
j -= 1
2018-03-23 10:43:27 +08:00
odata["Unknown"] = append(odata["Unknown"], ttl)
2018-03-23 13:05:07 +08:00
continue
2018-03-23 10:43:27 +08:00
}
2018-03-23 13:05:07 +08:00
cc := geo[j].CC
2018-03-24 23:11:19 +08:00
odata[cc] = append(odata[cc], ttl)
2018-03-23 10:43:27 +08:00
}
2018-03-23 18:55:14 +08:00
total := 0
for k, v := range odata {
log.Println("Country " + k + " has " + strconv.Itoa(len(v)) + " samples")
total += len(v)
}
log.Println("Total: " + strconv.Itoa(total))
2018-03-23 10:43:27 +08:00
log.Println("Encoding json")
raw, err := json.Marshal(odata)
if err != nil {
panic(err)
}
log.Println("Writing to file " + out)
err = ioutil.WriteFile(out, raw, 0644)
if err != nil {
panic(err)
}
2018-03-21 21:59:15 +08:00
}