github.com/aquasecurity/trivy-iac@v0.8.1-0.20240127024015-3d8e412cf0ab/pkg/scanners/terraform/options.go (about) 1 package terraform 2 3 import ( 4 "io/fs" 5 "strings" 6 7 "github.com/aquasecurity/defsec/pkg/scan" 8 "github.com/aquasecurity/defsec/pkg/scanners/options" 9 "github.com/aquasecurity/defsec/pkg/severity" 10 "github.com/aquasecurity/defsec/pkg/state" 11 12 "github.com/aquasecurity/trivy-iac/pkg/scanners/terraform/executor" 13 "github.com/aquasecurity/trivy-iac/pkg/scanners/terraform/parser" 14 ) 15 16 type ConfigurableTerraformScanner interface { 17 options.ConfigurableScanner 18 SetForceAllDirs(bool) 19 AddExecutorOptions(options ...executor.Option) 20 AddParserOptions(options ...options.ParserOption) 21 } 22 23 func ScannerWithTFVarsPaths(paths ...string) options.ScannerOption { 24 return func(s options.ConfigurableScanner) { 25 if tf, ok := s.(ConfigurableTerraformScanner); ok { 26 tf.AddParserOptions(parser.OptionWithTFVarsPaths(paths...)) 27 } 28 } 29 } 30 31 func ScannerWithAlternativeIDProvider(f func(string) []string) options.ScannerOption { 32 return func(s options.ConfigurableScanner) { 33 if tf, ok := s.(ConfigurableTerraformScanner); ok { 34 tf.AddExecutorOptions(executor.OptionWithAlternativeIDProvider(f)) 35 } 36 } 37 } 38 39 func ScannerWithSeverityOverrides(overrides map[string]string) options.ScannerOption { 40 return func(s options.ConfigurableScanner) { 41 if tf, ok := s.(ConfigurableTerraformScanner); ok { 42 tf.AddExecutorOptions(executor.OptionWithSeverityOverrides(overrides)) 43 } 44 } 45 } 46 47 func ScannerWithNoIgnores() options.ScannerOption { 48 return func(s options.ConfigurableScanner) { 49 if tf, ok := s.(ConfigurableTerraformScanner); ok { 50 tf.AddExecutorOptions(executor.OptionNoIgnores()) 51 } 52 } 53 } 54 55 func ScannerWithExcludedRules(ruleIDs []string) options.ScannerOption { 56 return func(s options.ConfigurableScanner) { 57 if tf, ok := s.(ConfigurableTerraformScanner); ok { 58 tf.AddExecutorOptions(executor.OptionExcludeRules(ruleIDs)) 59 } 60 } 61 } 62 63 func ScannerWithExcludeIgnores(ruleIDs []string) options.ScannerOption { 64 return func(s options.ConfigurableScanner) { 65 if tf, ok := s.(ConfigurableTerraformScanner); ok { 66 tf.AddExecutorOptions(executor.OptionExcludeIgnores(ruleIDs)) 67 } 68 } 69 } 70 71 func ScannerWithIncludedRules(ruleIDs []string) options.ScannerOption { 72 return func(s options.ConfigurableScanner) { 73 if tf, ok := s.(ConfigurableTerraformScanner); ok { 74 tf.AddExecutorOptions(executor.OptionIncludeRules(ruleIDs)) 75 } 76 } 77 } 78 79 func ScannerWithStopOnRuleErrors(stop bool) options.ScannerOption { 80 return func(s options.ConfigurableScanner) { 81 if tf, ok := s.(ConfigurableTerraformScanner); ok { 82 tf.AddExecutorOptions(executor.OptionStopOnErrors(stop)) 83 } 84 } 85 } 86 87 func ScannerWithWorkspaceName(name string) options.ScannerOption { 88 return func(s options.ConfigurableScanner) { 89 if tf, ok := s.(ConfigurableTerraformScanner); ok { 90 tf.AddParserOptions(parser.OptionWithWorkspaceName(name)) 91 tf.AddExecutorOptions(executor.OptionWithWorkspaceName(name)) 92 } 93 } 94 } 95 96 func ScannerWithSingleThread(single bool) options.ScannerOption { 97 return func(s options.ConfigurableScanner) { 98 if tf, ok := s.(ConfigurableTerraformScanner); ok { 99 tf.AddExecutorOptions(executor.OptionWithSingleThread(single)) 100 } 101 } 102 } 103 104 func ScannerWithAllDirectories(all bool) options.ScannerOption { 105 return func(s options.ConfigurableScanner) { 106 if tf, ok := s.(ConfigurableTerraformScanner); ok { 107 tf.SetForceAllDirs(all) 108 } 109 } 110 } 111 112 func ScannerWithStopOnHCLError(stop bool) options.ScannerOption { 113 return func(s options.ConfigurableScanner) { 114 if tf, ok := s.(ConfigurableTerraformScanner); ok { 115 tf.AddParserOptions(parser.OptionStopOnHCLError(stop)) 116 } 117 } 118 } 119 120 func ScannerWithSkipDownloaded(skip bool) options.ScannerOption { 121 return func(s options.ConfigurableScanner) { 122 if !skip { 123 return 124 } 125 if tf, ok := s.(ConfigurableTerraformScanner); ok { 126 tf.AddExecutorOptions(executor.OptionWithResultsFilter(func(results scan.Results) scan.Results { 127 for i, result := range results { 128 prefix := result.Range().GetSourcePrefix() 129 switch { 130 case prefix == "": 131 case strings.HasPrefix(prefix, "."): 132 default: 133 results[i].OverrideStatus(scan.StatusIgnored) 134 } 135 } 136 return results 137 })) 138 } 139 } 140 } 141 142 func ScannerWithResultsFilter(f func(scan.Results) scan.Results) options.ScannerOption { 143 return func(s options.ConfigurableScanner) { 144 if tf, ok := s.(ConfigurableTerraformScanner); ok { 145 tf.AddExecutorOptions(executor.OptionWithResultsFilter(f)) 146 } 147 } 148 } 149 150 func ScannerWithMinimumSeverity(minimum severity.Severity) options.ScannerOption { 151 min := severityAsOrdinal(minimum) 152 return func(s options.ConfigurableScanner) { 153 if tf, ok := s.(ConfigurableTerraformScanner); ok { 154 tf.AddExecutorOptions(executor.OptionWithResultsFilter(func(results scan.Results) scan.Results { 155 for i, result := range results { 156 if severityAsOrdinal(result.Severity()) < min { 157 results[i].OverrideStatus(scan.StatusIgnored) 158 } 159 } 160 return results 161 })) 162 } 163 } 164 } 165 166 func severityAsOrdinal(sev severity.Severity) int { 167 switch sev { 168 case severity.Critical: 169 return 4 170 case severity.High: 171 return 3 172 case severity.Medium: 173 return 2 174 case severity.Low: 175 return 1 176 default: 177 return 0 178 } 179 } 180 181 func ScannerWithStateFunc(f ...func(*state.State)) options.ScannerOption { 182 return func(s options.ConfigurableScanner) { 183 if tf, ok := s.(ConfigurableTerraformScanner); ok { 184 tf.AddExecutorOptions(executor.OptionWithStateFunc(f...)) 185 } 186 } 187 } 188 189 func ScannerWithDownloadsAllowed(allowed bool) options.ScannerOption { 190 return func(s options.ConfigurableScanner) { 191 if tf, ok := s.(ConfigurableTerraformScanner); ok { 192 tf.AddParserOptions(parser.OptionWithDownloads(allowed)) 193 } 194 } 195 } 196 197 func ScannerWithSkipCachedModules(b bool) options.ScannerOption { 198 return func(s options.ConfigurableScanner) { 199 if tf, ok := s.(ConfigurableTerraformScanner); ok { 200 tf.AddParserOptions(parser.OptionWithDownloads(b)) 201 } 202 } 203 } 204 205 func ScannerWithConfigsFileSystem(fsys fs.FS) options.ScannerOption { 206 return func(s options.ConfigurableScanner) { 207 if tf, ok := s.(ConfigurableTerraformScanner); ok { 208 tf.AddParserOptions(parser.OptionWithConfigsFS(fsys)) 209 } 210 } 211 }