rubyでsnmpを使ってネットワークプリンタのトナー残量チェック

お手軽スクリプトプロトタイプ。自分の端末でネットワークプリンタのトナー残量を調べます。
ブラウザでプリンタのIPを叩くとチェックできることが多いですが,プリンタごとにログインしたりUIが違ったりJavaが必要だったり面倒だったので…

rubygemでsnmpをインストールする必要あり。あと1.8系列でしょうか…
triger_toner1, triger_toner2以下のパーセンテージでトナー名称の前に*, -が警告表示されます。

require 'rubygems'
require 'snmp'
require 'csv'

triger_toner1 = 10.0
triger_toner2 = 20.0
name = ''
maxvalue = 0
curvalue = 0

id_name = "1.3.6.1.2.1.43.11.1.1.6.1."
id_max  = "1.3.6.1.2.1.43.11.1.1.8.1."
id_cur  = "1.3.6.1.2.1.43.11.1.1.9.1."

printer = Struct.new("Printer",:host, :range_toner)
printers = []

file = CSV.open("printer.dat", "r") 
file.each do |row|
        pp = printer.new(row[0], 1..row[1].to_i)
	printers << pp
end

printers.each{|pp|
	if pp.host
		manager = SNMP::Manager.new(:Host => pp.host, :version => :SNMPv1)
		print "Hostname " + pp.host + "\n"
		pp.range_toner.each{|num|
			response = manager.get([id_name + num.to_s])
			response.each_varbind{|v| name = v.value}
			response = manager.get([id_cur + num.to_s])
			response.each_varbind{|v| curvalue = v.value}
			response = manager.get([id_max + num.to_s])
			response.each_varbind{|v| maxvalue = v.value}
			if(curvalue.to_f/maxvalue.to_f * 100.0 < triger_toner1)
				print "* " + name, ":"," ", curvalue.to_f/maxvalue.to_f*100.0,"%\n"
                	elsif(curvalue.to_f/maxvalue.to_f * 100.0 < triger_toner2)
                	        print "+ " + name, ":"," ", curvalue.to_f/maxvalue.to_f*100.0,"%\n"
			else
				print "  " + name, ":"," ", curvalue.to_f/maxvalue.to_f*100.0,"%\n"
			end
		}
		print "\n"
		manager.close
	end
}

プリンタリストは同じディレクトリのprinter.datで定義。CSV形式で1列目がプリンタのホスト名,2列目がトナーの数になります。モノクロなら1,カラーなら4のことが多いはず。

hogehoge, 4
fugafuga, 1

実行するとこんな感じに出力されます。

Hostname hogehoge
* Toner Cartridge K: 8.0%
  Toner Cartridge C: 31.0%
  Toner Cartridge M: 26.0%
* Toner Cartridge Y: 5.0%

Hostname fugafuga
 Toner Cartridge Black: 100.0%