repro-run/main.go

91 lines
2.3 KiB
Go
Raw Normal View History

2023-01-22 03:21:11 +00:00
package main
import (
"embed"
"io"
"log"
"os"
"os/exec"
"path"
"strings"
)
//go:embed alpine/keys
var alpineKeys embed.FS
func main() {
config, err := readConfig()
must(err)
must(os.MkdirAll("rootfs/etc/apk/keys", 0700))
must(os.WriteFile("rootfs/etc/apk/repositories", []byte(
`https://dl-cdn.alpinelinux.org/alpine/v3.17/main
https://dl-cdn.alpinelinux.org/alpine/v3.17/community`), 0600))
must(os.WriteFile("rootfs/etc/resolv.conf", []byte(
`nameserver 8.8.8.8`), 0644))
keys, err := alpineKeys.ReadDir("alpine/keys")
must(err)
for _, entry := range keys {
o, err := os.Create(path.Join("rootfs/etc/apk/keys/", entry.Name()))
must(err)
s, err := alpineKeys.Open(path.Join("alpine/keys", entry.Name()))
must(err)
_, err = io.Copy(o, s)
must(err)
}
must(os.MkdirAll("cache/_var_cache_apk", 0700))
os.Remove("rootfs/etc/apk/cache")
must(os.Symlink("/var/cache/apk", "rootfs/etc/apk/cache"))
// must(os.MkdirAll("rootfs/var/cache", 0700))
// must(os.RemoveAll("rootfs/var/cache/apk"))
// must(os.Symlink("../../../cache/apk", "rootfs/var/cache/apk"))
cmd := exec.Command("apk", "add",
"--root", "rootfs",
"--initdb",
"--cache-dir", "../cache/_var_cache_apk",
"apk-tools")
must(cmd.Run(), "apk add apk-tools")
// must(os.Remove("rootfs/var/cache/apk"))
cached := append(config.Cache, "/var/cache/apk")
var cachedParams []string
for _, c := range cached {
cacheDir := path.Join("./cache", strings.ReplaceAll(c, "/", "_"))
must(os.MkdirAll(cacheDir, 0700))
cachedParams = append(cachedParams, "--bind", cacheDir, c)
}
tmp, err := os.MkdirTemp("", "repro-run-")
must(err)
params := append(
[]string{"--bind", "./rootfs", "/",
"--ro-bind", ".", "/src",
"--bind", tmp, "/work",
"--chdir", "/work",
},
cachedParams...)
log.Println(strings.Join(params, " "))
cmd = exec.Command("bwrap", append(params,
"apk", "add", "busybox", "busybox-suid", "libc-utils", "alpine-baselayout", "alpine-conf", "alpine-release")...)
// cmd.Stdout = os.Stdout
// cmd.Stderr = os.Stderr
must(cmd.Run())
cmd = exec.Command("bwrap", append(params, strings.Split(config.Command, " ")...)...)
cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin
cmd.Stderr = os.Stderr
must(cmd.Run())
}
func must(err error, where ...string) {
if err != nil {
log.Fatal(err, where)
}
}