lib/logstash/inputs/snmp/base_client.rb in logstash-input-snmp-1.2.2 vs lib/logstash/inputs/snmp/base_client.rb in logstash-input-snmp-1.2.3

- old
+ new

@@ -5,37 +5,67 @@ module LogStash class SnmpClientError < StandardError end - class BaseSnmpClient - + # Only one Snmp instance per transport should be created and listened on. + # The Snmp object is thread safe and can be shared across input threads and pipelines. + class SnmpFactory java_import "org.snmp4j.Snmp" + java_import "org.snmp4j.transport.DefaultUdpTransportMapping" + java_import "org.snmp4j.transport.DefaultTcpTransportMapping" + + include Singleton + + def initialize + @lock = Mutex.new + @udp = nil + @tcp = nil + end + + def udp + @lock.synchronize do + if @udp.nil? + @udp = Snmp.new(DefaultUdpTransportMapping.new) + @udp.listen + end + end + @udp + end + + def tcp + @lock.synchronize do + if @tcp.nil? + @tcp = Snmp.new(DefaultTcpTransportMapping.new) + @tcp.listen + end + end + @tcp + end + end + + class BaseSnmpClient java_import "org.snmp4j.TransportMapping" java_import "org.snmp4j.mp.SnmpConstants" java_import "org.snmp4j.smi.OID" java_import "org.snmp4j.smi.VariableBinding" - java_import "org.snmp4j.transport.DefaultUdpTransportMapping" - java_import "org.snmp4j.transport.DefaultTcpTransportMapping" java_import "org.snmp4j.util.TableUtils" java_import "org.snmp4j.util.TreeUtils" java_import "org.snmp4j.asn1.BER" include LogStash::Util::Loggable def initialize(protocol, address, port, retries, timeout, mib) + @mib = mib + transport = case protocol.to_s when "udp" - DefaultUdpTransportMapping.new + @snmp = SnmpFactory.instance.udp when "tcp" - DefaultTcpTransportMapping.new + @snmp = SnmpFactory.instance.tcp else raise(SnmpClientError, "invalid transport protocol specified '#{protocol.to_s}', expecting 'udp' or 'tcp'") - end - - @mib = mib - @snmp = Snmp.new(transport) - transport.listen() + end end def get(oids, strip_root = 0, path_length = 0) pdu = get_pdu Array(oids).each { |oid| pdu.add(VariableBinding.new(OID.new(oid))) }