2013-07-24 50 views
1

我有,我正在努力恢復到鞋子整數和字符串蒙上了返回的數組,以適當的值

 Shoes.setup do 
    gem 'snmp' 
end 

class SNMPManager 
    require 'snmp' 
    include SNMP 
    attr_accessor :hostname, :framerate 

    def initialize(params = {}) 
    @hostname = params.fetch(:hostname, 'localhost') 
    @framerate = params.fetch(:framerate, 25) 

    end 

    def getValues 
    Manager.open(:host => @hostname, :mib_modules => ["SNMPv2-MIB"]) do |manager| 
     poolArray = [] 
     ifTable = ObjectId.new("1.3.6.1.4.1.15248.2.5.1.3.1") 
     manager.walk(ifTable) do |row| 
     poolArray.push(row.inspect) 
     end 
     groups = poolArray.group_by{ |s| s.split(',').first[/\d+$/] } 
     @values = groups.map{ |key, ary| ary.map{ |s| s[/value=(\S+)/, 1] } } 

    end 
    end 

    def to_s 
    return @values 
    end 
end 



Shoes.app do 
    #@hostname = edit_line 
    #man =SNMPManager.new(:host => @hostname) 
    man = SNMPManager.new 
    man.getValues 
    puts 'SNMP Space Monitor' 
    man.to_s.each {|v| 
    @note = para "#{v[1]} \t(Pool: #{v[0]}) \tCapacity: #{v[3].to_i} \tFree Protons: #{v[2].to_i} \tPercent Free: %#{(v[3].to_f/v[2].to_f*100).round(2)}" 
     } 
end 

出於某種原因,鞋業的數組下面的代碼片段顯示的是什麼樣子: Shoes Screengrab

但是,如果我正常運行ruby腳本,並輸出put,它顯示正確,並正確計算響應。 我知道我錯過了一些明顯的東西,但看不到它是什麼。 我想將數組強制轉換爲另一個數組,但似乎這樣做是爲了全部。

+0

對setup()的調用會導致一個錯誤:'未初始化的常量Encoding :: US_ASCII'。我在鞋子郵寄名單上問了一個關於鞋子的問題,顯然鞋子幾乎是一個獨立包裝,而鞋子導入其他模塊並不是很好。另外,你的to_s()方法仍然不返回一個字符串。 – 7stud

回答

1

1)

@values = Array(@values) 

即有點奇怪。所有的Array構造函數都會創建@values的副本。你會這樣做的唯一原因是@values包含對由另一個變量引用的某個數組的引用,並且你不希望其他變量能夠更改@values。但是,當你首次將數組賦值給@values時,爲什麼不復制副本?

2)您的to_s方法不返回字符串。

+0

實現1的更好方法是'@ values.dup'。 2可能是一個問題:)也許他想'@ values.inspect' –

+0

不管我嘗試什麼,它都會一直返回同一組數據 - 我希望能夠嘗試 - 甚至檢查那裏有什麼,不會返回我期望的結果。 – Scott

+0

@Scott,你需要發佈一個完整的,簡單的例子(包括更正),任何人都可以運行並獲得與你一樣的結果。 – 7stud

0

這是使用鞋子的好方法。

它看起來像鞋子給你包含array_of_integers_and_strings.to_s的段。

完整的代碼會超級有用。

+0

我已經添加完整的代碼,並將添加示例輸出 只要我切換回控制檯輸出,我就會得到預期的輸出 – Scott

0

從「紅鞋」切換到「綠鞋」

沒有其他的變化需要解決的問題,但這裏是我當前的代碼(其中成功超時時,作爲一個控制檯應用程序運行。但不能作爲鞋應用程序 - 去圖)

require 'green_shoes' 
gem 'snmp' 

class SNMPManager 
    require 'snmp' 
    include SNMP 
    attr_accessor :hostname, :framerate 

    def initialize(params = {}) 
    @hostname = params.fetch(:hostname, 'localhost') 
    @framerate = params.fetch(:framerate, 25) 

    end 

    def getValues 
    Manager.open(:host => @hostname) do |manager| 
     @poolArray = [] 
     poolsTable = ObjectId.new("1.3.6.1.4.1.15248.2.5.1.3.1") 
     manager.walk(poolsTable) do |row| 
     @poolArray.push(row.inspect) 
     end 
     if @poolArray.empty? 
     puts "Manager Down" 
     @poolArray = [ 
      '[name=1.3.6.1.4.1.15248.2.5.1.3.1.1.8650, value=8650 (INTEGER)]', 
      '[name=1.3.6.1.4.1.15248.2.5.1.3.1.1.8651, value=8651 (INTEGER)]', 
      '[name=1.3.6.1.4.1.15248.2.5.1.3.1.2.8650, value=QNewsAK (OCTET STRING)]', 
      '[name=1.3.6.1.4.1.15248.2.5.1.3.1.2.8651, value=QSuite4AK (OCTET STRING)]', 
      '[name=1.3.6.1.4.1.15248.2.5.1.3.1.3.8650, value=46835255 (INTEGER)]', 
      '[name=1.3.6.1.4.1.15248.2.5.1.3.1.3.8651, value=11041721 (INTEGER)]', 
      '[name=1.3.6.1.4.1.15248.2.5.1.3.1.4.8650, value=8442357 (INTEGER)]', 
      '[name=1.3.6.1.4.1.15248.2.5.1.3.1.4.8651, value=5717570 (INTEGER)]', 
      '[name=1.3.6.1.4.1.15248.2.5.1.3.1.5.8650, value=0 (INTEGER)]', 
      '[name=1.3.6.1.4.1.15248.2.5.1.3.1.5.8651, value=0 (INTEGER)]', 
     ] 

     else puts "Manager Up" 
     end 
     groups = @poolArray.group_by{ |s| s.split(',').first[/\d+$/] } 
     @values = groups.map{ |key, ary| ary.map{ |s| s[/value=(\S+)/, 1] } } 

    end 
    end 

    def to_s 
    return @values 
    end 

    protected 

end 

Shoes.app(:title=>'SNMP Space Monitor') do 
    man = SNMPManager.new 
    stack do 
    every(300) { 
     man.getValues 
     man.to_s 
     man.to_s.each {|v| 
     para "#{v[1]} \t(Pool: #{v[0]}) \tCapacity: #{v[2].to_i} \tFree Protons: #{v[3].to_i} \tPercent Free: #{(v[3].to_f/v[2].to_f*100).round(2)}%" 
     } 
    } 
     end 
end