61 lines
1.4 KiB
Go
61 lines
1.4 KiB
Go
package aghnet
|
|
|
|
import (
|
|
"fmt"
|
|
"net/netip"
|
|
"strings"
|
|
|
|
"github.com/AdguardTeam/golibs/errors"
|
|
"github.com/AdguardTeam/golibs/stringutil"
|
|
)
|
|
|
|
// GenerateHostname generates the hostname from ip. In case of using IPv4 the
|
|
// result should be like:
|
|
//
|
|
// 192-168-10-1
|
|
//
|
|
// In case of using IPv6, the result is like:
|
|
//
|
|
// ff80-f076-0000-0000-0000-0000-0000-0010
|
|
//
|
|
// ip must be either an IPv4 or an IPv6.
|
|
func GenerateHostname(ip netip.Addr) (hostname string) {
|
|
if !ip.IsValid() {
|
|
// TODO(s.chzhen): Get rid of it.
|
|
panic("aghnet generate hostname: invalid ip")
|
|
}
|
|
|
|
ip = ip.Unmap()
|
|
hostname = ip.StringExpanded()
|
|
|
|
if ip.Is4() {
|
|
return strings.Replace(hostname, ".", "-", -1)
|
|
}
|
|
|
|
return strings.Replace(hostname, ":", "-", -1)
|
|
}
|
|
|
|
// NewDomainNameSet returns nil and error, if list has duplicate or empty
|
|
// domain name. Otherwise returns a set, which contains non-FQDN domain names,
|
|
// and nil error.
|
|
func NewDomainNameSet(list []string) (set *stringutil.Set, err error) {
|
|
set = stringutil.NewSet()
|
|
|
|
for i, v := range list {
|
|
host := strings.ToLower(strings.TrimSuffix(v, "."))
|
|
// TODO(a.garipov): Think about ignoring empty (".") names in the
|
|
// future.
|
|
if host == "" {
|
|
return nil, errors.Error("host name is empty")
|
|
}
|
|
|
|
if set.Has(host) {
|
|
return nil, fmt.Errorf("duplicate host name %q at index %d", host, i)
|
|
}
|
|
|
|
set.Add(host)
|
|
}
|
|
|
|
return set, nil
|
|
}
|