package ingest import ( "context" "fmt" "log" "net" "strings" "time" "git.apinb.com/ops/logs/internal/config" "github.com/gosnmp/gosnmp" ) func StartTrapUDP(ctx context.Context) error { addr := strings.TrimSpace(config.Spec.Ingest.TrapListenAddr) if addr == "" { return nil } tl := gosnmp.NewTrapListener() tl.OnNewTrap = func(pkt *gosnmp.SnmpPacket, u *net.UDPAddr) { if u == nil || pkt == nil { return } ua := *u Global.HandleTrap(&ua, pkt) markWorkerSucceeded("trap_udp") } tl.Params = gosnmp.Default tl.Params.Logger = gosnmp.NewLogger(log.Default()) started := make(chan error, 1) startWorker("trap_udp", func() error { go func() { <-ctx.Done() tl.Close() }() err := tl.Listen(addr) if ctx.Err() != nil { return nil } return err }) go func() { select { case <-tl.Listening(): started <- nil case <-ctx.Done(): started <- ctx.Err() case <-time.After(5 * time.Second): tl.Close() started <- fmt.Errorf("Trap UDP 监听 %s 启动超时", addr) } }() if err := <-started; err != nil { return err } return nil }