86 lines
2 KiB
Go
86 lines
2 KiB
Go
package checker
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
sdk "git.happydns.org/checker-sdk-go/checker"
|
|
)
|
|
|
|
// One rule per concern so the UI can list what passed and what didn't.
|
|
func Rules() []sdk.CheckRule {
|
|
return []sdk.CheckRule{
|
|
&nsDeclaredRule{},
|
|
&parentDelegationRule{},
|
|
&nsResolvableRule{},
|
|
&nsReachableRule{},
|
|
&authoritativeRule{},
|
|
&ednsRule{},
|
|
&latencyRule{},
|
|
&serialConsistencyRule{},
|
|
&serialVsSavedRule{},
|
|
&soaFieldsConsistencyRule{},
|
|
&nsRRsetConsistencyRule{},
|
|
}
|
|
}
|
|
|
|
// On error, returns a CheckState the caller should emit to short-circuit.
|
|
func loadObservation(ctx context.Context, obs sdk.ObservationGetter) (*ObservationData, *sdk.CheckState) {
|
|
var data ObservationData
|
|
if err := obs.Get(ctx, ObservationKey, &data); err != nil {
|
|
return nil, &sdk.CheckState{
|
|
Status: sdk.StatusError,
|
|
Message: fmt.Sprintf("Failed to get observation: %v", err),
|
|
Code: "authoritative_consistency_error",
|
|
}
|
|
}
|
|
return &data, nil
|
|
}
|
|
|
|
// Hint is copied into Meta["fix"] so the HTML reporter can surface it
|
|
// without re-deriving from the code.
|
|
func findingsToStates(findings []Finding) []sdk.CheckState {
|
|
out := make([]sdk.CheckState, 0, len(findings))
|
|
for _, f := range findings {
|
|
st := sdk.CheckState{
|
|
Status: severityToStatus(f.Severity),
|
|
Message: f.Message,
|
|
Code: f.Code,
|
|
Subject: f.Server,
|
|
}
|
|
if hint, ok := remediationHints[f.Code]; ok && hint != "" {
|
|
st.Meta = map[string]any{"fix": hint}
|
|
}
|
|
out = append(out, st)
|
|
}
|
|
return out
|
|
}
|
|
|
|
func severityToStatus(sev Severity) sdk.Status {
|
|
switch sev {
|
|
case SeverityCrit:
|
|
return sdk.StatusCrit
|
|
case SeverityWarn:
|
|
return sdk.StatusWarn
|
|
case SeverityInfo:
|
|
return sdk.StatusInfo
|
|
default:
|
|
return sdk.StatusOK
|
|
}
|
|
}
|
|
|
|
func passState(code, message string) sdk.CheckState {
|
|
return sdk.CheckState{
|
|
Status: sdk.StatusOK,
|
|
Message: message,
|
|
Code: code,
|
|
}
|
|
}
|
|
|
|
func notTestedState(code, message string) sdk.CheckState {
|
|
return sdk.CheckState{
|
|
Status: sdk.StatusUnknown,
|
|
Message: message,
|
|
Code: code,
|
|
}
|
|
}
|