Use chroot for package scripts

This commit is contained in:
2025-08-14 14:48:41 +03:00
parent 998d4a2252
commit c01ca62e34
+27 -17
View File
@@ -5,8 +5,6 @@ import (
"compress/gzip" "compress/gzip"
"errors" "errors"
"fmt" "fmt"
version "github.com/knqyf263/go-rpm-version"
"gopkg.in/yaml.v3"
"io" "io"
"log" "log"
"os" "os"
@@ -17,6 +15,9 @@ import (
"strconv" "strconv"
"strings" "strings"
"syscall" "syscall"
version "github.com/knqyf263/go-rpm-version"
"gopkg.in/yaml.v3"
) )
type BPMPackage struct { type BPMPackage struct {
@@ -321,19 +322,16 @@ func executePackageScripts(filename, rootDir string, operation packageOperation,
} }
run := func(name, content string) error { run := func(name, content string) error {
temp, err := os.CreateTemp("", name) cmd := exec.Command("/bin/bash", "-c", content)
if err != nil { // Setup subprocess environment
return err cmd.Dir = "/"
// Run hook in chroot if using the -R flag
if rootDir != "/" {
cmd.SysProcAttr = &syscall.SysProcAttr{Chroot: rootDir}
} }
_, err = temp.WriteString(content) // Setup command environment
if err != nil {
return err
}
cmd := exec.Command("/bin/bash", temp.Name())
cmd.Dir = rootDir
cmd.Env = os.Environ() cmd.Env = os.Environ()
cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_ROOT=%s", rootDir)) cmd.Env = append(cmd.Env, "BPM_ROOT=/") // Setting to "/" for backwards compatibility
cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_PKG_NAME=%s", pkgInfo.PkgInfo.Name)) cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_PKG_NAME=%s", pkgInfo.PkgInfo.Name))
cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_PKG_DESC=%s", pkgInfo.PkgInfo.Description)) cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_PKG_DESC=%s", pkgInfo.PkgInfo.Description))
cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_PKG_VERSION=%s", pkgInfo.PkgInfo.Version)) cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_PKG_VERSION=%s", pkgInfo.PkgInfo.Version))
@@ -939,9 +937,15 @@ func removePackage(pkg string, verbose bool, rootDir string) error {
// Executing pre_remove script // Executing pre_remove script
if _, err := os.Stat(path.Join(pkgDir, "pre_remove.sh")); err == nil { if _, err := os.Stat(path.Join(pkgDir, "pre_remove.sh")); err == nil {
cmd := exec.Command("/bin/bash", path.Join(pkgDir, "pre_remove.sh")) cmd := exec.Command("/bin/bash", path.Join(pkgDir, "pre_remove.sh"))
cmd.Dir = rootDir // Setup subprocess environment
cmd.Dir = "/"
// Run hook in chroot if using the -R flag
if rootDir != "/" {
cmd.SysProcAttr = &syscall.SysProcAttr{Chroot: rootDir}
}
// Setup command environment
cmd.Env = os.Environ() cmd.Env = os.Environ()
cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_ROOT=%s", rootDir)) cmd.Env = append(cmd.Env, "BPM_ROOT=/") // Setting to "/" for backwards compatibility
cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_PKG_NAME=%s", pkgInfo.Name)) cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_PKG_NAME=%s", pkgInfo.Name))
cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_PKG_VERSION=%s", pkgInfo.Version)) cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_PKG_VERSION=%s", pkgInfo.Version))
cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_PKG_REVISION=%d", pkgInfo.Revision)) cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_PKG_REVISION=%d", pkgInfo.Revision))
@@ -1030,9 +1034,15 @@ func removePackage(pkg string, verbose bool, rootDir string) error {
// Executing post_remove script // Executing post_remove script
if _, err := os.Stat(path.Join(pkgDir, "post_remove.sh")); err == nil { if _, err := os.Stat(path.Join(pkgDir, "post_remove.sh")); err == nil {
cmd := exec.Command("/bin/bash", path.Join(pkgDir, "post_remove.sh")) cmd := exec.Command("/bin/bash", path.Join(pkgDir, "post_remove.sh"))
cmd.Dir = rootDir // Setup subprocess environment
cmd.Dir = "/"
// Run hook in chroot if using the -R flag
if rootDir != "/" {
cmd.SysProcAttr = &syscall.SysProcAttr{Chroot: rootDir}
}
// Setup command environment
cmd.Env = os.Environ() cmd.Env = os.Environ()
cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_ROOT=%s", rootDir)) cmd.Env = append(cmd.Env, "BPM_ROOT=/") // Setting to "/" for backwards compatibility
cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_PKG_NAME=%s", pkgInfo.Name)) cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_PKG_NAME=%s", pkgInfo.Name))
cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_PKG_VERSION=%s", pkgInfo.Version)) cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_PKG_VERSION=%s", pkgInfo.Version))
cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_PKG_REVISION=%d", pkgInfo.Revision)) cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_PKG_REVISION=%d", pkgInfo.Revision))