LBP-1820のステータスを一括取得

20数台のプリンタのステータスを取得したいのが、エラーに悩まされたりして解決に時間が掛かった。
 
頭を悩ませていたのが「Timeout::Error」って奴。
 
参考にしたのがこのあたり。

  def lprlist
    @page_title = "プリンタの状態"
    
    ip_ary = ["192.168.1.200","192.168.1.201","192.168.1.202"]
              
    @printers = Array.new
    require 'ping'
    count = 0
    ip_ary.each{|host_name|
      if Ping.pingecho(host_name, timeout = 5, "80")
        @printers[count] = lpr_state(count, ip_ary[count])
        count += 1
      end
    }
  end
  def lpr_state(id, ip)
    #LBP-1820用
    require 'net/http'
    Net::HTTP.version_1_2   # おまじない
    $proxy_addr = 'proxy_address'
    $proxy_port = 80
    
    lpr = Array.new
    lpr[0] = id
    lpr[1] = "http://"+ip
    begin
    http = Net::HTTP::Proxy($proxy_addr, $proxy_port).new( ip )
    http.open_timeout = 5
    http.read_timeout = 10
    http.start do
      response = http.get('/dev/dev_env.shtml')
      find_flag = 0
      response.body.toutf8.each{|l|
        #ホスト名を取得する
        if /izm/ =~ l
          s = l.index("izm")
          e = l.index("</b>")
          lpr[3] = l.slice(s,e-s)
        end
        #総印刷ページ数を取得する
        if find_flag == 1
          s =  l.index("<td>")
          e =  l.rindex("</td>")
          lpr[2] = l.slice(s+4..e-1)
          break
        end
        find_flag = 1 if /総印刷ページ数/ =~ l.toutf8
      }

      #用紙の状態を表す画像のURLを取得する。
      response = http.get('/dev/dev_stat.shtml')
      response.body.toutf8.each{|l|
      if /cassette/ =~ l
        s = l.index("image")
        e = l.index("gif")
        lpr[4] = "http://"+ip+"/cab/image/"+l.slice(s+6,e-s-3)
      end
      }
      #デバイスの状態を取得する
      find_flag = 0
      response.body.toutf8.each{|l|
      if find_flag == 1
        s = l.index("><b>")
        e = l.index("/b>")
        lpr[5] = l.slice(s+4..e-2)
        break
      end
      find_flag = 1 if /デバイス状態/ =~ l.toutf8
      }
    end
    rescue 
      puts "exception on HTTP: StandardError #{$!}"
    rescue Timeout::Error
      puts "exception on HTTP: TimeoutError"
    rescue Exception
      puts "exception on HTTP: #{$!}"
    end
    return lpr
  end

他にも試したのがこれら。

  • Hashにパラメータを入れてリダイレクト(URLがアホみたいになった!)
  • Tempfile.rbを使った(意味が無かった)
  • ファイルを作った(意味が無かった)

どれもTimeout::Errorには対処できなかった。