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