diff --git a/cmd/cloudinitsave/cloudinitsave.go b/cmd/cloudinitsave/cloudinitsave.go index d715c988..67525163 100644 --- a/cmd/cloudinitsave/cloudinitsave.go +++ b/cmd/cloudinitsave/cloudinitsave.go @@ -182,6 +182,11 @@ func fetchAndSave(ds datasource.Datasource) error { log.Errorf("Failed fetching user-data from datasource: %v", err) return err } + userDataBytes, err = decompressIfGzip(userDataBytes) + if err != nil { + log.Errorf("Failed decompressing user-data from datasource: %v", err) + return err + } log.Infof("Fetching meta-data from datasource of type %v", ds.Type()) metadata, err = ds.FetchMetadata() if err != nil { @@ -367,3 +372,13 @@ func composeToCloudConfig(bytes []byte) ([]byte, error) { }, }) } + +const gzipMagicBytes = "\x1f\x8b" + +func decompressIfGzip(userdataBytes []byte) ([]byte, error) { + if !bytes.HasPrefix(userdataBytes, []byte(gzipMagicBytes)) { + return userdataBytes, nil + } + + return config.DecompressGzip(userdataBytes) +} diff --git a/config/cloudinit/config/decode.go b/config/cloudinit/config/decode.go index f5847aa9..3c520e02 100644 --- a/config/cloudinit/config/decode.go +++ b/config/cloudinit/config/decode.go @@ -18,7 +18,12 @@ func DecodeBase64Content(content string) ([]byte, error) { } func DecodeGzipContent(content string) ([]byte, error) { - gzr, err := gzip.NewReader(bytes.NewReader([]byte(content))) + byteContent := []byte(content) + return DecompressGzip(byteContent) +} + +func DecompressGzip(content []byte) ([]byte, error) { + gzr, err := gzip.NewReader(bytes.NewReader(content)) if err != nil { return nil, fmt.Errorf("Unable to decode gzip: %q", err)