class Puppet::Node::Ldap

Public Instance Methods

class_attributes() click to toggle source

The attributes that Puppet class information is stored in.

# File lib/puppet/indirector/node/ldap.rb, line 11
def class_attributes
  Puppet[:ldapclassattrs].split(/\s*,\s*/)
end
entry2hash(entry, fqdn = false) click to toggle source

Convert the found entry into a simple hash.

# File lib/puppet/indirector/node/ldap.rb, line 83
def entry2hash(entry, fqdn = false)
  result = {}

  cn  = entry.dn[     /cn\s*=\s*([^,\s]+)/,1]
  dcs = entry.dn.scan(/dc\s*=\s*([^,\s]+)/)
  result[:name]    = fqdn ? ([cn]+dcs).join('.') : cn
  result[:parent] = get_parent_from_entry(entry) if parent_attribute
  result[:classes] = get_classes_from_entry(entry)
  result[:stacked] = get_stacked_values_from_entry(entry)
  result[:parameters] = get_parameters_from_entry(entry)

  result[:environment] = result[:parameters]["environment"] if result[:parameters]["environment"]

  result[:stacked_parameters] = {}

  if result[:stacked]
    result[:stacked].each do |value|
      param = value.split('=', 2)
      result[:stacked_parameters][param[0]] = param[1]
    end
  end

  if result[:stacked_parameters]
    result[:stacked_parameters].each do |param, value|
      result[:parameters][param] = value unless result[:parameters].include?(param)
    end
  end

  result[:parameters] = convert_parameters(result[:parameters])

  result
end
find(request) click to toggle source

Look for our node in ldap.

# File lib/puppet/indirector/node/ldap.rb, line 28
def find(request)
  names = [request.key]
  names << request.key.sub(/\..+/, '') if request.key.include?(".") # we assume it's an fqdn
  names << "default"

  node = nil
  names.each do |name|
    next unless info = name2hash(name)

    merge_parent(info) if info[:parent]
    info[:environment] ||= request.environment
    node = info2node(request.key, info)
    break
  end

  node
end
name2hash(name) click to toggle source

Separate this out so it’s relatively atomic. It’s tempting to call process instead of name2hash() here, but it ends up being difficult to test because all exceptions get caught by ldapsearch. LAK:NOTE Unfortunately, the ldap support is too stupid to throw anything but LDAP::ResultError, even on bad connections, so we are rough-handed with our error handling.

# File lib/puppet/indirector/node/ldap.rb, line 21
def name2hash(name)
  info = nil
  ldapsearch(search_filter(name)) { |entry| info = entry2hash(entry) }
  info
end
parent_attribute() click to toggle source

The parent attribute, if we have one.

# File lib/puppet/indirector/node/ldap.rb, line 68
def parent_attribute
  if pattr = Puppet[:ldapparentattr] and ! pattr.empty?
    pattr
  else
    nil
  end
end
search_attributes() click to toggle source

Default to all attributes.

# File lib/puppet/indirector/node/ldap.rb, line 117
def search_attributes
  ldapattrs = Puppet[:ldapattrs]

  # results in everything getting returned
  return nil if ldapattrs == "all"

  search_attrs = class_attributes + ldapattrs.split(/\s*,\s*/)

  if pattr = parent_attribute
    search_attrs << pattr
  end

  search_attrs
end
search_filter(name) click to toggle source

The ldap search filter to use.

# File lib/puppet/indirector/node/ldap.rb, line 133
def search_filter(name)
  filter = Puppet[:ldapstring]

  if filter.include? "%s"
    # Don't replace the string in-line, since that would hard-code our node
    # info.
    filter = filter.gsub('%s', name)
  end
  filter
end
stacked_attributes(dummy_argument=:work_arround_for_ruby_GC_bug) click to toggle source

The attributes that Puppet will stack as array over the full hierarchy.

# File lib/puppet/indirector/node/ldap.rb, line 78
def stacked_attributes(dummy_argument=:work_arround_for_ruby_GC_bug)
  Puppet[:ldapstackedattrs].split(/\s*,\s*/)
end