lib/logstash/inputs/LDAPSearch.rb in logstash-input-LDAPSearch-0.1.4 vs lib/logstash/inputs/LDAPSearch.rb in logstash-input-LDAPSearch-0.3.0

- old
+ new

@@ -1,83 +1,87 @@ # encoding: utf-8 require "logstash/inputs/base" require "logstash/namespace" -require "stud/interval" -require "socket" # for Socket.gethostname -# Perform an LDAP Search -# -# Example: -# -# input { -# LDAPSearch { -# host => "myLDAPServer" -# dn => "myDN" -# password => "myPassword" -# filter => "myldapfilter" -# base => "ou=people,dc=univ,dc=fr" -# attrs => ['myattrubteslist'] -# } -# } - class LogStash::Inputs::LDAPSearch < LogStash::Inputs::Base - config_name "LDAPSearch" + config_name "LDAPSearch" - # If undefined, Logstash will complain, even if codec is unused. - default :codec, "plain" + # If undefined, Logstash will complain, even if codec is unused. + default :codec, "plain" - # LDAP parameters - config :host, :validate => :string, :required => true - config :dn, :validate => :string, :required => true - config :password, :validate => :password, :required => true - config :filter, :validate => :string, :required => true - config :base, :validate => :string, :required => true - config :port, :validate => :number, :default => 389 - config :usessl, :validate => :boolean, :default => false - config :attrs, :validate => :array, :default => ['uid'] + # LDAP parameters + config :host, :validate => :string, :required => true + config :dn, :validate => :string, :required => true + config :password, :validate => :password, :required => true + config :filter, :validate => :string, :required => true + config :base, :validate => :string, :required => true + config :port, :validate => :number, :default => 389 + config :usessl, :validate => :boolean, :default => false + config :attrs, :validate => :array, :default => ['uid'] - public - def register - require 'base64' - require 'rubygems' - require 'ldap' - end # def register + public + def register + require 'net/ldap' + end # def register - public - def run(queue) - - @host = Socket.gethostbyname(@host).first - #attrs = ['uid', 'sn', 'cn', 'eduPersonPrimaryAffiliation'] - scope = LDAP::LDAP_SCOPE_SUBTREE #LDAP::LDAP_SCOPE_ONELEVEL - begin - conn = ( @usessl == true ) ? LDAP::SSLConn.new(@host,@port) : LDAP::Conn.new(@host, @port) - conn.bind(@dn, @password.value) - @logger.debug("Executing LDAP search base='#{@base}' filter='#{@filter}'") - conn.search(base, scope, filter, attrs) { |entry| - # print distinguished name - # p entry.dn - event = LogStash::Event.new - decorate(event) - event["host"] = @host - entry.get_attributes.each do |attr| - #values = entry.get_values(attr).first - values = entry.get_values(attr) - values = values.map { |value| - (/[^[:print:]]/ =~ value).nil? ? value : Base64.strict_encode64(value) - } - event[attr] = values - end - #event["attr"] = entry.attrs - queue << event - } - rescue LDAP::Error => ex - @logger.error("Ldap connect failed: #{ex}\n#{ex.backtrace}") - exit - rescue LDAP::ResultError => ex - @logger.error("LDAP search error: #{ex}\n#{ex.backtrace}") - exit - end - # no finished in 2.1, instead stop method is called - # finished - end # def run + public + def run(queue) + begin + if @usessl == true + conn = Net::LDAP.new :host => @host, + :port => @port, + :encryption => :simple_tls, + :base => base, + :auth => { + :method => :simple, + :username => @dn, + :password => @password.value + } + else + conn = Net::LDAP.new :host => @host, + :port => @port, + :base => base, + :auth => { + :method => :simple, + :username => @dn, + :password => @password.value + } + end + + # Handling binding exception + if ! conn.bind + puts "Connection failed - code: #{conn.get_operation_result.code}: #{conn.get_operation_result.message}" + end + + # Instantiating a LDAP filter + search_filter = Net::LDAP::Filter.from_rfc2254(filter) + + # Lauching LDAP request + conn.search( :filter => search_filter, :attributes => attrs ) { |entry| + event = LogStash::Event.new + decorate(event) + entry.attribute_names.each { |attr| + # Changing attribute variable type returned by attribute_name method from Symbol to String + attr = attr.to_s + # Suppressing default dn attribute if not wanted + next if (/^dn$/ =~ attr) + values = entry[attr] + # Formatting sAMAccountName to match classic case + attr = "sAMAccountName" if attr == "samaccountname" + values = values.map { |value| + (/[^[:print:]]/ =~ value).nil? ? value : Base64.strict_encode64(value) + } + # Populating event + event.set(attr,values) + } + # Adding event and sending to logstash for processing + queue << event + } + #Managing LDAP exception + rescue Net::LDAP::Error => le + puts "Got LDAP error: #{le}" + exit + end + # finished + end # def run end # class LogStash::Inputs::LDAPSearch