75 lines
2 KiB
Go
75 lines
2 KiB
Go
package checker
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
sdk "git.happydns.org/checker-sdk-go/checker"
|
|
)
|
|
|
|
// Defaults are centralised so Definition's docs and runtime reads cannot drift.
|
|
const (
|
|
defaultMaxChainLength = 8
|
|
defaultMinTargetTTL = 60
|
|
defaultRequireResolvableTarget = true
|
|
defaultAllowApexCNAME = false
|
|
defaultRecognizeApexFlattening = true
|
|
|
|
// hintKey is the CheckState.Meta key the HTML report reads to render the
|
|
// "How to fix" block: keep them in sync.
|
|
hintKey = "hint"
|
|
)
|
|
|
|
func loadAlias(ctx context.Context, obs sdk.ObservationGetter) (*AliasData, []sdk.CheckState) {
|
|
var data AliasData
|
|
if err := obs.Get(ctx, ObservationKeyAlias, &data); err != nil {
|
|
return nil, []sdk.CheckState{{
|
|
Status: sdk.StatusError,
|
|
Message: fmt.Sprintf("failed to read alias observation: %v", err),
|
|
}}
|
|
}
|
|
return &data, nil
|
|
}
|
|
|
|
// skipped is the "nothing to judge right now" return: rules must produce at
|
|
// least one state, otherwise the SDK substitutes StatusUnknown.
|
|
func skipped(reason string) []sdk.CheckState {
|
|
return []sdk.CheckState{{
|
|
Status: sdk.StatusUnknown,
|
|
Message: "skipped: " + reason,
|
|
}}
|
|
}
|
|
|
|
func okState(subject, message string) []sdk.CheckState {
|
|
return []sdk.CheckState{{
|
|
Status: sdk.StatusOK,
|
|
Subject: subject,
|
|
Message: message,
|
|
}}
|
|
}
|
|
|
|
// withHint is a no-op when hint is empty so callers can pass through unchecked.
|
|
func withHint(s sdk.CheckState, hint string) sdk.CheckState {
|
|
if hint == "" {
|
|
return s
|
|
}
|
|
if s.Meta == nil {
|
|
s.Meta = map[string]any{}
|
|
}
|
|
s.Meta[hintKey] = hint
|
|
return s
|
|
}
|
|
|
|
// apexKnown gates chain-oriented rules with a uniform "apex lookup failed"
|
|
// skip line so the UI stays consistent across rules.
|
|
func apexKnown(data *AliasData) bool {
|
|
return data.ApexLookupError == "" && data.Apex != ""
|
|
}
|
|
|
|
func allowApexCNAME(opts sdk.CheckerOptions) bool {
|
|
return sdk.GetBoolOption(opts, "allowApexCNAME", defaultAllowApexCNAME)
|
|
}
|
|
|
|
func recognizeApexFlattening(opts sdk.CheckerOptions) bool {
|
|
return sdk.GetBoolOption(opts, "recognizeApexFlattening", defaultRecognizeApexFlattening)
|
|
}
|