puppet 0.9.2 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- data/CHANGELOG +58 -0
- data/README +21 -18
- data/Rakefile +176 -36
- data/bin/puppet +34 -48
- data/bin/puppetca +41 -28
- data/bin/puppetd +87 -65
- data/bin/puppetdoc +99 -23
- data/bin/puppetmasterd +72 -91
- data/conf/redhat/client.init +80 -0
- data/conf/redhat/client.sysconfig +11 -0
- data/conf/redhat/fileserver.conf +12 -0
- data/conf/redhat/puppet.spec +130 -0
- data/conf/redhat/server.init +89 -0
- data/conf/redhat/server.sysconfig +9 -0
- data/examples/code/allatonce +2 -2
- data/examples/code/assignments +1 -1
- data/examples/code/classing +2 -2
- data/examples/code/components +2 -2
- data/examples/code/file.bl +5 -5
- data/examples/code/filedefaults +2 -2
- data/examples/code/fileparsing +1 -1
- data/examples/code/filerecursion +1 -1
- data/examples/code/functions +1 -1
- data/examples/code/groups +1 -1
- data/examples/code/importing +1 -1
- data/examples/code/nodes +1 -1
- data/examples/code/one +1 -1
- data/examples/code/relationships +2 -2
- data/examples/code/simpletests +5 -5
- data/examples/code/snippets/argumentdefaults +2 -2
- data/examples/code/snippets/casestatement +16 -8
- data/examples/code/snippets/classheirarchy.pp +4 -4
- data/examples/code/snippets/classincludes.pp +4 -4
- data/examples/code/snippets/classpathtest +2 -2
- data/examples/code/snippets/componentmetaparams.pp +11 -0
- data/examples/code/snippets/dirchmod +5 -5
- data/examples/code/snippets/emptyclass.pp +9 -0
- data/examples/code/snippets/failmissingexecpath.pp +1 -1
- data/examples/code/snippets/falsevalues.pp +1 -1
- data/examples/code/snippets/filecreate +5 -5
- data/examples/code/snippets/implicititeration +5 -5
- data/examples/code/snippets/multipleinstances +4 -4
- data/examples/code/snippets/namevartest +3 -3
- data/examples/code/snippets/scopetest +1 -1
- data/examples/code/snippets/selectorvalues.pp +3 -3
- data/examples/code/snippets/simpledefaults +2 -2
- data/examples/code/snippets/simpleselector +5 -5
- data/examples/code/snippets/singleary.pp +19 -0
- data/examples/root/etc/init.d/sleeper +3 -2
- data/ext/emacs/puppet-mode-init.el +6 -0
- data/ext/emacs/puppet-mode.el +189 -0
- data/ext/ldap/puppet.schema +17 -0
- data/ext/{module:puppet → module_puppet} +30 -31
- data/ext/vim/filetype.vim +9 -0
- data/ext/vim/puppet.vim +87 -0
- data/install.rb +63 -30
- data/lib/puppet.rb +216 -122
- data/lib/puppet/client.rb +51 -416
- data/lib/puppet/client/ca.rb +17 -0
- data/lib/puppet/client/dipper.rb +78 -0
- data/lib/puppet/client/file.rb +20 -0
- data/lib/puppet/client/log.rb +17 -0
- data/lib/puppet/client/master.rb +246 -0
- data/lib/puppet/client/proxy.rb +27 -0
- data/lib/puppet/client/status.rb +7 -0
- data/lib/puppet/config.rb +563 -13
- data/lib/puppet/daemon.rb +50 -22
- data/lib/puppet/element.rb +4 -4
- data/lib/puppet/event-loop.rb +1 -0
- data/lib/puppet/event-loop/better-definers.rb +367 -0
- data/lib/puppet/event-loop/event-loop.rb +355 -0
- data/lib/puppet/event-loop/signal-system.rb +220 -0
- data/lib/puppet/event.rb +9 -11
- data/lib/puppet/filetype.rb +195 -0
- data/lib/puppet/log.rb +35 -12
- data/lib/puppet/metric.rb +2 -2
- data/lib/puppet/networkclient.rb +145 -0
- data/lib/puppet/parameter.rb +335 -0
- data/lib/puppet/parser/ast.rb +42 -1453
- data/lib/puppet/parser/ast/astarray.rb +88 -0
- data/lib/puppet/parser/ast/branch.rb +47 -0
- data/lib/puppet/parser/ast/caseopt.rb +66 -0
- data/lib/puppet/parser/ast/casestatement.rb +78 -0
- data/lib/puppet/parser/ast/classdef.rb +78 -0
- data/lib/puppet/parser/ast/compdef.rb +111 -0
- data/lib/puppet/parser/ast/component.rb +105 -0
- data/lib/puppet/parser/ast/hostclass.rb +82 -0
- data/lib/puppet/parser/ast/leaf.rb +86 -0
- data/lib/puppet/parser/ast/node.rb +103 -0
- data/lib/puppet/parser/ast/nodedef.rb +68 -0
- data/lib/puppet/parser/ast/objectdef.rb +336 -0
- data/lib/puppet/parser/ast/objectparam.rb +30 -0
- data/lib/puppet/parser/ast/objectref.rb +76 -0
- data/lib/puppet/parser/ast/selector.rb +60 -0
- data/lib/puppet/parser/ast/typedefaults.rb +45 -0
- data/lib/puppet/parser/ast/vardef.rb +44 -0
- data/lib/puppet/parser/interpreter.rb +31 -14
- data/lib/puppet/parser/lexer.rb +2 -4
- data/lib/puppet/parser/parser.rb +332 -242
- data/lib/puppet/parser/scope.rb +55 -38
- data/lib/puppet/server.rb +43 -44
- data/lib/puppet/server/authstore.rb +3 -6
- data/lib/puppet/server/ca.rb +5 -2
- data/lib/puppet/server/filebucket.rb +2 -4
- data/lib/puppet/server/fileserver.rb +28 -12
- data/lib/puppet/server/logger.rb +15 -4
- data/lib/puppet/server/master.rb +62 -7
- data/lib/puppet/sslcertificates.rb +41 -607
- data/lib/puppet/sslcertificates/ca.rb +291 -0
- data/lib/puppet/sslcertificates/certificate.rb +283 -0
- data/lib/puppet/statechange.rb +6 -1
- data/lib/puppet/storage.rb +67 -56
- data/lib/puppet/transaction.rb +25 -9
- data/lib/puppet/transportable.rb +102 -22
- data/lib/puppet/type.rb +1096 -315
- data/lib/puppet/type/component.rb +30 -21
- data/lib/puppet/type/cron.rb +409 -448
- data/lib/puppet/type/exec.rb +234 -174
- data/lib/puppet/type/group.rb +65 -82
- data/lib/puppet/type/nameservice.rb +247 -3
- data/lib/puppet/type/nameservice/netinfo.rb +29 -40
- data/lib/puppet/type/nameservice/objectadd.rb +52 -66
- data/lib/puppet/type/nameservice/posix.rb +6 -194
- data/lib/puppet/type/package.rb +447 -295
- data/lib/puppet/type/package/apt.rb +51 -50
- data/lib/puppet/type/package/bsd.rb +82 -0
- data/lib/puppet/type/package/dpkg.rb +85 -88
- data/lib/puppet/type/package/rpm.rb +67 -63
- data/lib/puppet/type/package/sun.rb +119 -98
- data/lib/puppet/type/package/yum.rb +41 -37
- data/lib/puppet/type/parsedtype.rb +295 -0
- data/lib/puppet/type/parsedtype/host.rb +143 -0
- data/lib/puppet/type/parsedtype/port.rb +232 -0
- data/lib/puppet/type/parsedtype/sshkey.rb +129 -0
- data/lib/puppet/type/pfile.rb +484 -460
- data/lib/puppet/type/pfile/checksum.rb +237 -181
- data/lib/puppet/type/pfile/content.rb +67 -0
- data/lib/puppet/type/pfile/ensure.rb +212 -0
- data/lib/puppet/type/pfile/group.rb +106 -105
- data/lib/puppet/type/pfile/mode.rb +98 -101
- data/lib/puppet/type/pfile/source.rb +228 -209
- data/lib/puppet/type/pfile/type.rb +18 -21
- data/lib/puppet/type/pfile/uid.rb +127 -130
- data/lib/puppet/type/pfilebucket.rb +68 -63
- data/lib/puppet/type/schedule.rb +341 -0
- data/lib/puppet/type/service.rb +351 -255
- data/lib/puppet/type/service/base.rb +9 -14
- data/lib/puppet/type/service/debian.rb +32 -38
- data/lib/puppet/type/service/init.rb +130 -130
- data/lib/puppet/type/service/smf.rb +48 -20
- data/lib/puppet/type/state.rb +229 -16
- data/lib/puppet/type/symlink.rb +51 -63
- data/lib/puppet/type/tidy.rb +105 -102
- data/lib/puppet/type/user.rb +118 -180
- data/lib/puppet/util.rb +100 -6
- data/test/certmgr/certmgr.rb +0 -1
- data/test/client/client.rb +4 -4
- data/test/executables/puppetbin.rb +7 -14
- data/test/executables/puppetca.rb +18 -24
- data/test/executables/puppetd.rb +7 -16
- data/test/executables/puppetmasterd.rb +7 -9
- data/test/executables/puppetmodule.rb +11 -16
- data/test/language/ast.rb +11 -7
- data/test/language/interpreter.rb +1 -1
- data/test/language/scope.rb +2 -0
- data/test/language/snippets.rb +30 -5
- data/test/language/transportable.rb +77 -0
- data/test/other/config.rb +316 -0
- data/test/other/events.rb +22 -21
- data/test/other/log.rb +14 -14
- data/test/other/metrics.rb +4 -8
- data/test/other/overrides.rb +5 -5
- data/test/other/relationships.rb +4 -2
- data/test/other/storage.rb +64 -3
- data/test/other/transactions.rb +20 -20
- data/test/parser/parser.rb +7 -4
- data/test/puppet/conffiles.rb +12 -12
- data/test/puppet/defaults.rb +13 -11
- data/test/puppet/utiltest.rb +14 -11
- data/test/puppettest.rb +156 -48
- data/test/server/bucket.rb +2 -2
- data/test/server/fileserver.rb +6 -6
- data/test/server/logger.rb +19 -11
- data/test/server/master.rb +33 -4
- data/test/server/server.rb +2 -7
- data/test/types/basic.rb +5 -7
- data/test/types/component.rb +22 -18
- data/test/types/cron.rb +111 -44
- data/test/types/exec.rb +116 -59
- data/test/types/file.rb +262 -137
- data/test/types/filebucket.rb +13 -15
- data/test/types/fileignoresource.rb +12 -16
- data/test/types/filesources.rb +73 -48
- data/test/types/filetype.rb +13 -15
- data/test/types/group.rb +15 -13
- data/test/types/host.rb +146 -0
- data/test/types/package.rb +74 -63
- data/test/types/port.rb +139 -0
- data/test/types/query.rb +8 -8
- data/test/types/schedule.rb +335 -0
- data/test/types/service.rb +137 -21
- data/test/types/sshkey.rb +140 -0
- data/test/types/symlink.rb +3 -5
- data/test/types/tidy.rb +5 -14
- data/test/types/type.rb +67 -11
- data/test/types/user.rb +25 -23
- metadata +186 -122
- data/lib/puppet/type/pfile/create.rb +0 -108
- data/lib/puppet/type/pprocess.rb +0 -97
- data/lib/puppet/type/typegen.rb +0 -149
- data/lib/puppet/type/typegen/filerecord.rb +0 -243
- data/lib/puppet/type/typegen/filetype.rb +0 -316
- data/test/other/state.rb +0 -106
data/lib/puppet/type/state.rb
CHANGED
@@ -4,29 +4,130 @@
|
|
4
4
|
require 'puppet'
|
5
5
|
require 'puppet/element'
|
6
6
|
require 'puppet/statechange'
|
7
|
+
require 'puppet/parameter'
|
7
8
|
|
8
9
|
module Puppet
|
9
|
-
class State < Puppet::
|
10
|
-
attr_accessor :is
|
10
|
+
class State < Puppet::Parameter
|
11
|
+
attr_accessor :is
|
11
12
|
|
12
13
|
# Because 'should' uses an array, we have a special method for handling
|
13
14
|
# it. We also want to keep copies of the original values, so that
|
14
15
|
# they can be retrieved and compared later when merging.
|
15
16
|
attr_reader :shouldorig
|
16
17
|
|
17
|
-
@virtual = true
|
18
|
-
|
19
18
|
class << self
|
20
19
|
attr_accessor :unmanaged
|
21
20
|
attr_reader :name
|
21
|
+
|
22
|
+
#def inspect
|
23
|
+
# "State(%s)" % self.name
|
24
|
+
#end
|
25
|
+
|
26
|
+
#def to_s
|
27
|
+
# self.inspect
|
28
|
+
#end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Parameters just use 'newvalues', since there's no work associated with them.
|
32
|
+
def self.newvalue(name, &block)
|
33
|
+
@parametervalues ||= {}
|
34
|
+
|
35
|
+
if @parametervalues.include?(name)
|
36
|
+
Puppet.warning "%s already has a value for %s" % [name, name]
|
37
|
+
end
|
38
|
+
@parametervalues[name] = block
|
39
|
+
|
40
|
+
define_method("set_" + name.to_s, &block)
|
22
41
|
end
|
42
|
+
#
|
43
|
+
# def self.aliasvalue(name, other)
|
44
|
+
# @statevalues ||= {}
|
45
|
+
# unless @statevalues.include?(other)
|
46
|
+
# raise Puppet::DevError, "Cannot alias nonexistent value %s" % other
|
47
|
+
# end
|
48
|
+
#
|
49
|
+
# @aliasvalues ||= {}
|
50
|
+
# @aliasvalues[name] = other
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# def self.alias(name)
|
54
|
+
# @aliasvalues[name]
|
55
|
+
# end
|
56
|
+
#
|
57
|
+
def self.defaultvalues
|
58
|
+
newvalue(:present) do
|
59
|
+
@parent.create
|
60
|
+
end
|
61
|
+
|
62
|
+
newvalue(:absent) do
|
63
|
+
@parent.destroy
|
64
|
+
end
|
65
|
+
|
66
|
+
# This doc will probably get overridden
|
67
|
+
@doc ||= "The basic state that the object should be in."
|
68
|
+
end
|
69
|
+
#
|
70
|
+
# # Return the list of valid values.
|
71
|
+
# def self.values
|
72
|
+
# @statevalues ||= {}
|
73
|
+
# @aliasvalues ||= {}
|
74
|
+
#
|
75
|
+
# #[@aliasvalues.keys, @statevalues.keys].flatten
|
76
|
+
# @statevalues.keys
|
77
|
+
# end
|
78
|
+
|
79
|
+
# Call the method associated with a given value.
|
80
|
+
def set
|
81
|
+
if self.insync?
|
82
|
+
self.log "already in sync"
|
83
|
+
return nil
|
84
|
+
end
|
85
|
+
|
86
|
+
value = self.should
|
87
|
+
method = "set_" + value.to_s
|
88
|
+
unless self.respond_to?(method)
|
89
|
+
self.fail "%s is not a valid value for %s" %
|
90
|
+
[value, self.class.name]
|
91
|
+
end
|
92
|
+
self.debug "setting %s (currently %s)" % [value, self.is]
|
23
93
|
|
94
|
+
begin
|
95
|
+
event = self.send(method)
|
96
|
+
rescue Puppet::Error
|
97
|
+
raise
|
98
|
+
rescue => detail
|
99
|
+
if Puppet[:debug]
|
100
|
+
puts detail.backtrace
|
101
|
+
end
|
102
|
+
self.fail "Could not set %s on %s: %s" %
|
103
|
+
[value, self.class.name, detail]
|
104
|
+
end
|
105
|
+
|
106
|
+
if event and event.is_a?(Symbol)
|
107
|
+
return event
|
108
|
+
else
|
109
|
+
# Return the appropriate event.
|
110
|
+
event = case self.should
|
111
|
+
when :present: (@parent.class.name.to_s + "_created").intern
|
112
|
+
when :absent: (@parent.class.name.to_s + "_removed").intern
|
113
|
+
else
|
114
|
+
(@parent.class.name.to_s + "_changed").intern
|
115
|
+
end
|
116
|
+
|
117
|
+
#self.log "made event %s because 'should' is %s, 'is' is %s" %
|
118
|
+
# [event, self.should.inspect, self.is.inspect]
|
119
|
+
|
120
|
+
return event
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
24
124
|
# initialize our state
|
25
125
|
def initialize(hash)
|
126
|
+
super()
|
26
127
|
@is = nil
|
27
128
|
|
28
129
|
unless hash.include?(:parent)
|
29
|
-
|
130
|
+
self.devfail "State %s was not passed a parent" % self
|
30
131
|
end
|
31
132
|
@parent = hash[:parent]
|
32
133
|
|
@@ -39,6 +140,21 @@ class State < Puppet::Element
|
|
39
140
|
end
|
40
141
|
end
|
41
142
|
|
143
|
+
def inspect
|
144
|
+
str = "State('%s', " % self.name
|
145
|
+
if defined? @is and @is
|
146
|
+
str += "@is = '%s', " % @is
|
147
|
+
else
|
148
|
+
str += "@is = nil, "
|
149
|
+
end
|
150
|
+
|
151
|
+
if defined? @should and @should
|
152
|
+
str += "@should = '%s')" % @should.join(", ")
|
153
|
+
else
|
154
|
+
str += "@should = nil)"
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
42
158
|
# Determine whether the state is in-sync or not. If @should is
|
43
159
|
# not defined or is set to a non-true value, then we do not have
|
44
160
|
# a valid value for it and thus consider the state to be in-sync
|
@@ -53,7 +169,7 @@ class State < Puppet::Element
|
|
53
169
|
end
|
54
170
|
|
55
171
|
unless @should.is_a?(Array)
|
56
|
-
|
172
|
+
self.devfail "%s's should is not array" % self.class.name
|
57
173
|
end
|
58
174
|
|
59
175
|
# an empty array is analogous to no should values
|
@@ -74,8 +190,9 @@ class State < Puppet::Element
|
|
74
190
|
|
75
191
|
def log(msg)
|
76
192
|
unless @parent[:loglevel]
|
77
|
-
|
78
|
-
|
193
|
+
p @parent
|
194
|
+
self.devfail "Parent %s has no loglevel" %
|
195
|
+
@parent.name
|
79
196
|
end
|
80
197
|
Puppet::Log.create(
|
81
198
|
:level => @parent[:loglevel],
|
@@ -112,8 +229,7 @@ class State < Puppet::Element
|
|
112
229
|
def should
|
113
230
|
if defined? @should
|
114
231
|
unless @should.is_a?(Array)
|
115
|
-
self.
|
116
|
-
raise Puppet::DevError, "should for %s on %s is not an array" %
|
232
|
+
self.devfail "should for %s on %s is not an array" %
|
117
233
|
[self.class.name, @parent.name]
|
118
234
|
end
|
119
235
|
return @should[0]
|
@@ -130,23 +246,78 @@ class State < Puppet::Element
|
|
130
246
|
|
131
247
|
@shouldorig = values
|
132
248
|
|
133
|
-
if self.respond_to?(:
|
249
|
+
if self.respond_to?(:validate)
|
250
|
+
values.each { |val|
|
251
|
+
validate(val)
|
252
|
+
}
|
253
|
+
end
|
254
|
+
if self.respond_to?(:munge)
|
134
255
|
@should = values.collect { |val|
|
135
|
-
self.
|
256
|
+
self.munge(val)
|
136
257
|
}
|
137
258
|
else
|
138
259
|
@should = values
|
139
260
|
end
|
140
261
|
end
|
141
262
|
|
263
|
+
# The default 'sync' method only selects among a list of registered
|
264
|
+
# values.
|
265
|
+
def sync
|
266
|
+
if self.insync?
|
267
|
+
self.info "already in sync"
|
268
|
+
return nil
|
269
|
+
#else
|
270
|
+
#self.info "%s vs %s" % [self.is.inspect, self.should.inspect]
|
271
|
+
end
|
272
|
+
unless self.class.values
|
273
|
+
self.devfail "No values defined for %s" %
|
274
|
+
self.class.name
|
275
|
+
end
|
276
|
+
|
277
|
+
# Set ourselves to whatever our should value is.
|
278
|
+
self.set
|
279
|
+
end
|
280
|
+
|
281
|
+
# munge do |value|
|
282
|
+
# if self.class.values.empty?
|
283
|
+
# # This state isn't using defined values to do its work.
|
284
|
+
# return value
|
285
|
+
# end
|
286
|
+
# intern = value.to_s.intern
|
287
|
+
# # If it's a valid value, always return it as a symbol.
|
288
|
+
# if self.class.values.include?(intern)
|
289
|
+
# retval = intern
|
290
|
+
# elsif other = self.class.alias(intern)
|
291
|
+
# self.info "returning alias %s for %s" % [other, intern]
|
292
|
+
# retval = other
|
293
|
+
# else
|
294
|
+
# retval = value
|
295
|
+
# end
|
296
|
+
# retval
|
297
|
+
# end
|
298
|
+
#
|
299
|
+
# # Verify that the passed value is valid.
|
300
|
+
# validate do |value|
|
301
|
+
# if self.class.values.empty?
|
302
|
+
# # This state isn't using defined values to do its work.
|
303
|
+
# return
|
304
|
+
# end
|
305
|
+
# unless value.is_a?(Symbol)
|
306
|
+
# value = value.to_s.intern
|
307
|
+
# end
|
308
|
+
# unless self.class.values.include?(value) or self.class.alias(value)
|
309
|
+
# self.fail "Invalid '%s' value '%s'. Valid values are '%s'" %
|
310
|
+
# [self.class.name, value, self.class.values.join(", ")]
|
311
|
+
# end
|
312
|
+
# end
|
142
313
|
|
143
314
|
# How should a state change be printed as a string?
|
144
315
|
def change_to_s
|
145
316
|
begin
|
146
|
-
if @is == :
|
317
|
+
if @is == :absent
|
147
318
|
return "defined '%s' as '%s'" %
|
148
319
|
[self.name, self.should_to_s]
|
149
|
-
elsif self.should == :
|
320
|
+
elsif self.should == :absent
|
150
321
|
return "undefined %s from '%s'" %
|
151
322
|
[self.name, self.is_to_s]
|
152
323
|
else
|
@@ -170,13 +341,55 @@ class State < Puppet::Element
|
|
170
341
|
end
|
171
342
|
|
172
343
|
def should_to_s
|
173
|
-
@should
|
344
|
+
@should.join(" ")
|
174
345
|
end
|
175
346
|
|
176
347
|
def to_s
|
177
348
|
return "%s(%s)" % [@parent.name,self.name]
|
178
349
|
end
|
350
|
+
|
351
|
+
# This state will get automatically added to any type that responds
|
352
|
+
# to the methods 'exists?', 'create', and 'remove'.
|
353
|
+
class Ensure < Puppet::State
|
354
|
+
@name = :ensure
|
355
|
+
|
356
|
+
def self.inherited(sub)
|
357
|
+
# Add in the two states that everyone will have.
|
358
|
+
sub.class_eval do
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
def change_to_s
|
363
|
+
begin
|
364
|
+
if @is == :absent
|
365
|
+
return "created"
|
366
|
+
elsif self.should == :absent
|
367
|
+
return "removed"
|
368
|
+
else
|
369
|
+
return "%s changed '%s' to '%s'" %
|
370
|
+
[self.name, self.is_to_s, self.should_to_s]
|
371
|
+
end
|
372
|
+
rescue Puppet::Error, Puppet::DevError
|
373
|
+
raise
|
374
|
+
rescue => detail
|
375
|
+
raise Puppet::DevError, "Could not convert change %s to string: %s" %
|
376
|
+
[self.name, detail]
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
def retrieve
|
381
|
+
if @parent.exists?
|
382
|
+
@is = :present
|
383
|
+
else
|
384
|
+
@is = :absent
|
385
|
+
end
|
386
|
+
end
|
387
|
+
|
388
|
+
# If they're talking about the thing at all, they generally want to
|
389
|
+
# say it should exist.
|
390
|
+
defaultto :present
|
391
|
+
end
|
179
392
|
end
|
180
393
|
end
|
181
394
|
|
182
|
-
# $Id: state.rb
|
395
|
+
# $Id: state.rb 883 2006-02-08 16:53:34Z luke $
|
data/lib/puppet/type/symlink.rb
CHANGED
@@ -1,16 +1,11 @@
|
|
1
|
-
#!/usr/local/bin/ruby -w
|
2
|
-
|
3
|
-
# $Id: symlink.rb 731 2005-10-26 04:44:25Z luke $
|
4
|
-
|
5
1
|
require 'etc'
|
6
2
|
require 'puppet/type/state'
|
7
3
|
require 'puppet/type/pfile'
|
8
4
|
|
9
5
|
module Puppet
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
class SymlinkTarget < Puppet::State
|
6
|
+
newtype(:symlink) do
|
7
|
+
@doc = "Create symbolic links to existing files."
|
8
|
+
newstate(:target) do
|
14
9
|
require 'etc'
|
15
10
|
attr_accessor :file
|
16
11
|
|
@@ -22,15 +17,15 @@ module Puppet
|
|
22
17
|
|
23
18
|
def create
|
24
19
|
begin
|
25
|
-
debug("Creating symlink '%s' to '%s'" %
|
20
|
+
@parent.debug("Creating symlink '%s' to '%s'" %
|
26
21
|
[self.parent[:path],self.should])
|
27
22
|
unless File.symlink(self.should,self.parent[:path])
|
28
|
-
|
29
|
-
self.parent[:path]
|
23
|
+
self.fail "Could not create symlink '%s'" %
|
24
|
+
self.parent[:path]
|
30
25
|
end
|
31
26
|
rescue => detail
|
32
|
-
|
33
|
-
[self.parent[:path],detail]
|
27
|
+
self.fail "Cannot create symlink '%s': %s" %
|
28
|
+
[self.parent[:path],detail]
|
34
29
|
end
|
35
30
|
end
|
36
31
|
|
@@ -40,14 +35,14 @@ module Puppet
|
|
40
35
|
begin
|
41
36
|
File.unlink(self.parent[:path])
|
42
37
|
rescue
|
43
|
-
|
44
|
-
self.parent[:path]
|
38
|
+
self.fail "Failed to remove symlink '%s'" %
|
39
|
+
self.parent[:path]
|
45
40
|
end
|
46
41
|
elsif FileTest.exists?(self.parent[:path])
|
47
|
-
|
48
|
-
self.parent[:path]
|
42
|
+
self.fail "Cannot remove normal file '%s'" %
|
43
|
+
self.parent[:path]
|
49
44
|
else
|
50
|
-
debug("Symlink '%s' does not exist" %
|
45
|
+
@parent.debug("Symlink '%s' does not exist" %
|
51
46
|
self.parent[:path])
|
52
47
|
end
|
53
48
|
end
|
@@ -78,8 +73,8 @@ module Puppet
|
|
78
73
|
self.create()
|
79
74
|
end
|
80
75
|
elsif FileTest.exists?(self.parent[:path])
|
81
|
-
|
82
|
-
self.parent[:path]
|
76
|
+
self.fail "Cannot replace normal file '%s'" %
|
77
|
+
self.parent[:path]
|
83
78
|
else
|
84
79
|
self.create()
|
85
80
|
end
|
@@ -88,46 +83,37 @@ module Puppet
|
|
88
83
|
#self.parent.newevent(:event => :inode_changed)
|
89
84
|
end
|
90
85
|
end
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
Puppet::State::SymlinkTarget
|
99
|
-
]
|
100
|
-
|
101
|
-
@parameters = [
|
102
|
-
:path,
|
103
|
-
:recurse
|
104
|
-
]
|
105
|
-
|
106
|
-
@paramdoc[:path] = "Path of link to create."
|
107
|
-
@paramdoc[:recurse] = "If target is a directory, recursively create
|
86
|
+
|
87
|
+
attr_reader :stat, :path, :params
|
88
|
+
|
89
|
+
copyparam(Puppet.type(:file), :path)
|
90
|
+
|
91
|
+
newparam(:recurse) do
|
92
|
+
desc "If target is a directory, recursively create
|
108
93
|
directories (using `file`'s `source` parameter) and link all
|
109
|
-
contained files.
|
110
|
-
@doc = "Create symbolic links to existing files."
|
111
|
-
@name = :symlink
|
112
|
-
@namevar = :path
|
94
|
+
contained files. For instance::
|
113
95
|
|
114
|
-
|
115
|
-
|
116
|
-
|
96
|
+
# The Solaris Blastwave repository installs everything
|
97
|
+
# in /opt/csw; link it into /usr/local
|
98
|
+
symlink { \"/usr/local\":
|
99
|
+
target => \"/opt/csw\",
|
100
|
+
recurse => 1
|
101
|
+
}
|
117
102
|
|
118
|
-
super
|
119
|
-
end
|
120
103
|
|
121
|
-
|
104
|
+
Note that this does not link directories -- any directories
|
105
|
+
are created in the destination, and any files are linked over."
|
106
|
+
|
107
|
+
munge do |value|
|
122
108
|
@stat = nil
|
123
|
-
@target =
|
109
|
+
@target = @parent.state(:target).should
|
124
110
|
|
125
111
|
# we want to remove our state, because we're creating children
|
126
112
|
# to do the links
|
127
113
|
if FileTest.exist?(@target)
|
128
114
|
@stat = File.stat(@target)
|
129
115
|
else
|
130
|
-
|
116
|
+
@parent.info "Target %s must exist for recursive links" %
|
131
117
|
@target
|
132
118
|
return
|
133
119
|
end
|
@@ -138,7 +124,7 @@ module Puppet
|
|
138
124
|
return
|
139
125
|
end
|
140
126
|
|
141
|
-
|
127
|
+
@parent.delete(:target)
|
142
128
|
|
143
129
|
recurse = value
|
144
130
|
# we might have a string, rather than a number
|
@@ -161,23 +147,25 @@ module Puppet
|
|
161
147
|
# working in pfile
|
162
148
|
|
163
149
|
args = {
|
164
|
-
:name =>
|
150
|
+
:name => @parent.name,
|
165
151
|
:linkmaker => true,
|
166
152
|
:recurse => recurse,
|
167
153
|
:source => @target
|
168
154
|
}
|
169
155
|
|
170
|
-
dir = Puppet
|
171
|
-
dir.parent =
|
172
|
-
|
173
|
-
|
174
|
-
#Dir.foreach(@target) { |file|
|
175
|
-
# next if file =~ /^\.\.?$/ # skip . and ..
|
176
|
-
# newtarget = File.join(@target,file)
|
177
|
-
# #stat = File.stat(File.join(@target,file))
|
178
|
-
# self.newchild(file, :target => newtarget)
|
179
|
-
#}
|
156
|
+
dir = Puppet.type(:file).implicitcreate(args)
|
157
|
+
dir.parent = @parent
|
158
|
+
@parent.debug "Got dir %s" % dir.name
|
159
|
+
@parent.push dir
|
180
160
|
end
|
181
|
-
end
|
182
|
-
|
161
|
+
end
|
162
|
+
|
163
|
+
def initialize(hash)
|
164
|
+
@arghash = self.argclean(hash.dup)
|
165
|
+
@arghash.delete(self.class.namevar)
|
166
|
+
super
|
167
|
+
end
|
168
|
+
end # Puppet.type(:symlink)
|
183
169
|
end
|
170
|
+
|
171
|
+
# $Id: symlink.rb 841 2006-01-18 17:24:15Z luke $
|