Source compilation will now use fakeroot and added a skip check flag

This commit is contained in:
CapCreeperGR 2024-07-01 12:04:43 +03:00
parent e72aa2320d
commit 9cbc36f869
3 changed files with 112 additions and 47 deletions

View File

@ -1,6 +1,8 @@
package bpm_utils package bpm_utils
import ( import (
"io"
"os"
"os/exec" "os/exec"
"strings" "strings"
) )
@ -13,6 +15,29 @@ func GetArch() string {
return strings.TrimSpace(string(output)) return strings.TrimSpace(string(output))
} }
func copyFileContents(src, dst string) (err error) {
in, err := os.Open(src)
if err != nil {
return
}
defer in.Close()
out, err := os.Create(dst)
if err != nil {
return
}
defer func() {
cerr := out.Close()
if err == nil {
err = cerr
}
}()
if _, err = io.Copy(out, in); err != nil {
return
}
err = out.Sync()
return
}
func stringSliceRemove(s []string, r string) []string { func stringSliceRemove(s []string, r string) []string {
for i, v := range s { for i, v := range s {
if v == r { if v == r {

View File

@ -15,6 +15,7 @@ import (
"slices" "slices"
"strconv" "strconv"
"strings" "strings"
"syscall"
) )
type PackageInfo struct { type PackageInfo struct {
@ -480,7 +481,7 @@ func extractPackage(pkgInfo *PackageInfo, filename, rootDir string) (error, []st
return nil, files return nil, files
} }
func compilePackage(pkgInfo *PackageInfo, filename, rootDir string, binaryPkgFromSrc, keepTempDir bool) (error, []string) { func compilePackage(pkgInfo *PackageInfo, filename, rootDir string, binaryPkgFromSrc, skipCheck, keepTempDir bool) (error, []string) {
var files []string var files []string
if !IsPackageInstalled(pkgInfo.Name, rootDir) { if !IsPackageInstalled(pkgInfo.Name, rootDir) {
err := ExecutePackageScripts(filename, rootDir, Install, false) err := ExecutePackageScripts(filename, rootDir, Install, false)
@ -509,11 +510,16 @@ func compilePackage(pkgInfo *PackageInfo, filename, rootDir string, binaryPkgFro
if err != nil { if err != nil {
return err, nil return err, nil
} }
err = os.Mkdir(temp, 0755)
fmt.Println("Creating temp directory at: " + temp) fmt.Println("Creating temp directory at: " + temp)
err = os.Mkdir(temp, 0755)
if err != nil { if err != nil {
return err, nil return err, nil
} }
err = os.Chown(temp, 65534, 65534)
if err != nil {
return err, nil
}
for { for {
header, err := tr.Next() header, err := tr.Next()
if err == io.EOF { if err == io.EOF {
@ -532,6 +538,10 @@ func compilePackage(pkgInfo *PackageInfo, filename, rootDir string, binaryPkgFro
} }
} else { } else {
fmt.Println("Creating Directory: " + extractFilename) fmt.Println("Creating Directory: " + extractFilename)
err = os.Chown(extractFilename, 65534, 65534)
if err != nil {
return err, nil
}
} }
case tar.TypeReg: case tar.TypeReg:
err := os.Remove(extractFilename) err := os.Remove(extractFilename)
@ -543,6 +553,10 @@ func compilePackage(pkgInfo *PackageInfo, filename, rootDir string, binaryPkgFro
if err != nil { if err != nil {
return err, nil return err, nil
} }
err = os.Chown(extractFilename, 65534, 65534)
if err != nil {
return err, nil
}
if _, err := io.Copy(outFile, tr); err != nil { if _, err := io.Copy(outFile, tr); err != nil {
return err, nil return err, nil
} }
@ -570,6 +584,10 @@ func compilePackage(pkgInfo *PackageInfo, filename, rootDir string, binaryPkgFro
if err != nil { if err != nil {
return err, nil return err, nil
} }
err = os.Chown(path.Join(temp, "source.sh"), 65534, 65534)
if err != nil {
return err, nil
}
} }
} }
if _, err := os.Stat(path.Join(temp, "source.sh")); os.IsNotExist(err) { if _, err := os.Stat(path.Join(temp, "source.sh")); os.IsNotExist(err) {
@ -594,19 +612,10 @@ func compilePackage(pkgInfo *PackageInfo, filename, rootDir string, binaryPkgFro
if err != nil { if err != nil {
return err, nil return err, nil
} }
hasPackageFunc := false
compatMode := false if !strings.Contains(string(bs), "package()") {
if strings.Contains(string(bs), "package()") { fmt.Print("This package does not seem to have the required 'package' function\nThe source.sh file may have been created for an older BPM version\nPlease update the source.sh file")
hasPackageFunc = true return errors.New("invalid source.sh format"), nil
}
if !hasPackageFunc {
reader := bufio.NewReader(os.Stdin)
fmt.Print("This package does not seem to have the required 'package' function\nThe source.sh file may have been created for an older BPM version\nWould you like to run the script in compatibility mode (Not Recommended)? [Y\\n] ")
text, _ := reader.ReadString('\n')
if strings.TrimSpace(strings.ToLower(text)) != "y" && strings.TrimSpace(strings.ToLower(text)) != "yes" {
return errors.New("could not find required 'package' function in source.sh"), nil
}
compatMode = true
} }
runScript := ` runScript := `
@ -621,29 +630,39 @@ if [[ $(type -t prepare) == function ]]; then
bash -e -c prepare bash -e -c prepare
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "Failed to run prepare() function in source.sh" echo "Failed to run prepare() function in source.sh"
exit 1
fi fi
fi fi
cd "$BPM_SOURCE" cd "$BPM_SOURCE"
if [[ $(type -t build) == function ]]; then if [[ $(type -t build) == function ]]; then
echo "Running build() function..." echo "Running build() function..."
bash -e -c build bash -e -c build
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "Failed to run build() function in source.sh" echo "Failed to run build() function in source.sh"
exit 1
fi fi
fi fi
cd "$BPM_SOURCE" cd "$BPM_SOURCE"
if [[ $(type -t check) == function ]]; then if [[ $(type -t check) == function ]] && [ -z "$SKIPCHECK" ]; then
echo "Running check() function..." echo "Running check() function..."
bash -e -c check bash -e -c check
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "Failed to run check() function in source.sh" echo "Failed to run check() function in source.sh"
exit 1
fi fi
fi fi
cd "$BPM_SOURCE"
if ! [[ $(type -t package) == function ]]; then if ! [[ $(type -t package) == function ]]; then
echo "Failed to locate package() function in source.sh" echo "Failed to locate package() function in source.sh"
exit 1 exit 1
fi fi
echo "Running package() function..." echo "Running package() function..."
touch "$BPM_WORKDIR"/fakeroot_file
fakeroot -s "$BPM_WORKDIR"/fakeroot_file bash -e -c package
bash -e -c package bash -e -c package
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "Failed to run package() function in source.sh" echo "Failed to run package() function in source.sh"
@ -654,17 +673,22 @@ fi
if err != nil { if err != nil {
return err, nil return err, nil
} }
err = os.Chown(path.Join(temp, "run.sh"), 65534, 65534)
if err != nil {
return err, nil
}
cmd := exec.Command("/bin/bash", "-e", "run.sh") cmd := exec.Command("/bin/bash", "-e", "run.sh")
cmd.SysProcAttr = &syscall.SysProcAttr{}
cmd.SysProcAttr.Credential = &syscall.Credential{Uid: 65534, Gid: 65534}
cmd.Dir = temp cmd.Dir = temp
cmd.Env = os.Environ() cmd.Env = os.Environ()
if compatMode { err = os.Mkdir(path.Join(temp, "source"), 0755)
cmd = exec.Command("/bin/bash", "-e", "source.sh") if err != nil {
cmd.Dir = temp return err, nil
cmd.Env = os.Environ() }
} else { err = os.Chown(path.Join(temp, "source"), 65534, 65534)
err := os.Mkdir(path.Join(temp, "source"), 0755)
if err != nil { if err != nil {
return err, nil return err, nil
} }
@ -672,10 +696,14 @@ fi
if err != nil { if err != nil {
return err, nil return err, nil
} }
err = os.Chown(path.Join(temp, "output"), 65534, 65534)
if err != nil {
return err, nil
}
cmd.Env = append(cmd.Env, "BPM_WORKDIR="+temp) cmd.Env = append(cmd.Env, "BPM_WORKDIR="+temp)
cmd.Env = append(cmd.Env, "BPM_SOURCE="+path.Join(temp, "source")) cmd.Env = append(cmd.Env, "BPM_SOURCE="+path.Join(temp, "source"))
cmd.Env = append(cmd.Env, "BPM_OUTPUT="+path.Join(temp, "output")) cmd.Env = append(cmd.Env, "BPM_OUTPUT="+path.Join(temp, "output"))
} cmd.Env = append(cmd.Env, "SKIPCHECK="+strconv.FormatBool(skipCheck))
cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_ROOT=%s", rootDir)) cmd.Env = append(cmd.Env, fmt.Sprintf("BPM_ROOT=%s", rootDir))
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))
@ -805,37 +833,47 @@ fi
compiledInfo = *pkgInfo compiledInfo = *pkgInfo
compiledInfo.Type = "binary" compiledInfo.Type = "binary"
compiledInfo.Arch = GetArch() compiledInfo.Arch = GetArch()
err = os.WriteFile(path.Join(compiledDir, "pkg.info"), []byte(CreateInfoFile(compiledInfo, false)), 0644) err = os.WriteFile(path.Join(temp, "pkg.info"), []byte(CreateInfoFile(compiledInfo, false)), 0644)
if err != nil {
return err, nil
}
err = os.Chown(path.Join(temp, "pkg.info"), 65534, 65534)
if err != nil { if err != nil {
return err, nil return err, nil
} }
scripts, err := ReadPackageScripts(filename) scripts, err := ReadPackageScripts(filename)
for key, val := range scripts { for key, val := range scripts {
err = os.WriteFile(path.Join(compiledDir, key), []byte(val), 0644) err = os.WriteFile(path.Join(temp, key), []byte(val), 0644)
if err != nil {
return err, nil
}
err = os.Chown(path.Join(temp, key), 65534, 65534)
if err != nil { if err != nil {
return err, nil return err, nil
} }
} }
sed := fmt.Sprintf("s/%s/files/", strings.Replace(strings.TrimPrefix(path.Join(temp, "/output/"), "/"), "/", `\/`, -1)) sed := fmt.Sprintf("s/output/files/")
cmd := exec.Command("/usr/bin/tar", "-czvf", compiledInfo.Name+"-"+compiledInfo.Version+".bpm", "pkg.info", path.Join(temp, "/output/"), "--transform", sed) fileName := compiledInfo.Name + "-" + compiledInfo.Version + "-" + compiledInfo.Arch + ".bpm"
cmd := exec.Command("/usr/bin/fakeroot", "-i fakeroot_file", "tar", "-czvpf", fileName, "pkg.info", "output/", "--transform", sed)
if !BPMConfig.SilentCompilation { if !BPMConfig.SilentCompilation {
cmd.Stdin = os.Stdin cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr cmd.Stderr = os.Stderr
} }
cmd.Dir = compiledDir cmd.SysProcAttr = &syscall.SysProcAttr{}
fmt.Printf("running command: %s %s\n", cmd.Path, strings.Join(cmd.Args, " ")) cmd.SysProcAttr.Credential = &syscall.Credential{Uid: 65534, Gid: 65534}
cmd.Dir = temp
cmd.Env = os.Environ()
fmt.Printf("running command: %s\n", strings.Join(cmd.Args, " "))
err = cmd.Run() err = cmd.Run()
if err != nil { if err != nil {
return err, nil return err, nil
} }
err = os.Remove(path.Join(compiledDir, "pkg.info")) err = copyFileContents(path.Join(temp, fileName), path.Join(compiledDir, fileName))
for key := range scripts {
err = os.Remove(path.Join(compiledDir, key))
if err != nil { if err != nil {
return err, nil return err, nil
} }
} err = os.Chown(path.Join(compiledDir, fileName), 0, 0)
if err != nil { if err != nil {
return err, nil return err, nil
} }
@ -855,7 +893,7 @@ fi
return nil, files return nil, files
} }
func InstallPackage(filename, rootDir string, force, binaryPkgFromSrc, keepTempDir bool) error { func InstallPackage(filename, rootDir string, force, binaryPkgFromSrc, skipCheck, keepTempDir bool) error {
if _, err := os.Stat(filename); os.IsNotExist(err) { if _, err := os.Stat(filename); os.IsNotExist(err) {
return err return err
} }
@ -884,7 +922,7 @@ func InstallPackage(filename, rootDir string, force, binaryPkgFromSrc, keepTempD
} }
files = i files = i
} else if pkgInfo.Type == "source" { } else if pkgInfo.Type == "source" {
err, i := compilePackage(pkgInfo, filename, rootDir, binaryPkgFromSrc, keepTempDir) err, i := compilePackage(pkgInfo, filename, rootDir, binaryPkgFromSrc, skipCheck, keepTempDir)
if err != nil { if err != nil {
return err return err
} }

View File

@ -26,6 +26,7 @@ var subcommandArgs []string
var rootDir = "/" var rootDir = "/"
var yesAll = false var yesAll = false
var buildSource = false var buildSource = false
var skipCheck = false
var keepTempDir = false var keepTempDir = false
var forceInstall = false var forceInstall = false
var pkgListNumbers = false var pkgListNumbers = false
@ -204,7 +205,7 @@ func resolveCommand() {
} }
} }
err = bpm_utils.InstallPackage(file, rootDir, forceInstall, buildSource, keepTempDir) err = bpm_utils.InstallPackage(file, rootDir, forceInstall, buildSource, skipCheck, keepTempDir)
if err != nil { if err != nil {
if pkgInfo.Type == "source" && keepTempDir { if pkgInfo.Type == "source" && keepTempDir {
fmt.Println("BPM temp directory was created at /var/tmp/bpm_source-" + pkgInfo.Name) fmt.Println("BPM temp directory was created at /var/tmp/bpm_source-" + pkgInfo.Name)
@ -348,6 +349,7 @@ func resolveFlags() {
installFlagSet.StringVar(&rootDir, "R", "/", "Set the destination root") installFlagSet.StringVar(&rootDir, "R", "/", "Set the destination root")
installFlagSet.BoolVar(&yesAll, "y", false, "Skip confirmation prompts") installFlagSet.BoolVar(&yesAll, "y", false, "Skip confirmation prompts")
installFlagSet.BoolVar(&buildSource, "b", false, "Build binary package from source package") installFlagSet.BoolVar(&buildSource, "b", false, "Build binary package from source package")
installFlagSet.BoolVar(&skipCheck, "s", false, "Skip check function during source compilation")
installFlagSet.BoolVar(&keepTempDir, "k", false, "Keep temporary directory after source compilation") installFlagSet.BoolVar(&keepTempDir, "k", false, "Keep temporary directory after source compilation")
installFlagSet.BoolVar(&forceInstall, "f", false, "Force installation by skipping architecture and dependency resolution") installFlagSet.BoolVar(&forceInstall, "f", false, "Force installation by skipping architecture and dependency resolution")
installFlagSet.Usage = printHelp installFlagSet.Usage = printHelp