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
}