61 lines
1.3 KiB
Go
61 lines
1.3 KiB
Go
package do53
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"golang.org/x/net/dns/dnsmessage"
|
|
)
|
|
|
|
func MakeDNSMessage(domain string, queryType string) ([]byte, error) {
|
|
messageHeader := dnsmessage.Header{
|
|
ID: 1234, // FIX: Use a random ID
|
|
Response: false,
|
|
OpCode: dnsmessage.OpCode(0),
|
|
RecursionDesired: true,
|
|
}
|
|
|
|
messageBuilder := dnsmessage.NewBuilder(nil, messageHeader)
|
|
queryName, err := dnsmessage.NewName(domain)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to create query name: %v", err)
|
|
}
|
|
|
|
// Determine query type
|
|
var queryTypeValue dnsmessage.Type
|
|
switch queryType {
|
|
case "A":
|
|
queryTypeValue = dnsmessage.TypeA
|
|
case "AAAA":
|
|
queryTypeValue = dnsmessage.TypeAAAA
|
|
case "MX":
|
|
queryTypeValue = dnsmessage.TypeMX
|
|
case "CNAME":
|
|
queryTypeValue = dnsmessage.TypeCNAME
|
|
case "TXT":
|
|
queryTypeValue = dnsmessage.TypeTXT
|
|
default:
|
|
queryTypeValue = dnsmessage.TypeA
|
|
}
|
|
|
|
messageQuestion := dnsmessage.Question{
|
|
Name: queryName,
|
|
Type: queryTypeValue,
|
|
Class: dnsmessage.ClassINET,
|
|
}
|
|
|
|
err = messageBuilder.StartQuestions()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
err = messageBuilder.Question(messageQuestion)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to add question: %v", err)
|
|
}
|
|
|
|
message, err := messageBuilder.Finish()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to build message: %v", err)
|
|
}
|
|
return message, nil
|
|
}
|