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
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
@@ -16,7 +15,6 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sync"
|
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -47,8 +45,6 @@ var runSession = session.Run
|
|||||||
//nolint:gochecknoglobals // Tests replace gen runner with a stub.
|
//nolint:gochecknoglobals // Tests replace gen runner with a stub.
|
||||||
var runGen = execGen
|
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.
|
// loadedConfig bundles the parsed YAML file and the derived session config.
|
||||||
type loadedConfig struct {
|
type loadedConfig struct {
|
||||||
scfg session.Config
|
scfg session.Config
|
||||||
@@ -339,46 +335,6 @@ func (f filteredWriter) Write(p []byte) (int, error) {
|
|||||||
return n, nil
|
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 {
|
func isNoisyLogLine(line []byte) bool {
|
||||||
for _, prefix := range noisyPrefixes {
|
for _, prefix := range noisyPrefixes {
|
||||||
if bytes.Contains(line, prefix) {
|
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() {}
|
||||||
2
go.mod
2
go.mod
@@ -18,6 +18,7 @@ require (
|
|||||||
github.com/zarazaex69/j v0.0.0-20260516013155-bffcfe38e7d9
|
github.com/zarazaex69/j v0.0.0-20260516013155-bffcfe38e7d9
|
||||||
golang.org/x/crypto v0.50.0
|
golang.org/x/crypto v0.50.0
|
||||||
golang.org/x/mobile v0.0.0-20260410095206-2cfb76559b7b
|
golang.org/x/mobile v0.0.0-20260410095206-2cfb76559b7b
|
||||||
|
golang.org/x/sys v0.43.0
|
||||||
google.golang.org/genproto v0.0.0-20260209200024-4cfbd4190f57
|
google.golang.org/genproto v0.0.0-20260209200024-4cfbd4190f57
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
)
|
)
|
||||||
@@ -82,7 +83,6 @@ require (
|
|||||||
golang.org/x/mod v0.35.0 // indirect
|
golang.org/x/mod v0.35.0 // indirect
|
||||||
golang.org/x/net v0.53.0 // indirect
|
golang.org/x/net v0.53.0 // indirect
|
||||||
golang.org/x/sync v0.20.0 // indirect
|
golang.org/x/sync v0.20.0 // indirect
|
||||||
golang.org/x/sys v0.43.0 // indirect
|
|
||||||
golang.org/x/text v0.36.0 // indirect
|
golang.org/x/text v0.36.0 // indirect
|
||||||
golang.org/x/time v0.15.0 // indirect
|
golang.org/x/time v0.15.0 // indirect
|
||||||
golang.org/x/tools v0.44.0 // indirect
|
golang.org/x/tools v0.44.0 // indirect
|
||||||
|
|||||||
Reference in New Issue
Block a user