2010/09/01

RubyからSNMPを使ってみる

RubyからSNMPを使ってみたかったので、自分用開発サーバのCPU負荷とメモリ負荷をゲットして、閾値を越えていたら@dabesaから自分宛にMentionを飛ばすようにしてみた。以下ソース。


#! /usr/bin/ruby -Ku

require 'rubygems'
require 'snmp'
require 'oauth'
require 'rubytter'


begin
  mess = ""
  cpu=0,mem=0,mema=0,memb=0,memc=0,memp=0

  manager = SNMP::Manager.new(:Host => 'localhost', :Community => 'COMMUNITY')

  response = manager.get(["1.3.6.1.4.1.2021.10.1.3.2"])
  response.each_varbind {|vb| cpu = vb.value }
  response = manager.get(["1.3.6.1.4.1.2021.4.5.0"])
  response.each_varbind {|vb| mem = vb.value }
  response = manager.get(["1.3.6.1.4.1.2021.4.6.0"])
  response.each_varbind {|vb| mema = vb.value}
  response = manager.get(["1.3.6.1.4.1.2021.4.14.0"])
  response.each_varbind {|vb| memb = vb.value}
  response = manager.get(["1.3.6.1.4.1.2021.4.15.0"])
  response.each_varbind {|vb| memc = vb.value}

  memp = ((mem.to_f - (mema.to_f + memb.to_f + memc.to_f)) / mem.to_f) * 100

  if cpu.to_f > 14 or memp.to_f > 80 then
    mess = "@smokeymonkey CPUの5分平均ロードアベレージが" + cpu + "、メモリ使用率が" + sprintf("%.2f", memp) + "% だべさ!"

    consumer = OAuth::Consumer.new(
      "CONSUMER_KEY",
      "CONSUMER_SECRET",
      :site => 'http://twitter.com'
    )

    token = OAuth::AccessToken.new(
      consumer,
      "REQUEST_TOKEN",
      "REQUEST_TOKEN_SECRET"
    )

    client = OAuthRubytter.new(token)
    client.update(mess)
  end

  manager.close

rescue
  print "RuntimeError: ", $!, "\n";
end