GetContentsFromDeb returns list of files installed by .deb package
(file io.Reader, packageFile string)
| 149 | |
| 150 | // GetContentsFromDeb returns list of files installed by .deb package |
| 151 | func GetContentsFromDeb(file io.Reader, packageFile string) ([]string, error) { |
| 152 | library := ar.NewReader(file) |
| 153 | for { |
| 154 | header, err := library.Next() |
| 155 | if err == io.EOF { |
| 156 | return nil, fmt.Errorf("unable to find data.tar.* part in %s", packageFile) |
| 157 | } |
| 158 | if err != nil { |
| 159 | return nil, errors.Wrapf(err, "unable to read .deb archive from %s", packageFile) |
| 160 | } |
| 161 | |
| 162 | if strings.HasPrefix(header.Name, "data.tar") { |
| 163 | bufReader := bufio.NewReader(library) |
| 164 | signature, err := bufReader.Peek(270) |
| 165 | |
| 166 | var isTar bool |
| 167 | if err == nil { |
| 168 | isTar = matchers.Tar(signature) |
| 169 | } |
| 170 | |
| 171 | var tarInput io.Reader |
| 172 | |
| 173 | switch header.Name { |
| 174 | case "data.tar": |
| 175 | tarInput = bufReader |
| 176 | case "data.tar.gz": |
| 177 | if isTar { |
| 178 | tarInput = bufReader |
| 179 | } else { |
| 180 | ungzip, err := gzip.NewReader(bufReader) |
| 181 | if err != nil { |
| 182 | return nil, errors.Wrapf(err, "unable to ungzip data.tar.gz from %s", packageFile) |
| 183 | } |
| 184 | defer func() { _ = ungzip.Close() }() |
| 185 | tarInput = ungzip |
| 186 | } |
| 187 | case "data.tar.bz2": |
| 188 | tarInput = bzip2.NewReader(bufReader) |
| 189 | case "data.tar.xz": |
| 190 | unxz, err := xz.NewReader(bufReader) |
| 191 | if err != nil { |
| 192 | return nil, errors.Wrapf(err, "unable to unxz data.tar.xz from %s", packageFile) |
| 193 | } |
| 194 | defer func() { _ = unxz.Close() }() |
| 195 | tarInput = unxz |
| 196 | case "data.tar.lzma": |
| 197 | unlzma := lzma.NewReader(bufReader) |
| 198 | defer func() { _ = unlzma.Close() }() |
| 199 | tarInput = unlzma |
| 200 | case "data.tar.zst": |
| 201 | unzstd, err := zstd.NewReader(bufReader) |
| 202 | if err != nil { |
| 203 | return nil, errors.Wrapf(err, "unable to unzstd %s from %s", header.Name, packageFile) |
| 204 | } |
| 205 | defer unzstd.Close() |
| 206 | tarInput = unzstd |
| 207 | default: |
| 208 | return nil, fmt.Errorf("unsupported tar compression in %s: %s", packageFile, header.Name) |