75 lines
2.5 KiB
Go
75 lines
2.5 KiB
Go
package fileProcess
|
|
|
|
import (
|
|
"encoding/csv"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
|
|
"github.com/deepfence/FlowMeter/pkg/common"
|
|
)
|
|
|
|
// Save file.
|
|
func FileSave(flowSave map[string][]interface{}, mapKeys map[string]int, fname string) {
|
|
// logrus.Info(flowSave)
|
|
|
|
file, err := os.Create(fname + ".csv")
|
|
|
|
CheckErrorFileSave("Cannot create file", err)
|
|
|
|
defer file.Close()
|
|
|
|
writer := csv.NewWriter(file)
|
|
|
|
defer writer.Flush()
|
|
|
|
writer.Write([]string{"fiveTuple", "srcIP", "dstIP", "protocol", "srcPort", "dstPort", "flowDuration", "flowLength", "fwdFlowLength", "bwdFlowLength", "packetSizeTotal", "packetSizeMean", "packetSizeStd", "packetSizeMin", "packetSizeMax", "fwdPacketSizeTotal", "bwdPacketSizeTotal", "fwdPacketSizeMean", "bwdPacketSizeMean", "fwdPacketSizeStd", "bwdPacketSizeStd", "fwdPacketSizeMin", "bwdPacketSizeMin", "fwdPacketSizeMax", "bwdPacketSizeMax", "IATMean", "IATStd", "IATMin", "IATMax", "fwdIATTotal", "bwdIATTotal", "fwdIATMean", "bwdIATMean", "fwdIATStd", "bwdIATStd", "fwdIATMin", "bwdIATMin", "fwdIATMax", "bwdIATMax"})
|
|
|
|
data := []interface{}{}
|
|
|
|
for flow5Tuple, values := range flowSave {
|
|
flow := common.FlowData(values)
|
|
|
|
flowArr := []interface{}{flow5Tuple, flow.SrcIP, flow.DstIP, flow.Protocol, flow.SrcPort, flow.DstPort, flow.FlowDuration, flow.FlowLength, flow.FwdFlowLength, flow.BwdFlowLength, flow.PacketSizeTotal, flow.PacketSizeMean, flow.PacketSizeStd, flow.PacketSizeMin, flow.PacketSizeMax, flow.FwdPacketSizeTotal, flow.BwdPacketSizeTotal, flow.FwdPacketSizeMean, flow.BwdPacketSizeMean, flow.FwdPacketSizeStd, flow.BwdPacketSizeStd, flow.FwdPacketSizeMin, flow.BwdPacketSizeMin, flow.FwdPacketSizeMax, flow.BwdPacketSizeMax, flow.IATMean, flow.IATStd, flow.IATMin, flow.IATMax, flow.FwdIATTotal, flow.BwdIATTotal, flow.FwdIATMean, flow.BwdIATMean, flow.FwdIATStd, flow.BwdIATStd, flow.FwdIATMin, flow.BwdIATMin, flow.FwdIATMax, flow.BwdIATMax}
|
|
|
|
data = append(data, flowArr)
|
|
}
|
|
|
|
for _, value := range data {
|
|
modValue := ModifyArrTypeFileSave(value.([]interface{}))
|
|
|
|
err := writer.Write(modValue)
|
|
|
|
CheckErrorFileSave("Cannot write to file", err)
|
|
}
|
|
|
|
}
|
|
|
|
// Type cast arrays for saving of file.
|
|
func ModifyArrTypeFileSave(array []interface{}) []string {
|
|
modArray := []string{}
|
|
|
|
value := ""
|
|
|
|
for i := 0; i < len(array); i++ {
|
|
_, ok := array[i].(string)
|
|
|
|
if ok {
|
|
value = array[i].(string)
|
|
} else {
|
|
value = fmt.Sprintf("%f", array[i])
|
|
}
|
|
|
|
modArray = append(modArray, value)
|
|
}
|
|
|
|
return modArray
|
|
}
|
|
|
|
// Check errors during saving of file.
|
|
func CheckErrorFileSave(message string, err error) {
|
|
if err != nil {
|
|
log.Fatal(message, err)
|
|
}
|
|
}
|