Skip to content

Commit 2b61aa0

Browse files
authored
Terminal Fixes (#175)
* Fix broken terminal state after terminating. * Use correct newlines on Windows
1 parent 809235d commit 2b61aa0

File tree

2 files changed

+56
-4
lines changed

2 files changed

+56
-4
lines changed

src/pipeleak/cmd/root.go

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package cmd
22

33
import (
4+
"bytes"
5+
"io"
46
"os"
7+
"runtime"
58
"time"
69

710
"github.com/CompassSecurity/pipeleak/cmd/bitbucket"
@@ -41,8 +44,38 @@ func init() {
4144
rootCmd.PersistentFlags().StringVarP(&LogFile, "logfile", "l", "", "Log output to a file")
4245
}
4346

47+
type CustomWriter struct {
48+
Writer *os.File
49+
}
50+
51+
func (cw *CustomWriter) Write(p []byte) (n int, err error) {
52+
originalLen := len(p)
53+
if bytes.HasSuffix(p, []byte("\n")) {
54+
p = bytes.TrimSuffix(p, []byte("\n"))
55+
}
56+
57+
// necessary as to: https://github.com/rs/zerolog/blob/master/log.go#L474
58+
newlineChars := []byte("\n")
59+
if runtime.GOOS == "windows" {
60+
newlineChars = []byte("\n\r")
61+
}
62+
63+
modified := append(p, newlineChars...)
64+
65+
written, err := cw.Writer.Write(modified)
66+
if err != nil {
67+
return 0, err
68+
}
69+
70+
if written != len(modified) {
71+
return 0, io.ErrShortWrite
72+
}
73+
74+
return originalLen, nil
75+
}
76+
4477
func initLogger() {
45-
defaultOut := os.Stdout
78+
defaultOut := &CustomWriter{Writer: os.Stdout}
4679
if LogFile != "" {
4780
runLogFile, err := os.OpenFile(
4881
LogFile,
@@ -52,7 +85,7 @@ func initLogger() {
5285
if err != nil {
5386
panic(err)
5487
}
55-
defaultOut = runLogFile
88+
defaultOut = &CustomWriter{Writer: runLogFile}
5689
}
5790

5891
if JsonLogoutput {

src/pipeleak/main.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,34 @@
11
package main
22

33
import (
4-
"os"
5-
64
"github.com/CompassSecurity/pipeleak/cmd"
5+
"golang.org/x/term"
76
_ "net/http/pprof"
7+
"os"
88
)
99

10+
var originalTerminalState *term.State
11+
1012
func main() {
13+
saveTerminalState()
14+
defer restoreTerminalState()
1115
err := cmd.Execute()
1216
if err != nil {
1317
os.Exit(1)
1418
}
1519
}
20+
21+
func saveTerminalState() {
22+
if term.IsTerminal(int(os.Stdin.Fd())) {
23+
state, err := term.GetState(int(os.Stdin.Fd()))
24+
if err == nil {
25+
originalTerminalState = state
26+
}
27+
}
28+
}
29+
30+
func restoreTerminalState() {
31+
if originalTerminalState != nil {
32+
_ = term.Restore(int(os.Stdin.Fd()), originalTerminalState)
33+
}
34+
}

0 commit comments

Comments
 (0)