This commit is contained in:
LovroG05
2025-03-10 19:33:14 +01:00
commit 8572131137
10 changed files with 240 additions and 0 deletions

8
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

1
.idea/.name generated Normal file
View File

@@ -0,0 +1 @@
dns-thingymagik

9
.idea/dns-thingymagik.iml generated Normal file
View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="Go" enabled="true" />
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/dns-thingymagik.iml" filepath="$PROJECT_DIR$/.idea/dns-thingymagik.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

42
cache/Records.go vendored Normal file
View File

@@ -0,0 +1,42 @@
package cache
import (
"github.com/patrickmn/go-cache"
"golang.org/x/net/dns/dnsmessage"
"sync"
"time"
)
type RecordsCache struct {
records *cache.Cache
mu sync.Mutex
}
const (
defaultExpiration = 1 * time.Hour
purgeTime = 1 * time.Hour
)
func NewRecordsCache() *RecordsCache {
Cache := cache.New(defaultExpiration, purgeTime)
return &RecordsCache{
records: Cache,
}
}
func (rc *RecordsCache) Get(name string) (dnsmessage.Resource, bool) {
rc.mu.Lock()
defer rc.mu.Unlock()
record, ok := rc.records.Get(name)
if ok {
res := record.(dnsmessage.Resource)
return res, ok
}
return dnsmessage.Resource{}, false
}
func (rc *RecordsCache) Set(resource dnsmessage.Resource) {
rc.mu.Lock()
defer rc.mu.Unlock()
rc.records.Set(resource.Header.Name.String(), resource, time.Duration(resource.Header.TTL)*time.Second)
}

10
go.mod Normal file
View File

@@ -0,0 +1,10 @@
module dnsthingymagik
go 1.23.0
toolchain go1.23.4
require (
github.com/patrickmn/go-cache v2.1.0+incompatible
golang.org/x/net v0.37.0
)

4
go.sum Normal file
View File

@@ -0,0 +1,4 @@
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c=
golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=

109
main.go Normal file
View File

@@ -0,0 +1,109 @@
package main
import (
"dnsthingymagik/cache"
"fmt"
"golang.org/x/net/dns/dnsmessage"
"log"
"net"
)
func main() {
udpServer, err := net.ListenPacket("udp", ":53")
if err != nil {
log.Fatal(err)
}
defer udpServer.Close()
rc := cache.NewRecordsCache()
for {
buf := make([]byte, 514)
n, addr, err := udpServer.ReadFrom(buf)
if err != nil {
log.Println(err)
}
go process(addr, buf[:n], rc)
//go response(udpServer, addr, buf)
}
}
func process(addr net.Addr, buf []byte, rc *cache.RecordsCache) {
var parser dnsmessage.Parser
header, err := parser.Start(buf)
if err != nil {
fmt.Println("Error:", err)
}
fmt.Println(header)
msg := dnsmessage.Message{
Header: header,
}
for {
question, err := parser.Question()
if err == dnsmessage.ErrSectionDone {
break
}
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(question)
msg.Questions = append(msg.Questions, question)
}
for {
answer, err := parser.Answer()
if err == dnsmessage.ErrSectionDone {
break
}
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(answer)
msg.Answers = append(msg.Answers, answer)
}
for {
authority, err := parser.Authority()
if err == dnsmessage.ErrSectionDone {
break
}
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(authority)
msg.Authorities = append(msg.Authorities, authority)
}
for {
additional, err := parser.Additional()
if err == dnsmessage.ErrSectionDone {
break
}
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(additional)
msg.Additionals = append(msg.Additionals, additional)
}
// MESSAGE IS FULL
fmt.Println(msg)
}

43
query/Query.go Normal file
View File

@@ -0,0 +1,43 @@
package query
import (
"golang.org/x/net/dns/dnsmessage"
"net"
"time"
)
func sendQuery(server string, query dnsmessage.Message) (dnsmessage.Message, error) {
conn, err := net.DialTimeout("udp", server+":53", 5*time.Second)
if err != nil {
return dnsmessage.Message{}, err
}
defer conn.Close()
q, err := query.Pack()
if err != nil {
return dnsmessage.Message{}, err
}
_, err = conn.Write(q)
if err != nil {
return dnsmessage.Message{}, err
}
buf := make([]byte, 512)
err = conn.SetReadDeadline(time.Now().Add(5 * time.Second))
if err != nil {
return dnsmessage.Message{}, err
}
n, err := conn.Read(buf)
if err != nil {
return dnsmessage.Message{}, err
}
msg := dnsmessage.Message{}
err = msg.Unpack(buf[:n])
if err != nil {
return dnsmessage.Message{}, err
}
return msg, nil
}