diff options
Diffstat (limited to 'middleware/pkg/dnsutil/reverse.go')
-rw-r--r-- | middleware/pkg/dnsutil/reverse.go | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/middleware/pkg/dnsutil/reverse.go b/middleware/pkg/dnsutil/reverse.go new file mode 100644 index 000000000..a360432f3 --- /dev/null +++ b/middleware/pkg/dnsutil/reverse.go @@ -0,0 +1,40 @@ +package dnsutil + +import "strings" + +// ExtractAddressFromReverse turns a standard PTR reverse record name +// into an IP address. This works for ipv4 or ipv6. +// +// 54.119.58.176.in-addr.arpa. becomes 176.58.119.54. If the conversion +// failes the empty string is returned. +func ExtractAddressFromReverse(reverseName string) string { + search := "" + + switch { + case strings.HasSuffix(reverseName, v4arpaSuffix): + search = strings.TrimSuffix(reverseName, v4arpaSuffix) + case strings.HasSuffix(reverseName, v6arpaSuffix): + search = strings.TrimSuffix(reverseName, v6arpaSuffix) + default: + return "" + } + + // Reverse the segments and then combine them. + segments := reverse(strings.Split(search, ".")) + return strings.Join(segments, ".") +} + +func reverse(slice []string) []string { + for i := 0; i < len(slice)/2; i++ { + j := len(slice) - i - 1 + slice[i], slice[j] = slice[j], slice[i] + } + return slice +} + +const ( + // v4arpaSuffix is the reverse tree suffix for v4 IP addresses. + v4arpaSuffix = ".in-addr.arpa." + // v6arpaSuffix is the reverse tree suffix for v6 IP addresses. + v6arpaSuffix = ".ip6.arpa." +) |