main.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package main
  2. import (
  3. "os"
  4. "os/signal"
  5. "time"
  6. "github.com/zricethezav/gitleaks/v7/config"
  7. "github.com/zricethezav/gitleaks/v7/options"
  8. "github.com/zricethezav/gitleaks/v7/scan"
  9. "github.com/hako/durafmt"
  10. log "github.com/sirupsen/logrus"
  11. )
  12. func main() {
  13. // this block sets up a go routine to listen for an interrupt signal
  14. // which will immediately exit gitleaks
  15. stopChan := make(chan os.Signal, 1)
  16. signal.Notify(stopChan, os.Interrupt)
  17. go listenForInterrupt(stopChan)
  18. // setup options
  19. opts, err := options.ParseOptions()
  20. if err != nil {
  21. log.Error(err)
  22. os.Exit(1)
  23. }
  24. err = opts.Guard()
  25. if err != nil {
  26. log.Error(err)
  27. os.Exit(1)
  28. }
  29. // setup configs
  30. cfg, err := config.NewConfig(opts)
  31. if err != nil {
  32. log.Error(err)
  33. os.Exit(1)
  34. }
  35. // setup scanner
  36. scanner, err := scan.NewScanner(opts, cfg)
  37. if err != nil {
  38. log.Error(err)
  39. os.Exit(1)
  40. }
  41. // run and time the scan
  42. start := time.Now()
  43. scannerReport, err := scanner.Scan()
  44. log.Info("scan time: ", durafmt.Parse(time.Now().Sub(start)))
  45. if err != nil {
  46. log.Error(err)
  47. os.Exit(1)
  48. }
  49. // report scan
  50. if err := scan.WriteReport(scannerReport, opts, cfg); err != nil {
  51. log.Error(err)
  52. os.Exit(1)
  53. }
  54. if len(scannerReport.Leaks) != 0 {
  55. os.Exit(opts.CodeOnLeak)
  56. }
  57. }
  58. func listenForInterrupt(stopScan chan os.Signal) {
  59. <-stopScan
  60. log.Warn("halting gitleaks scan")
  61. os.Exit(1)
  62. }