github.com/adevinta/lava@v0.7.2/cmd/lava/main.go (about) 1 // Copyright 2023 Adevinta 2 3 // Lava is a tool for running security checks in your local and CI/CD 4 // environments. 5 package main 6 7 import ( 8 "flag" 9 "fmt" 10 "log/slog" 11 "os" 12 "strconv" 13 14 "github.com/fatih/color" 15 "github.com/jroimartin/clilog" 16 17 "github.com/adevinta/lava/cmd/lava/internal/base" 18 "github.com/adevinta/lava/cmd/lava/internal/help" 19 "github.com/adevinta/lava/cmd/lava/internal/initialize" 20 "github.com/adevinta/lava/cmd/lava/internal/run" 21 "github.com/adevinta/lava/cmd/lava/internal/scan" 22 "github.com/adevinta/lava/cmd/lava/internal/version" 23 ) 24 25 func init() { 26 base.Commands = []*base.Command{ 27 scan.CmdScan, 28 run.CmdRun, 29 initialize.CmdInit, 30 version.CmdVersion, 31 32 help.HelpEnvironment, 33 help.HelpLavaYAML, 34 help.HelpMetrics, 35 } 36 } 37 38 func main() { 39 h := clilog.NewCLIHandler(os.Stderr, &clilog.HandlerOptions{Level: base.LogLevel}) 40 slog.SetDefault(slog.New(h)) 41 42 flag.Usage = func() { 43 help.PrintUsage(os.Stderr) 44 } 45 flag.Parse() //nolint:errcheck 46 47 args := flag.Args() 48 if len(args) < 1 { 49 help.PrintUsage(os.Stderr) 50 os.Exit(2) 51 } 52 53 if err := parseEnv(); err != nil { 54 fmt.Fprintf(os.Stderr, "error: %v\n", err) 55 os.Exit(2) 56 } 57 58 if args[0] == "help" { 59 help.Help(args[1:]) 60 return 61 } 62 63 for _, cmd := range base.Commands { 64 if cmd.Run == nil { 65 continue 66 } 67 cmd.Flag.Usage = cmd.Usage 68 if cmd.Name() == args[0] { 69 cmd.Flag.Parse(args[1:]) //nolint:errcheck 70 args = cmd.Flag.Args() 71 if err := cmd.Run(args); err != nil { 72 fmt.Fprintf(os.Stderr, "error: %v\n", err) 73 os.Exit(1) 74 } 75 return 76 } 77 } 78 79 fmt.Fprintf(os.Stderr, "Unknown command %q. Run \"lava help\".\n", args[0]) 80 os.Exit(2) 81 } 82 83 func parseEnv() error { 84 if envForceColor := os.Getenv("LAVA_FORCECOLOR"); envForceColor != "" { 85 forceColor, err := strconv.ParseBool(envForceColor) 86 if err != nil { 87 return fmt.Errorf("invalid LAVA_FORCECOLOR value: %v", envForceColor) 88 } 89 color.NoColor = !forceColor 90 } 91 return nil 92 }