98 lines
2.5 KiB
Go
98 lines
2.5 KiB
Go
package checker
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
sdk "git.happydns.org/checker-sdk-go/checker"
|
|
)
|
|
|
|
// Rules returns the full list of CheckRules the SIP checker exposes. Each
|
|
// rule covers a single concern so the UI can show granular pass/fail
|
|
// instead of a monolithic aggregate. Shared helpers live at the bottom of
|
|
// this file; per-concern logic is in rules_*.go.
|
|
func Rules() []sdk.CheckRule {
|
|
return []sdk.CheckRule{
|
|
&srvPresenceRule{},
|
|
&transportDiversityRule{},
|
|
&srvTargetsResolvableRule{},
|
|
&endpointReachableRule{},
|
|
&optionsResponseRule{},
|
|
&optionsCapabilitiesRule{},
|
|
&ipv6CoverageRule{},
|
|
&tlsQualityRule{},
|
|
}
|
|
}
|
|
|
|
// ─── Shared helpers ──────────────────────────────────────────────────
|
|
|
|
// loadSIPData fetches the SIP observation. On error, returns a CheckState
|
|
// the caller should emit to short-circuit its rule.
|
|
func loadSIPData(ctx context.Context, obs sdk.ObservationGetter) (*SIPData, *sdk.CheckState) {
|
|
var data SIPData
|
|
if err := obs.Get(ctx, ObservationKeySIP, &data); err != nil {
|
|
return nil, &sdk.CheckState{
|
|
Status: sdk.StatusError,
|
|
Message: fmt.Sprintf("failed to load SIP observation: %v", err),
|
|
Code: "sip.observation_error",
|
|
}
|
|
}
|
|
return &data, nil
|
|
}
|
|
|
|
func statesFromIssues(issues []Issue) []sdk.CheckState {
|
|
out := make([]sdk.CheckState, 0, len(issues))
|
|
for _, is := range issues {
|
|
out = append(out, issueToState(is))
|
|
}
|
|
return out
|
|
}
|
|
|
|
func issueToState(is Issue) sdk.CheckState {
|
|
st := sdk.CheckState{
|
|
Status: severityToStatus(is.Severity),
|
|
Message: is.Message,
|
|
Code: is.Code,
|
|
Subject: is.Endpoint,
|
|
}
|
|
if is.Fix != "" {
|
|
st.Meta = map[string]any{"fix": is.Fix}
|
|
}
|
|
return st
|
|
}
|
|
|
|
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,
|
|
}
|
|
}
|
|
|
|
func severityToStatus(sev string) sdk.Status {
|
|
switch sev {
|
|
case SeverityCrit:
|
|
return sdk.StatusCrit
|
|
case SeverityWarn:
|
|
return sdk.StatusWarn
|
|
case SeverityInfo:
|
|
return sdk.StatusInfo
|
|
default:
|
|
return sdk.StatusOK
|
|
}
|
|
}
|
|
|
|
// wantTLS returns whether the TLS transport was requested for this run.
|
|
// Mirrors the default at Collect time (all three transports probed when
|
|
// unset).
|
|
func wantTLS(opts sdk.CheckerOptions) bool {
|
|
return sdk.GetBoolOption(opts, "probeTLS", true)
|
|
}
|