82
deb/archive/archive.go
Normal file
82
deb/archive/archive.go
Normal file
@ -0,0 +1,82 @@
|
||||
package archive
|
||||
|
||||
import (
|
||||
"os"
|
||||
"fmt"
|
||||
"github.com/blakesmith/ar"
|
||||
"bytes"
|
||||
"io"
|
||||
"strings"
|
||||
"compress/gzip"
|
||||
"archive/tar"
|
||||
"log"
|
||||
)
|
||||
|
||||
func InspectPackage(filename string) (string, error) {
|
||||
f, err := os.Open(filename)
|
||||
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("error opening package file %s: %s", filename, err)
|
||||
}
|
||||
|
||||
arReader := ar.NewReader(f)
|
||||
defer f.Close()
|
||||
var controlBuf bytes.Buffer
|
||||
|
||||
for {
|
||||
header, err := arReader.Next()
|
||||
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("error in inspectPackage loop: %s", err)
|
||||
}
|
||||
|
||||
if strings.Trim(header.Name, "/") == "control.tar.gz" {
|
||||
io.Copy(&controlBuf, arReader)
|
||||
return InspectPackageControl(controlBuf)
|
||||
}
|
||||
}
|
||||
return "", nil
|
||||
}
|
||||
|
||||
func InspectPackageControl(filename bytes.Buffer) (string, error) {
|
||||
gzf, err := gzip.NewReader(bytes.NewReader(filename.Bytes()))
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("error creating gzip reader: %s", err)
|
||||
}
|
||||
|
||||
tarReader := tar.NewReader(gzf)
|
||||
var controlBuf bytes.Buffer
|
||||
for {
|
||||
header, err := tarReader.Next()
|
||||
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to inspect package: %s", err)
|
||||
}
|
||||
|
||||
name := header.Name
|
||||
|
||||
switch header.Typeflag {
|
||||
case tar.TypeDir:
|
||||
continue
|
||||
case tar.TypeReg:
|
||||
if name == "./control" {
|
||||
io.Copy(&controlBuf, tarReader)
|
||||
return controlBuf.String(), nil
|
||||
}
|
||||
default:
|
||||
log.Printf(
|
||||
"Unable to figure out type : %c in file %s\n",
|
||||
header.Typeflag, name,
|
||||
)
|
||||
}
|
||||
}
|
||||
return "", nil
|
||||
}
|
Reference in New Issue
Block a user