Add GET /api/v1/probe endpoint for device inspection

Fast (~1-3s) endpoint that gathers network info about a device
before full stream discovery. Runs ping first, then parallel probes.

Features:
- Ping with ICMP + TCP fallback (works without root)
- Reverse DNS hostname lookup
- ARP table MAC address + OUI vendor identification (2403 entries, 51 camera vendors)
- mDNS HomeKit detection (camera/doorbell, paired status)
- Extensible Prober interface for adding new probe types
- 3-second overall timeout, parallel execution

Response includes "type" field:
- "unreachable" - device not responding
- "standard" - normal IP camera (RTSP/HTTP/ONVIF flow)
- "homekit" - Apple HomeKit camera (PIN pairing flow)
This commit is contained in:
eduard256
2026-03-16 13:57:41 +00:00
parent eb8cc546c8
commit 4d6c2fd878
13 changed files with 3164 additions and 12 deletions
+21
View File
@@ -20,6 +20,7 @@ type Server struct {
loader *database.Loader
searchEngine *database.SearchEngine
scanner *discovery.Scanner
probeService *discovery.ProbeService
sseServer *sse.Server
logger interface{ Debug(string, ...any); Error(string, error, ...any); Info(string, ...any) }
}
@@ -75,6 +76,22 @@ func NewServer(
// Initialize SSE server
sseServer := sse.NewServer(logger)
// Initialize OUI database for vendor identification
ouiDB := discovery.NewOUIDatabase()
if err := ouiDB.LoadFromFile(cfg.Database.OUIPath); err != nil {
logger.Error("failed to load OUI database, vendor lookup will be unavailable", err)
} else {
logger.Info("OUI database loaded", "entries", ouiDB.Size())
}
// Initialize ProbeService with all probers
probers := []discovery.Prober{
&discovery.DNSProber{},
discovery.NewARPProber(ouiDB),
&discovery.MDNSProber{},
}
probeService := discovery.NewProbeService(probers, logger)
// Create server
server := &Server{
router: chi.NewRouter(),
@@ -82,6 +99,7 @@ func NewServer(
loader: loader,
searchEngine: searchEngine,
scanner: scanner,
probeService: probeService,
sseServer: sseServer,
logger: logger,
}
@@ -127,6 +145,9 @@ func (s *Server) setupRoutes() {
// Stream discovery (SSE)
s.router.Post("/streams/discover", handlers.NewDiscoverHandler(s.scanner, s.sseServer, s.logger).ServeHTTP)
// Device probe (ping + DNS + ARP/OUI + mDNS)
s.router.Get("/probe", handlers.NewProbeHandler(s.probeService, s.logger).ServeHTTP)
}
// ServeHTTP implements http.Handler