2016-10-24 17 views
-1

ソースIPと宛先IPに関する情報をnfcapdバイナリファイルから取得する必要があります。問題はファイルのサイズにあります。私はioまたはosパッケージで非常に大きなファイル(1 GB以上)を開いて読み込むことは望ましくないことを知っています。私は同時にnetflowpackageを読んだ後、24のフローやプロセス、それを持つチャンクにファイルを分割したい大きなnfcapdバイナリファイルからIPアドレスを取得する

package main 

import (
    "fmt" 
    "time" 
    "os" 
    "github.com/tehmaze/netflow/netflow5" 
    "log" 
    "io" 
    "bytes" 
) 

type Message interface {} 

func main() { 
    startTime := time.Now() 
    getFile := os.Args[1] 
    processFile(getFile) 
    endTime := time.Since(startTime) 
    log.Printf("Program executes in %s", endTime) 
} 

func processFile(fileName string) { 
    file, err := os.Open(fileName) 
    // Check if file is not empty. If it is, then exit from program 
    if err != nil { 
     fmt.Println(err) 
     os.Exit(1) 
    } 

    // Useful to close file after getting information about it 
    defer file.Close() 
    Read(file) 
} 

func Read(r io.Reader) (Message, error) { 
    data := [2]byte{} 
    if _, err := r.Read(data[:]); err != nil { 
     return nil, err 
    } 
    buffer := bytes.NewBuffer(data[:]) 
    mr := io.MultiReader(buffer, r) 
    return netflow5.Read(mr) 
} 

は、ここに私のハッキング、ドラフトスタートです。しかし、私は分割中にデータを失うことなくそれを行う方法を想像していません。

私がコードや説明で何かを忘れた場合は、私に修正してください。私はWeb上で私のソリューションを検索し、別の可能な実装について考えるのに多くの時間を費やします。

何か助けやアドバイスをいただければ幸いです。

ファイルには、次のプロパティ(ターミナルでコマンドfile -I <file_name>を)持っている:

file_name: application/octet-stream; charset=binary

ファイルの出力をコマンドnfdump -r <file_name>後にこの構造を有する:

Date first seen   Duration Proto  Src IP Addr:Port   Dst IP Addr:Port Packets Bytes Flows 

すべてのプロパティは、自身のコラムです。

UPDATE 1: は残念ながら、それはnfcapd介してディスク上に保存した後によるバイナリファイルの構造の違いにNetFlowのパッケージを使用してファイルを解析するimpossibleです。この回答は、nfdumpの寄稿者のoneによって与えられました。

唯一の方法は、pynfdumpのようなgoプログラムで端末からnfdumpを実行することです。

今後別のpossibleソリューションは、gopacketを使用します。

+0

このnfcapdバイナリファイルの構造は何ですか?それは実際に合理的に構造化された行を持つテキストファイルですか?あなたの問題はファイルを効率的に読む方法がわからないか、あるいはIPの解析にも助けが必要なのでしょうか?私はGitHubの要旨の例の出力ファイルを発見した – HenryTK

+0

:私はそれを非常に大規模なバージョンを仮定しますhttps://gist.githubusercontent.com/asachs/bfbfebdb39b33a5ded61/raw/319f206b29e5b7a046e48768f24b4be0f5e2f07c/gistfile1.txt は、あなたが扱っているものです。 – HenryTK

+0

@HenryTKファイルに関する詳細を追加しました。私は今、ファイルを効率的に読み込み、IPを解析する方法を知らない。私はゴランの初心者です。 – memu

答えて

0

IOは、ファイルを解析する際の制約要因になりがちですが、計算が複雑でない限り、1つのファイルをシリアルに読み取るのが処理の最速方法になります。

ラップbufio.Reader内のファイルとRead関数にそれを与える:それは解析されています一度あなたが別途チャンクを処理する必要がある場合、あなたはその後、レコードを分割することができます

file, err := os.Open(fileName) 
if err != nil { 
    log.Fatal((err) 
} 
defer file.Close() 

packet, err := netflow5.Read(bufio.NewReader(file)) 

+0

想像どおり、このバイナリファイルをnetflowで読むことはできません。この '' if文 ''のために:https://github.com/tehmaze/netflow/blob/master/netflow5/packet.go#L62 ファイル全体を一度に読むことはできません。私の目標は、Unmarshallデータにフローを送るためにそれを別々に読むことです。 – memu

+0

@memu:netflowパッケージが解析しない場合は、何かが必要になります。初歩的な解析を行わなくても、バイナリファイルの部分を分離することはできません。ワークフローはまだ変わりません。ファイルを 'bufio.Reader'にラップし、それをシリアルに読み込みます。 – JimB

+0

「シリアルリーディング」の意味は?それはバイト配列のチャンクで読んでいますか?もしそうなら、どのサイズを選ぶべきですか? – memu

関連する問題