cmd/policy-tool/debug/debug.go (67 lines of code) (raw):
package debug
import (
"context"
"fmt"
"os"
"strings"
"github.com/GoogleCloudPlatform/config-validator/pkg/gcv"
"github.com/spf13/cobra"
)
var Cmd = &cobra.Command{
Use: "debug",
Short: "Run the config validator on a set of policies / cai data and print out any info on errors.",
Example: `policy-tool debug --policies ./GoogleCloudPlatform/policy-library/policies --libs ./GoogleCloudPlatform/policy-library/libs --file resource.json`,
RunE: debugCmd,
}
var (
flags struct {
policies []string
libs string
files []string
disabledBuiltins []string
}
)
func init() {
Cmd.Flags().StringSliceVar(&flags.policies, "policies", nil, "Path to one or more policy directories or files.")
Cmd.Flags().StringVar(&flags.libs, "libs", "", "Path to the Rego libs directory.")
Cmd.Flags().StringSliceVar(&flags.files, "file", nil, "Files to process.")
Cmd.Flags().StringSliceVar(&flags.disabledBuiltins, "disabledBuiltins", nil, "Built in functions that should be disabled.")
if err := Cmd.MarkFlagRequired("policies"); err != nil {
panic(err)
}
}
func debugCmd(cmd *cobra.Command, args []string) error {
validator, err := gcv.NewValidator(flags.policies, flags.libs, gcv.DisableBuiltins(flags.disabledBuiltins...))
if err != nil {
fmt.Printf("Errors Loading Policies:\n%s\n", err)
os.Exit(1)
}
ctx := context.Background()
// TODO: streaming read
for _, fileName := range flags.files {
fileBytes, err := os.ReadFile(fileName)
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to read %s: %v\n", fileName, err)
continue
}
lines := strings.Split(string(fileBytes), "\n")
for idx, line := range lines {
if len(line) == 0 {
continue
}
result, err := validator.ReviewJSON(ctx, line)
if err != nil {
fmt.Fprintf(os.Stderr, "Error processing input at %s[%d]: %v\n", fileName, idx, err)
continue
}
vs, err := result.ToViolations()
if err != nil {
fmt.Fprintf(os.Stderr, "Error processing violations for input at %s[%d]: %v\n", fileName, idx, err)
continue
}
for _, v := range vs {
fmt.Printf("%s: %s [%s]\n", v.Resource, v.Message, v.Constraint)
}
}
}
return nil
}