ディスクのアラート
一歩が大きくてイメージがつかめなかったのでユーザストーリをもっと小さくして実行する
実装も今できる手続き型で順番に書く
mockとかstubとか一気に使いたいと考えすぎてた
仕様
dfの値のなかで"/"は50越えてたらwarning, 70越えてたらcriticalを警告
それ以外は60越えてたらwarning, 80越えてたらcriticalを警告
機能実装案
標準入力からdfの値を受け取って問題なければ何も返さない
想定内の問題が起これば標準出力
想定外のエラーは標準エラー出力
パイプで渡されて
メールコマンドにパイプで渡すUNIXなイメージ
うそdf結果を渡して確認できる!
/bin/df -kP
rubyではじめる
ファイルを作る
$ touch disk_alert.rb
$ /bin/df -kP > honto_dfkp.txt
$ cat honto_dfkp.txt
Filesystem 1024-blocks Used Available Capacity マウント位置
/dev/mapper/vg_fri-lv_root 39720352 6609080 32707820 17% /
tmpfs 1544056 1460 1542596 1% /dev/shm
/dev/sda3 198337 56791 131306 31% /boot
標準入力を読んでまずはそれを吐き出す
…標準入力を読む?ぐぐる
while s = gets
print s
end
もしくは
print STDIN.read
もしくは
print ARGF.read
ARGFつかうと
cat honto_dfkp.txt | ruby disk_alert.rb
ruby disk_alert.rb < honto_dfkp.txt
ruby disk_alert.rb honto_dfkp.txt
どれでもいける
こんなかんじ
なんかこんなかんじかなー
def critical?(line)
true
end
input = ARGF.read
input.map do |line|
puts 'hoge' if critical? line
end
String.map -> String.lines.map
input.class してみたらStringだったので、Stringがenumerableになるというのをどっかで見た記憶があるから
Japanese user list of the Ruby programming language () <http://comments.gmane.org/gmane.comp.lang.ruby.japanese/4884>
そこにかいてあるとおり
def critical?(line)
true
end
input = ARGF.read
input.lines.map do |line|
puts 'hoge' if critical? line
end
にした
一行目のFilesystemは飛ばす
def critical?(string)
true
end
input = ARGF.read
input.lines.map do |line|
next if /^Filesystem/ =~ line
puts "critical!!!\n" + line if critical? line
end
空白区切りの中で6番目の要素を取り出す
def critical?(string)
puts string.split(/\s+/)[5]
true
end
input = ARGF.read
input.lines.map do |line|
next if /^Filesystem/ =~ line
puts "critical!!!\n" + line if critical? line
end
やっぱり一旦置いておく
def critical?(string)
# puts string.split(/\s+/)[5]
true
end
input = ARGF.read
input.lines.map do |line|
next if /^Filesystem/ =~ line
puts "critical!!!\n" + line if critical? line
end
ウソdfを作る
uso_dfkp.txtを作ってそれを解釈するようにする
$ cat uso_dfkp.txt
Filesystem 1024-blocks Used Available Capacity マウント位置
/dev/mapper/vg_fri-lv_root 39720352 6609080 32707820 67% /
tmpfs 1544056 1460 1542596 1% /dev/shm
/dev/sda3 198337 56791 131306 85% /boot
critical部分を作成
80%越えてたら警告
def critical?(string)
# puts string.split(/\s+/)[5]
# get used %
if string.split(/\s+/)[4][/\d+/].to_i >= 80
true
else
false
end
end
input = ARGF.read
input.lines.map do |line|
next if /^Filesystem/ =~ line
puts "critical!!!\n" + line if critical? line
end
/の場合は70%越えてたら警告
なんかbadなかんじになってきたけどまあいいとしよう…
def critical?(string)
if string.split(/\s+/)[5] == '/'
# get used %
if string.split(/\s+/)[4][/\d+/].to_i >= 70
true
else
false
end
else
# get used %
if string.split(/\s+/)[4][/\d+/].to_i >= 80
true
else
false
end
end
end
input = ARGF.read
input.lines.map do |line|
next if /^Filesystem/ =~ line
puts "critical!!!\n" + line if critical? line
end
ちょっとだけリファクタリングした テストの綱なしでリファクタリングこわい
def critical?(string)
if string.split(/\s+/)[5] == '/'
# get used %
string.split(/\s+/)[4][/\d+/].to_i >= 70
else
# get used %
string.split(/\s+/)[4][/\d+/].to_i >= 80
end
end
input = ARGF.read
input.lines.map do |line|
next if /^Filesystem/ =~ line
puts "critical!!!\n" + line if critical? line
end
warning部分を作成
warningをつくる
必殺コピペプログラミング!
完成
def critical?(string)
if string.split(/\s+/)[5] == '/'
# get used %
string.split(/\s+/)[4][/\d+/].to_i >= 70
else
# get used %
string.split(/\s+/)[4][/\d+/].to_i >= 80
end
end
def warning?(string)
return false if critical? string
if string.split(/\s+/)[5] == '/'
# get used %
string.split(/\s+/)[4][/\d+/].to_i >= 50
else
# get used %
string.split(/\s+/)[4][/\d+/].to_i >= 60
end
end
input = ARGF.read
input.lines.map do |line|
next if /^Filesystem/ =~ line
puts "critical!!!\n" + line if critical? line
puts "warning\n" + line if warning? line
end
$ cat uso_dfkp.txt
Filesystem 1024-blocks Used Available Capacity マウント位置
/dev/mapper/vg_fri-lv_root 39720352 6609080 32707820 67% /
tmpfs 1544056 1460 1542596 1% /dev/shm
/dev/sda3 198337 56791 131306 85% /boot
$ cat uso_dfkp.txt |ruby disk_alert.rb
warning
/dev/mapper/vg_fri-lv_root 39720352 6609080 32707820 67% /
critical!!!
/dev/sda3 198337 56791 131306 85% /boot
$ cat uso_dfkp.txt |ruby disk_alert.rb |mail sane
$ mail
Heirloom Mail version 12.4 7/29/08. Type ? for help.
"/var/spool/mail/sane": 1 message
> 1 sane Mon Mar 22 17:44 23/926
& 1
Message 1:
From sane@localhost.localdomain Mon Mar 22 17:44:39 2010
Return-Path: <sane@localhost.localdomain>
From: sane <sane@localhost.localdomain>
Date: Mon, 22 Mar 2010 17:44:39 +0900
To: sane@localhost.localdomain
User-Agent: Heirloom mailx 12.4 7/29/08
Content-Type: text/plain; charset=us-ascii
Status: RO
warning
/dev/mapper/vg_fri-lv_root 39720352 6609080 32707820 67% /
critical!!!
/dev/sda3 198337 56791 131306 85% /boot
&
メール来てた!完了
コードひどいなー
わかったこと
自動化されたテストがないとリファクタリングがこわい
こわいからリファクタリングする気力がわかない
次TDDでやる