func unzipAgent()

in main/utils.go [161:222]


func unzipAgent(lg ExtensionLogger, source string, prefix string, dest string) ([]string, error) {
	var filenames []string
	var agentZip = ""

	files, err := ioutil.ReadDir(source)
	if err != nil {
		return filenames, errors.Wrap(err, "failed to open the source dir: "+source)
	}

	for _, file := range files {
		if strings.Contains(file.Name(), prefix) {
			agentZip = filepath.Join(source, file.Name())
		}
	}

	if agentZip == "" {
		return filenames, errors.New("failed to find zip file " + agentZip)
	}

	lg.event("Got the agentZip. Agent is: " + agentZip)

	r, err := zip.OpenReader(agentZip)
	if err != nil {
		return filenames, errors.New("failed to open zip: " + agentZip)
	}
	defer r.Close()

	for _, f := range r.File {
		rc, err := f.Open()
		if err != nil {
			return filenames, errors.Wrap(err, "failed to open file")
		}
		defer rc.Close()

		// store filename/path for returning and using later on
		fpath := filepath.Join(dest, f.Name)
		filenames = append(filenames, fpath)

		if f.FileInfo().IsDir() {
			// make folder
			os.MkdirAll(fpath, os.ModePerm)
		} else {
			// make file
			if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
				return filenames, errors.Wrap(err, "failed to create directory: "+fpath)
			}
			outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
			if err != nil {
				return filenames, errors.Wrap(err, "failed to open directory at current path: "+fpath)
			}
			_, err = io.Copy(outFile, rc)
			// close the file without defer to close before next iteration of loop
			outFile.Close()
			if err != nil {
				return filenames, errors.Wrap(err, "failed to close file: "+outFile.Name())
			}
		}
	}

	lg.event("unzipAgent successful")
	return filenames, nil
}