キャプチャファイルからシーケンス図を楽に書きたかってん。。。


はじめに

(使い方を早く知りたい方は前提条件まで読み飛ばしてください)

仕事柄、よく原因解析のため取得したキャプチャファイルからシーケンス図を描いてくれと言われることがある。
シーケンス図を描く作業というのは多大な稼働を用し、編集しようにも大変。
その時、皆さんってどんなツールで描いてますか?

キャプチャファイルから直接シーケンス図作れたらいいのに。。。

探しました。
良さげなの見つかりました。
pcapファイルからシーケンスチャート生成

hmhm, 「mscgen」っていうのを使えばいけると、
「mscgen」には"MSCs"(Message Seuence Charts)っていうフォーマットがあって、
それを食わせるとPNGでもSVGでも画像で出力してあげるということらしい。

そこでキャプチャファイルを"MSCs"にするのが「pcap2msc」。
pythonのスクリプトみたいです。

しかし私、pythonエンジニアではないので、わかりません。
リンク先は、Unix系の導入しか載せてない。
でも...Windowsでやりたい。
だって、環境がそれしかないから。
仮想環境でやれ?構築が面倒。

探しました。
私のググり力では及びませんした。
Cygwinパッケージ?どうぞどうぞ、私は止めません。

実行も環境構築もパパパって終わらせてたい!

pythonスクリプト動かすにはpythonのインストール?
Cygwinはなんやかんややるからインストールめちゃ時間かかるやん?
新規ソフトウェアのインストールには管理者の承認がいる?

そんな障害がワサワサワサーって。

そこで、、、
キャプチャファイルからシーケンス図を作成するヤツをPowerShellで書きました。
キャプチャファイルをcsvに落とし込んで、あとはおまかせ。
そんなやつです。
※本ツールは社内用にチューニングしています。
 GitHubにも上げるんで、都合の良いように改良しちゃってください。
 こ↑こ↓

前提条件

  • tsharkのインストール
    • キャプチャファイルをcsvにするときに使います。
  • mscgenのインストール
    • 今回のキモです。
    • コマンドプロンプトなどで「mscgen」と入力してhelpが出ればOKです。
    • 後述しますが、未インストールでも問題なかったりします。
  • PowerShellの実行セキュリティポリシーを変更
    • 一応やっときましょ
    • verは2.0以上だったらいけるはず
    • デジタル署名の追加もお忘れなく

フォルダ構成

  • X:ツールを使用する上で使用しない
  • ★:ツールの使用中にできるファイル
  • Example_filter.pcapng:SIPのキャプチャファイルです。
    ありがたく動作確認などに利用させていただきましょう。
    元ファイル:リンク
  • Release版にはinstallerフォルダはつきません。各自ダウンロードしてください。

キャプチャファイルのcsv化

キャプチャファイルをcsv化するにはtsharkを使用します。
インストールが終わりましたら、filterAndSequence.bat内のtsharkがインストールされているディレクトリの確認をお忘れなく。
ファイル名は「*_*.*」として ひとつだけ配置してください。
※複数の出力には対応していません。

確認が終わったらfilterAndSequence.batをダブルクリック!
プログラムが起動するよ!

また、csv化する前にキャプチャをフィルタリングする機能もつけています。
※元からしている方は必要ありません。
 半角スペースでフィルタなしで継続可能です。


※何度も言いますが、社内用にチューニングしています。
 指定しているファイル名も然り、フィルタも然り。
 デフォルトではsip contains "@@@"となっています。

作業が完了するとfilter.pcapfilter.csvが出力されます。
その後、問題がなければ画像生成まで自動で行います。
※mscgenをインストールしている場合のみ画像生成

これより、Example_filter.pcapngを使った各機能の説明です。

csvファイルの整形

1. filter.csvから、各データごとに取り除く

取り除かれるデータは以下の通り

  • Source(src)
  • Destination(dst)
  • protocol
  • info
src.txt
10.33.6.101
10.33.6.100
10.33.6.100
10.33.6.100
10.33.6.101
10.33.6.100
10.33.6.101
dst.txt
10.33.6.100
10.33.6.101
10.33.6.101
10.33.6.101
10.33.6.100
10.33.6.101
10.33.6.100
protocol.txt
SIP/SDP
SIP
SIP
SIP/SDP
SIP
SIP
SIP
info.txt
Request: INVITE sip:[email protected];user=phone |
Status: 100 Trying |
Status: 180 Ringing |
Status: 200 OK |
Request: ACK sip:[email protected]:5060 |
Request: BYE sip:[email protected]:5060 |
Status: 200 OK |

2. アドレス部分のみを抽出し、ソートする

srcとdstから使用されているアドレスを抽出する。
使用用途は追々説明。

sortAddressList.txt
10.33.6.101
10.33.6.100

"MSCs"フォーマットの作成

0. "MSCs"フォーマットとは

Ex.公式サイトより引用
# MSC for some fictional process
msc {
  hscale = "2";

  a,b,c;

  a->b [ label = "ab()" ] ;
  b->c [ label = "bc(TRUE)"];
  c=>c [ label = "process(1)" ];
  c=>c [ label = "process(2)" ];
  ...;
  c=>c [ label = "process(n)" ];
  c=>c [ label = "process(END)" ];
  a<<=c [ label = "callback()"];
  ---  [ label = "If more to run", ID="*" ];
  a->a [ label = "next()"];
  a->c [ label = "ac1()\nac2()"];
  b<-c [ label = "cb(TRUE)"];
  b->b [ label = "stalled(...)"];
  a<-b [ label = "ab() = FALSE"];
}

このように、エンティティを初期化(a,b,c;)し、そのエンティティが、どのエンティティへ
メッセージを送信(a->b)したか、どんなメッセージを送信した("ab()")かを書くだけです。
ここで、csvファイルの整形で説明したアドレス抽出を思い出してください。
そうです、抽出したアドレスは、このエンティティ初期化で使用する値です。

詳しい構文は公式サイトをご確認ください。

1. 抽出したデータを構文に当てはめる

以下は、Example_filter.pcapngより抽出したアドレスである。

sortAddressList.txt
10.33.6.101
10.33.6.100

このままだとカンマ(,)もついてない、最後尾にはセミコロン(;)も必要になってくる。
また、「mscgen」の仕様上、"."は許容されていないのだ。
許容されているのは、","と";"である。
ポイント:Labelに落とし込むという裏ワザもあるが今回は省きます。

じゃあ、どうしたか。
"."を" "に置き換えました。
あれ、" "も許容されてないんじゃ。
ポイント:問題ありません、エンティティに" "を含む場合、""で囲むことができます。

なんやかんややって構文に当てはまる形になったのがこれ。

sortAddressListMSC.txt
  "10 33 6 101",
  "10 33 6 100";

ついでにsrcとdstも当てはまる形にします。

srcMSC.txt
10 33 6 101
10 33 6 100
10 33 6 100
10 33 6 100
10 33 6 101
10 33 6 100
10 33 6 101
dstMSC.txt
10 33 6 100
10 33 6 101
10 33 6 101
10 33 6 101
10 33 6 100
10 33 6 101
10 33 6 100

それとinfoについてたパイプ(|)も消しときます。
動作には影響ありませんが、IKI(粋)ってやつです。

infoMSC.txt
Request: INVITE sip:[email protected];user=phone
Status: 100 Trying
Status: 180 Ringing
Status: 200 OK
Request: ACK sip:[email protected]:5060
Request: BYE sip:[email protected]:5060
Status: 200 OK

2. できあがった情報を入れていく

イメージとしてはこんな感じです。

other/mscTemp.txt
# test
msc {
  hscale = "1";

  "src" or "dst" filtering entities;

  "src" =>> "dst" [ label = "info" ];
}

矢印の形は、固定です。
好きなように変えてください。

ポイント:srcを左固定にすることで矢印の向きを変えなくて良いのだ。
つまり、a->bb<-aとあったとして矢印の向きを揃えれば同じでしょ、てことです。

で、できあがったのがこんな感じです。

msc.txt
# test
msc {
  hscale = "1";

  "10 33 6 101",
  "10 33 6 100";

  "10 33 6 101" =>> "10 33 6 100" [ label = "SIP/SDP Request: INVITE sip:[email protected];user=phone" ];
  "10 33 6 100" =>> "10 33 6 101" [ label = "SIP Status: 100 Trying" ];
  "10 33 6 100" =>> "10 33 6 101" [ label = "SIP Status: 180 Ringing" ];
  "10 33 6 100" =>> "10 33 6 101" [ label = "SIP/SDP Status: 200 OK" ];
  "10 33 6 101" =>> "10 33 6 100" [ label = "SIP Request: ACK sip:[email protected]:5060" ];
  "10 33 6 100" =>> "10 33 6 101" [ label = "SIP Request: BYE sip:[email protected]:5060" ];
  "10 33 6 101" =>> "10 33 6 100" [ label = "SIP Status: 200 OK" ];
}

画像の生成

いよいよです。
生成は、ただただコマンドに対してオプションを付与してあげるだけです。
画像フォーマットPNGでmsc.pngという名前で保存としてあります。
※mscgenが未インストールの方はfilterAndSequence.batの以下の行をコメントアウトしてください。

filterAndSequence.bat
powershell -ExecutionPolicy RemoteSigned -File code¥csvDisassembly.ps1
powershell -ExecutionPolicy RemoteSigned -File code¥makeMSC.ps1
rem powershell -ExecutionPolicy RemoteSigned -File code¥mscgen.ps1
mscgen.ps1
"mscファイルから画像を生成します"
mscgen -i .\outputs\msc.txt -T png -o msc.png
"完了しました msc.pngをご確認ください"

Read-Host "全行程が終了しました Enter キーを押してください..."

できあがった画像を確認してみましょう。

msc.png

お疲れさまでした。

余談

読み込ませるファイルについて

読み込むキャプチャファイル名などは各自の環境に合わせて使用してください。
「*_*.*」となっているのはただただ私の職場での保存形式に則っただけです。

pause

結構頻繁にpauseとかRead-Hostを入れてますが、これはただ私が、動作を一つ一つ確かめるために置いているだけなので
除けるなりなんなりしていただいて構いません。
大規模なファイルのシーケンスができるのをコーヒー片手に待つってこともできちゃうわけです。
あ、当然ながらマシンスペックに依存しますよ。

他ツールとの連携

できあがったmsc.txtの中身を mscgen_js に食わせることもできますよ。


きれいなシーケンスで上司もニッコリ

QA

Wiresharkの「Flow Graph」機能でいいんじゃないの?

どうぞ、ご自由に、使いたい方を選んでください。

エンティティ同士が詰まって画像が見にくい

キャプチャによってはプロキシなどを挟んでいたりして、アドレスがたくさん出てくるかもしれません。
その際は、dataフォルダにあるmscTemp.txtの3行目のhscale = "2";の""内の数字を増やしてお試しください。

さいごに

それ○○でもできるよ、大歓迎です。
今回は、自身の勉強も兼ねてPowerShellで開発しました。
改良も引き続き行っていきたいと思います。

それでは良きmscライフを。