TUN-3524: Don't ignore errors from app-level action handler (#248)

This commit is contained in:
Igor Postelnik 2020-11-09 16:53:51 -06:00
parent 64d3836645
commit 8c6181db9f
2 changed files with 10 additions and 14 deletions

View File

@ -27,17 +27,17 @@ func UsageError(format string, args ...interface{}) error {
// Ensures exit with error code if actionFunc returns an error // Ensures exit with error code if actionFunc returns an error
func ErrorHandler(actionFunc cli.ActionFunc) cli.ActionFunc { func ErrorHandler(actionFunc cli.ActionFunc) cli.ActionFunc {
return func(ctx *cli.Context) error { return func(ctx *cli.Context) error {
defer logger.SharedWriteManager.Shutdown()
err := actionFunc(ctx) err := actionFunc(ctx)
if err != nil { if err != nil {
if _, ok := err.(usageError); ok { if _, ok := err.(usageError); ok {
msg := fmt.Sprintf("%s\nSee 'cloudflared %s --help'.", err.Error(), ctx.Command.FullName()) msg := fmt.Sprintf("%s\nSee 'cloudflared %s --help'.", err.Error(), ctx.Command.FullName())
return cli.Exit(msg, -1) err = cli.Exit(msg, -1)
} else if _, ok := err.(cli.ExitCoder); !ok {
err = cli.Exit(err.Error(), 1)
} }
// os.Exits with error code if err is cli.ExitCoder or cli.MultiError
cli.HandleExitCoder(err)
err = cli.Exit(err.Error(), 1)
} }
logger.SharedWriteManager.Shutdown()
return err return err
} }
} }

View File

@ -145,7 +145,7 @@ func isEmptyInvocation(c *cli.Context) bool {
} }
func action(version string, shutdownC, graceShutdownC chan struct{}) cli.ActionFunc { func action(version string, shutdownC, graceShutdownC chan struct{}) cli.ActionFunc {
return func(c *cli.Context) (err error) { return cliutil.ErrorHandler(func(c *cli.Context) (err error) {
if isEmptyInvocation(c) { if isEmptyInvocation(c) {
return handleServiceMode(shutdownC) return handleServiceMode(shutdownC)
} }
@ -153,15 +153,11 @@ func action(version string, shutdownC, graceShutdownC chan struct{}) cli.ActionF
tags["hostname"] = c.String("hostname") tags["hostname"] = c.String("hostname")
raven.SetTagsContext(tags) raven.SetTagsContext(tags)
raven.CapturePanic(func() { err = tunnel.TunnelCommand(c) }, nil) raven.CapturePanic(func() { err = tunnel.TunnelCommand(c) }, nil)
exitCode := 0
if err != nil { if err != nil {
handleError(err) captureError(err)
exitCode = 1
} }
// we already handle error printing, so we pass an empty string so we return err
// don't have to print again. })
return cli.Exit("", exitCode)
}
} }
func userHomeDir() (string, error) { func userHomeDir() (string, error) {
@ -177,7 +173,7 @@ func userHomeDir() (string, error) {
} }
// In order to keep the amount of noise sent to Sentry low, typical network errors can be filtered out here by a substring match. // In order to keep the amount of noise sent to Sentry low, typical network errors can be filtered out here by a substring match.
func handleError(err error) { func captureError(err error) {
errorMessage := err.Error() errorMessage := err.Error()
for _, ignoredErrorMessage := range ignoredErrors { for _, ignoredErrorMessage := range ignoredErrors {
if strings.Contains(errorMessage, ignoredErrorMessage) { if strings.Contains(errorMessage, ignoredErrorMessage) {