diff options
author | Jakob Unterwurzacher | 2016-06-15 23:17:51 +0200 |
---|---|---|
committer | Jakob Unterwurzacher | 2016-06-15 23:17:51 +0200 |
commit | 09e88f31d1b4308bf82c7f4eb0dd83855ad67ffc (patch) | |
tree | e91a7ea9669fae9c633671ca5ca722fb97f2c254 /internal | |
parent | c89455063cfd9c531c0a671251ccfcd46f09403d (diff) |
toggledlog: assume command of color handling
We want to use colored error messages also outside of main,
so let's handle it in the logging package.
The fatal logger now automatically prints red.
Diffstat (limited to 'internal')
-rw-r--r-- | internal/readpassword/read.go | 19 | ||||
-rw-r--r-- | internal/toggledlog/log.go | 45 |
2 files changed, 46 insertions, 18 deletions
diff --git a/internal/readpassword/read.go b/internal/readpassword/read.go index f316846..1f2a9fa 100644 --- a/internal/readpassword/read.go +++ b/internal/readpassword/read.go @@ -16,9 +16,6 @@ const ( exitCode = 9 ) -// TODO -var colorReset, colorRed string - // Once() tries to get a password from the user, either from the terminal, // extpass or stdin. func Once(extpass string) string { @@ -43,7 +40,7 @@ func Twice(extpass string) string { p1 := readPasswordTerminal("Password: ") p2 := readPasswordTerminal("Repeat: ") if p1 != p2 { - toggledlog.Fatal.Println(colorRed + "Passwords do not match" + colorReset) + toggledlog.Fatal.Println("Passwords do not match") os.Exit(exitCode) } return p1 @@ -57,12 +54,12 @@ func readPasswordTerminal(prompt string) string { // terminal.ReadPassword removes the trailing newline p, err := terminal.ReadPassword(fd) if err != nil { - toggledlog.Fatal.Printf(colorRed+"Could not read password from terminal: %v\n"+colorReset, err) + toggledlog.Fatal.Printf("Could not read password from terminal: %v\n", err) os.Exit(exitCode) } fmt.Fprintf(os.Stderr, "\n") if len(p) == 0 { - toggledlog.Fatal.Println(colorRed + "Password is empty" + colorReset) + toggledlog.Fatal.Println("Password is empty") os.Exit(exitCode) } return string(p) @@ -75,7 +72,7 @@ func readPasswordStdin() string { p := readLineUnbuffered(os.Stdin) if len(p) == 0 { fmt.Fprintf(os.Stderr, "FOOOOOO\n") - toggledlog.Fatal.Println(colorRed + "Got empty password from stdin" + colorReset) + toggledlog.Fatal.Println("Got empty password from stdin") os.Exit(exitCode) } return p @@ -91,19 +88,19 @@ func readPasswordExtpass(extpass string) string { cmd.Stderr = os.Stderr pipe, err := cmd.StdoutPipe() if err != nil { - toggledlog.Fatal.Printf(colorRed+"extpass pipe setup failed: %v\n"+colorReset, err) + toggledlog.Fatal.Printf("extpass pipe setup failed: %v", err) os.Exit(exitCode) } err = cmd.Start() if err != nil { - toggledlog.Fatal.Printf(colorRed+"extpass cmd start failed: %v\n"+colorReset, err) + toggledlog.Fatal.Printf("extpass cmd start failed: %v", err) os.Exit(exitCode) } p := readLineUnbuffered(pipe) pipe.Close() cmd.Wait() if len(p) == 0 { - toggledlog.Fatal.Println(colorRed + "extpass: password is empty" + colorReset) + toggledlog.Fatal.Println("extpass: password is empty") os.Exit(exitCode) } return p @@ -119,7 +116,7 @@ func readLineUnbuffered(r io.Reader) (l string) { return l } if err != nil { - toggledlog.Fatal.Printf(colorRed+"readLineUnbuffered: %v\n"+colorReset, err) + toggledlog.Fatal.Printf("readLineUnbuffered: %v", err) os.Exit(exitCode) } if n == 0 { diff --git a/internal/toggledlog/log.go b/internal/toggledlog/log.go index 23d7347..30fab18 100644 --- a/internal/toggledlog/log.go +++ b/internal/toggledlog/log.go @@ -5,6 +5,8 @@ import ( "fmt" "log" "os" + + "golang.org/x/crypto/ssh/terminal" ) const ( @@ -12,6 +14,10 @@ const ( wpanicMsg = "-wpanic turns this warning into a panic: " ) +// Escape sequences for terminal colors. These will be empty strings if stdout +// is not a terminal. +var ColorReset, ColorGrey, ColorRed, ColorGreen, ColorYellow string + func JSONDump(obj interface{}) string { b, err := json.MarshalIndent(obj, "", "\t") if err != nil { @@ -27,6 +33,10 @@ type toggledLogger struct { Enabled bool // Panic after logging a message, useful in regression tests Wpanic bool + // Private prefix and postfix are used for coloring + prefix string + postfix string + *log.Logger } @@ -34,7 +44,7 @@ func (l *toggledLogger) Printf(format string, v ...interface{}) { if !l.Enabled { return } - l.Logger.Printf(format, v...) + l.Logger.Printf(l.prefix + fmt.Sprintf(format, v...) + l.postfix) if l.Wpanic { l.Logger.Panic(wpanicMsg + fmt.Sprintf(format, v...)) } @@ -43,9 +53,9 @@ func (l *toggledLogger) Println(v ...interface{}) { if !l.Enabled { return } - l.Logger.Println(v...) + l.Logger.Println(l.prefix + fmt.Sprint(v...) + l.postfix) if l.Wpanic { - l.Logger.Panic(wpanicMsg + fmt.Sprintln(v...)) + l.Logger.Panic(wpanicMsg + fmt.Sprint(v...)) } } @@ -65,8 +75,29 @@ var Warn *toggledLogger var Fatal *toggledLogger func init() { - Debug = &toggledLogger{false, false, log.New(os.Stdout, "", 0)} - Info = &toggledLogger{true, false, log.New(os.Stdout, "", 0)} - Warn = &toggledLogger{true, false, log.New(os.Stderr, "", 0)} - Fatal = &toggledLogger{true, false, log.New(os.Stderr, "", 0)} + if terminal.IsTerminal(int(os.Stdout.Fd())) { + ColorReset = "\033[0m" + ColorGrey = "\033[2m" + ColorRed = "\033[31m" + ColorGreen = "\033[32m" + ColorYellow = "\033[33m" + } + + Debug = &toggledLogger{ + Logger: log.New(os.Stdout, "", 0), + } + Info = &toggledLogger{ + Enabled: true, + Logger: log.New(os.Stdout, "", 0), + } + Warn = &toggledLogger{ + Enabled: true, + Logger: log.New(os.Stderr, "", 0), + } + Fatal = &toggledLogger{ + Enabled: true, + Logger: log.New(os.Stderr, "", 0), + prefix: ColorRed, + postfix: ColorReset, + } } |