// This file is part of the happyDomain (R) project. // Copyright (c) 2020-2026 happyDomain // Authors: Pierre-Olivier Mercier, et al. // // This program is offered under a commercial and under the AGPL license. // For commercial licensing, contact us at . // // For AGPL licensing: // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . package checker import ( "context" "fmt" sdk "git.happydns.org/checker-sdk-go/checker" ) // One rule per concern so each failure is individually visible rather than buried in a single rule's Code field. func Rules() []sdk.CheckRule { return []sdk.CheckRule{ RulePresent(), RuleNullTarget(), RuleTargetNotCNAME(), RuleTargetsResolve(), RuleTCPReachable(), RuleUDPReachable(), RulePortValid(), RulePriorityWeightSanity(), RuleRedundancy(), } } func getData(ctx context.Context, obs sdk.ObservationGetter) (*SRVData, *sdk.CheckState) { var d SRVData if err := obs.Get(ctx, ObservationKeySRV, &d); err != nil { return nil, &sdk.CheckState{ Status: sdk.StatusError, Message: fmt.Sprintf("Failed to load SRV observation: %v", err), Code: "srv_obs_error", } } return &d, nil } func countProbeResults(d *SRVData, proto string) (total, ok int, failed []string) { for _, r := range d.Records { if r.IsNullTarget || r.Proto != proto { continue } for _, pr := range r.Probes { total++ if pr.Connected { ok++ } else { failed = append(failed, fmt.Sprintf("%s: %s", pr.Address, pr.Error)) } } } return }