Create an ldap connection.
# File lib/puppet/indirector/ldap.rb, line 63 def connection unless @connection raise Puppet::Error, "Could not set up LDAP Connection: Missing ruby/ldap libraries" unless Puppet.features.ldap? begin conn = Puppet::Util::Ldap::Connection.instance conn.start @connection = conn.connection rescue => detail message = "Could not connect to LDAP: #{detail}" Puppet.log_exception(detail, message) raise Puppet::Error, message end end @connection end
Perform our ldap search and process the result.
# File lib/puppet/indirector/ldap.rb, line 6 def find(request) ldapsearch(search_filter(request.key)) { |entry| return process(entry) } || nil end
Find the ldap node, return the class list and parent node specially, and everything else in a parameter hash.
# File lib/puppet/indirector/ldap.rb, line 32 def ldapsearch(filter) raise ArgumentError.new("You must pass a block to ldapsearch") unless block_given? found = false count = 0 begin connection.search(search_base, 2, filter, search_attributes) do |entry| found = true yield entry end rescue SystemExit,NoMemoryError raise rescue Exception => detail if count == 0 # Try reconnecting to ldap if we get an exception and we haven't yet retried. count += 1 @connection = nil Puppet.warning "Retrying LDAP connection" retry else error = Puppet::Error.new("LDAP Search failed") error.set_backtrace(detail.backtrace) raise error end end found end
Process the found entry. We assume that we don’t just want the ldap object.
# File lib/puppet/indirector/ldap.rb, line 12 def process(entry) raise Puppet::DevError, "The 'process' method has not been overridden for the LDAP terminus for #{self.name}" end
Default to all attributes.
# File lib/puppet/indirector/ldap.rb, line 17 def search_attributes nil end
# File lib/puppet/indirector/ldap.rb, line 21 def search_base Puppet[:ldapbase] end
The ldap search filter to use.
# File lib/puppet/indirector/ldap.rb, line 26 def search_filter(name) raise Puppet::DevError, "No search string set for LDAP terminus for #{self.name}" end