85 lines
1.9 KiB
Go
85 lines
1.9 KiB
Go
package checker
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
sdk "git.happydns.org/checker-sdk-go/checker"
|
|
)
|
|
|
|
// Rules returns the full list of CheckRules exposed by the PTR checker.
|
|
// Each rule covers one concern so callers can see at a glance which checks
|
|
// passed and which did not.
|
|
func Rules() []sdk.CheckRule {
|
|
return []sdk.CheckRule{
|
|
&reverseArpaRule{},
|
|
&ownerDecodeRule{},
|
|
&reverseZoneRule{},
|
|
&queryOutcomeRule{},
|
|
&ptrPresentRule{},
|
|
&singlePTRRule{},
|
|
&declaredMatchRule{},
|
|
&targetSyntaxRule{},
|
|
&genericHostnameRule{},
|
|
&targetResolvesRule{},
|
|
&fcrdnsMatchRule{},
|
|
&ipv6PTRRule{},
|
|
&ttlHygieneRule{},
|
|
}
|
|
}
|
|
|
|
// loadPTR fetches the raw observation. On error, the returned CheckState is
|
|
// what the caller should emit to short-circuit.
|
|
func loadPTR(ctx context.Context, obs sdk.ObservationGetter) (*PTRData, *sdk.CheckState) {
|
|
var data PTRData
|
|
if err := obs.Get(ctx, ObservationKeyPTR, &data); err != nil {
|
|
return nil, &sdk.CheckState{
|
|
Status: sdk.StatusError,
|
|
Code: "ptr.observation_error",
|
|
Message: fmt.Sprintf("failed to get PTR data: %v", err),
|
|
}
|
|
}
|
|
return &data, nil
|
|
}
|
|
|
|
func passState(code, message, subject string) sdk.CheckState {
|
|
return sdk.CheckState{
|
|
Status: sdk.StatusOK,
|
|
Code: code,
|
|
Message: message,
|
|
Subject: subject,
|
|
}
|
|
}
|
|
|
|
func skipState(code, message string) sdk.CheckState {
|
|
return sdk.CheckState{
|
|
Status: sdk.StatusUnknown,
|
|
Code: code,
|
|
Message: message,
|
|
}
|
|
}
|
|
|
|
func critState(code, message, subject, hint string) sdk.CheckState {
|
|
return withHint(sdk.CheckState{
|
|
Status: sdk.StatusCrit,
|
|
Code: code,
|
|
Message: message,
|
|
Subject: subject,
|
|
}, hint)
|
|
}
|
|
|
|
func warnState(code, message, subject, hint string) sdk.CheckState {
|
|
return withHint(sdk.CheckState{
|
|
Status: sdk.StatusWarn,
|
|
Code: code,
|
|
Message: message,
|
|
Subject: subject,
|
|
}, hint)
|
|
}
|
|
|
|
func withHint(st sdk.CheckState, hint string) sdk.CheckState {
|
|
if hint != "" {
|
|
st.Meta = map[string]any{"hint": hint}
|
|
}
|
|
return st
|
|
}
|