func untar()

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)
			}
		}
	}
}