@@ -20,6 +20,8 @@ import (
20
20
"io"
21
21
"io/fs"
22
22
"log/slog"
23
+ "net/http"
24
+ "net/url"
23
25
"os"
24
26
"os/exec"
25
27
"path/filepath"
@@ -866,6 +868,7 @@ type PackageInstallStepFile struct {
866
868
Filename string `yaml:"filename"`
867
869
Source string `yaml:"source"`
868
870
Content string `yaml:"content"`
871
+ Url string `yaml:"url"`
869
872
Mode fs.FileMode `yaml:"mode,omitempty"`
870
873
}
871
874
@@ -896,23 +899,56 @@ func (p *PackageInstallStepFile) install(
896
899
if p .Mode > 0 {
897
900
fileMode = p .Mode
898
901
}
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 != "" {
901
910
fullSourcePath := filepath .Join (
902
911
filepath .Dir (packagePath ),
903
912
p .Source ,
904
913
)
905
- tmpContent , err := os .ReadFile (fullSourcePath )
914
+ tmpContentBytes , err := os .ReadFile (fullSourcePath )
906
915
if err != nil {
907
916
return err
908
917
}
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" )
914
950
}
915
- if err := os .WriteFile (filePath , [] byte ( fileContent ) , fileMode ); err != nil {
951
+ if err := os .WriteFile (filePath , fileContent , fileMode ); err != nil {
916
952
return err
917
953
}
918
954
cfg .Logger .Debug (fmt .Sprintf ("wrote file %s" , filePath ))
0 commit comments