Remove ICMP ping from probe, add HomeKit port 51826

ICMP requires root or CAP_NET_RAW which is not available in
unprivileged containers. Probe now relies solely on port scanning
for reachability detection, which works without any special
permissions. Add port 51826 (HomeKit) to both default and
database-loaded port lists.
This commit is contained in:
eduard256
2026-04-05 11:54:24 +00:00
parent 4e9ffd1440
commit f084135701
3 changed files with 3 additions and 73 deletions
+2 -27
View File
@@ -21,8 +21,6 @@ const probeTimeout = 100 * time.Millisecond
var log zerolog.Logger var log zerolog.Logger
var db *sql.DB var db *sql.DB
var ports []int var ports []int
var hasICMP bool
var detectors []func(*probe.Response) string var detectors []func(*probe.Response) string
func Init() { func Init() {
@@ -35,14 +33,6 @@ func Init() {
} }
ports = loadPorts() ports = loadPorts()
hasICMP = probe.CanICMP()
if hasICMP {
log.Info().Msg("[probe] ICMP available")
} else {
log.Info().Msg("[probe] ICMP not available, using port scan only")
}
// HomeKit detector // HomeKit detector
detectors = append(detectors, func(r *probe.Response) string { detectors = append(detectors, func(r *probe.Response) string {
if r.Probes.MDNS != nil && !r.Probes.MDNS.Paired { if r.Probes.MDNS != nil && !r.Probes.MDNS.Paired {
@@ -123,26 +113,10 @@ func runProbe(parent context.Context, ip string) *probe.Response {
mu.Unlock() mu.Unlock()
}) })
if hasICMP {
run(func() {
r, _ := probe.Ping(ctx, ip)
mu.Lock()
resp.Probes.Ping = r
mu.Unlock()
})
}
wg.Wait() wg.Wait()
// determine reachable // determine reachable
resp.Reachable = resp.Probes.Ports != nil && len(resp.Probes.Ports.Open) > 0 resp.Reachable = resp.Probes.Ports != nil && len(resp.Probes.Ports.Open) > 0
if !resp.Reachable && resp.Probes.Ping != nil {
resp.Reachable = true
}
if resp.Reachable && resp.Probes.Ping != nil {
resp.LatencyMs = resp.Probes.Ping.LatencyMs
}
// determine type // determine type
resp.Type = "standard" resp.Type = "standard"
@@ -184,10 +158,11 @@ func loadPorts() []int {
return defaultPorts() return defaultPorts()
} }
result = append(result, 51826)
log.Info().Int("count", len(result)).Msg("[probe] loaded ports from db") log.Info().Int("count", len(result)).Msg("[probe] loaded ports from db")
return result return result
} }
func defaultPorts() []int { func defaultPorts() []int {
return []int{554, 80, 8080, 443, 8554, 5544, 10554, 1935, 81, 88, 8090, 8001, 8081, 7070, 7447, 34567} return []int{554, 80, 8080, 443, 8554, 5544, 10554, 1935, 81, 88, 8090, 8001, 8081, 7070, 7447, 34567, 51826}
} }
-6
View File
@@ -3,14 +3,12 @@ package probe
type Response struct { type Response struct {
IP string `json:"ip"` IP string `json:"ip"`
Reachable bool `json:"reachable"` Reachable bool `json:"reachable"`
LatencyMs float64 `json:"latency_ms,omitempty"`
Type string `json:"type"` // "unreachable", "standard", "homekit" Type string `json:"type"` // "unreachable", "standard", "homekit"
Error string `json:"error,omitempty"` Error string `json:"error,omitempty"`
Probes Probes `json:"probes"` Probes Probes `json:"probes"`
} }
type Probes struct { type Probes struct {
Ping *PingResult `json:"ping"`
Ports *PortsResult `json:"ports"` Ports *PortsResult `json:"ports"`
DNS *DNSResult `json:"dns"` DNS *DNSResult `json:"dns"`
ARP *ARPResult `json:"arp"` ARP *ARPResult `json:"arp"`
@@ -18,10 +16,6 @@ type Probes struct {
HTTP *HTTPResult `json:"http"` HTTP *HTTPResult `json:"http"`
} }
type PingResult struct {
LatencyMs float64 `json:"latency_ms"`
}
type PortsResult struct { type PortsResult struct {
Open []int `json:"open"` Open []int `json:"open"`
} }
-39
View File
@@ -1,39 +0,0 @@
package probe
import (
"context"
"net"
"time"
)
func CanICMP() bool {
conn, err := net.DialTimeout("ip4:icmp", "127.0.0.1", 100*time.Millisecond)
if err != nil {
return false
}
conn.Close()
return true
}
func Ping(ctx context.Context, ip string) (*PingResult, error) {
deadline, ok := ctx.Deadline()
if !ok {
deadline = time.Now().Add(100 * time.Millisecond)
}
timeout := time.Until(deadline)
if timeout <= 0 {
return nil, context.DeadlineExceeded
}
start := time.Now()
conn, err := net.DialTimeout("ip4:icmp", ip, timeout)
if err != nil {
return nil, err
}
conn.Close()
return &PingResult{
LatencyMs: float64(time.Since(start).Microseconds()) / 1000.0,
}, nil
}