diff --git a/cmd/dkl-local-server/boot-iso.go b/cmd/dkl-local-server/boot-iso.go index 05ad2f9..10e53dc 100644 --- a/cmd/dkl-local-server/boot-iso.go +++ b/cmd/dkl-local-server/boot-iso.go @@ -13,188 +13,7 @@ import ( "github.com/cespare/xxhash" ) -// deprecated -func buildBootISO(out io.Writer, ctx *renderContext) error { - tempDir, err := ioutil.TempDir("/tmp", "iso-") - if err != nil { - return err - } - - defer os.RemoveAll(tempDir) - - cp := func(src, dst string) error { - log.Printf("iso: adding %s as %s", src, dst) - in, err := os.Open(src) - if err != nil { - return err - } - - defer in.Close() - - outPath := filepath.Join(tempDir, dst) - - if err := os.MkdirAll(filepath.Dir(outPath), 0755); err != nil { - return err - } - - out, err := os.Create(outPath) - if err != nil { - return err - } - - defer out.Close() - - _, err = io.Copy(out, in) - return err - } - - err = func() error { - // grub - - if err := os.MkdirAll(filepath.Join(tempDir, "grub"), 0755); err != nil { - return err - } - err = ioutil.WriteFile(filepath.Join(tempDir, "grub", "grub.cfg"), []byte(` -search --set=root --file /config.yaml - -insmod all_video -set timeout=3 - -menuentry "Direktil" { - linux /vmlinuz direktil.boot=DEVNAME=sr0 direktil.boot.fs=iso9660 `+ctx.CmdLine+` - initrd /initrd -} -`), 0644) - if err != nil { - return err - } - - coreImgPath := filepath.Join(tempDir, "grub", "core.img") - grubCfgPath := filepath.Join(tempDir, "grub", "grub.cfg") - - cmd := exec.Command("grub-mkstandalone", - "--format=i386-pc", - "--output="+coreImgPath, - "--install-modules=linux normal iso9660 biosdisk memdisk search tar ls", - "--modules=linux normal iso9660 biosdisk search", - "--locales=", - "--fonts=", - "boot/grub/grub.cfg="+grubCfgPath, - ) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - if err := cmd.Run(); err != nil { - return err - } - - defer os.Remove(coreImgPath) - defer os.Remove(grubCfgPath) - - out, err := os.Create(filepath.Join(tempDir, "grub", "bios.img")) - if err != nil { - return err - } - - defer out.Close() - - b, err := ioutil.ReadFile("/usr/lib/grub/i386-pc/cdboot.img") - if err != nil { - return err - } - - if _, err := out.Write(b); err != nil { - return err - } - - b, err = ioutil.ReadFile(coreImgPath) - if err != nil { - return err - } - - if _, err := out.Write(b); err != nil { - return err - } - - return nil - }() - if err != nil { - return err - } - - // config - cfgBytes, cfg, err := ctx.Config() - if err != nil { - return err - } - - ioutil.WriteFile(filepath.Join(tempDir, "config.yaml"), cfgBytes, 0600) - - // kernel and initrd - type distCopy struct { - Src []string - Dst string - } - - copies := []distCopy{ - {Src: []string{"kernels", ctx.Host.Kernel}, Dst: "vmlinuz"}, - {Src: []string{"initrd", ctx.Host.Initrd}, Dst: "initrd"}, - } - - // layers - for _, layer := range cfg.Layers { - layerVersion := ctx.Host.Versions[layer] - if layerVersion == "" { - return fmt.Errorf("layer %q not mapped to a version", layer) - } - - copies = append(copies, - distCopy{ - Src: []string{"layers", layer, layerVersion}, - Dst: filepath.Join("current", "layers", layer+".fs"), - }) - } - - for _, copy := range copies { - outPath, err := ctx.distFetch(copy.Src...) - if err != nil { - return err - } - - err = cp(outPath, copy.Dst) - if err != nil { - return err - } - } - - // build the ISO - mkisofs, err := exec.LookPath("genisoimage") - if err != nil { - mkisofs, err = exec.LookPath("mkisofs") - } - if err != nil { - return err - } - - cmd := exec.Command(mkisofs, - "-quiet", - "-joliet", - "-joliet-long", - "-rock", - "-translation-table", - "-no-emul-boot", - "-boot-load-size", "4", - "-boot-info-table", - "-eltorito-boot", "grub/bios.img", - "-eltorito-catalog", "grub/boot.cat", - tempDir, - ) - cmd.Stdout = out - cmd.Stderr = os.Stderr - - return cmd.Run() -} - -func buildBootISOv2(out io.Writer, ctx *renderContext) (err error) { +func buildBootISO(out io.Writer, ctx *renderContext) (err error) { tempDir, err := ioutil.TempDir("/tmp", "iso-v2-") if err != nil { return @@ -320,7 +139,7 @@ menuentry "Direktil" { // kernel and initrd buildRes(fetchKernel, "vmlinuz") - buildRes(buildInitrdV2, "initrd") + buildRes(buildInitrd, "initrd") // build the ISO mkisofs, err := exec.LookPath("genisoimage") diff --git a/cmd/dkl-local-server/boot-tar.go b/cmd/dkl-local-server/boot-tar.go index ffb6d37..c10e88e 100644 --- a/cmd/dkl-local-server/boot-tar.go +++ b/cmd/dkl-local-server/boot-tar.go @@ -49,7 +49,7 @@ func buildBootTar(out io.Writer, ctx *renderContext) (err error) { // initrd initrd := new(bytes.Buffer) - err = buildInitrdV2(initrd, ctx) + err = buildInitrd(initrd, ctx) if err != nil { return } @@ -110,7 +110,7 @@ func buildBootEFITar(out io.Writer, ctx *renderContext) (err error) { // initrd initrd := new(bytes.Buffer) - err = buildInitrdV2(initrd, ctx) + err = buildInitrd(initrd, ctx) if err != nil { return } diff --git a/cmd/dkl-local-server/bootv2.go b/cmd/dkl-local-server/bootv2.go index 7ae4c24..1fc5b6e 100644 --- a/cmd/dkl-local-server/bootv2.go +++ b/cmd/dkl-local-server/bootv2.go @@ -34,7 +34,7 @@ func renderBootstrapConfig(w http.ResponseWriter, r *http.Request, ctx *renderCo return nil } -func buildInitrdV2(out io.Writer, ctx *renderContext) (err error) { +func buildInitrd(out io.Writer, ctx *renderContext) (err error) { _, cfg, err := ctx.Config() if err != nil { return diff --git a/cmd/dkl-local-server/initrd.go b/cmd/dkl-local-server/initrd.go index 4142abf..38aeb81 100644 --- a/cmd/dkl-local-server/initrd.go +++ b/cmd/dkl-local-server/initrd.go @@ -2,13 +2,9 @@ package main import ( "encoding/json" - "fmt" - "io" "log" "net/http" - "os" - cpio "github.com/cavaliergopher/cpio" yaml "gopkg.in/yaml.v2" ) @@ -28,84 +24,3 @@ func renderConfig(w http.ResponseWriter, r *http.Request, ctx *renderContext, as return nil } - -func buildInitrd(out io.Writer, ctx *renderContext) error { - _, cfg, err := ctx.Config() - - if err != nil { - return err - } - - // send initrd basis - initrdPath, err := ctx.distFetch("initrd", ctx.Host.Initrd) - if err != nil { - return err - } - - err = writeFile(out, initrdPath) - if err != nil { - return err - } - - // and our extra archive - archive := cpio.NewWriter(out) - - // - required dirs - for _, dir := range []string{ - "boot", - "boot/current", - "boot/current/layers", - } { - archive.WriteHeader(&cpio.Header{ - Name: dir, - Mode: cpio.FileMode(0600 | os.ModeDir), - }) - } - - // - the layers - for _, layer := range cfg.Layers { - layerVersion := ctx.Host.Versions[layer] - if layerVersion == "" { - return fmt.Errorf("layer %q not mapped to a version", layer) - } - - path, err := ctx.distFetch("layers", layer, layerVersion) - if err != nil { - return err - } - - stat, err := os.Stat(path) - if err != nil { - return err - } - - archive.WriteHeader(&cpio.Header{ - Name: "boot/current/layers/" + layer + ".fs", - Mode: 0600, - Size: stat.Size(), - }) - - if err = writeFile(archive, path); err != nil { - return err - } - } - - // - the configuration - ba, err := yaml.Marshal(cfg) - if err != nil { - return err - } - - archive.WriteHeader(&cpio.Header{ - Name: "boot/config.yaml", - Mode: 0600, - Size: int64(len(ba)), - }) - - archive.Write(ba) - - // finalize the archive - archive.Flush() - archive.Close() - return nil -} diff --git a/cmd/dkl-local-server/ws-host.go b/cmd/dkl-local-server/ws-host.go index 122894c..f2800da 100644 --- a/cmd/dkl-local-server/ws-host.go +++ b/cmd/dkl-local-server/ws-host.go @@ -73,33 +73,24 @@ func (ws wsHost) register(rws *restful.WebService, alterRB func(*restful.RouteBu Produces(mime.IPXE). Doc("Get the " + ws.hostDoc + "'s IPXE code (for netboot)"), + // boot support b("kernel"). Produces(mime.OCTET). Doc("Get the " + ws.hostDoc + "'s kernel (ie: for netboot)"), - b("initrd"). Produces(mime.OCTET). Doc("Get the " + ws.hostDoc + "'s initial RAM disk (ie: for netboot)"), - // boot v2 // - bootstrap config b("bootstrap-config"). Produces(mime.YAML). Doc("Get the " + ws.hostDoc + "'s bootstrap configuration"), b("bootstrap-config.json"). Doc("Get the " + ws.hostDoc + "'s bootstrap configuration (as JSON)"), - // - initrd - b("initrd-v2"). - Produces(mime.OCTET). - Doc("Get the " + ws.hostDoc + "'s initial RAM disk (v2)"), // - bootstrap b("bootstrap.tar"). Produces(mime.TAR). Doc("Get the " + ws.hostDoc + "'s bootstrap seed archive"), - b("boot-v2.iso"). - Produces(mime.ISO). - Param(cmdlineParam). - Doc("Get the " + ws.hostDoc + "'s boot CD-ROM image (v2)"), } { alterRB(rb) rws.Route(rb) @@ -173,12 +164,17 @@ func renderHost(w http.ResponseWriter, r *http.Request, what string, host *local case "kernel": err = renderKernel(w, r, ctx) + // boot v2 + case "bootstrap-config": + err = renderBootstrapConfig(w, r, ctx, false) + case "bootstrap-config.json": + err = renderBootstrapConfig(w, r, ctx, true) case "initrd": err = renderCtx(w, r, ctx, what, buildInitrd) - + case "bootstrap.tar": + err = renderCtx(w, r, ctx, what, buildBootstrap) case "boot.iso": err = renderCtx(w, r, ctx, what, buildBootISO) - case "boot.tar": err = renderCtx(w, r, ctx, what, buildBootTar) case "boot-efi.tar": @@ -186,25 +182,11 @@ func renderHost(w http.ResponseWriter, r *http.Request, what string, host *local case "boot.img": err = renderCtx(w, r, ctx, what, buildBootImg) - case "boot.img.gz": err = renderCtx(w, r, ctx, what, buildBootImgGZ) - case "boot.img.lz4": err = renderCtx(w, r, ctx, what, buildBootImgLZ4) - // boot v2 - case "bootstrap-config": - err = renderBootstrapConfig(w, r, ctx, false) - case "bootstrap-config.json": - err = renderBootstrapConfig(w, r, ctx, true) - case "initrd-v2": - err = renderCtx(w, r, ctx, what, buildInitrdV2) - case "bootstrap.tar": - err = renderCtx(w, r, ctx, what, buildBootstrap) - case "boot-v2.iso": - err = renderCtx(w, r, ctx, what, buildBootISOv2) - default: http.NotFound(w, r) } diff --git a/html/ui/js/Downloads.js b/html/ui/js/Downloads.js index a4f7c08..1a71f1b 100644 --- a/html/ui/js/Downloads.js +++ b/html/ui/js/Downloads.js @@ -10,18 +10,16 @@ export default { cluster: ['addons'], host: [ "kernel", - "initrd-v2", + "initrd", "bootstrap.tar", - "boot-v2.iso", + "boot.img.lz4", + "boot.iso", "config", "bootstrap-config", - "boot.iso", "boot.tar", "boot-efi.tar", - "boot.img", "boot.img.gz", - "boot.img.lz4", - "initrd", + "boot.img", "ipxe", ], }[this.kind]