55 lines
921 B
Go
55 lines
921 B
Go
package sources
|
|
|
|
import (
|
|
"bufio"
|
|
"git.veenee.ru/veenee/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
|
|
}
|