#! /usr/local/bin/ruby # Copyright (c) 2006 Frédéric Senault. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the author or any contributors may be used to # endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. class SNMPTester < Tester @@struct = {} def register(sdata) if(sdata.result =~ /SNMP-BULK [A-Z,]+ /) then yield(:bw) if(sdata.result =~ /BW/) #sdata.perfdata.scan(/([a-zA-Z0-9_]+)_in_bytes/) do |iface| # yield(:"bw_#{iface}") #end yield(:net) if(sdata.result =~ /\bTABLES\b/ && sdata.result =~ /\bTCP\b/) yield(:udp) if(sdata.result =~ /\bUDP\b/) yield(:cpu) if(sdata.result =~ /\bCPU\b/) yield(:wcpu) if(sdata.result =~ /\bWCPU\b/) end end def initrrdstruct(rrd, id) case id.to_s when /bw.*/ then [ 'in', 'out' ].each do |d| [ 'bytes', 'ucast', 'bcast', 'error', 'discd' ].each do |t| rrd.addds(d + '_' + t, :COUNTER) @@struct[d + '_' + t] = id end end # |routing=22 arp=19 tcp_estab=18 tcp_reset=5053 tcp_passive=5953 # tcp_active=161033 tcp_fail=854 #when when 'net' then [ 'routing', 'arp', 'tcp_estab'].each do |t| rrd.addds(t, :GAUGE) @@struct[t] = id end [ 'tcp_reset', 'tcp_passive', 'tcp_active', 'tcp_fail' ].each do |t| rrd.addds(t, :COUNTER) @@struct[t] = id end # |cpu_wait=U cpu_system=907039 cpu_idle=15177141 cpu_user=2592669 # cpu_intr=71675 cpu_nice=0 cpu_kernel=835364 when 'cpu' then [ 'wait', 'system', 'idle', 'user', 'intr', 'nice', 'kernel' ].each do |t| rrd.addds('cpu_' + t, :COUNTER) @@struct['cpu_' + t] = id end # |wcpu_dpc=0 wcpu_intr=0 wcpu_user=2 when 'wcpu' then [ 'dpc', 'intr', 'user' ].each do |t| rrd.addds('wcpu_' + t, :GAUGE) @@struct['wcpu_' + t] = id end when 'udp' then rrd.addds('udpconn', :GAUGE) @@struct['udpconn'] = id end end def rrdname(sdata, id) if(id == :bw) then t = ( sdata.service =~ /net/ ? 'net_bw' : 'lan_bw' ) sdata.host.normalize + '_' + t else sdata.host.normalize + '_' + id.to_s end end def getdata(rrd, sdata, id) ds = nil case id.to_s when /bw.*/ then e = Regexp.new('[a-z0-9]+_((?:in|out)_[a-z]+)=([0-9.]+)') else e = Regexp.new('([a-z_]+)=([0-9.]+)') end sdata.perfdata.split(/ /).each do |ss| m = e.match(ss) if(!m.nil?) then if(@@struct[m[1]] == id) then ds = rrd.addtime(sdata.time) if(ds.nil?) ds[m[1]] = m[2] end end end end end