Initial commit
This commit is contained in:
commit
36baaf0caf
10 changed files with 961 additions and 0 deletions
109
dns.go
Normal file
109
dns.go
Normal file
|
|
@ -0,0 +1,109 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
// Standard
|
||||
"fmt"
|
||||
"slices"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type DNSRecord struct {
|
||||
ID string `json:".id"`
|
||||
Address string
|
||||
Disabled string
|
||||
Dynamic string
|
||||
Name string
|
||||
TTL string
|
||||
Type string
|
||||
}
|
||||
|
||||
type RecordsTree struct {
|
||||
Record DNSRecord
|
||||
Children []RecordsTree
|
||||
}
|
||||
|
||||
func SortDNSRecord(a, b DNSRecord) int {
|
||||
aComponents := strings.Split(a.Name, ".")
|
||||
bComponents := strings.Split(b.Name, ".")
|
||||
|
||||
slices.Reverse(aComponents)
|
||||
slices.Reverse(bComponents)
|
||||
|
||||
for i, aComp := range aComponents {
|
||||
if i >= len(bComponents) {
|
||||
return -1
|
||||
}
|
||||
|
||||
bComp := bComponents[i]
|
||||
if aComp > bComp {
|
||||
return 1
|
||||
}
|
||||
|
||||
if aComp < bComp {
|
||||
return -1
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
func (r DNSRecord) Parts() int {
|
||||
return len(strings.Split(r.Name, "."))
|
||||
}
|
||||
|
||||
func (r DNSRecord) Part(numParts int) string {
|
||||
splitName := strings.Split(r.Name, ".")
|
||||
slices.Reverse(splitName)
|
||||
|
||||
parts := []string{}
|
||||
for i := range numParts {
|
||||
if i >= len(splitName) {
|
||||
break
|
||||
}
|
||||
parts = append(parts, splitName[i])
|
||||
}
|
||||
|
||||
slices.Reverse(parts)
|
||||
return strings.Join(parts, ".")
|
||||
}
|
||||
|
||||
func (r DNSRecord) NameReversed() string {
|
||||
parts := strings.Split(r.Name, ".")
|
||||
slices.Reverse(parts)
|
||||
return strings.Join(parts, ".")
|
||||
}
|
||||
|
||||
func (rt *RecordsTree) BuildTree(records []DNSRecord, startAt, partsLevel int) (tree RecordsTree) {
|
||||
tree = RecordsTree{}
|
||||
|
||||
for i := startAt; i < len(records); i++ {
|
||||
// current: bar.foo.n44.se
|
||||
current := records[i]
|
||||
currentPart := current.Part(partsLevel)
|
||||
|
||||
for j := i; j < len(records); j++ {
|
||||
// next: baz.bar.foo.n44.se
|
||||
next := records[j]
|
||||
nextPart := next.Part(partsLevel)
|
||||
fmt.Printf("%04d %04d: %s ?= %s\n", i, j, currentPart, nextPart)
|
||||
|
||||
if currentPart == nextPart {
|
||||
fmt.Printf("FOUND SOMETHING!\n")
|
||||
nextTree := RecordsTree{
|
||||
Record: next,
|
||||
}
|
||||
|
||||
tree.Children = append(tree.Children, nextTree)
|
||||
}
|
||||
|
||||
// Doesn't match anymore, return to other loop after all that are processed
|
||||
if currentPart != nextPart {
|
||||
i = j
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return tree
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue