Skip to content

Commit 5d066ec

Browse files
authored
feat: support url as a content source for file installs (#342)
Signed-off-by: Chris Gianelloni <[email protected]>
1 parent a051e6e commit 5d066ec

File tree

1 file changed

+45
-9
lines changed

1 file changed

+45
-9
lines changed

pkgmgr/package.go

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import (
2020
"io"
2121
"io/fs"
2222
"log/slog"
23+
"net/http"
24+
"net/url"
2325
"os"
2426
"os/exec"
2527
"path/filepath"
@@ -866,6 +868,7 @@ type PackageInstallStepFile struct {
866868
Filename string `yaml:"filename"`
867869
Source string `yaml:"source"`
868870
Content string `yaml:"content"`
871+
Url string `yaml:"url"`
869872
Mode fs.FileMode `yaml:"mode,omitempty"`
870873
}
871874

@@ -896,23 +899,56 @@ func (p *PackageInstallStepFile) install(
896899
if p.Mode > 0 {
897900
fileMode = p.Mode
898901
}
899-
fileContent := p.Content
900-
if p.Source != "" {
902+
var fileContent []byte
903+
if p.Content != "" {
904+
tmpContent, err := cfg.Template.Render(p.Content, nil)
905+
if err != nil {
906+
return err
907+
}
908+
fileContent = []byte(tmpContent)
909+
} else if p.Source != "" {
901910
fullSourcePath := filepath.Join(
902911
filepath.Dir(packagePath),
903912
p.Source,
904913
)
905-
tmpContent, err := os.ReadFile(fullSourcePath)
914+
tmpContentBytes, err := os.ReadFile(fullSourcePath)
906915
if err != nil {
907916
return err
908917
}
909-
fileContent = string(tmpContent)
910-
}
911-
fileContent, err = cfg.Template.Render(fileContent, nil)
912-
if err != nil {
913-
return err
918+
tmpContent, err := cfg.Template.Render(string(tmpContentBytes), nil)
919+
if err != nil {
920+
return err
921+
}
922+
fileContent = []byte(tmpContent)
923+
} else if p.Url != "" {
924+
// Validate URL
925+
u, err := url.Parse(p.Url)
926+
if err != nil {
927+
return err
928+
}
929+
if u.Scheme == "" || u.Host == "" {
930+
return fmt.Errorf("invalid URL given...")
931+
}
932+
933+
// Fetch data
934+
resp, err := http.Get(p.Url)
935+
if err != nil {
936+
return err
937+
}
938+
if resp == nil {
939+
return fmt.Errorf("nil response for URL: %s", p.Url)
940+
}
941+
respBody, err := io.ReadAll(resp.Body)
942+
if err != nil {
943+
return err
944+
}
945+
resp.Body.Close()
946+
947+
fileContent = respBody
948+
} else {
949+
return fmt.Errorf("packages must provide content, source, or url for file install types")
914950
}
915-
if err := os.WriteFile(filePath, []byte(fileContent), fileMode); err != nil {
951+
if err := os.WriteFile(filePath, fileContent, fileMode); err != nil {
916952
return err
917953
}
918954
cfg.Logger.Debug(fmt.Sprintf("wrote file %s", filePath))

0 commit comments

Comments
 (0)