Внесение логики для запуска из под root

This commit is contained in:
2025-08-27 01:45:54 +03:00
parent 75ece6dfcc
commit 59cc41e94c
5 changed files with 93 additions and 21 deletions

View File

@@ -16,14 +16,30 @@
package manager
import "os/exec"
import (
"os"
"os/exec"
)
type CommonPackageManager struct {
noConfirmArg string
}
func (m *CommonPackageManager) getCmd(opts *Opts, mgrCmd string, args ...string) *exec.Cmd {
cmd := exec.Command(mgrCmd)
var cmd *exec.Cmd
// Проверяем, нужно ли повышение привилегий
isRoot := os.Geteuid() == 0
isCI := os.Getenv("CI") == "true"
if !isRoot && !isCI {
// Если не root и не в CI, используем sudo
cmd = exec.Command("sudo", mgrCmd)
} else {
// Если root или в CI, запускаем напрямую
cmd = exec.Command(mgrCmd)
}
cmd.Args = append(cmd.Args, opts.Args...)
cmd.Args = append(cmd.Args, args...)

View File

@@ -39,19 +39,45 @@ func EnsureTempDirWithRootOwner(path string, mode os.FileMode) error {
return err
}
// Все каталоги в /tmp/alr доступны для группы wheel
// Устанавливаем setgid бит (2775), чтобы новые файлы наследовали группу
// В CI или если мы уже root, не нужно использовать sudo
isRoot := os.Geteuid() == 0
isCI := os.Getenv("CI") == "true"
// Если мы в CI или root, выполняем команды напрямую
// В противном случае используем sudo
permissions := "2775"
group := "wheel"
var chmodCmd, chownCmd *exec.Cmd
if isRoot || isCI {
// Выполняем команды напрямую без sudo
chmodCmd = exec.Command("chmod", permissions, path)
chownCmd = exec.Command("chown", "root:"+group, path)
} else {
// Используем sudo для обычных пользователей
chmodCmd = exec.Command("sudo", "chmod", permissions, path)
chownCmd = exec.Command("sudo", "chown", "root:"+group, path)
}
// Устанавливаем права с setgid битом
err = exec.Command("sudo", "chmod", permissions, path).Run()
err = chmodCmd.Run()
if err != nil {
return err
// В CI или для root игнорируем ошибки, если группа wheel не существует
if !isRoot && !isCI {
return err
}
}
// Устанавливаем владельца root:wheel
return exec.Command("sudo", "chown", "root:"+group, path).Run()
err = chownCmd.Run()
if err != nil {
// В CI или для root игнорируем ошибки, если группа wheel не существует
if !isRoot && !isCI {
return err
}
}
return nil
}
// Для остальных каталогов обычное создание