checker-ptr/checker/rule.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
}