Moar parsers

This commit is contained in:
2025-10-06 23:11:50 +02:00
parent a254b306f2
commit 5f0f4aa96b
14 changed files with 419 additions and 136 deletions

View File

@@ -3,22 +3,25 @@ package parser
import (
"bufio"
"io"
"net"
"net/netip"
"strings"
"git.maze.io/maze/styx/internal/sliceutil"
)
func init() {
RegisterDomainsParser(hostsParser{})
RegisterDomainsParser(hostsDomainsParser{})
RegisterNetworksParser(hostsNetworksParser{})
}
type hostsParser struct{}
type hostsDomainsParser struct{}
func (hostsParser) CanHandle(line string) bool {
func (hostsDomainsParser) CanHandle(line string) bool {
part := strings.Fields(line)
return len(part) >= 2 && net.ParseIP(part[0]) != nil
return len(part) >= 2 && isIP(part[0])
}
func (hostsParser) ParseDomains(r io.Reader) (domains []string, ignored int, err error) {
func (hostsDomainsParser) ParseDomains(r io.Reader) (domains []string, ignored int, err error) {
scanner := bufio.NewScanner(r)
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
@@ -27,7 +30,7 @@ func (hostsParser) ParseDomains(r io.Reader) (domains []string, ignored int, err
}
part := strings.Fields(line)
if len(part) >= 2 && net.ParseIP(part[0]) != nil {
if len(part) >= 2 && isIP(part[0]) {
domains = append(domains, part[1:]...)
continue
}
@@ -37,5 +40,36 @@ func (hostsParser) ParseDomains(r io.Reader) (domains []string, ignored int, err
if err = scanner.Err(); err != nil {
return
}
return unique(domains), ignored, nil
return sliceutil.Unique(domains), ignored, nil
}
type hostsNetworksParser struct{}
func (hostsNetworksParser) CanHandle(line string) bool {
part := strings.Fields(line)
return len(part) >= 2 && isIP(part[0])
}
func (hostsNetworksParser) 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
}
part := strings.Fields(line)
if len(part) >= 2 && isIP(part[0]) {
if addr, err := netip.ParseAddr(part[0]); 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
}