diff --git a/Dockerfile b/Dockerfile index bc9d430..2ce7c94 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # ------------------------------------------------------------------------ -from golang:1.22.2-bookworm as build +from golang:1.24.3-bookworm as build run apt-get update && apt-get install -y git @@ -27,7 +27,7 @@ entrypoint ["/bin/dkl-local-server"] env _uncache=1 run apt-get update \ && yes |apt-get install -y genisoimage gdisk dosfstools util-linux udev binutils systemd \ - grub2 grub-pc-bin grub-efi-amd64-bin ca-certificates curl openssh-client \ + grub2 grub-pc-bin grub-efi-amd64-bin ca-certificates curl openssh-client qemu-utils \ && apt-get clean copy --from=build /src/dist/ /bin/ diff --git a/cmd/dkl-local-server/boot-img.go b/cmd/dkl-local-server/boot-img.go index c0889c1..efc86a5 100644 --- a/cmd/dkl-local-server/boot-img.go +++ b/cmd/dkl-local-server/boot-img.go @@ -56,6 +56,55 @@ func buildBootImgGZ(out io.Writer, ctx *renderContext) (err error) { return } +func buildBootImgQemuConvert(out io.Writer, ctx *renderContext, format string) (err error) { + imgPath, err := func() (imgPath string, err error) { + bootImg, err := os.CreateTemp(os.TempDir(), "boot.img-") + if err != nil { + return + } + defer rmTempFile(bootImg) + + err = setupBootImage(bootImg, ctx) + if err != nil { + return + } + + err = bootImg.Sync() + if err != nil { + return + } + + imgPath = bootImg.Name() + "." + format + + err = run("qemu-img", "convert", "-f", "raw", "-O", format, bootImg.Name(), imgPath) + if err != nil { + return + } + return + }() + + defer os.Remove(imgPath) + + if err != nil { + return + } + + // send the result + img, err := os.Open(imgPath) + if err != nil { + return + } + + io.Copy(out, img) + return +} +func buildBootQcow2(out io.Writer, ctx *renderContext) (err error) { + return buildBootImgQemuConvert(out, ctx, "qcow2") +} +func buildBootVmdk(out io.Writer, ctx *renderContext) (err error) { + return buildBootImgQemuConvert(out, ctx, "vmdk") +} + var grubSupportVersion = flag.String("grub-support", "1.1.0", "GRUB support version") func setupBootImage(bootImg *os.File, ctx *renderContext) (err error) { diff --git a/cmd/dkl-local-server/ws-host.go b/cmd/dkl-local-server/ws-host.go index 0187bd9..fe4f6ac 100644 --- a/cmd/dkl-local-server/ws-host.go +++ b/cmd/dkl-local-server/ws-host.go @@ -54,6 +54,13 @@ func (ws wsHost) register(rws *restful.WebService, alterRB func(*restful.RouteBu Produces(mime.DISK + "+lz4"). Doc("Get the " + ws.hostDoc + "'s boot disk image (lz4 compressed)"), + b("boot.qcow2"). + Produces(mime.DISK + "+qcow2"). + Doc("Get the " + ws.hostDoc + "'s boot disk image (qcow2)"), + b("boot.vmdk"). + Produces(mime.DISK + "+vmdk"). + Doc("Get the " + ws.hostDoc + "'s boot disk image (VMDK)"), + // metal/local HDD upgrades b("boot.tar"). Produces(mime.TAR). @@ -186,6 +193,10 @@ func renderHost(w http.ResponseWriter, r *http.Request, what string, host *local err = renderCtx(w, r, ctx, what, buildBootImgGZ) case "boot.img.lz4": err = renderCtx(w, r, ctx, what, buildBootImgLZ4) + case "boot.qcow2": + err = renderCtx(w, r, ctx, what, buildBootQcow2) + case "boot.vmdk": + err = renderCtx(w, r, ctx, what, buildBootVmdk) default: http.NotFound(w, r) diff --git a/html/ui/js/Downloads.js b/html/ui/js/Downloads.js index 1a71f1b..2e02c44 100644 --- a/html/ui/js/Downloads.js +++ b/html/ui/js/Downloads.js @@ -20,6 +20,8 @@ export default { "boot-efi.tar", "boot.img.gz", "boot.img", + "boot.qcow2", + "boot.vmdk", "ipxe", ], }[this.kind] diff --git a/modd.conf b/modd.conf index 426c157..a3a8526 100644 --- a/modd.conf +++ b/modd.conf @@ -12,15 +12,15 @@ html/**/* { prep: hack/build ./cmd/dkl-local-server } -dist/dkl-local-server { - prep: mkdir -p tmp - daemon +sigterm: dist/dkl-local-server -data tmp -auto-unlock test -} +#dist/dkl-local-server { +# prep: mkdir -p tmp +# daemon +sigterm: dist/dkl-local-server -data tmp -auto-unlock test +#} dist/dkl-dir2config { - prep: dist/dkl-dir2config --debug --in test-dir2config +# prep: dist/dkl-dir2config --debug --in test-dir2config } -**/*.proto !dist/**/* { - prep: for mod in @mods; do protoc -I ./ --go_out=plugins=grpc,paths=source_relative:. $mod; done -} +#**/*.proto !dist/**/* { +# prep: for mod in @mods; do protoc -I ./ --go_out=plugins=grpc,paths=source_relative:. $mod; done +#}