From 8c7b36c07b48c641775007bca198f02dfe1b514a Mon Sep 17 00:00:00 2001 From: Nulo Date: Sun, 22 Jan 2023 00:21:11 -0300 Subject: [PATCH] lol --- .gitignore | 3 + ...vel@lists.alpinelinux.org-4a6a0840.rsa.pub | 9 ++ ...vel@lists.alpinelinux.org-5243ef4b.rsa.pub | 9 ++ ...vel@lists.alpinelinux.org-5261cecb.rsa.pub | 9 ++ ...vel@lists.alpinelinux.org-6165ee59.rsa.pub | 14 +++ ...vel@lists.alpinelinux.org-61666e3f.rsa.pub | 14 +++ config.go | 16 ++++ go.mod | 3 + main.go | 90 +++++++++++++++++++ 9 files changed, 167 insertions(+) create mode 100644 .gitignore create mode 100644 alpine/keys/alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub create mode 100644 alpine/keys/alpine-devel@lists.alpinelinux.org-5243ef4b.rsa.pub create mode 100644 alpine/keys/alpine-devel@lists.alpinelinux.org-5261cecb.rsa.pub create mode 100644 alpine/keys/alpine-devel@lists.alpinelinux.org-6165ee59.rsa.pub create mode 100644 alpine/keys/alpine-devel@lists.alpinelinux.org-61666e3f.rsa.pub create mode 100644 config.go create mode 100644 go.mod create mode 100644 main.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8d8713d --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +cache/ +rootfs/ +test diff --git a/alpine/keys/alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub b/alpine/keys/alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub new file mode 100644 index 0000000..bb4bdc8 --- /dev/null +++ b/alpine/keys/alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1yHJxQgsHQREclQu4Ohe +qxTxd1tHcNnvnQTu/UrTky8wWvgXT+jpveroeWWnzmsYlDI93eLI2ORakxb3gA2O +Q0Ry4ws8vhaxLQGC74uQR5+/yYrLuTKydFzuPaS1dK19qJPXB8GMdmFOijnXX4SA +jixuHLe1WW7kZVtjL7nufvpXkWBGjsfrvskdNA/5MfxAeBbqPgaq0QMEfxMAn6/R +L5kNepi/Vr4S39Xvf2DzWkTLEK8pcnjNkt9/aafhWqFVW7m3HCAII6h/qlQNQKSo +GuH34Q8GsFG30izUENV9avY7hSLq7nggsvknlNBZtFUcmGoQrtx3FmyYsIC8/R+B +ywIDAQAB +-----END PUBLIC KEY----- diff --git a/alpine/keys/alpine-devel@lists.alpinelinux.org-5243ef4b.rsa.pub b/alpine/keys/alpine-devel@lists.alpinelinux.org-5243ef4b.rsa.pub new file mode 100644 index 0000000..6cbfad7 --- /dev/null +++ b/alpine/keys/alpine-devel@lists.alpinelinux.org-5243ef4b.rsa.pub @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvNijDxJ8kloskKQpJdx+ +mTMVFFUGDoDCbulnhZMJoKNkSuZOzBoFC94omYPtxnIcBdWBGnrm6ncbKRlR+6oy +DO0W7c44uHKCFGFqBhDasdI4RCYP+fcIX/lyMh6MLbOxqS22TwSLhCVjTyJeeH7K +aA7vqk+QSsF4TGbYzQDDpg7+6aAcNzg6InNePaywA6hbT0JXbxnDWsB+2/LLSF2G +mnhJlJrWB1WGjkz23ONIWk85W4S0XB/ewDefd4Ly/zyIciastA7Zqnh7p3Ody6Q0 +sS2MJzo7p3os1smGjUF158s6m/JbVh4DN6YIsxwl2OjDOz9R0OycfJSDaBVIGZzg +cQIDAQAB +-----END PUBLIC KEY----- diff --git a/alpine/keys/alpine-devel@lists.alpinelinux.org-5261cecb.rsa.pub b/alpine/keys/alpine-devel@lists.alpinelinux.org-5261cecb.rsa.pub new file mode 100644 index 0000000..83f0658 --- /dev/null +++ b/alpine/keys/alpine-devel@lists.alpinelinux.org-5261cecb.rsa.pub @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwlzMkl7b5PBdfMzGdCT0 +cGloRr5xGgVmsdq5EtJvFkFAiN8Ac9MCFy/vAFmS8/7ZaGOXoCDWbYVLTLOO2qtX +yHRl+7fJVh2N6qrDDFPmdgCi8NaE+3rITWXGrrQ1spJ0B6HIzTDNEjRKnD4xyg4j +g01FMcJTU6E+V2JBY45CKN9dWr1JDM/nei/Pf0byBJlMp/mSSfjodykmz4Oe13xB +Ca1WTwgFykKYthoLGYrmo+LKIGpMoeEbY1kuUe04UiDe47l6Oggwnl+8XD1MeRWY +sWgj8sF4dTcSfCMavK4zHRFFQbGp/YFJ/Ww6U9lA3Vq0wyEI6MCMQnoSMFwrbgZw +wwIDAQAB +-----END PUBLIC KEY----- diff --git a/alpine/keys/alpine-devel@lists.alpinelinux.org-6165ee59.rsa.pub b/alpine/keys/alpine-devel@lists.alpinelinux.org-6165ee59.rsa.pub new file mode 100644 index 0000000..f2165ae --- /dev/null +++ b/alpine/keys/alpine-devel@lists.alpinelinux.org-6165ee59.rsa.pub @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAutQkua2CAig4VFSJ7v54 +ALyu/J1WB3oni7qwCZD3veURw7HxpNAj9hR+S5N/pNeZgubQvJWyaPuQDm7PTs1+ +tFGiYNfAsiibX6Rv0wci3M+z2XEVAeR9Vzg6v4qoofDyoTbovn2LztaNEjTkB+oK +tlvpNhg1zhou0jDVYFniEXvzjckxswHVb8cT0OMTKHALyLPrPOJzVtM9C1ew2Nnc +3848xLiApMu3NBk0JqfcS3Bo5Y2b1FRVBvdt+2gFoKZix1MnZdAEZ8xQzL/a0YS5 +Hd0wj5+EEKHfOd3A75uPa/WQmA+o0cBFfrzm69QDcSJSwGpzWrD1ScH3AK8nWvoj +v7e9gukK/9yl1b4fQQ00vttwJPSgm9EnfPHLAtgXkRloI27H6/PuLoNvSAMQwuCD +hQRlyGLPBETKkHeodfLoULjhDi1K2gKJTMhtbnUcAA7nEphkMhPWkBpgFdrH+5z4 +Lxy+3ek0cqcI7K68EtrffU8jtUj9LFTUC8dERaIBs7NgQ/LfDbDfGh9g6qVj1hZl +k9aaIPTm/xsi8v3u+0qaq7KzIBc9s59JOoA8TlpOaYdVgSQhHHLBaahOuAigH+VI +isbC9vmqsThF2QdDtQt37keuqoda2E6sL7PUvIyVXDRfwX7uMDjlzTxHTymvq2Ck +htBqojBnThmjJQFgZXocHG8CAwEAAQ== +-----END PUBLIC KEY----- diff --git a/alpine/keys/alpine-devel@lists.alpinelinux.org-61666e3f.rsa.pub b/alpine/keys/alpine-devel@lists.alpinelinux.org-61666e3f.rsa.pub new file mode 100644 index 0000000..aa63d81 --- /dev/null +++ b/alpine/keys/alpine-devel@lists.alpinelinux.org-61666e3f.rsa.pub @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlEyxkHggKCXC2Wf5Mzx4 +nZLFZvU2bgcA3exfNPO/g1YunKfQY+Jg4fr6tJUUTZ3XZUrhmLNWvpvSwDS19ZmC +IXOu0+V94aNgnhMsk9rr59I8qcbsQGIBoHzuAl8NzZCgdbEXkiY90w1skUw8J57z +qCsMBydAueMXuWqF5nGtYbi5vHwK42PffpiZ7G5Kjwn8nYMW5IZdL6ZnMEVJUWC9 +I4waeKg0yskczYDmZUEAtrn3laX9677ToCpiKrvmZYjlGl0BaGp3cxggP2xaDbUq +qfFxWNgvUAb3pXD09JM6Mt6HSIJaFc9vQbrKB9KT515y763j5CC2KUsilszKi3mB +HYe5PoebdjS7D1Oh+tRqfegU2IImzSwW3iwA7PJvefFuc/kNIijfS/gH/cAqAK6z +bhdOtE/zc7TtqW2Wn5Y03jIZdtm12CxSxwgtCF1NPyEWyIxAQUX9ACb3M0FAZ61n +fpPrvwTaIIxxZ01L3IzPLpbc44x/DhJIEU+iDt6IMTrHOphD9MCG4631eIdB0H1b +6zbNX1CXTsafqHRFV9XmYYIeOMggmd90s3xIbEujA6HKNP/gwzO6CDJ+nHFDEqoF +SkxRdTkEqjTjVKieURW7Swv7zpfu5PrsrrkyGnsRrBJJzXlm2FOOxnbI2iSL1B5F +rO5kbUxFeZUIDq+7Yv4kLWcCAwEAAQ== +-----END PUBLIC KEY----- diff --git a/config.go b/config.go new file mode 100644 index 0000000..793b781 --- /dev/null +++ b/config.go @@ -0,0 +1,16 @@ +package main + +import ( + "encoding/json" + "os" +) + +type Config struct { + Command string + Cache []string +} + +func readConfig() (config Config, err error) { + err = json.NewDecoder(os.Stdin).Decode(&config) + return +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..b969676 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module gitea.nulo.in/Nulo/repro-run + +go 1.19 diff --git a/main.go b/main.go new file mode 100644 index 0000000..24b0c22 --- /dev/null +++ b/main.go @@ -0,0 +1,90 @@ +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) + } +}