diff --git a/cmd/olcrtc/main.go b/cmd/olcrtc/main.go index 65140d9..0ed3c5a 100644 --- a/cmd/olcrtc/main.go +++ b/cmd/olcrtc/main.go @@ -6,6 +6,7 @@ package main import ( + "bufio" "bytes" "context" "errors" @@ -15,6 +16,7 @@ import ( "os" "os/signal" "path/filepath" + "sync" "syscall" "time" @@ -45,6 +47,8 @@ var runSession = session.Run //nolint:gochecknoglobals // Tests replace gen runner with a stub. var runGen = execGen +var stderrFilterOnce sync.Once //nolint:gochecknoglobals // process-wide stderr fd filter + // loadedConfig bundles the parsed YAML file and the derived session config. type loadedConfig struct { scfg session.Config @@ -73,6 +77,7 @@ func run() error { func runWithArgs(args []string) error { logger.DisableNoisyPionLogs() + installStderrFilter() session.RegisterDefaults() if len(args) != 1 || args[0] == "-h" || args[0] == "--help" || args[0] == "-help" { @@ -334,7 +339,57 @@ func (f filteredWriter) Write(p []byte) (int, error) { return n, nil } +func installStderrFilter() { + stderrFilterOnce.Do(func() { + origFD, err := syscall.Dup(int(os.Stderr.Fd())) + if err != nil { + return + } + reader, writer, err := os.Pipe() + if err != nil { + _ = syscall.Close(origFD) + return + } + if err := syscall.Dup2(int(writer.Fd()), int(os.Stderr.Fd())); err != nil { + _ = reader.Close() + _ = writer.Close() + _ = syscall.Close(origFD) + return + } + _ = writer.Close() + os.Stderr = os.NewFile(uintptr(syscall.Stderr), "/dev/stderr") + orig := os.NewFile(uintptr(origFD), "/dev/stderr-original") + go copyFilteredStderr(reader, orig) + }) +} + +func copyFilteredStderr(reader *os.File, out io.Writer) { + defer func() { _ = reader.Close() }() + br := bufio.NewReader(reader) + for { + line, err := br.ReadBytes('\n') + if len(line) > 0 && !isNoisyLogLine(line) { + if _, writeErr := out.Write(line); writeErr != nil { + return + } + } + if err != nil { + return + } + } +} + +func isNoisyLogLine(line []byte) bool { + for _, prefix := range noisyPrefixes { + if bytes.Contains(line, prefix) { + return true + } + } + return false +} + func configureLogging(debug bool) { + installStderrFilter() log.SetOutput(filteredWriter{w: os.Stderr}) logger.DisableNoisyPionLogs() if debug {