in internal/extraction/extraction.go [53:102]
func UntarIntoZip(reader *io.PipeReader, job RemoteSource, file *archive.ZipFile, verbose bool) error {
tarReader := tar.NewReader(reader)
for {
header, err := tarReader.Next()
if err != nil {
if !errors.Is(err, io.EOF) {
return err
}
break
}
remoteFilename := header.Name
// remove the path prefix on the Pod
relOutputDir := fmt.Sprintf("%s/", strings.TrimPrefix(job.PodOutputDir, "/"))
relativeFilename := strings.TrimPrefix(remoteFilename, relOutputDir)
// stack diagnostics create output in a directory called api-diagnostics-{{.Timestamp}}
if !strings.HasPrefix(relativeFilename, job.sourceDirPrefix()) {
if verbose {
logger.Printf("Ignoring file %s in tar from %s diagnostics\n", header.Name, job.ResourceName)
}
continue
}
manifest := archive.StackDiagnosticManifest{DiagType: job.Typ}
switch {
case strings.HasSuffix(relativeFilename, "tar.gz"):
manifest.DiagPath = job.outputDirPrefix()
if err := RepackageTarGzip(tarReader, job.outputDirPrefix(), file); err != nil {
return err
}
case strings.HasSuffix(relativeFilename, ".zip"):
manifest.DiagPath = job.outputDirPrefix()
if err := RepackageZip(tarReader, job.outputDirPrefix(), file); err != nil {
return err
}
default:
path := archive.Path(job.Namespace, job.Typ, job.ResourceName, relativeFilename)
manifest.DiagPath = path
out, err := file.Create(path)
if err != nil {
return err
}
// accept decompression bomb for CLI as we control the src
if _, err := io.Copy(out, tarReader); err != nil { //nolint:gosec
return err
}
}
file.AddManifestEntry(manifest)
}
return nil
}