1package handlers
2
3import (
4 "dnsense/dns"
5 "strings"
6)
7
8func baseResponse(req *dns.Message) *dns.Message {
9 resp := &dns.Message{}
10 resp.Header = req.Header
11 resp.Header.SetResponse()
12 resp.Header.SetAA()
13 resp.Header.Flags &^= (1 << 5) // clear AD bit
14 resp.Header.ARCount = 0
15 resp.Questions = req.Questions
16 return resp
17}
18
19func errorResponse(req *dns.Message, msg string) *dns.Message {
20 resp := baseResponse(req)
21
22 rr, err := dns.NewTXTRecord(req.Questions[0].Name, 30, "error: "+msg)
23 if err != nil {
24 return resp
25 }
26
27 resp.Answers = append(resp.Answers, *rr)
28 return resp
29}
30
31func Route(req *dns.Message) *dns.Message {
32 if len(req.Questions) == 0 {
33 return errorResponse(req, "no question")
34 }
35
36 q := req.Questions[0]
37
38 if q.Type != dns.TypeTXT {
39 return errorResponse(req, "only TXT queries supported")
40 }
41
42 name := strings.TrimSuffix(q.Name, ".")
43 labels := strings.SplitN(name, ".", 3)
44
45 if len(labels) < 2 {
46 return errorResponse(req, "format: <command>.<input>")
47 }
48
49 command := strings.ToLower(labels[0])
50 input := strings.ReplaceAll(labels[1], "-", " ")
51
52 return handleCMD(req, command, input)
53}