in common/utils.go [153:215]
func untar(agentFile *string, dest *string) {
file, err := os.Open(*agentFile)
if err != nil {
log.Fatal("Error ", err)
}
defer file.Close()
var fileReader io.ReadCloser = file
if strings.HasSuffix(*agentFile, "gz") {
if fileReader, err = gzip.NewReader(file); err != nil {
log.Fatal("Error ", err)
}
defer fileReader.Close()
}
tarBallReader := tar.NewReader(fileReader)
for {
header, err := tarBallReader.Next()
if err != nil {
if err == io.EOF {
break
}
log.Fatal("Error ", err)
}
// get the individual filename and extract to the current directory
if !strings.Contains(header.Name, "..") {
filename := filepath.Join(*dest, header.Name)
switch header.Typeflag {
case tar.TypeDir:
// handle directory
fmt.Println("Creating directory :", filename)
err = os.MkdirAll(filename, os.FileMode(header.Mode)) // or use 0755 if you prefer
if err != nil {
log.Fatal("Error ", err)
}
case tar.TypeReg:
// handle normal file
fmt.Println("Untarring :", filename)
writer, err := os.Create(filename)
if err != nil {
log.Fatal("Error ", err)
}
io.Copy(writer, tarBallReader)
err = os.Chmod(filename, os.FileMode(header.Mode))
if err != nil {
log.Fatal("Error ", err)
}
writer.Close()
default:
fmt.Printf("Unable to untar type : %c in file %s", header.Typeflag, filename)
}
}
}
}