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%