5
5
# provides a way for them all to be as similar as possible.
6
6
class Puppet::Provider::NameService < Puppet::Provider
8
def autogen_default(param)
9
if defined? @autogen_defaults
10
return @autogen_defaults[symbolize(param)]
16
def autogen_defaults(hash)
17
@autogen_defaults ||= {}
18
hash.each do |param, value|
19
@autogen_defaults[symbolize(param)] = value
11
30
listbyname do |name|
13
check = model.validstates
17
# unless it exists, create it as an unmanaged object
18
obj = model.create(:name => name, :check => check)
21
next unless obj # In case there was an error somewhere
24
yield obj if block_given?
31
objects << new(:name => name, :ensure => :present)
39
46
def options(name, hash)
40
unless model.validattr?(name)
47
unless resource_type.validattr?(name)
41
48
raise Puppet::DevError, "%s is not a valid attribute for %s" %
49
[name, resource_type.name]
45
52
@options[name] ||= {}
80
def resource_type=(resource_type)
82
@resource_type.validproperties.each do |prop|
83
next if prop == :ensure
84
unless public_method_defined?(prop)
85
define_method(prop) { get(prop) || :absent}
87
unless public_method_defined?(prop.to_s + "=")
88
define_method(prop.to_s + "=") { |*vals| set(prop, *vals) }
73
93
# This is annoying, but there really aren't that many options,
74
94
# and this *is* built into Ruby.
76
unless defined? @model
96
unless defined? @resource_type
77
97
raise Puppet::DevError,
78
"Cannot determine Etc section without a model"
98
"Cannot determine Etc section without a resource type"
82
if @model.name == :group
102
if @resource_type.name == :group
89
def disabled_validate(name, value)
109
def validate(name, value)
90
110
name = name.intern if name.is_a? String
91
111
if @checks.include? name
92
112
block = @checks[name][:block]
100
120
def verify(name, error, &block)
101
121
name = name.intern if name.is_a? String
103
122
@checks[name] = {:error => error, :block => block}
109
@ops[state.name] || ("-" + state.name)
128
@ops[property.name] || ("-" + property.name)
132
# Autogenerate a value. Mostly used for uid/gid, but also used heavily
133
# with netinfo, because netinfo is stupid.
135
field = symbolize(field)
136
id_generators = {:user => :uid, :group => :gid}
137
if id_generators[@resource.class.name] == field
138
return autogen_id(field)
140
if value = self.class.autogen_default(field)
142
elsif respond_to?("autogen_%s" % [field])
143
return send("autogen_%s" % field)
113
150
# Autogenerate either a uid or a gid. This is hard-coded: we can only
114
151
# generate one field type per class.
152
def autogen_id(field)
118
155
group = method = nil
119
case @model.class.name
156
case @resource.class.name
120
157
when :user: group = :passwd; method = :uid
121
158
when :group: group = :group; method = :gid
123
raise Puppet::DevError, "Invalid model name %s" % model
160
raise Puppet::DevError, "Invalid resource name %s" % resource
126
163
# Make sure we don't use the same value multiple times
199
228
rescue Puppet::ExecutionFailure => detail
200
229
raise Puppet::Error, "Could not %s %s %s: %s" %
201
[type, @model.class.name, @model.name, detail]
230
[type, @resource.class.name, @resource.name, detail]
225
254
if @objectinfo.nil? or refresh == true
226
255
@etcmethod ||= ("get" + self.class.section().to_s + "nam").intern
228
@objectinfo = Etc.send(@etcmethod, @model[:name])
257
@objectinfo = Etc.send(@etcmethod, @resource[:name])
229
258
rescue ArgumentError => detail
230
259
@objectinfo = nil
269
298
# Convert the Etc struct into a hash.
270
299
def info2hash(info)
272
self.class.model.validstates.each do |param|
301
self.class.resource_type.validproperties.each do |param|
273
302
method = posixmethod(param)
274
303
if info.respond_to? method
275
304
hash[param] = info.send(posixmethod(param))
282
def initialize(model)
311
def initialize(resource)
285
314
@objectinfo = nil
289
def method_missing(name, *args)
292
# Make sure it's a valid state. We go up our class structure instead of
293
# our model's because the model is fake during testing.
294
unless self.class.model.validstate?(name.sub("=",''))
295
raise Puppet::DevError, "%s is not a valid %s state" %
296
[name, @model.class.name]
299
# Each class has to override this manually
301
set(name.to_s.sub("=", ''), *args)
303
return get(name.intern) || :absent
307
317
def set(param, value)
308
#self.class.validate(param, value)
318
self.class.validate(param, value)
309
319
cmd = modifycmd(param, value)
320
unless cmd.is_a?(Array)
321
raise Puppet::DevError, "Nameservice command must be an array"
312
325
rescue Puppet::ExecutionFailure => detail
313
raise Puppet::Error, "Could not set %s on %s[%s]: %s" %
314
[param, @model.class.name, @model.name, detail]
326
raise Puppet::Error, "Could not set %s on %s[%s]: %s" % [param, @resource.class.name, @resource.name, detail]
319
# $Id: nameservice.rb 1860 2006-11-12 21:25:13Z luke $