From 0dfb66c6c0133f7e39429dddc771272dd6749a2b Mon Sep 17 00:00:00 2001 From: EnumDev Date: Fri, 5 Dec 2025 18:02:54 +0200 Subject: [PATCH] Bind mount etc/resolv.conf in package scripts for internet access --- src/bpmlib/packages.go | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/bpmlib/packages.go b/src/bpmlib/packages.go index 48ccf42..ab16b65 100644 --- a/src/bpmlib/packages.go +++ b/src/bpmlib/packages.go @@ -376,9 +376,44 @@ func executePackageScript(pkg, rootDir string, verbose bool, packageScript strin cmd := exec.Command("/bin/bash", "-c", content) // Setup subprocess environment cmd.Dir = "/" - // Run hook in chroot if using the -R flag + // Run package script in chroot if using the -R flag if rootDir != "/" { cmd.SysProcAttr = &syscall.SysProcAttr{Chroot: rootDir} + + // Bind mount /etc/resolv.conf + mounted, err := func() (bool, error) { + if _, err := os.Stat("/etc/resolv.conf"); err != nil { + return false, nil + } + + if _, err := os.Stat(path.Join(rootDir, "etc/resolv.conf")); os.IsNotExist(err) { + err = os.WriteFile(path.Join(rootDir, "/etc/resolv.conf"), nil, 0644) + if err != nil { + return false, nil + } + } else if err != nil { + return false, err + } + + mntCmd := exec.Command("mount", "-o", "ro,bind", "/etc/resolv.conf", path.Join(rootDir, "/etc/resolv.conf")) + if verbose { + mntCmd.Stdout = os.Stdout + mntCmd.Stderr = os.Stderr + } + err = mntCmd.Run() + if err != nil { + return false, err + } + + return true, nil + }() + if err != nil { + return err + } + + if mounted { + defer exec.Command("umount", "-f", path.Join(rootDir, "/etc/resolv.conf")).Run() + } } // Show output if verbose if verbose {