diff --git a/Makefile b/Makefile index 574165d4b..9f4f7e630 100644 --- a/Makefile +++ b/Makefile @@ -66,7 +66,7 @@ clean: @rm -f $(CROWDSEC_BIN) @rm -f $(CSCLI_BIN) @rm -f *.log - @rm crowdsec-release.tgz + @rm -f crowdsec-release.tgz cscli: ifeq ($(lastword $(RESPECT_VERSION)), $(CURRENT_GOVERSION)) diff --git a/pkg/types/utils.go b/pkg/types/utils.go index 867064e81..a0624f7d9 100644 --- a/pkg/types/utils.go +++ b/pkg/types/utils.go @@ -13,6 +13,7 @@ import ( "runtime/debug" "strconv" "strings" + "syscall" "time" "github.com/crowdsecurity/crowdsec/pkg/cwversion" @@ -116,6 +117,17 @@ func Clone(a, b interface{}) error { func CatchPanic(component string) { if r := recover(); r != nil { + + /*mimic gin's behaviour on broken pipe*/ + var brokenPipe bool + if ne, ok := r.(*net.OpError); ok { + if se, ok := ne.Err.(*os.SyscallError); ok { + if se.Err == syscall.EPIPE || se.Err == syscall.ECONNRESET { + brokenPipe = true + } + } + } + tmpfile, err := ioutil.TempFile("/tmp/", "crowdsec-crash.*.txt") if err != nil { log.Fatal(err) @@ -131,10 +143,16 @@ func CatchPanic(component string) { if err := tmpfile.Close(); err != nil { log.Fatal(err) } + log.Errorf("crowdsec - goroutine %s crashed : %s", component, r) log.Errorf("please report this error to https://github.com/crowdsecurity/crowdsec/") log.Errorf("stacktrace/report is written to %s : please join it to your issue", tmpfile.Name()) - log.Fatalf("crowdsec stopped") + + /*if it's not a broken pipe error, we don't want to fatal. it can happen from Local API pov*/ + if !brokenPipe { + log.Fatalf("crowdsec stopped") + } + } }