CPU温度でPCをシャットダウン

http://alfalfa.livedoor.biz/archives/51510441.htmlをみて怖くなってきたのでチョロッと作成した。

#!/usr/bin/env ruby
# -*- encoding: UTF-8 -*-

class String
  def grep(reg)
    ret = []

    self.each_line do |line|
      ret << line if reg =~ line
    end

    ret
  end
end

class Sensors
  #文字列を温度に変換する
  def to_temperature(str)
    str.scan(/\d*\.\d*/)[0].to_f
  end
  private :to_temperature

  def get
    #現状Core系のみ対応
    `sensors`.grep(/Core/).map{|s|s.split(" ")}.map do |cpu|
      ret = {}

      ret[cpu[0]] = cpu[1].to_i
      ret["temperature"] = to_temperature(cpu[2])
      ret[cpu[3].delete("(")] = to_temperature(cpu[5])
      ret[cpu[6]] = to_temperature(cpu[8])

      cpu = ret
    end
  end

  def core
    get.size
  end

  #温度取得
  def temperature(cpu)
    get[cpu]["temperature"]
  end

  #high
  def high(cpu)
    get[cpu]["high"]
  end

  #crit
  def crit(cpu)
    get[cpu]["crit"]
  end
end

def log(tem)
  File.open("/var/log/rsenwatch", "a") do |f|
    f.write "#{Time.now} shoutdown:cpu temperature is #{tem}"
  end
end

s = Sensors.new
s.core.times do |i|
  if s.high(i) <= s.temperature(i)
    log(s.temperature(i))
    system("/sbin/shutdown -h now")
  end
end


自分の環境がマルチコアなので、シングルコアだと動かないはず。
あとはcronで適当に動かせば良い。
問題は留守以外でも落ちるのが問題。