github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/pkg/scanners/terraform/parser/load_vars.go (about) 1 package parser 2 3 import ( 4 "fmt" 5 "io/fs" 6 "os" 7 "path/filepath" 8 "strings" 9 10 "github.com/hashicorp/hcl/v2" 11 "github.com/hashicorp/hcl/v2/hclsyntax" 12 hcljson "github.com/hashicorp/hcl/v2/json" 13 "github.com/zclconf/go-cty/cty" 14 ) 15 16 func loadTFVars(srcFS fs.FS, filenames []string) (map[string]cty.Value, error) { 17 combinedVars := make(map[string]cty.Value) 18 19 for _, env := range os.Environ() { 20 split := strings.Split(env, "=") 21 key := split[0] 22 if !strings.HasPrefix(key, "TF_VAR_") { 23 continue 24 } 25 key = strings.TrimPrefix(key, "TF_VAR_") 26 var val string 27 if len(split) > 1 { 28 val = split[1] 29 } 30 combinedVars[key] = cty.StringVal(val) 31 } 32 33 for _, filename := range filenames { 34 vars, err := loadTFVarsFile(srcFS, filename) 35 if err != nil { 36 return nil, fmt.Errorf("failed to load tfvars from %s: %w", filename, err) 37 } 38 for k, v := range vars { 39 combinedVars[k] = v 40 } 41 } 42 43 return combinedVars, nil 44 } 45 46 func loadTFVarsFile(srcFS fs.FS, filename string) (map[string]cty.Value, error) { 47 inputVars := make(map[string]cty.Value) 48 if filename == "" { 49 return inputVars, nil 50 } 51 52 src, err := fs.ReadFile(srcFS, filepath.ToSlash(filename)) 53 if err != nil { 54 return nil, err 55 } 56 57 var attrs hcl.Attributes 58 if strings.HasSuffix(filename, ".json") { 59 variableFile, err := hcljson.Parse(src, filename) 60 if err != nil { 61 return nil, err 62 } 63 attrs, err = variableFile.Body.JustAttributes() 64 if err != nil { 65 return nil, err 66 } 67 } else { 68 variableFile, err := hclsyntax.ParseConfig(src, filename, hcl.Pos{Line: 1, Column: 1}) 69 if err != nil { 70 return nil, err 71 } 72 attrs, err = variableFile.Body.JustAttributes() 73 if err != nil { 74 return nil, err 75 } 76 } 77 78 for _, attr := range attrs { 79 inputVars[attr.Name], _ = attr.Expr.Value(&hcl.EvalContext{}) 80 } 81 82 return inputVars, nil 83 }