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 }