mirror of
https://github.com/MarekWojt/gertdns.git
synced 2025-12-15 12:59:53 +01:00
Verbesserungen DNS-Server
This commit is contained in:
69
dns/dns.go
69
dns/dns.go
@@ -11,23 +11,23 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type domain struct {
|
type domain struct {
|
||||||
Root string
|
root string
|
||||||
Mutv4 sync.RWMutex
|
mutv4 sync.RWMutex
|
||||||
Mutv6 sync.RWMutex
|
mutv6 sync.RWMutex
|
||||||
Ipv4 map[string]string
|
ipv4 map[string]string
|
||||||
Ipv6 map[string]string
|
ipv6 map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
var Domains = []*domain{}
|
var domains = []*domain{}
|
||||||
|
|
||||||
func parseQuery(m *dns.Msg, currentDomain *domain) {
|
func parseQuery(m *dns.Msg, currentDomain *domain) {
|
||||||
for _, q := range m.Question {
|
for _, q := range m.Question {
|
||||||
switch q.Qtype {
|
switch q.Qtype {
|
||||||
case dns.TypeA:
|
case dns.TypeA:
|
||||||
log.Printf("Query for A record of %s\n", q.Name)
|
log.Printf("Query for A record of %s\n", q.Name)
|
||||||
currentDomain.Mutv4.RLock()
|
currentDomain.mutv4.RLock()
|
||||||
ip := currentDomain.Ipv4[q.Name]
|
ip := currentDomain.ipv4[q.Name]
|
||||||
currentDomain.Mutv4.RUnlock()
|
currentDomain.mutv4.RUnlock()
|
||||||
if ip != "" {
|
if ip != "" {
|
||||||
rr, err := dns.NewRR(fmt.Sprintf("%s A %s", q.Name, ip))
|
rr, err := dns.NewRR(fmt.Sprintf("%s A %s", q.Name, ip))
|
||||||
if err == nil {
|
if err == nil {
|
||||||
@@ -36,9 +36,9 @@ func parseQuery(m *dns.Msg, currentDomain *domain) {
|
|||||||
}
|
}
|
||||||
case dns.TypeAAAA:
|
case dns.TypeAAAA:
|
||||||
log.Printf("Query for AAAA record of %s\n", q.Name)
|
log.Printf("Query for AAAA record of %s\n", q.Name)
|
||||||
currentDomain.Mutv6.RLock()
|
currentDomain.mutv6.RLock()
|
||||||
ip := currentDomain.Ipv6[q.Name]
|
ip := currentDomain.ipv6[q.Name]
|
||||||
currentDomain.Mutv6.RUnlock()
|
currentDomain.mutv6.RUnlock()
|
||||||
if ip != "" {
|
if ip != "" {
|
||||||
rr, err := dns.NewRR(fmt.Sprintf("%s AAAA %s", q.Name, ip))
|
rr, err := dns.NewRR(fmt.Sprintf("%s AAAA %s", q.Name, ip))
|
||||||
if err == nil {
|
if err == nil {
|
||||||
@@ -64,21 +64,50 @@ func handleDnsRequest(currentDomain *domain) func(w dns.ResponseWriter, r *dns.M
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Run() error {
|
func Load() {
|
||||||
|
for _, currentDomain := range config.Config.Domains {
|
||||||
|
domains = append(domains, &domain{
|
||||||
|
root: currentDomain,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Run() (*dns.Server, error) {
|
||||||
// attach request handler func
|
// attach request handler func
|
||||||
for _, currentDomain := range Domains {
|
for _, currentDomain := range domains {
|
||||||
dns.HandleFunc(currentDomain.Root, handleDnsRequest(currentDomain))
|
dns.HandleFunc(currentDomain.root, handleDnsRequest(currentDomain))
|
||||||
}
|
}
|
||||||
|
|
||||||
// start server
|
// start server
|
||||||
port := config.Config.Port
|
server := &dns.Server{Addr: ":" + strconv.Itoa(int(config.Config.Port)), Net: "udp"}
|
||||||
server := &dns.Server{Addr: ":" + strconv.Itoa(int(port)), Net: "udp"}
|
log.Printf("Starting DNS at %d\n", config.Config.Port)
|
||||||
log.Printf("Starting DNS at %d\n", port)
|
|
||||||
err := server.ListenAndServe()
|
err := server.ListenAndServe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
server.Shutdown()
|
server.Shutdown()
|
||||||
return err
|
return server, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return server, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateIpv6(domain string, ipv6 string) {
|
||||||
|
for _, currentDomain := range domains {
|
||||||
|
if dns.IsSubDomain(currentDomain.root, domain) {
|
||||||
|
currentDomain.mutv6.Lock()
|
||||||
|
currentDomain.ipv6[domain] = ipv6
|
||||||
|
currentDomain.mutv6.Unlock()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateIpv4(domain string, ipv4 string) {
|
||||||
|
for _, currentDomain := range domains {
|
||||||
|
if dns.IsSubDomain(currentDomain.root, domain) {
|
||||||
|
currentDomain.mutv4.Lock()
|
||||||
|
currentDomain.ipv4[domain] = ipv4
|
||||||
|
currentDomain.mutv4.Unlock()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
4
main.go
4
main.go
@@ -20,8 +20,10 @@ func main() {
|
|||||||
log.Fatalf("Failed to load configuration: %s\n ", err.Error())
|
log.Fatalf("Failed to load configuration: %s\n ", err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
err = dns.Run()
|
dns.Load()
|
||||||
|
server, err := dns.Run()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Failed to start DNS server: %s\n ", err.Error())
|
log.Fatalf("Failed to start DNS server: %s\n ", err.Error())
|
||||||
}
|
}
|
||||||
|
defer server.Shutdown()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user