exec.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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(298 * time.Second)
  21. }
  22. }
  23. func updateSudo() {
  24. for {
  25. mSudoFlags := strings.Fields(config.SudoFlags)
  26. mSudoFlags = append([]string{"-v"}, mSudoFlags...)
  27. err := config.Runtime.CmdRunner.Show(exec.Command(config.SudoBin, mSudoFlags...))
  28. if err != nil {
  29. fmt.Fprintln(os.Stderr, err)
  30. } else {
  31. break
  32. }
  33. }
  34. }
  35. // waitLock will lock yay checking the status of db.lck until it does not exist
  36. func waitLock(dbPath string) {
  37. lockDBPath := filepath.Join(dbPath, "db.lck")
  38. if _, err := os.Stat(lockDBPath); err != nil {
  39. return
  40. }
  41. text.Warnln(gotext.Get("%s is present.", lockDBPath))
  42. text.Warn(gotext.Get("There may be another Pacman instance running. Waiting..."))
  43. for {
  44. time.Sleep(3 * time.Second)
  45. if _, err := os.Stat(lockDBPath); err != nil {
  46. fmt.Println()
  47. return
  48. }
  49. }
  50. }
  51. func passToPacman(args *settings.Arguments) *exec.Cmd {
  52. argArr := make([]string, 0, 32)
  53. if args.NeedRoot(config.Runtime) {
  54. argArr = append(argArr, config.SudoBin)
  55. argArr = append(argArr, strings.Fields(config.SudoFlags)...)
  56. }
  57. argArr = append(argArr, config.PacmanBin)
  58. argArr = append(argArr, args.FormatGlobals()...)
  59. argArr = append(argArr, args.FormatArgs()...)
  60. if settings.NoConfirm {
  61. argArr = append(argArr, "--noconfirm")
  62. }
  63. argArr = append(argArr, "--config", config.PacmanConf, "--")
  64. argArr = append(argArr, args.Targets...)
  65. if args.NeedRoot(config.Runtime) {
  66. waitLock(config.Runtime.PacmanConf.DBPath)
  67. }
  68. return exec.Command(argArr[0], argArr[1:]...)
  69. }