へぼいいいわけ このページをアンテナに追加 RSSフィード Twitter

2009年12月23日

GoでWiresharkのログ(csv)の必要な部分を単純に抜き出してみた

Wiresharkのログを確認する際に、Excel2003では65536行を超えるcsvが省略されてしまうので少しばかり不便です。

そこで、ログの中から必要な部分を抜き出すGoを書いてみました。

PHPと同じような感覚で作れましたが、実行時間は体感的にはPHPと同じくらい(遅い?)でした。ファイルのIOが影響しているのか私の書き方が悪いのか分かりませんが、ちょっとがっかりです。

※最初にPHPで作って、後からGoで作りました。


Wiresharkのログのcsvは大まかに以下のようになっています。ログの内容は適当です。

"No.","Time","Source","Destination","Protocol","Info"
"1","0","192.168.0.3","192.168.0.11","TCP","nfs > 7014 [ACK] Seq=1000 Ack=10 Win=5678 Len=1460"
"2","0.1","192.168.0.4","192.168.0.11","TCP","nfs > 7015 [ACK] Seq=2000 Ack=20 Win=6789 Len=1460"
"3","0.2","192.168.0.99","192.168.0.11","TCP","nfs > 7016 [ACK] Seq=3000 Ack=30 Win=7890 Len=1460"

作りとしては、"Source","Destination","Protocol","Info"を比較したりして抜き出します。

作るにあたり、Go標準の正規表現や動的配列ライブラリを使用しました。すごく簡単に使えて感動です。


ソースコード

ライブラリの使い方の参考にどうぞ。

ちなみに、Windowsではコンパイルできません。

Windowsコンパイルしたい方はfp.Stat()を消してファイルサイズを手入力してください。

package main

import (
	"os";
	"bytes";
	"strings";
	"regexp";
	"container/vector";
)

const (
	// 自身のIPアドレス
	IP = "192.168.0.11";
	// ログのファイル名
	PATH = "aaa.csv";
)

func get_ip_list() (*vector.StringVector){
	// 動的配列を用意
	ip_list := new(vector.StringVector);
	// 通信先IPアドレス
	ip_list.Push("192.168.0.3");
	ip_list.Push("192.168.0.4");
	ip_list.Push("192.168.0.5");
	ip_list.Push("192.168.0.6");
	ip_list.Push("192.168.0.7");
	ip_list.Push("192.168.0.8");
	ip_list.Push("192.168.0.9");
	ip_list.Push("192.168.0.10");
	return ip_list;
}

func main(){
	fp, _ := os.Open(PATH, os.O_RDONLY, 0);			// 読み込みで開く
	dir, _ := fp.Stat();					// ファイル情報取得
	ip_list := get_ip_list();				// IPのリスト
	fp_list := make(map[string] *os.File, 10);		// ハッシュ
	buf := make([]byte, dir.Size);				// ファイルサイズ分のバッファを用意
	fp.Read(buf);						// ファイルを読み込む
	for ip := range ip_list.Iter() {
		// ファイルポインタを格納
		// 書き込みモードでファイルを作成
		fp, _ := os.Open(ip + ".txt", os.O_WRONLY | os.O_CREATE, 500);
		fp_list[ip] = fp;
	}
	str := bytes.NewBuffer(buf).String();			// ファイルのバイト配列を文字列に変換
	list := strings.Split(str, "\n", 0);			// 文字列を改行で分割
	length := len(list);					// 配列の要素数
	// 正規表現を用意
	regs, _ := regexp.Compile(" Len=(1460|0)");
	for i := 0; i < length; i++ {
		line := strings.Split(list[i], "\",\"", 0);	// 分割
		if len(line) < 5 { continue; }
		if line[4] != "TCP" { continue; }		// TCP通信であること
		if line[2] == IP || line[3] == IP {		// 自身のIPと通信していること
			if regs.MatchString(line[5]) {		// 一致した
				for ip := range ip_list.Iter() {
					if line[2] == ip || line[3] == ip {
						// 送信、または受信が指定のIPアドレスだった場合
						// ファイルに書き出す
						fp_list[ip].WriteString(strings.Join(line, "\",\"") + "\n");
					}
				}
			}
		}
	}
	// ファイルを閉じる
	for ip := range ip_list.Iter() {
		fp_list[ip].Close();
	}
}

おまんこ31おまんこ31 2009/12/27 12:37 お久しぶりデス!
またスレのメンテナンスお願いしますお♪

http://www.unkar.org/read/babiru.bbspink.com/hnews/1246080636
http://www.unkar.org/read/venus.bbspink.com/hneta/1252217650
http://www.unkar.org/read/set.bbspink.com/ogefin/1253356338
http://www.unkar.org/read/set.bbspink.com/ogefin/1036050625

おまんこ32おまんこ32 2009/12/27 12:39 http://www.unkar.org/read/set.bbspink.com/avideo2/1242652059
http://www.unkar.org/read/set.bbspink.com/erocomic/1243000286

計6個
頼みますお!

おまんこ33おまんこ33 2009/12/29 16:14 あうー!
全部のスレでキャッシュが消えちゃったお!
直して下さいましー!

heiwabokeheiwaboke 2009/12/29 20:47 ごめんなさい。
12月中旬からbbspinkへのアクセスを制限されているようで、スレッドの取得ができていないです。
中の人にメールしてみましたが復活は未定。

アクセス制限が解除されれば自動的に復旧するようにはしたので、もう少しお待ちください…。

おまんこ34おまんこ34 2009/12/30 19:27 どうもアリガ?!
気長に待ってみるお♪

美奈代美奈代 2010/01/06 20:57 またうんかーに繋がり難いぞ!
どうしたの?

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/heiwaboke/20091223/1261495755