utils.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "os"
  6. "os/exec"
  7. "strings"
  8. )
  9. func commandExists(cmd string) bool {
  10. _, err := exec.LookPath(cmd)
  11. return err == nil
  12. }
  13. func checkDependencies() error {
  14. requiredTools := []string{"git", "find", "grep"}
  15. optionalTools := []string{"gitleaks"}
  16. var missing []string
  17. log("Checking dependencies...")
  18. for _, tool := range requiredTools {
  19. if !commandExists(tool) {
  20. missing = append(missing, tool)
  21. }
  22. }
  23. for _, tool := range optionalTools {
  24. if !commandExists(tool) {
  25. warn("Optional tool missing: %s (recommended for security scanning)", tool)
  26. } else {
  27. log("✓ Found: %s", tool)
  28. }
  29. }
  30. if len(missing) > 0 {
  31. errorLog("Missing required tools: %s", strings.Join(missing, ", "))
  32. errorLog("Please install missing dependencies")
  33. return fmt.Errorf("missing dependencies")
  34. }
  35. log("✓ All required dependencies found")
  36. return nil
  37. }
  38. func runSecurityScan() error {
  39. log("Running security scan...")
  40. if !commandExists("gitleaks") {
  41. warn("GitLeaks not installed - skipping security scan")
  42. warn("Install with: paru -S gitleaks")
  43. fmt.Println()
  44. fmt.Print("Continue without security scan? (y/N): ")
  45. reader := bufio.NewReader(os.Stdin)
  46. answer, _ := reader.ReadString('\n')
  47. answer = strings.TrimSpace(strings.ToLower(answer))
  48. if answer != "y" && answer != "yes" {
  49. errorLog("Push cancelled for security")
  50. return fmt.Errorf("security scan cancelled")
  51. }
  52. return nil
  53. }
  54. log("Using GitLeaks for secret detection...")
  55. cmd := exec.Command("gitleaks", "detect", "--verbose", "--exit-code", "1")
  56. if err := cmd.Run(); err != nil {
  57. errorLog("❌ Secrets detected! Review before pushing.")
  58. return fmt.Errorf("secrets detected")
  59. }
  60. log("✅ No secrets detected")
  61. return nil
  62. }