go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers-sdk/v1/lr/cli/cmd/go.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package cmd 5 6 import ( 7 "encoding/json" 8 "os" 9 "path" 10 "strings" 11 12 "github.com/rs/zerolog/log" 13 "github.com/spf13/cobra" 14 "go.mondoo.com/cnquery/providers-sdk/v1/lr" 15 "go.mondoo.com/cnquery/providers-sdk/v1/lr/docs" 16 "sigs.k8s.io/yaml" 17 ) 18 19 var goCmd = &cobra.Command{ 20 Use: "go", 21 Short: "convert LR file to go", 22 Long: `parse an LR file and convert it to go, saving it in the same location with the suffix .go`, 23 Args: cobra.MinimumNArgs(1), 24 Run: func(cmd *cobra.Command, args []string) { 25 dist, err := cmd.Flags().GetString("dist") 26 if err != nil { 27 log.Fatal().Err(err).Msg("failed to get dist flag") 28 } 29 30 file := args[0] 31 packageName := path.Base(path.Dir(file)) 32 33 res, err := lr.Resolve(file, func(path string) ([]byte, error) { 34 return os.ReadFile(path) 35 }) 36 if err != nil { 37 log.Fatal().Err(err).Msg("failed to resolve") 38 return 39 } 40 41 collector := lr.NewCollector(args[0]) 42 godata, err := lr.Go(packageName, res, collector) 43 if err != nil { 44 log.Fatal().Err(err).Msg("failed to compile go code") 45 } 46 47 err = os.WriteFile(args[0]+".go", []byte(godata), 0o644) 48 if err != nil { 49 log.Fatal().Err(err).Msg("failed to write to go file") 50 } 51 52 schema, err := lr.Schema(res) 53 if err != nil { 54 log.Fatal().Err(err).Msg("failed to generate schema") 55 } 56 57 // we will attempt to auto-detect the manifest to inject some metadata 58 // into the schema 59 manifestPath := file + ".manifest.yaml" 60 raw, err := os.ReadFile(manifestPath) 61 if err == nil { 62 var lrDocsData docs.LrDocs 63 err = yaml.Unmarshal(raw, &lrDocsData) 64 if err != nil { 65 log.Fatal().Err(err).Msg("could not load yaml data") 66 } 67 68 docs.InjectMetadata(schema, &lrDocsData) 69 } else if os.IsNotExist(err) { 70 log.Info().Str("path", manifestPath).Msg("no manifest found, ignoring") 71 } else { 72 log.Fatal().Err(err).Str("path", manifestPath).Msg("failed to read manifest") 73 } 74 75 schemaData, err := json.Marshal(schema) 76 if err != nil { 77 log.Fatal().Err(err).Msg("failed to generate schema json") 78 } 79 80 base := path.Base(args[0]) 81 base = strings.TrimSuffix(base, ".lr") 82 83 dst := strings.TrimSuffix(file, ".lr") + ".resources.json" 84 err = os.WriteFile(dst, []byte(schemaData), 0o644) 85 if err != nil { 86 log.Fatal().Err(err).Str("dst", dst).Msg("failed to write schema json") 87 } 88 89 if dist != "" { 90 if err = os.MkdirAll(dist, 0o755); err != nil { 91 log.Fatal().Err(err).Msg("failed to create dist folder") 92 } 93 infoFile := path.Join(dist, base+".resources.json") 94 err = os.WriteFile(infoFile, []byte(schemaData), 0o644) 95 if err != nil { 96 log.Fatal().Err(err).Str("dst", infoFile).Msg("failed to write schema json") 97 } 98 } 99 }, 100 } 101 102 func init() { 103 rootCmd.AddCommand(goCmd) 104 goCmd.Flags().String("dist", "", "folder for output json generation") 105 }