Generic SRV records checker for happyDomain.
For each SRV record attached to an svcs.UnknownSRV service, the checker
resolves every target and probes reachability:
- DNS resolution (A/AAAA), CNAME detection (RFC 2782 violation),
null-target detection (RFC 2782 "service explicitly unavailable")
- TCP connect to target:port for _tcp SRVs
- UDP probe for _udp SRVs, using ICMP port-unreachable detection
The checker also publishes TLS endpoints (host, port, SNI) for every
SRV target hitting a well-known direct-TLS port (443, 465, 636, 853,
993, 995, 5061, 5223, …) via the EndpointDiscoverer SDK interface, so
a downstream TLS checker can pick them up.
The HTML report groups records as cards and surfaces the most common
failure scenarios (DNS failure, CNAME target, TCP unreachable,
null-target) at the top with remediation guidance.
75 lines
1.7 KiB
Go
75 lines
1.7 KiB
Go
package checker
|
|
|
|
import (
|
|
"time"
|
|
|
|
sdk "git.happydns.org/checker-sdk-go/checker"
|
|
)
|
|
|
|
var Version = "built-in"
|
|
|
|
func Definition() *sdk.CheckerDefinition {
|
|
return &sdk.CheckerDefinition{
|
|
ID: "srv",
|
|
Name: "SRV Records Tester",
|
|
Version: Version,
|
|
Availability: sdk.CheckerAvailability{
|
|
ApplyToService: true,
|
|
LimitToServices: []string{"svcs.UnknownSRV"},
|
|
},
|
|
HasHTMLReport: true,
|
|
ObservationKeys: []sdk.ObservationKey{ObservationKeySRV},
|
|
Options: sdk.CheckerOptionsDocumentation{
|
|
UserOpts: []sdk.CheckerOptionDocumentation{
|
|
{
|
|
Id: "tcpTimeout",
|
|
Type: "number",
|
|
Label: "TCP connect timeout (ms)",
|
|
Default: float64(3000),
|
|
Description: "Max time to wait for a TCP handshake on each target.",
|
|
},
|
|
{
|
|
Id: "udpTimeout",
|
|
Type: "number",
|
|
Label: "UDP probe timeout (ms)",
|
|
Default: float64(2000),
|
|
Description: "Max time to wait for a UDP response or ICMP unreachable.",
|
|
},
|
|
},
|
|
ServiceOpts: []sdk.CheckerOptionDocumentation{
|
|
{
|
|
Id: "service",
|
|
Label: "Service",
|
|
AutoFill: sdk.AutoFillService,
|
|
Hide: true,
|
|
},
|
|
{
|
|
Id: "subdomain",
|
|
Label: "Subdomain",
|
|
AutoFill: sdk.AutoFillSubdomain,
|
|
Hide: true,
|
|
},
|
|
{
|
|
Id: "domain",
|
|
Label: "Domain",
|
|
AutoFill: sdk.AutoFillDomainName,
|
|
Hide: true,
|
|
},
|
|
},
|
|
},
|
|
Rules: []sdk.CheckRule{
|
|
RulePresent(),
|
|
RuleNullTarget(),
|
|
RuleTargetNotCNAME(),
|
|
RuleTargetsResolve(),
|
|
RuleTCPReachable(),
|
|
RuleUDPReachable(),
|
|
RuleRedundancy(),
|
|
},
|
|
Interval: &sdk.CheckIntervalSpec{
|
|
Min: 5 * time.Minute,
|
|
Max: 7 * 24 * time.Hour,
|
|
Default: 6 * time.Hour,
|
|
},
|
|
}
|
|
}
|