mirror of
https://github.com/openlibrecommunity/olcrtc.git
synced 2026-05-26 07:08:11 +00:00
refactor: move stderr filter to unix build-tagged file
This commit is contained in:
@@ -6,7 +6,6 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"context"
|
||||
"errors"
|
||||
@@ -16,7 +15,6 @@ import (
|
||||
"os"
|
||||
"os/signal"
|
||||
"path/filepath"
|
||||
"sync"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
@@ -47,8 +45,6 @@ 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
|
||||
@@ -339,46 +335,6 @@ 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) {
|
||||
|
||||
54
cmd/olcrtc/stderr_filter_unix.go
Normal file
54
cmd/olcrtc/stderr_filter_unix.go
Normal file
@@ -0,0 +1,54 @@
|
||||
//go:build !windows
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"io"
|
||||
"os"
|
||||
"sync"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
var stderrFilterOnce sync.Once //nolint:gochecknoglobals // process-wide stderr fd filter
|
||||
|
||||
func installStderrFilter() {
|
||||
stderrFilterOnce.Do(func() {
|
||||
origFD, err := unix.Dup(int(os.Stderr.Fd()))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
reader, writer, err := os.Pipe()
|
||||
if err != nil {
|
||||
_ = unix.Close(origFD)
|
||||
return
|
||||
}
|
||||
if err := unix.Dup2(int(writer.Fd()), int(os.Stderr.Fd())); err != nil {
|
||||
_ = reader.Close()
|
||||
_ = writer.Close()
|
||||
_ = unix.Close(origFD)
|
||||
return
|
||||
}
|
||||
_ = writer.Close()
|
||||
os.Stderr = os.NewFile(uintptr(unix.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
|
||||
}
|
||||
}
|
||||
}
|
||||
5
cmd/olcrtc/stderr_filter_windows.go
Normal file
5
cmd/olcrtc/stderr_filter_windows.go
Normal file
@@ -0,0 +1,5 @@
|
||||
//go:build windows
|
||||
|
||||
package main
|
||||
|
||||
func installStderrFilter() {}
|
||||
Reference in New Issue
Block a user