exec.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "os/exec"
  6. "path/filepath"
  7. "strings"
  8. "time"
  9. "github.com/leonelquinteros/gotext"
  10. "github.com/Jguer/yay/v10/pkg/settings"
  11. "github.com/Jguer/yay/v10/pkg/text"
  12. )
  13. func sudoLoopBackground() {
  14. updateSudo()
  15. go sudoLoop()
  16. }
  17. func sudoLoop() {
  18. for {
  19. updateSudo()
  20. time.Sleep(241 * time.Second)
  21. }
  22. }
  23. func updateSudo() {
  24. for {
  25. err := config.Runtime.CmdRunner.Show(exec.Command(config.SudoBin, "-v"))
  26. if err != nil {
  27. fmt.Fprintln(os.Stderr, err)
  28. } else {
  29. break
  30. }
  31. }
  32. }
  33. // waitLock will lock yay checking the status of db.lck until it does not exist
  34. func waitLock(dbPath string) {
  35. lockDBPath := filepath.Join(dbPath, "db.lck")
  36. if _, err := os.Stat(lockDBPath); err != nil {
  37. return
  38. }
  39. text.Warnln(gotext.Get("%s is present.", lockDBPath))
  40. text.Warn(gotext.Get("There may be another Pacman instance running. Waiting..."))
  41. for {
  42. time.Sleep(3 * time.Second)
  43. if _, err := os.Stat(lockDBPath); err != nil {
  44. fmt.Println()
  45. return
  46. }
  47. }
  48. }
  49. func passToPacman(args *settings.Arguments) *exec.Cmd {
  50. argArr := make([]string, 0, 32)
  51. if args.NeedRoot(config.Runtime) {
  52. argArr = append(argArr, config.SudoBin)
  53. argArr = append(argArr, strings.Fields(config.SudoFlags)...)
  54. }
  55. argArr = append(argArr, config.PacmanBin)
  56. argArr = append(argArr, args.FormatGlobals()...)
  57. argArr = append(argArr, args.FormatArgs()...)
  58. if settings.NoConfirm {
  59. argArr = append(argArr, "--noconfirm")
  60. }
  61. argArr = append(argArr, "--config", config.PacmanConf, "--")
  62. argArr = append(argArr, args.Targets...)
  63. if args.NeedRoot(config.Runtime) {
  64. waitLock(config.Runtime.PacmanConf.DBPath)
  65. }
  66. return exec.Command(argArr[0], argArr[1:]...)
  67. }