diff --git a/cmd/dkl-local-server/ws-download-set.go b/cmd/dkl-local-server/ws-download-set.go index 3cd60c6..71df998 100644 --- a/cmd/dkl-local-server/ws-download-set.go +++ b/cmd/dkl-local-server/ws-download-set.go @@ -6,6 +6,7 @@ import ( "encoding/base32" "fmt" "io" + "path/filepath" "slices" "strconv" "strings" @@ -16,6 +17,11 @@ import ( "m.cluseau.fr/go/httperr" ) +func globMatch(pattern, value string) bool { + ok, _ := filepath.Match(pattern, value) + return ok +} + type DownloadSet struct { Expiry time.Time Items []DownloadSetItem @@ -23,7 +29,7 @@ type DownloadSet struct { func (s DownloadSet) Contains(kind, name, asset string) bool { for _, item := range s.Items { - if item.Kind == kind && item.Name == name && + if item.Kind == kind && globMatch(item.Name, name) && slices.Contains(item.Assets, asset) { return true } @@ -76,7 +82,15 @@ type DownloadSetItem struct { } func (i DownloadSetItem) EncodeTo(buf *strings.Builder) { - buf.WriteString(i.Kind) + kind := i.Kind + switch kind { + case "host": + kind = "h" + case "cluster": + kind = "c" + } + + buf.WriteString(kind) buf.WriteByte(':') buf.WriteString(i.Name) @@ -89,6 +103,14 @@ func (i DownloadSetItem) EncodeTo(buf *strings.Builder) { func (i *DownloadSetItem) Decode(encoded string) { rem := encoded i.Kind, rem, _ = strings.Cut(rem, ":") + + switch i.Kind { + case "h": + i.Kind = "host" + case "c": + i.Kind = "cluster" + } + i.Name, rem, _ = strings.Cut(rem, ":") if rem == "" { @@ -230,10 +252,8 @@ func wsDownloadSet(req *restful.Request, resp *restful.Response) {
\n") - for _, asset := range item.Assets { - fmt.Fprintf(buf, " %s\n", item.Kind, item.Name, asset, setStr, asset) + names := make([]string, 0) + switch item.Kind { + case "cluster": + for _, c := range cfg.Clusters { + if globMatch(item.Name, c.Name) { + names = append(names, c.Name) + } + } + case "host": + for _, h := range cfg.Hosts { + if globMatch(item.Name, h.Name) { + names = append(names, h.Name) + } + } + } + + for _, name := range names { + fmt.Fprintf(buf, "
\n") + for _, asset := range item.Assets { + fmt.Fprintf(buf, " %s\n", item.Kind, name, asset, setStr, asset) + } + fmt.Fprintf(buf, `
`) } - fmt.Fprintf(buf, ``) } buf.WriteString("") diff --git a/cmd/dkl-local-server/ws-downloads.go b/cmd/dkl-local-server/ws-downloads.go index 67868e7..8cf26f7 100644 --- a/cmd/dkl-local-server/ws-downloads.go +++ b/cmd/dkl-local-server/ws-downloads.go @@ -184,10 +184,8 @@ func wsDownloadPage(req *restful.Request, resp *restful.Response) {