disk-alert-kata2

ディスクのアラート


一歩が大きくてイメージがつかめなかったのでユーザストーリをもっと小さくして実行する
実装も今できる手続き型で順番に書く
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でやる
Comments