diff --git a/cmd/nuke.go b/cmd/nuke.go index aa54ca6f4..d81ddff86 100644 --- a/cmd/nuke.go +++ b/cmd/nuke.go @@ -211,8 +211,8 @@ func (n *Nuke) Scan() error { for _, region := range n.Config.Regions { sess := n.sessions[region] - scanner := Scan(sess) - for item := range scanner.Items { + items := Scan(sess) + for item := range items { if !n.Parameters.WantsTarget(item.Service) { continue } @@ -221,12 +221,8 @@ func (n *Nuke) Scan() error { n.Filter(item) item.Print() } - if scanner.Error != nil { - fmt.Printf("Scanner found an error %s \n", scanner.Error) - return scanner.Error - } - } + fmt.Printf("Scan complete: %d total, %d nukeable, %d filtered.\n\n", queue.CountTotal(), queue.Count(ItemStateNew), queue.Count(ItemStateFiltered)) diff --git a/cmd/scan.go b/cmd/scan.go index 073ab8c10..9d3c70b85 100644 --- a/cmd/scan.go +++ b/cmd/scan.go @@ -1,27 +1,29 @@ package cmd import ( + "fmt" + "runtime/debug" + "github.com/aws/aws-sdk-go/aws/session" "github.com/rebuy-de/aws-nuke/resources" ) -type Scanner struct { - Items <-chan *Item - Error error -} - -func Scan(sess *session.Session) *Scanner { - var err error +func Scan(sess *session.Session) <-chan *Item { items := make(chan *Item, 100) go func() { listers := resources.GetListers(sess) for _, lister := range listers { - var r []resources.Resource - r, err = lister() + r, err := safeLister(lister) if err != nil { - break + LogErrorf(fmt.Errorf("\n=============\n\n"+ + "Listing with %T failed:\n\n"+ + "%v\n\n"+ + "Please report this to https://github.com/rebuy-de/aws-nuke/issues/new.\n\n"+ + "=============", + lister, err)) + continue } for _, r := range r { @@ -38,5 +40,16 @@ func Scan(sess *session.Session) *Scanner { close(items) }() - return &Scanner{items, err} + return items +} + +func safeLister(lister resources.ResourceLister) (r []resources.Resource, err error) { + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("%v\n\n%s", r.(error), string(debug.Stack())) + } + }() + + r, err = lister() + return } diff --git a/cmd/scan_test.go b/cmd/scan_test.go new file mode 100644 index 000000000..094a2a6ca --- /dev/null +++ b/cmd/scan_test.go @@ -0,0 +1,22 @@ +package cmd + +import ( + "strings" + "testing" + + "github.com/rebuy-de/aws-nuke/resources" +) + +func TestSafeLister(t *testing.T) { + nilLister := func() ([]resources.Resource, error) { + var ptr *string = nil + _ = *ptr + + return nil, nil + } + + _, err := safeLister(nilLister) + if !strings.Contains(err.Error(), "runtime error: invalid memory address or nil pointer dereference") { + t.Fatalf("Got unexpected error: %v", err) + } +}