package sources import ( "bufio" "iplistget/common" "net" "os" "strings" ) func init() { common.RegisterSource(File{FileName: "iplistget.txt"}) } type File struct { FileName string } func (s File) Get(filename string) ([]net.IPNet, error) { if filename != "" { s.FileName = filename } file, err := os.Open(s.FileName) if err != nil { return nil, err } defer file.Close() ipmap := map[string]bool{} // TODO Provide custom split function for scanner to be universal scanner := bufio.NewScanner(file) for scanner.Scan() { ip := scanner.Text() if !strings.Contains(ip, "/") { ip += "/32" } ipmap[ip] = true } if err := scanner.Err(); err != nil { return nil, err } iplist := make([]net.IPNet, 0, len(ipmap)) for key, _ := range ipmap { if _, ipnet, err := net.ParseCIDR(key); err == nil { iplist = append(iplist, *ipnet) } } return iplist, nil }