/* * Copyright (C) 2024 Jonni Liljamo * * 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/~skye/felu-ddns/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) } }