Implements the full monitoring loop: - Immediate checks on startup, then periodic DNS+port and TLS cycles - Domain NS change detection with notifications - Per-nameserver hostname record tracking with change/failure/recovery and inconsistency detection - TCP port 80/443 monitoring with state change notifications - TLS certificate monitoring with change, expiry, and failure detection - State persistence after each cycle - First run establishes baseline without notifications - Graceful shutdown via context cancellation Defines DNSResolver, PortChecker, TLSChecker, and Notifier interfaces for dependency injection. Updates main.go fx wiring and resolver stub signature to match per-NS record format. Closes #2
65 lines
1.4 KiB
Go
65 lines
1.4 KiB
Go
// Package resolver provides iterative DNS resolution from root nameservers.
|
|
package resolver
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"log/slog"
|
|
|
|
"go.uber.org/fx"
|
|
|
|
"sneak.berlin/go/dnswatcher/internal/logger"
|
|
)
|
|
|
|
// ErrNotImplemented indicates the resolver is not yet implemented.
|
|
var ErrNotImplemented = errors.New("resolver not yet implemented")
|
|
|
|
// Params contains dependencies for Resolver.
|
|
type Params struct {
|
|
fx.In
|
|
|
|
Logger *logger.Logger
|
|
}
|
|
|
|
// Resolver performs iterative DNS resolution from root servers.
|
|
type Resolver struct {
|
|
log *slog.Logger
|
|
}
|
|
|
|
// New creates a new Resolver instance.
|
|
func New(
|
|
_ fx.Lifecycle,
|
|
params Params,
|
|
) (*Resolver, error) {
|
|
return &Resolver{
|
|
log: params.Logger.Get(),
|
|
}, nil
|
|
}
|
|
|
|
// LookupNS performs iterative resolution to find authoritative
|
|
// nameservers for the given domain.
|
|
func (r *Resolver) LookupNS(
|
|
_ context.Context,
|
|
_ string,
|
|
) ([]string, error) {
|
|
return nil, ErrNotImplemented
|
|
}
|
|
|
|
// LookupAllRecords performs iterative resolution to find all DNS
|
|
// records for the given hostname, keyed by authoritative nameserver.
|
|
func (r *Resolver) LookupAllRecords(
|
|
_ context.Context,
|
|
_ string,
|
|
) (map[string]map[string][]string, error) {
|
|
return nil, ErrNotImplemented
|
|
}
|
|
|
|
// ResolveIPAddresses resolves a hostname to all IPv4 and IPv6
|
|
// addresses, following CNAME chains.
|
|
func (r *Resolver) ResolveIPAddresses(
|
|
_ context.Context,
|
|
_ string,
|
|
) ([]string, error) {
|
|
return nil, ErrNotImplemented
|
|
}
|