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.

Files changed (213) hide show
  1. data/CHANGELOG +58 -0
  2. data/README +21 -18
  3. data/Rakefile +176 -36
  4. data/bin/puppet +34 -48
  5. data/bin/puppetca +41 -28
  6. data/bin/puppetd +87 -65
  7. data/bin/puppetdoc +99 -23
  8. data/bin/puppetmasterd +72 -91
  9. data/conf/redhat/client.init +80 -0
  10. data/conf/redhat/client.sysconfig +11 -0
  11. data/conf/redhat/fileserver.conf +12 -0
  12. data/conf/redhat/puppet.spec +130 -0
  13. data/conf/redhat/server.init +89 -0
  14. data/conf/redhat/server.sysconfig +9 -0
  15. data/examples/code/allatonce +2 -2
  16. data/examples/code/assignments +1 -1
  17. data/examples/code/classing +2 -2
  18. data/examples/code/components +2 -2
  19. data/examples/code/file.bl +5 -5
  20. data/examples/code/filedefaults +2 -2
  21. data/examples/code/fileparsing +1 -1
  22. data/examples/code/filerecursion +1 -1
  23. data/examples/code/functions +1 -1
  24. data/examples/code/groups +1 -1
  25. data/examples/code/importing +1 -1
  26. data/examples/code/nodes +1 -1
  27. data/examples/code/one +1 -1
  28. data/examples/code/relationships +2 -2
  29. data/examples/code/simpletests +5 -5
  30. data/examples/code/snippets/argumentdefaults +2 -2
  31. data/examples/code/snippets/casestatement +16 -8
  32. data/examples/code/snippets/classheirarchy.pp +4 -4
  33. data/examples/code/snippets/classincludes.pp +4 -4
  34. data/examples/code/snippets/classpathtest +2 -2
  35. data/examples/code/snippets/componentmetaparams.pp +11 -0
  36. data/examples/code/snippets/dirchmod +5 -5
  37. data/examples/code/snippets/emptyclass.pp +9 -0
  38. data/examples/code/snippets/failmissingexecpath.pp +1 -1
  39. data/examples/code/snippets/falsevalues.pp +1 -1
  40. data/examples/code/snippets/filecreate +5 -5
  41. data/examples/code/snippets/implicititeration +5 -5
  42. data/examples/code/snippets/multipleinstances +4 -4
  43. data/examples/code/snippets/namevartest +3 -3
  44. data/examples/code/snippets/scopetest +1 -1
  45. data/examples/code/snippets/selectorvalues.pp +3 -3
  46. data/examples/code/snippets/simpledefaults +2 -2
  47. data/examples/code/snippets/simpleselector +5 -5
  48. data/examples/code/snippets/singleary.pp +19 -0
  49. data/examples/root/etc/init.d/sleeper +3 -2
  50. data/ext/emacs/puppet-mode-init.el +6 -0
  51. data/ext/emacs/puppet-mode.el +189 -0
  52. data/ext/ldap/puppet.schema +17 -0
  53. data/ext/{module:puppet → module_puppet} +30 -31
  54. data/ext/vim/filetype.vim +9 -0
  55. data/ext/vim/puppet.vim +87 -0
  56. data/install.rb +63 -30
  57. data/lib/puppet.rb +216 -122
  58. data/lib/puppet/client.rb +51 -416
  59. data/lib/puppet/client/ca.rb +17 -0
  60. data/lib/puppet/client/dipper.rb +78 -0
  61. data/lib/puppet/client/file.rb +20 -0
  62. data/lib/puppet/client/log.rb +17 -0
  63. data/lib/puppet/client/master.rb +246 -0
  64. data/lib/puppet/client/proxy.rb +27 -0
  65. data/lib/puppet/client/status.rb +7 -0
  66. data/lib/puppet/config.rb +563 -13
  67. data/lib/puppet/daemon.rb +50 -22
  68. data/lib/puppet/element.rb +4 -4
  69. data/lib/puppet/event-loop.rb +1 -0
  70. data/lib/puppet/event-loop/better-definers.rb +367 -0
  71. data/lib/puppet/event-loop/event-loop.rb +355 -0
  72. data/lib/puppet/event-loop/signal-system.rb +220 -0
  73. data/lib/puppet/event.rb +9 -11
  74. data/lib/puppet/filetype.rb +195 -0
  75. data/lib/puppet/log.rb +35 -12
  76. data/lib/puppet/metric.rb +2 -2
  77. data/lib/puppet/networkclient.rb +145 -0
  78. data/lib/puppet/parameter.rb +335 -0
  79. data/lib/puppet/parser/ast.rb +42 -1453
  80. data/lib/puppet/parser/ast/astarray.rb +88 -0
  81. data/lib/puppet/parser/ast/branch.rb +47 -0
  82. data/lib/puppet/parser/ast/caseopt.rb +66 -0
  83. data/lib/puppet/parser/ast/casestatement.rb +78 -0
  84. data/lib/puppet/parser/ast/classdef.rb +78 -0
  85. data/lib/puppet/parser/ast/compdef.rb +111 -0
  86. data/lib/puppet/parser/ast/component.rb +105 -0
  87. data/lib/puppet/parser/ast/hostclass.rb +82 -0
  88. data/lib/puppet/parser/ast/leaf.rb +86 -0
  89. data/lib/puppet/parser/ast/node.rb +103 -0
  90. data/lib/puppet/parser/ast/nodedef.rb +68 -0
  91. data/lib/puppet/parser/ast/objectdef.rb +336 -0
  92. data/lib/puppet/parser/ast/objectparam.rb +30 -0
  93. data/lib/puppet/parser/ast/objectref.rb +76 -0
  94. data/lib/puppet/parser/ast/selector.rb +60 -0
  95. data/lib/puppet/parser/ast/typedefaults.rb +45 -0
  96. data/lib/puppet/parser/ast/vardef.rb +44 -0
  97. data/lib/puppet/parser/interpreter.rb +31 -14
  98. data/lib/puppet/parser/lexer.rb +2 -4
  99. data/lib/puppet/parser/parser.rb +332 -242
  100. data/lib/puppet/parser/scope.rb +55 -38
  101. data/lib/puppet/server.rb +43 -44
  102. data/lib/puppet/server/authstore.rb +3 -6
  103. data/lib/puppet/server/ca.rb +5 -2
  104. data/lib/puppet/server/filebucket.rb +2 -4
  105. data/lib/puppet/server/fileserver.rb +28 -12
  106. data/lib/puppet/server/logger.rb +15 -4
  107. data/lib/puppet/server/master.rb +62 -7
  108. data/lib/puppet/sslcertificates.rb +41 -607
  109. data/lib/puppet/sslcertificates/ca.rb +291 -0
  110. data/lib/puppet/sslcertificates/certificate.rb +283 -0
  111. data/lib/puppet/statechange.rb +6 -1
  112. data/lib/puppet/storage.rb +67 -56
  113. data/lib/puppet/transaction.rb +25 -9
  114. data/lib/puppet/transportable.rb +102 -22
  115. data/lib/puppet/type.rb +1096 -315
  116. data/lib/puppet/type/component.rb +30 -21
  117. data/lib/puppet/type/cron.rb +409 -448
  118. data/lib/puppet/type/exec.rb +234 -174
  119. data/lib/puppet/type/group.rb +65 -82
  120. data/lib/puppet/type/nameservice.rb +247 -3
  121. data/lib/puppet/type/nameservice/netinfo.rb +29 -40
  122. data/lib/puppet/type/nameservice/objectadd.rb +52 -66
  123. data/lib/puppet/type/nameservice/posix.rb +6 -194
  124. data/lib/puppet/type/package.rb +447 -295
  125. data/lib/puppet/type/package/apt.rb +51 -50
  126. data/lib/puppet/type/package/bsd.rb +82 -0
  127. data/lib/puppet/type/package/dpkg.rb +85 -88
  128. data/lib/puppet/type/package/rpm.rb +67 -63
  129. data/lib/puppet/type/package/sun.rb +119 -98
  130. data/lib/puppet/type/package/yum.rb +41 -37
  131. data/lib/puppet/type/parsedtype.rb +295 -0
  132. data/lib/puppet/type/parsedtype/host.rb +143 -0
  133. data/lib/puppet/type/parsedtype/port.rb +232 -0
  134. data/lib/puppet/type/parsedtype/sshkey.rb +129 -0
  135. data/lib/puppet/type/pfile.rb +484 -460
  136. data/lib/puppet/type/pfile/checksum.rb +237 -181
  137. data/lib/puppet/type/pfile/content.rb +67 -0
  138. data/lib/puppet/type/pfile/ensure.rb +212 -0
  139. data/lib/puppet/type/pfile/group.rb +106 -105
  140. data/lib/puppet/type/pfile/mode.rb +98 -101
  141. data/lib/puppet/type/pfile/source.rb +228 -209
  142. data/lib/puppet/type/pfile/type.rb +18 -21
  143. data/lib/puppet/type/pfile/uid.rb +127 -130
  144. data/lib/puppet/type/pfilebucket.rb +68 -63
  145. data/lib/puppet/type/schedule.rb +341 -0
  146. data/lib/puppet/type/service.rb +351 -255
  147. data/lib/puppet/type/service/base.rb +9 -14
  148. data/lib/puppet/type/service/debian.rb +32 -38
  149. data/lib/puppet/type/service/init.rb +130 -130
  150. data/lib/puppet/type/service/smf.rb +48 -20
  151. data/lib/puppet/type/state.rb +229 -16
  152. data/lib/puppet/type/symlink.rb +51 -63
  153. data/lib/puppet/type/tidy.rb +105 -102
  154. data/lib/puppet/type/user.rb +118 -180
  155. data/lib/puppet/util.rb +100 -6
  156. data/test/certmgr/certmgr.rb +0 -1
  157. data/test/client/client.rb +4 -4
  158. data/test/executables/puppetbin.rb +7 -14
  159. data/test/executables/puppetca.rb +18 -24
  160. data/test/executables/puppetd.rb +7 -16
  161. data/test/executables/puppetmasterd.rb +7 -9
  162. data/test/executables/puppetmodule.rb +11 -16
  163. data/test/language/ast.rb +11 -7
  164. data/test/language/interpreter.rb +1 -1
  165. data/test/language/scope.rb +2 -0
  166. data/test/language/snippets.rb +30 -5
  167. data/test/language/transportable.rb +77 -0
  168. data/test/other/config.rb +316 -0
  169. data/test/other/events.rb +22 -21
  170. data/test/other/log.rb +14 -14
  171. data/test/other/metrics.rb +4 -8
  172. data/test/other/overrides.rb +5 -5
  173. data/test/other/relationships.rb +4 -2
  174. data/test/other/storage.rb +64 -3
  175. data/test/other/transactions.rb +20 -20
  176. data/test/parser/parser.rb +7 -4
  177. data/test/puppet/conffiles.rb +12 -12
  178. data/test/puppet/defaults.rb +13 -11
  179. data/test/puppet/utiltest.rb +14 -11
  180. data/test/puppettest.rb +156 -48
  181. data/test/server/bucket.rb +2 -2
  182. data/test/server/fileserver.rb +6 -6
  183. data/test/server/logger.rb +19 -11
  184. data/test/server/master.rb +33 -4
  185. data/test/server/server.rb +2 -7
  186. data/test/types/basic.rb +5 -7
  187. data/test/types/component.rb +22 -18
  188. data/test/types/cron.rb +111 -44
  189. data/test/types/exec.rb +116 -59
  190. data/test/types/file.rb +262 -137
  191. data/test/types/filebucket.rb +13 -15
  192. data/test/types/fileignoresource.rb +12 -16
  193. data/test/types/filesources.rb +73 -48
  194. data/test/types/filetype.rb +13 -15
  195. data/test/types/group.rb +15 -13
  196. data/test/types/host.rb +146 -0
  197. data/test/types/package.rb +74 -63
  198. data/test/types/port.rb +139 -0
  199. data/test/types/query.rb +8 -8
  200. data/test/types/schedule.rb +335 -0
  201. data/test/types/service.rb +137 -21
  202. data/test/types/sshkey.rb +140 -0
  203. data/test/types/symlink.rb +3 -5
  204. data/test/types/tidy.rb +5 -14
  205. data/test/types/type.rb +67 -11
  206. data/test/types/user.rb +25 -23
  207. metadata +186 -122
  208. data/lib/puppet/type/pfile/create.rb +0 -108
  209. data/lib/puppet/type/pprocess.rb +0 -97
  210. data/lib/puppet/type/typegen.rb +0 -149
  211. data/lib/puppet/type/typegen/filerecord.rb +0 -243
  212. data/lib/puppet/type/typegen/filetype.rb +0 -316
  213. data/test/other/state.rb +0 -106
@@ -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::Element
10
- attr_accessor :is, :parent
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
- raise Puppet::DevError, "State %s was not passed a parent" % self
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
- raise Puppet::DevError, "%s's should is not array" % self.class.name
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
- raise Puppet::DevError, "Parent %s has no loglevel" %
78
- @parent.to_s
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.warning @should.inspect
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?(:shouldprocess)
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.shouldprocess(val)
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 == :notfound
317
+ if @is == :absent
147
318
  return "defined '%s' as '%s'" %
148
319
  [self.name, self.should_to_s]
149
- elsif self.should == :notfound
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 749 2005-11-22 05:33:42Z luke $
395
+ # $Id: state.rb 883 2006-02-08 16:53:34Z luke $
@@ -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
- # okay, how do we deal with parameters that don't have operations
11
- # associated with them?
12
- class State
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
- raise TypeError.new("Could not create symlink '%s'" %
29
- self.parent[:path])
23
+ self.fail "Could not create symlink '%s'" %
24
+ self.parent[:path]
30
25
  end
31
26
  rescue => detail
32
- raise TypeError.new("Cannot create symlink '%s': %s" %
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
- raise TypeError.new("Failed to remove symlink '%s'" %
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
- raise TypeError.new("Cannot remove normal file '%s'" %
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
- raise TypeError.new("Cannot replace normal file '%s'" %
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
- end
92
-
93
- class Type
94
- class Symlink < Type
95
- attr_reader :stat, :path, :params
96
- # class instance variable
97
- @states = [
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
- def initialize(hash)
115
- @arghash = self.argclean(hash.dup)
116
- @arghash.delete(self.class.namevar)
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
- def paramrecurse=(value)
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 = self.state(:target).should
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
- self.info "Target %s must exist for recursive links" %
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
- self.delete(:target)
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 => self.name,
150
+ :name => @parent.name,
165
151
  :linkmaker => true,
166
152
  :recurse => recurse,
167
153
  :source => @target
168
154
  }
169
155
 
170
- dir = Puppet::Type::PFile.implicitcreate(args)
171
- dir.parent = self
172
- self.debug "Got dir %s" % dir.name
173
- self.push dir
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 # Puppet::Type::Symlink
182
- end # Puppet::Type
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 $