1package iam 2 3import ( 4 "fmt" 5 "strings" 6 7 "github.com/aws/aws-sdk-go/aws" 8 awsiam "github.com/aws/aws-sdk-go/service/iam" 9 "github.com/genevieve/leftovers/common" 10) 11 12type policiesClient interface { 13 ListPolicies(*awsiam.ListPoliciesInput) (*awsiam.ListPoliciesOutput, error) 14 ListPolicyVersions(*awsiam.ListPolicyVersionsInput) (*awsiam.ListPolicyVersionsOutput, error) 15 DeletePolicyVersion(*awsiam.DeletePolicyVersionInput) (*awsiam.DeletePolicyVersionOutput, error) 16 DeletePolicy(*awsiam.DeletePolicyInput) (*awsiam.DeletePolicyOutput, error) 17} 18 19type Policies struct { 20 client policiesClient 21 logger logger 22} 23 24func NewPolicies(client policiesClient, logger logger) Policies { 25 return Policies{ 26 client: client, 27 logger: logger, 28 } 29} 30 31func (p Policies) List(filter string) ([]common.Deletable, error) { 32 policies, err := p.client.ListPolicies(&awsiam.ListPoliciesInput{Scope: aws.String("Local")}) 33 if err != nil { 34 return nil, fmt.Errorf("List IAM Policies: %s", err) 35 } 36 37 var resources []common.Deletable 38 for _, o := range policies.Policies { 39 r := NewPolicy(p.client, p.logger, o.PolicyName, o.Arn) 40 41 if !strings.Contains(r.Name(), filter) { 42 continue 43 } 44 45 proceed := p.logger.PromptWithDetails(r.Type(), r.Name()) 46 if !proceed { 47 continue 48 } 49 50 resources = append(resources, r) 51 } 52 53 return resources, nil 54} 55 56func (p Policies) Type() string { 57 return "iam-policy" 58} 59