pull-through dist server

This commit is contained in:
Mikaël Cluseau
2025-07-08 22:20:26 +02:00
parent 08cbccc756
commit 899a0a9dab
7 changed files with 28 additions and 12 deletions

View File

@ -109,7 +109,7 @@ func qemuImgBootImg(format string) func(out io.Writer, ctx *renderContext) (err
var grubSupportVersion = flag.String("grub-support", "1.1.0", "GRUB support version")
func setupBootImage(bootImg *os.File, ctx *renderContext) (err error) {
path, err := ctx.distFetch("grub-support", *grubSupportVersion)
path, err := distFetch("grub-support", *grubSupportVersion)
if err != nil {
return
}

View File

@ -31,7 +31,7 @@ func buildBootTar(out io.Writer, ctx *renderContext) (err error) {
}
// kernel
kernelPath, err := ctx.distFetch("kernels", ctx.Host.Kernel)
kernelPath, err := distFetch("kernels", ctx.Host.Kernel)
if err != nil {
return
}
@ -92,7 +92,7 @@ func buildBootEFITar(out io.Writer, ctx *renderContext) (err error) {
}
// kernel
kernelPath, err := ctx.distFetch("kernels", ctx.Host.Kernel)
kernelPath, err := distFetch("kernels", ctx.Host.Kernel)
if err != nil {
return
}

View File

@ -42,7 +42,7 @@ func buildInitrd(out io.Writer, ctx *renderContext) (err error) {
cat := cpiocat.New(out)
// initrd
initrdPath, err := ctx.distFetch("initrd", ctx.Host.Initrd)
initrdPath, err := distFetch("initrd", ctx.Host.Initrd)
if err != nil {
return
}
@ -54,7 +54,7 @@ func buildInitrd(out io.Writer, ctx *renderContext) (err error) {
case "modules":
layerVersion := ctx.Host.Versions[layer]
modulesPath, err := ctx.distFetch("layers", layer, layerVersion)
modulesPath, err := distFetch("layers", layer, layerVersion)
if err != nil {
return err
}
@ -165,7 +165,7 @@ func buildBootstrap(out io.Writer, ctx *renderContext) (err error) {
return fmt.Errorf("layer %q not mapped to a version", layer)
}
outPath, err := ctx.distFetch("layers", layer, layerVersion)
outPath, err := distFetch("layers", layer, layerVersion)
if err != nil {
return err
}

View File

@ -8,7 +8,7 @@ import (
)
func renderKernel(w http.ResponseWriter, r *http.Request, ctx *renderContext) error {
path, err := ctx.distFetch("kernels", ctx.Host.Kernel)
path, err := distFetch("kernels", ctx.Host.Kernel)
if err != nil {
return err
}
@ -19,7 +19,7 @@ func renderKernel(w http.ResponseWriter, r *http.Request, ctx *renderContext) er
}
func fetchKernel(out io.Writer, ctx *renderContext) (err error) {
path, err := ctx.distFetch("kernels", ctx.Host.Kernel)
path, err := distFetch("kernels", ctx.Host.Kernel)
if err != nil {
return err
}

View File

@ -72,7 +72,7 @@ func main() {
staticHandler := http.FileServer(http.FS(dlshtml.FS))
http.Handle("/favicon.ico", staticHandler)
http.Handle("/ui/", staticHandler)
http.Handle("/dist/", http.StripPrefix("/dist/", http.FileServer(http.Dir(*dataDir+"/dist"))))
http.Handle("/dist/", http.StripPrefix("/dist/", upstreamServer{}))
http.Handle("/public-state", streamsse.StreamHandler(wPublicState))
http.Handle("/state", requireAdmin(streamsse.StreamHandler(wState)))

View File

@ -138,7 +138,7 @@ func (ctx *renderContext) render(templateText string) (ba []byte, err error) {
return
}
func (ctx *renderContext) distFilePath(path ...string) string {
func distFilePath(path ...string) string {
return filepath.Join(append([]string{*dataDir, "dist"}, path...)...)
}

View File

@ -9,9 +9,11 @@ import (
"log"
"net/http"
"os"
"path"
gopath "path"
"path/filepath"
"strconv"
"strings"
"time"
"github.com/dustin/go-humanize"
@ -22,8 +24,22 @@ var (
upstreamURL = flag.String("upstream", "https://dkl.novit.io/dist", "Upstream server for dist elements")
)
func (ctx *renderContext) distFetch(path ...string) (outPath string, err error) {
outPath = ctx.distFilePath(path...)
type upstreamServer struct{}
func (_ upstreamServer) ServeHTTP(w http.ResponseWriter, req *http.Request) {
path := path.Clean(req.URL.Path)
outPath, err := distFetch(strings.Split(path, "/")...)
if err != nil {
w.WriteHeader(http.StatusBadGateway)
w.Write([]byte(err.Error() + "\n"))
return
}
http.ServeFile(w, req, outPath)
}
func distFetch(path ...string) (outPath string, err error) {
outPath = distFilePath(path...)
if _, err = os.Stat(outPath); err == nil {
return