rabbit-slide-znz-simple-ping-summary 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e42ffda554d5b441e3aa9110cdd618e99b781a93
4
+ data.tar.gz: bb41640a41a9641e78ff3d78d707d86437b06a1b
5
+ SHA512:
6
+ metadata.gz: 04eb2cac3bf7262d7e016c8f9af11222098065a02f3960489331277b55d6f21dfd58e2361324d5685e5b4cc7d8d475e31e004bdc71442d8ffde0c70dec0e47db
7
+ data.tar.gz: 8381e64a0e71b260354522325efea5ff0cbb28f8f18a50ca0a8c46e47317f684b65ea7a1fb4642fcaaec10af0bcde8bcae8434dbc828d91e2edbd50dee02b336
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ sps.rab
@@ -0,0 +1,24 @@
1
+ = シェルスクリプトで簡易ping監視
2
+
3
+ 200行ぐらいの行数のシェルスクリプトでping監視をして、その結果を簡易な画像にまとめるものを作ってみた話をします。
4
+
5
+ == 作者向け
6
+
7
+ === 表示
8
+
9
+ rake
10
+
11
+ === 公開
12
+
13
+ rake publish
14
+
15
+ == 閲覧者向け
16
+
17
+ === インストール
18
+
19
+ gem install rabbit-slide--simple-ping-summary
20
+
21
+ === 表示
22
+
23
+ rabbit rabbit-slide--simple-ping-summary.gem
24
+
@@ -0,0 +1,9 @@
1
+ require "rabbit/task/slide"
2
+
3
+ # Edit ./config.yaml to customize meta data
4
+
5
+ Rabbit::Task::Slide.new do |task|
6
+ # task.spec.files += Dir.glob("doc/**/*.*")
7
+ # task.spec.files -= Dir.glob("private/**/*.*")
8
+ # task.spec.add_runtime_dependency("YOUR THEME")
9
+ end
@@ -0,0 +1,18 @@
1
+ ---
2
+ id: simple-ping-summary
3
+ base_name: sps
4
+ tags: []
5
+ presentation_date: 2013/08/24
6
+ version: 1.0.0
7
+ licenses: []
8
+ slideshare_id: simple-ping-summary
9
+ speaker_deck_id:
10
+ ustream_id:
11
+ vimeo_id:
12
+ author:
13
+ markup_language: :rd
14
+ name: Kazuhiro NISHIYAMA
15
+ email: zn@mbf.nifty.com
16
+ rubygems_user: znz
17
+ slideshare_user: znzjp
18
+ speaker_deck_user:
Binary file
data/sps.rab ADDED
@@ -0,0 +1,225 @@
1
+ = シェルスクリプトで簡易ping監視
2
+
3
+ # : subtitle
4
+ # サブタイトル
5
+ : author
6
+ 西山和広 (@znz)
7
+ # : institution
8
+ # 株式会社ブロードエンタープライズ
9
+ : content-source
10
+ LLまつり
11
+ : date
12
+ 2013/08/24
13
+ : allotted-time
14
+ 5m
15
+ # : theme
16
+ # default
17
+
18
+ == Note
19
+ Note は大文字の I で表示
20
+
21
+ = 背景
22
+
23
+ * 背景
24
+ * 集合住宅向けの高速インターネットサービス (B-CUBIC)
25
+ * VPN で遠隔からルーターなどの状態確認や設定変更
26
+ * 目的
27
+ * その VPN の接続状態を監視したい
28
+
29
+ == Note
30
+ 今回のプログラムを作った背景として、まず、
31
+ 今の会社では、こういうサービスをやっていて、
32
+ IPsec VPN で社内からルーターなどのネットワーク機器の操作を出来るようにしています。
33
+ その VPN の接続状態を監視したいということで、今回のプログラムを作りました。
34
+
35
+ = 監視
36
+ * Zabbix などを併用
37
+ * SNMP などで詳細情報
38
+ == Note
39
+ 監視システムとして、流量などの詳細データの監視には Zabbix を併用しています。
40
+
41
+ = Zabbix の問題点 (1)
42
+ * 大量ホストの登録が大変
43
+ * ホスト自体の追加
44
+ * これは自動登録やAPIである程度省力化可能
45
+ * まとめて見るためのグラフなどの追加
46
+ * 特に複数ホストをまとめるのは大変
47
+ == Note
48
+ その zabbix の問題点として大量のホストを登録するのが大変ということがありました。
49
+ 特に複数ホストを横断的にまとめるビューを作るのが大変です。
50
+
51
+ = Zabbix の問題点 (2)
52
+ * 監視自体も重い
53
+ * ホストごとにfpingを実行 (ping監視)
54
+ * 同時実行数を増やす → データベースのコネクション数があふれる
55
+ == Note
56
+ さらに zabbix はその仕組み上、ホストが多いと監視自体も重くなります。
57
+ = 簡易ping監視
58
+ * 登録が簡単
59
+ * 依存は最小限
60
+ * bash, GNU coreutils, fping, ImageMagick の convert
61
+ * 結果表示
62
+ * 単純な画像で全体像の把握だけ
63
+ == Note
64
+ そういう問題点に対処するためにシェルスクリプトで簡易ping監視システムを作りました。
65
+ 登録が簡単で依存は最小限にして、結果表示は単純な画像で全体像を把握するだけという
66
+ 割り切ったシステムにしました。
67
+
68
+ = 単純な画像
69
+ * ping 応答の有無のみ
70
+ * 応答時間なし
71
+ * IPアドレスも出さない
72
+ * IPアドレス順にはしている
73
+ * 時刻も出さない
74
+ * cron で定期実行している
75
+ == Note
76
+ 単純な画像というのはどういうことかというと、
77
+ まず ping 応答の有無のみにして、
78
+ 簡潔な表示するためIPアドレスや時刻は画像には直接は出さないことにしました。
79
+
80
+ = summary.html
81
+ # image
82
+ # src = ping-results.png
83
+ # relative_height = 100
84
+ == Note
85
+ 説明だけだとわかりにくいので、ここで最終的な HTML のスクリーンショットを載せておきます。
86
+ 緑が alive で、赤が unreachable なホストです。
87
+ これは自宅 LAN と OpenVPN で使っているサブネットの情報なのでほとんどが unreachable になっています。
88
+
89
+ X軸方向がIPアドレスで、例えば右上の画像なら 192.168.253.1 から 192.168.253.254 までになります。
90
+ Y軸方向は時刻です。
91
+ cron で10分ごとに実行していて、上が0時で下に伸びていくようになっています。
92
+
93
+ = 画像の説明
94
+ * 緑: alive, 赤: unreachable
95
+ * X軸: IPアドレス, Y軸: 時刻 (上が0時で下が新しい)
96
+ * 最近の画像は symlink で先ほどの summary.html から参照
97
+
98
+ # image
99
+ # src = yesterday.png
100
+
101
+ == Note
102
+ 先ほどの最近の画像を一覧する HTML は動的生成ではなく別途用意しています。
103
+ cron で自動で更新するのは画像だけで、先ほどの HTML からはシンボリックで日付が変わっても最近の画像をさし続けられるようにしています。
104
+
105
+ = 実装 (1) データ収集
106
+ * 複数ホストの指定方法は bash の brace expansion
107
+ * 例1: (({172.16.{0..255}.254}))
108
+ * 例2: (({192.168.1.{1..254}}))
109
+ * ping 送信は fping -r 0
110
+ * -r 0 でリトライせずにすぐに終わる
111
+ == Note
112
+ ここからは実装の中身の話です。
113
+ 最初の実装上の工夫は複数ホストの指定にブレース展開を使ったところです。
114
+ この機能のために /bin/sh ではなく bash を使うことにしました。
115
+
116
+ 次に fping はデフォルトだと3回リトライしてタイムアウトを待ってしまい、
117
+ かなり時間がかかるので、リトライ回数を0にしてすぐ終わるようにしています。
118
+
119
+ = 実装 (2) データ収集
120
+ collect () {
121
+ IP_PREFIX=$1
122
+ IP_RANGE=${2:-"{1..254}"}
123
+ OUT_FILE="data/$IP_PREFIX/$(date '+%Y%m%d/%H%M%S').out"
124
+ trap "rm -f $OUT_FILE" 1 2 3 15
125
+ mkdir -p "$(dirname "$OUT_FILE")"
126
+ {
127
+ eval set -- $IP_PREFIX.$IP_RANGE
128
+ for ip; do
129
+ echo "$ip"
130
+ done
131
+ } | fping -r 0 >"$OUT_FILE"
132
+ trap "" 1 2 3 15
133
+ }
134
+ == Note
135
+ 実際のデータ収集部分の実装はこうなっています。
136
+
137
+ eval set のところでブレース展開しています。
138
+ それから、後の処理のために trap で中途半端な行数のファイルが残らないようにしています。
139
+ 収集したデータは fping の出力をファイルにそのまま保存しているので、IPアドレス順にはなっていません。
140
+
141
+ = fping の出力例
142
+ 192.168.253.1 is alive
143
+ 192.168.253.24 is alive
144
+ 192.168.253.29 is alive
145
+ 192.168.253.108 is alive
146
+ 192.168.253.109 is alive
147
+ 192.168.253.112 is alive
148
+ 192.168.253.113 is alive
149
+ 192.168.253.114 is alive
150
+ 192.168.253.2 is unreachable
151
+ 192.168.253.3 is unreachable
152
+ 192.168.253.4 is unreachable
153
+ 192.168.253.5 is unreachable
154
+ 192.168.253.6 is unreachable
155
+ 192.168.253.7 is unreachable
156
+ 192.168.253.8 is unreachable
157
+ 192.168.253.9 is unreachable
158
+ 192.168.253.10 is unreachable
159
+ == Note
160
+ fping の出力は結果がわかった順に出力されているからか、
161
+ このように alive が先に出てきて unreachable が後に並ぶようです。
162
+
163
+ = 実装 (3) 画像生成
164
+ * IPアドレス順は sort -V
165
+ * GNU coreutils の((*バージョンソート*))
166
+ * ls -v と同じ機能
167
+ * 画像生成
168
+ * シェルスクリプトで xpm 生成
169
+ * xpm はブラウザの対応に難あり
170
+ * convert で png に変換
171
+ == Note
172
+ 次に画像生成部分の話です。
173
+ 画像のX軸方向に並べるのにIPアドレス順にソートする必要があるのですが、
174
+ GNU coreutils のバージョンソートがこの用途にうまくはまりました。
175
+ シェルスクリプトでIPv4アドレスを扱うことがあればオススメなので
176
+ ぜひ覚えておいてください。
177
+
178
+ 画像生成はシェルスクリプトでも生成出来る画像ということで、
179
+ テキストベースの画像形式は xbm か xpm をよく使うのですが、
180
+ 今回は色をつけるために xpm にしました。
181
+ xpm のままだとブラウザが対応していないことがあるので、
182
+ ImageMagick の convert コマンドで png に変換するようにしました。
183
+
184
+ = 実装 (4) 画像生成
185
+ to_xpm () {
186
+ OUT_DIR="$1"
187
+ WIDTH=0
188
+ HEIGHT=0
189
+ for f in "$OUT_DIR"/*.out; do
190
+ HEIGHT=$[$HEIGHT + 1]
191
+ done
192
+ WIDTH="$(wc -l < "$f")"
193
+ cat <<EOF
194
+ static const char* const xpm[] = {
195
+ "$WIDTH $HEIGHT 3 1",
196
+ " c None",
197
+ "A c #00FF00",
198
+ "U c #FF0000",
199
+ EOF
200
+ for f in "$OUT_DIR"/*.out; do
201
+ echo -n ' "'
202
+ sort -V $f | awk -v ORS= '/alive/{print "A"}/unreachable/{print "U"}'
203
+ echo '",'
204
+ done
205
+ echo '};'
206
+ }
207
+ == Note
208
+ 実際の xpm の生成部分はこうなっています。
209
+
210
+ for ループのところの glob でY軸の時刻順にソートはされているので、
211
+ X軸のIPアドレス順ソートを sort -V でやっています。
212
+ そして awk で1行を1文字に変換しています。
213
+
214
+ = シェル便利
215
+ * 簡易なものにシェルは便利
216
+ * このシステムで 200 行ぐらい
217
+ * ポータブルにするため複雑な機能は避けたい
218
+ * と思ったら declare -A が bash4 依存だった
219
+ * sort と gsort とか .../sbin/fping とか
220
+ * 複雑なら ruby とか使う
221
+
222
+ = デモ
223
+
224
+ = trap "echo $URL" 0
225
+ * https://github.com/znz/simple-ping-summary
Binary file
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-znz-simple-ping-summary
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Kazuhiro NISHIYAMA
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rabbit
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.2
27
+ description: 200行ぐらいの行数のシェルスクリプトでping監視をして、その結果を簡易な画像にまとめるものを作ってみた話をします。
28
+ email:
29
+ - zn@mbf.nifty.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - .rabbit
35
+ - config.yaml
36
+ - Rakefile
37
+ - README.rd
38
+ - ping-results.png
39
+ - yesterday.png
40
+ - sps.rab
41
+ - pdf/simple-ping-summary-sps.pdf
42
+ homepage: http://slide.rabbit-shocker.org/authors/znz/simple-ping-summary/
43
+ licenses: []
44
+ metadata: {}
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubyforge_project:
61
+ rubygems_version: 2.0.3
62
+ signing_key:
63
+ specification_version: 4
64
+ summary: シェルスクリプトで簡易ping監視
65
+ test_files: []