/*
* Copyright (C) 2024 Jonni Liljamo <jonni@liljamo.com>
*
* This file is licensed under AGPL-3.0-or-later, see NOTICE and LICENSE for
* more information.
*/
package dns
import (
"log/slog"
"net"
"strings"
"git.src.quest/~liljamo/felu/internal/db"
"github.com/miekg/dns"
)
func parseQuery(m *dns.Msg, r *dns.Msg) {
for _, q := range m.Question {
switch q.Qtype {
case dns.TypeA:
handleARecord(&q, m, r)
}
}
}
func handleARecord(q *dns.Question, m *dns.Msg, r *dns.Msg) {
slog.Info("A Record Query", slog.String("qname", q.Name))
if index := strings.IndexByte(q.Name, '.'); index >= 0 {
aRecord, err := db.FetchDomainARecord(strings.ToLower(q.Name[:index]))
if err != nil {
m.SetRcode(r, dns.RcodeNameError)
} else {
m.Answer = append(m.Answer, &dns.A{
Hdr: dns.RR_Header{Name: q.Name, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 60},
A: net.ParseIP(aRecord),
})
}
} else {
m.SetRcode(r, dns.RcodeNameError)
}
}