dnscontrol/providers/fortigate/auditrecords.go
Klett IT a815bdcf45
FORTIGATE: Add NS and MX record support (#3671)
Co-authored-by: Klett IT <git@klett-it.net>
2025-07-18 10:22:37 -04:00

63 lines
1.9 KiB
Go

package fortigate
import (
"fmt"
"github.com/StackExchange/dnscontrol/v4/models"
"strings"
)
// AuditRecords performs basic validation and returns warnings for known limitations.
func AuditRecords(records []*models.RecordConfig) []error {
var problems []error
for _, rc := range records {
switch rc.Type {
case "A", "AAAA", "CNAME", "NS", "MX":
// Supported
case "PTR":
// FortiGate limitations: these record types are not fully supported.
problems = append(problems,
fmt.Errorf("record type %s is not supported by FortiGate provider (name: %s)", rc.Type, rc.GetLabelFQDN()))
default:
problems = append(problems,
fmt.Errorf("record type %s is not supported by FortiGate provider (name: %s)", rc.Type, rc.GetLabelFQDN()))
}
//Handle CNAME Records limitations
if rc.Type == "CNAME" && rc.GetLabel() == "@" {
problems = append(problems,
fmt.Errorf("CNAME at apex (@) is not allowed (name: %s)", rc.GetLabelFQDN()))
}
//Handle NS Records limitations
if rc.Type == "NS" && rc.GetLabel() != "@" && rc.GetLabel() != "" {
problems = append(problems,
fmt.Errorf("NS records are only supported at the zone apex (@): %s", rc.GetLabelFQDN()))
}
//Handle MX Records limitations
if rc.Type == "MX" {
// MX only supported at zone apex
if rc.GetLabel() != "@" && rc.GetLabel() != "" {
problems = append(problems,
fmt.Errorf("MX records are only supported at the zone apex (@): %s", rc.GetLabelFQDN()))
}
// FortiGate does not accept "." as target (it's not a valid DNS name)
target := rc.GetTargetField()
if target == "." {
problems = append(problems,
fmt.Errorf("FortiGate does not accept '.' as an MX target: %s", rc.GetLabelFQDN()))
}
}
// Wildcard support
if strings.Contains(rc.GetLabelFQDN(), "*") {
problems = append(problems,
fmt.Errorf("wildcard record %s is not supported by FortiGate", rc.GetLabelFQDN()))
}
}
return problems
}