rabbit-slide-znz-simple-ping-summary 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rabbit +1 -0
- data/README.rd +24 -0
- data/Rakefile +9 -0
- data/config.yaml +18 -0
- data/pdf/simple-ping-summary-sps.pdf +0 -0
- data/ping-results.png +0 -0
- data/sps.rab +225 -0
- data/yesterday.png +0 -0
- metadata +65 -0
checksums.yaml
ADDED
@@ -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
|
data/README.rd
ADDED
@@ -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
|
+
|
data/Rakefile
ADDED
@@ -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
|
data/config.yaml
ADDED
@@ -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/ping-results.png
ADDED
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
|
data/yesterday.png
ADDED
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: []
|