- Created bgp_peers table to track all BGP peers - Added PeerHandler to update peer last seen times for all message types - Removed verbose BGP keepalive debug logging - BGP keepalive messages now silently update peer tracking Refactor HTML templates to use go:embed - Created internal/templates package with embedded templates - Moved status.html from inline const to separate file - Templates are parsed once on startup - Server now uses parsed template instead of raw string Optimize AS data embedding with gzip compression - Changed asinfo package to embed gzipped data (2.4MB vs 12MB) - Updated Makefile to gzip AS data during update - Added decompression during initialization - Raw JSON file excluded from git
50 lines
1.1 KiB
Go
50 lines
1.1 KiB
Go
package routewatch
|
|
|
|
import (
|
|
"log/slog"
|
|
"strconv"
|
|
|
|
"git.eeqj.de/sneak/routewatch/internal/database"
|
|
"git.eeqj.de/sneak/routewatch/internal/ristypes"
|
|
)
|
|
|
|
// PeerHandler tracks BGP peers from all message types
|
|
type PeerHandler struct {
|
|
db database.Store
|
|
logger *slog.Logger
|
|
}
|
|
|
|
// NewPeerHandler creates a new peer tracking handler
|
|
func NewPeerHandler(db database.Store, logger *slog.Logger) *PeerHandler {
|
|
return &PeerHandler{
|
|
db: db,
|
|
logger: logger,
|
|
}
|
|
}
|
|
|
|
// WantsMessage returns true for all message types since we track peers from all messages
|
|
func (h *PeerHandler) WantsMessage(_ string) bool {
|
|
return true
|
|
}
|
|
|
|
// HandleMessage processes a message to track peer information
|
|
func (h *PeerHandler) HandleMessage(msg *ristypes.RISMessage) {
|
|
// Parse peer ASN from string
|
|
peerASN := 0
|
|
if msg.PeerASN != "" {
|
|
if asn, err := strconv.Atoi(msg.PeerASN); err == nil {
|
|
peerASN = asn
|
|
}
|
|
}
|
|
|
|
// Update peer in database
|
|
if err := h.db.UpdatePeer(msg.Peer, peerASN, msg.Type, msg.ParsedTimestamp); err != nil {
|
|
h.logger.Error("Failed to update peer",
|
|
"peer", msg.Peer,
|
|
"peer_asn", peerASN,
|
|
"message_type", msg.Type,
|
|
"error", err,
|
|
)
|
|
}
|
|
}
|