mirror of
https://github.com/MarekWojt/gertdns.git
synced 2025-12-15 12:59:53 +01:00
Webserver
This commit is contained in:
72
dns/dns.go
72
dns/dns.go
@@ -1,6 +1,7 @@
|
||||
package dns
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"strconv"
|
||||
@@ -11,11 +12,11 @@ import (
|
||||
)
|
||||
|
||||
type domain struct {
|
||||
root string
|
||||
mutv4 sync.RWMutex
|
||||
mutv6 sync.RWMutex
|
||||
ipv4 map[string]string
|
||||
ipv6 map[string]string
|
||||
Root string
|
||||
Mutv4 sync.RWMutex
|
||||
Mutv6 sync.RWMutex
|
||||
Ipv4 map[string]string
|
||||
Ipv6 map[string]string
|
||||
}
|
||||
|
||||
var domains = []*domain{}
|
||||
@@ -25,9 +26,9 @@ func parseQuery(m *dns.Msg, currentDomain *domain) {
|
||||
switch q.Qtype {
|
||||
case dns.TypeA:
|
||||
log.Printf("Query for A record of %s\n", q.Name)
|
||||
currentDomain.mutv4.RLock()
|
||||
ip := currentDomain.ipv4[q.Name]
|
||||
currentDomain.mutv4.RUnlock()
|
||||
currentDomain.Mutv4.RLock()
|
||||
ip := currentDomain.Ipv4[q.Name]
|
||||
currentDomain.Mutv4.RUnlock()
|
||||
if ip != "" {
|
||||
rr, err := dns.NewRR(fmt.Sprintf("%s A %s", q.Name, ip))
|
||||
if err == nil {
|
||||
@@ -36,9 +37,9 @@ func parseQuery(m *dns.Msg, currentDomain *domain) {
|
||||
}
|
||||
case dns.TypeAAAA:
|
||||
log.Printf("Query for AAAA record of %s\n", q.Name)
|
||||
currentDomain.mutv6.RLock()
|
||||
ip := currentDomain.ipv6[q.Name]
|
||||
currentDomain.mutv6.RUnlock()
|
||||
currentDomain.Mutv6.RLock()
|
||||
ip := currentDomain.Ipv6[q.Name]
|
||||
currentDomain.Mutv6.RUnlock()
|
||||
if ip != "" {
|
||||
rr, err := dns.NewRR(fmt.Sprintf("%s AAAA %s", q.Name, ip))
|
||||
if err == nil {
|
||||
@@ -64,10 +65,13 @@ func handleDnsRequest(currentDomain *domain) func(w dns.ResponseWriter, r *dns.M
|
||||
}
|
||||
}
|
||||
|
||||
func Load() {
|
||||
for _, currentDomain := range config.Config.Domains {
|
||||
func Init() {
|
||||
for _, currentDomain := range config.Config.DNS.Domains {
|
||||
log.Printf("Added domain root: %s\n", currentDomain)
|
||||
domains = append(domains, &domain{
|
||||
root: currentDomain,
|
||||
Root: currentDomain,
|
||||
Ipv4: make(map[string]string),
|
||||
Ipv6: make(map[string]string),
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -75,12 +79,12 @@ func Load() {
|
||||
func Run() (*dns.Server, error) {
|
||||
// attach request handler func
|
||||
for _, currentDomain := range domains {
|
||||
dns.HandleFunc(currentDomain.root, handleDnsRequest(currentDomain))
|
||||
dns.HandleFunc(currentDomain.Root, handleDnsRequest(currentDomain))
|
||||
}
|
||||
|
||||
// start server
|
||||
server := &dns.Server{Addr: ":" + strconv.Itoa(int(config.Config.Port)), Net: "udp"}
|
||||
log.Printf("Starting DNS at %d\n", config.Config.Port)
|
||||
server := &dns.Server{Addr: ":" + strconv.Itoa(int(config.Config.DNS.Port)), Net: "udp"}
|
||||
log.Printf("Starting DNS at %d\n", config.Config.DNS.Port)
|
||||
err := server.ListenAndServe()
|
||||
if err != nil {
|
||||
server.Shutdown()
|
||||
@@ -90,24 +94,34 @@ func Run() (*dns.Server, error) {
|
||||
return server, nil
|
||||
}
|
||||
|
||||
func UpdateIpv6(domain string, ipv6 string) {
|
||||
func UpdateIpv6(domain string, ipv6 string) error {
|
||||
for _, currentDomain := range domains {
|
||||
if dns.IsSubDomain(currentDomain.root, domain) {
|
||||
currentDomain.mutv6.Lock()
|
||||
currentDomain.ipv6[domain] = ipv6
|
||||
currentDomain.mutv6.Unlock()
|
||||
break
|
||||
if dns.IsSubDomain(currentDomain.Root, domain) {
|
||||
log.Printf("Updating domain %s AAAA %s\n", domain, ipv6)
|
||||
currentDomain.Mutv6.Lock()
|
||||
currentDomain.Ipv6[domain] = ipv6
|
||||
currentDomain.Mutv6.Unlock()
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
return errors.New("no root found")
|
||||
}
|
||||
|
||||
func UpdateIpv4(domain string, ipv4 string) {
|
||||
func UpdateIpv4(domain string, ipv4 string) (err error) {
|
||||
for _, currentDomain := range domains {
|
||||
if dns.IsSubDomain(currentDomain.root, domain) {
|
||||
currentDomain.mutv4.Lock()
|
||||
currentDomain.ipv4[domain] = ipv4
|
||||
currentDomain.mutv4.Unlock()
|
||||
break
|
||||
if dns.IsSubDomain(currentDomain.Root, domain) {
|
||||
log.Printf("Updating domain %s A %s\n", domain, ipv4)
|
||||
currentDomain.Mutv4.Lock()
|
||||
currentDomain.Ipv4[domain] = ipv4
|
||||
currentDomain.Mutv4.Unlock()
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
return errors.New("no root found")
|
||||
}
|
||||
|
||||
func Get() []*domain {
|
||||
return domains
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user