Browse Source

Fix AUR package installation root privileges

master
AI Bot 2 days ago committed by Riyyi
parent
commit
11a5e57516
  1. 49
      pkg/pacman/pacman.go

49
pkg/pacman/pacman.go

@ -5,6 +5,7 @@ import (
"io"
"os"
"os/exec"
"path/filepath"
"regexp"
"strings"
"time"
@ -160,15 +161,24 @@ func InstallAUR(f *fetch.Fetcher, pkgName string) error {
return fmt.Errorf("AUR package not found in cache: %s", pkgName)
}
tmpDir, err := os.MkdirTemp("", "declpac-aur-")
if err != nil {
sudoUser := os.Getenv("SUDO_USER")
if sudoUser == "" {
sudoUser = os.Getenv("USER")
if sudoUser == "" {
sudoUser = "root"
}
}
tmpDir := "/tmp/declpac-aur-" + pkgName
mkdirCmd := exec.Command("su", "-", sudoUser, "-c", "rm -rf "+tmpDir+" && mkdir -p "+tmpDir)
if err := mkdirCmd.Run(); err != nil {
return fmt.Errorf("failed to create temp directory: %w", err)
}
defer os.RemoveAll(tmpDir)
cloneURL := "https://aur.archlinux.org/" + aurInfo.PackageBase + ".git"
state.Write([]byte("Cloning " + cloneURL + "\n"))
cloneCmd := exec.Command("git", "clone", cloneURL, tmpDir)
cloneCmd := exec.Command("su", "-", sudoUser, "-c", "git clone "+cloneURL+" "+tmpDir)
cloneCmd.Stdout = io.MultiWriter(os.Stdout, state.GetLogWriter())
cloneCmd.Stderr = io.MultiWriter(os.Stderr, state.GetLogWriter())
if err := cloneCmd.Run(); err != nil {
@ -179,10 +189,9 @@ func InstallAUR(f *fetch.Fetcher, pkgName string) error {
fmt.Fprintf(os.Stderr, "[debug] InstallAUR: cloned (%.2fs)\n", time.Since(start).Seconds())
state.Write([]byte("Building package...\n"))
makepkgCmd := exec.Command("makepkg", "-si", "--noconfirm")
makepkgCmd := exec.Command("su", "-", sudoUser, "-c", "cd "+tmpDir+" && makepkg -s --noconfirm")
makepkgCmd.Stdout = io.MultiWriter(os.Stdout, state.GetLogWriter())
makepkgCmd.Stderr = io.MultiWriter(os.Stderr, state.GetLogWriter())
makepkgCmd.Dir = tmpDir
if err := makepkgCmd.Run(); err != nil {
errMsg := fmt.Sprintf("makepkg failed to build AUR package: %v\n", err)
state.Write([]byte("error: " + errMsg))
@ -190,10 +199,40 @@ func InstallAUR(f *fetch.Fetcher, pkgName string) error {
}
fmt.Fprintf(os.Stderr, "[debug] InstallAUR: built (%.2fs)\n", time.Since(start).Seconds())
pkgFile, err := findPKGFile(tmpDir)
if err != nil {
return fmt.Errorf("failed to find built package: %w", err)
}
state.Write([]byte("Installing package...\n"))
installCmd := exec.Command("pacman", "-U", "--noconfirm", pkgFile)
installCmd.Stdout = io.MultiWriter(os.Stdout, state.GetLogWriter())
installCmd.Stderr = io.MultiWriter(os.Stderr, state.GetLogWriter())
if err := installCmd.Run(); err != nil {
errMsg := fmt.Sprintf("failed to install package: %v\n", err)
state.Write([]byte("error: " + errMsg))
return fmt.Errorf("failed to install package: %w", err)
}
fmt.Fprintf(os.Stderr, "[debug] InstallAUR: built (%.2fs)\n", time.Since(start).Seconds())
fmt.Fprintf(os.Stderr, "[debug] InstallAUR: done (%.2fs)\n", time.Since(start).Seconds())
return nil
}
func findPKGFile(dir string) (string, error) {
entries, err := os.ReadDir(dir)
if err != nil {
return "", err
}
for _, entry := range entries {
name := entry.Name()
if strings.HasSuffix(name, ".pkg.tar.zst") || strings.HasSuffix(name, ".pkg.tar.gz") {
return filepath.Join(dir, name), nil
}
}
return "", fmt.Errorf("no package file found in %s", dir)
}
func getInstalledCount() (int, error) {
start := time.Now()
fmt.Fprintf(os.Stderr, "[debug] getInstalledCount: starting...\n")

Loading…
Cancel
Save