73 lines
1.6 KiB
Go
73 lines
1.6 KiB
Go
package parser
|
|
|
|
import (
|
|
"bufio"
|
|
"io"
|
|
"net"
|
|
"net/netip"
|
|
"strings"
|
|
|
|
"git.maze.io/maze/styx/internal/sliceutil"
|
|
)
|
|
|
|
func init() {
|
|
RegisterDomainsParser(listDomainsParser{})
|
|
RegisterNetworksParser(listNetworksParser{})
|
|
}
|
|
|
|
type listDomainsParser struct{}
|
|
|
|
func (listDomainsParser) CanHandle(line string) bool {
|
|
return isDomainName(line) &&
|
|
!strings.ContainsRune(line, ' ') &&
|
|
!strings.ContainsRune(line, ':') &&
|
|
net.ParseIP(line) == nil
|
|
}
|
|
|
|
func (listDomainsParser) ParseDomains(r io.Reader) (domains []string, ignored int, err error) {
|
|
scanner := bufio.NewScanner(r)
|
|
for scanner.Scan() {
|
|
line := strings.TrimSpace(scanner.Text())
|
|
if isComment(line) {
|
|
continue
|
|
}
|
|
if isDomainName(line) {
|
|
domains = append(domains, line)
|
|
continue
|
|
}
|
|
ignored++
|
|
}
|
|
if err = scanner.Err(); err != nil {
|
|
return
|
|
}
|
|
return sliceutil.Unique(domains), ignored, nil
|
|
}
|
|
|
|
type listNetworksParser struct{}
|
|
|
|
func (listNetworksParser) CanHandle(line string) bool {
|
|
return isPrefix(line) || isIP(line)
|
|
}
|
|
|
|
func (listNetworksParser) ParseNetworks(r io.Reader) (prefixes []netip.Prefix, ignored int, err error) {
|
|
scanner := bufio.NewScanner(r)
|
|
for scanner.Scan() {
|
|
line := strings.TrimSpace(scanner.Text())
|
|
if isComment(line) {
|
|
continue
|
|
}
|
|
if prefix, err := netip.ParsePrefix(line); err == nil {
|
|
prefixes = append(prefixes, prefix)
|
|
continue
|
|
} else if addr, err := netip.ParseAddr(line); err == nil && !addr.IsUnspecified() && addr.IsValid() {
|
|
prefixes = append(prefixes, addrToPrefix(addr))
|
|
continue
|
|
}
|
|
ignored++
|
|
}
|
|
if err = scanner.Err(); err != nil {
|
|
return
|
|
}
|
|
return sliceutil.Unique(prefixes), ignored, nil
|
|
}
|