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