Class: Puppet::Provider::Ldap

Inherits:
Puppet::Provider show all
Defined in:
lib/puppet/provider/ldap.rb

Overview

The base class for LDAP providers.

Constant Summary

Constants inherited from Puppet::Provider

Confine

Constants included from Util

Util::AbsolutePathPosix, Util::AbsolutePathWindows, Util::DEFAULT_POSIX_MODE, Util::DEFAULT_WINDOWS_MODE, Util::RFC_3986_URI_REGEX

Constants included from Util::SymbolicFileMode

Util::SymbolicFileMode::SetGIDBit, Util::SymbolicFileMode::SetUIDBit, Util::SymbolicFileMode::StickyBit, Util::SymbolicFileMode::SymbolicMode, Util::SymbolicFileMode::SymbolicSpecialToBit

Constants included from Util::POSIX

Util::POSIX::LOCALE_ENV_VARS, Util::POSIX::USER_ENV_VARS

Constants included from Util::Docs

Util::Docs::HEADER_LEVELS

Class Attribute Summary collapse

Attributes inherited from Puppet::Provider

#resource

Attributes included from Util::Docs

#doc, #nodoc

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Puppet::Provider

#<=>, #clear, command, #command, commands, declared_feature?, default?, default_match, defaultfor, execfail, #execfail, execpipe, #execpipe, execute, #execute, fact_match, feature_match, #get, has_command, initvars, #inspect, mk_resource_methods, #name, notdefaultfor, optional_commands, post_resource_eval, #set, some_default_match, specificity, supports_parameter?, #to_s

Methods included from Util::Logging

#clear_deprecation_warnings, #debug, #deprecation_warning, #format_exception, #get_deprecation_offender, #log_and_raise, #log_deprecations_to_file, #log_exception, #puppet_deprecation_warning, #send_log, setup_facter_logging!, #warn_once

Methods included from Util

absolute_path?, benchmark, chuser, clear_environment, default_env, deterministic_rand, deterministic_rand_int, exit_on_fail, get_env, get_environment, logmethods, merge_environment, path_to_uri, pretty_backtrace, replace_file, safe_posix_fork, set_env, symbolizehash, thinmark, uri_encode, uri_query_encode, uri_to_path, which, withenv, withumask

Methods included from Util::SymbolicFileMode

#normalize_symbolic_mode, #symbolic_mode_to_int, #valid_symbolic_mode?

Methods included from Util::POSIX

#get_posix_field, #gid, groups_of, #idfield, #methodbyid, #methodbyname, #search_posix_field, #uid

Methods included from Util::Docs

#desc, #dochook, #doctable, #markdown_definitionlist, #markdown_header, #nodoc?, #pad, scrub

Methods included from Confiner

#confine, #confine_collection, #suitable?

Methods included from Util::Warnings

clear_warnings, debug_once, maybe_log, notice_once, warnonce

Methods included from Util::Errors

#adderrorcontext, #devfail, #error_context, error_location, error_location_with_space, error_location_with_unknowns, #exceptwrap, #fail

Constructor Details

#initialize(*args) ⇒ Ldap

Returns a new instance of Ldap

Raises:


79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/puppet/provider/ldap.rb', line 79

def initialize(*args)
  raise(Puppet::DevError, _("No LDAP Configuration defined for %{class_name}") % { class_name: self.class }) unless self.class.manager
  raise(Puppet::DevError, _("Invalid LDAP Configuration defined for %{class_name}") % { class_name: self.class }) unless self.class.manager.valid?
  super

  @property_hash = @property_hash.inject({}) do |result, ary|
    param, values = ary

    # Skip any attributes we don't manage.
    next result unless self.class.resource_type.valid_parameter?(param)

    paramclass = self.class.resource_type.attrclass(param)

    unless values.is_a?(Array)
      result[param] = values
      next result
    end

    # Only use the first value if the attribute class doesn't manage
    # arrays of values.
    if paramclass.superclass == Puppet::Parameter or paramclass.array_matching == :first
      result[param] = values[0]
    else
      result[param] = values
    end
    result
  end

  # Make a duplicate, so that we have a copy for comparison
  # at the end.
  @ldap_properties = @property_hash.dup
end

Class Attribute Details

.managerObject (readonly)


8
9
10
# File 'lib/puppet/provider/ldap.rb', line 8

def manager
  @manager
end

Class Method Details

.instancesObject

Look up all instances at our location. Yay.


12
13
14
15
16
17
# File 'lib/puppet/provider/ldap.rb', line 12

def self.instances
  list = manager.search
  return [] unless list

  list.collect { |entry| new(entry) }
end

.manages(*args) ⇒ Object

Specify the ldap manager for this provider, which is used to figure out how we actually interact with ldap.


21
22
23
24
25
26
27
28
# File 'lib/puppet/provider/ldap.rb', line 21

def self.manages(*args)
  @manager = Puppet::Util::Ldap::Manager.new
  @manager.manages(*args)

  # Set up our getter/setter methods.
  mk_resource_methods
  @manager
end

.prefetch(resources) ⇒ Object

Query all of our resources from ldap.


31
32
33
34
35
36
37
38
39
40
41
# File 'lib/puppet/provider/ldap.rb', line 31

def self.prefetch(resources)
  resources.each do |name, resource|
    result = manager.find(name)
    if result
      result[:ensure] = :present
      resource.provider = new(result)
    else
      resource.provider = new(:ensure => :absent)
    end
  end
end

Instance Method Details

#createObject


47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/puppet/provider/ldap.rb', line 47

def create
  @property_hash[:ensure] = :present
  self.class.resource_type.validproperties.each do |property|
    val = resource.should(property)
    if val
      if property.to_s == 'gid'
        self.gid = val
      else
        @property_hash[property] = val
      end
    end
  end
end

#deleteObject


61
62
63
# File 'lib/puppet/provider/ldap.rb', line 61

def delete
  @property_hash[:ensure] = :absent
end

#exists?Boolean


65
66
67
# File 'lib/puppet/provider/ldap.rb', line 65

def exists?
  @property_hash[:ensure] != :absent
end

#flushObject

Apply our changes to ldap, yo.


70
71
72
73
74
75
76
77
# File 'lib/puppet/provider/ldap.rb', line 70

def flush
  # Just call the manager's update() method.
  @property_hash.delete(:groups)
  @ldap_properties.delete(:groups)
  manager.update(name, ldap_properties, properties)
  @property_hash.clear
  @ldap_properties.clear
end

#ldap_propertiesObject

Return the current state of ldap.


113
114
115
# File 'lib/puppet/provider/ldap.rb', line 113

def ldap_properties
  @ldap_properties.dup
end

#managerObject


43
44
45
# File 'lib/puppet/provider/ldap.rb', line 43

def manager
  self.class.manager
end

#propertiesObject

Return (and look up if necessary) the desired state.


118
119
120
121
122
123
124
# File 'lib/puppet/provider/ldap.rb', line 118

def properties
  if @property_hash.empty?
    @property_hash = query || {:ensure => :absent}
    @property_hash[:ensure] = :absent if @property_hash.empty?
  end
  @property_hash.dup
end

#queryObject

Collect the current attributes from ldap. Returns the results, but also stores the attributes locally, so we have something to compare against when we update. LAK:NOTE This is normally not used, because we rely on prefetching.


130
131
132
133
134
135
136
137
138
139
140
# File 'lib/puppet/provider/ldap.rb', line 130

def query
  # Use the module function.
  attributes = manager.find(name)
  unless attributes
    @ldap_properties = {}
    return nil
  end

  @ldap_properties = attributes
  @ldap_properties.dup
end