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  }