func sendFile()

in agent/taskengine/sendfile.go [132:191]


func sendFile(sendFile models.SendFileTaskInfo) int {
	if sendFile.Name == "" {
		return EInvalidFilePath
	}
	if sendFile.Content == "" {
		return EEmptyContent
	}
	fileDir := ""
	if sendFile.Destination == "" {
		if G_IsWindows {
			fileDir, _ = pathutil.GetExecutableDir()
		} else {
			fileDir = "/root"
		}
	} else {
		fileDir = sendFile.Destination
	}

	if sendFile.Destination != "" {
		err := os.MkdirAll(sendFile.Destination, os.ModePerm)
		if err != nil {
			log.GetLogger().Errorln("MkdirAll error: ", err)
			return ECreateDirFailed
		}
	}
	if G_IsLinux || G_IsFreebsd {
		//文件下发时,如果root目录有一个test的文件,又创建了一个/root/test下的文件,则会报错。报错应通过invalid接口上报
		if util.IsFile(sendFile.Destination) {
			return EInvalidFilePath
		}
	}
	file_path := path.Join(fileDir, sendFile.Name)
	fileContent, err := base64.StdEncoding.DecodeString(sendFile.Content)
	if err != nil {
		log.GetLogger().Errorln("base64 decode error: ", err)
		return EInvalidContent
	}

	contentMd5 := util.ComputeStrMd5(sendFile.Content)

	if strings.ToLower(contentMd5) != strings.ToLower(sendFile.Signature) {
		return EInvalidSignature
	}
	fileMode := sendFile.Mode
	if len(fileMode) != 3 && len(fileMode) != 4 && len(fileMode) != 0 {
		return EInalidFileMode
	}
	if len(fileMode) == 0 {
		fileMode = "0644"
	}
	fMode, err := strconv.ParseInt(fileMode, 8, 32)
	if err != nil {
		return EInalidFileMode
	}
	ret := writeFile(file_path, fileContent, sendFile.Overwrite, os.FileMode(fMode))
	if ret != ESuccess {
		return ret
	}
	return changeFileOwner(file_path, sendFile.Owner, sendFile.Group)
}