Initial commit

This commit is contained in:
Magnus Åhall 2026-02-20 13:26:21 +01:00
commit 36baaf0caf
10 changed files with 961 additions and 0 deletions

109
dns.go Normal file
View 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
}