puppet 0.22.4 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. data/CHANGELOG +156 -0
  2. data/README +2 -2
  3. data/Rakefile +6 -6
  4. data/bin/filebucket +212 -0
  5. data/bin/puppet +2 -0
  6. data/bin/puppetca +2 -4
  7. data/bin/puppetd +16 -15
  8. data/bin/puppetdoc +46 -496
  9. data/bin/puppetmasterd +3 -5
  10. data/bin/puppetrun +8 -3
  11. data/bin/ralsh +271 -0
  12. data/conf/redhat/client.init +1 -1
  13. data/conf/redhat/puppet.spec +13 -2
  14. data/conf/solaris/pkginfo +1 -1
  15. data/ext/puppet-test +374 -0
  16. data/install.rb +40 -31
  17. data/lib/puppet.rb +39 -4
  18. data/lib/puppet/config_stores/rest.rb +60 -0
  19. data/lib/puppet/configuration.rb +312 -17
  20. data/lib/puppet/external/event-loop/event-loop.rb +4 -0
  21. data/lib/puppet/external/gratr/rdot.rb +1 -1
  22. data/lib/puppet/fact_stores/yaml.rb +42 -0
  23. data/lib/puppet/feature/base.rb +4 -1
  24. data/lib/puppet/metatype/attributes.rb +20 -43
  25. data/lib/puppet/metatype/container.rb +1 -36
  26. data/lib/puppet/metatype/evaluation.rb +48 -19
  27. data/lib/puppet/metatype/instances.rb +35 -1
  28. data/lib/puppet/metatype/metaparams.rb +23 -19
  29. data/lib/puppet/metatype/providers.rb +25 -38
  30. data/lib/puppet/network/client/ca.rb +8 -5
  31. data/lib/puppet/network/client/master.rb +59 -17
  32. data/lib/puppet/network/handler.rb +18 -1
  33. data/lib/puppet/network/handler/ca.rb +9 -3
  34. data/lib/puppet/network/handler/facts.rb +70 -0
  35. data/lib/puppet/network/handler/filebucket.rb +4 -1
  36. data/lib/puppet/network/handler/fileserver.rb +65 -21
  37. data/lib/puppet/network/handler/master.rb +6 -3
  38. data/lib/puppet/network/handler/report.rb +12 -26
  39. data/lib/puppet/network/handler/resource.rb +14 -2
  40. data/lib/puppet/network/handler/runner.rb +5 -1
  41. data/lib/puppet/network/handler/status.rb +5 -1
  42. data/lib/puppet/network/server/mongrel.rb +4 -4
  43. data/lib/puppet/network/server/webrick.rb +14 -3
  44. data/lib/puppet/parameter.rb +30 -25
  45. data/lib/puppet/parser/ast.rb +1 -6
  46. data/lib/puppet/parser/ast/component.rb +23 -20
  47. data/lib/puppet/parser/ast/hostclass.rb +7 -11
  48. data/lib/puppet/parser/ast/leaf.rb +4 -1
  49. data/lib/puppet/parser/ast/node.rb +6 -8
  50. data/lib/puppet/parser/functions.rb +7 -4
  51. data/lib/puppet/parser/interpreter.rb +155 -205
  52. data/lib/puppet/parser/lexer.rb +35 -2
  53. data/lib/puppet/parser/parser.rb +705 -612
  54. data/lib/puppet/parser/resource.rb +91 -48
  55. data/lib/puppet/parser/resource/param.rb +52 -29
  56. data/lib/puppet/parser/scope.rb +28 -23
  57. data/lib/puppet/pgraph.rb +26 -21
  58. data/lib/puppet/propertychange.rb +12 -12
  59. data/lib/puppet/provider.rb +102 -31
  60. data/lib/puppet/provider/cron/crontab.rb +7 -8
  61. data/lib/puppet/provider/group/groupadd.rb +4 -4
  62. data/lib/puppet/provider/group/pw.rb +3 -3
  63. data/lib/puppet/provider/mount.rb +8 -8
  64. data/lib/puppet/provider/mount/netinfo.rb +5 -5
  65. data/lib/puppet/provider/mount/parsed.rb +2 -2
  66. data/lib/puppet/provider/nameservice.rb +19 -31
  67. data/lib/puppet/provider/nameservice/netinfo.rb +14 -14
  68. data/lib/puppet/provider/nameservice/objectadd.rb +4 -4
  69. data/lib/puppet/provider/nameservice/pw.rb +4 -4
  70. data/lib/puppet/provider/package.rb +31 -0
  71. data/lib/puppet/provider/package/appdmg.rb +118 -0
  72. data/lib/puppet/provider/package/apple.rb +18 -16
  73. data/lib/puppet/provider/package/apt.rb +13 -15
  74. data/lib/puppet/provider/package/aptitude.rb +5 -3
  75. data/lib/puppet/provider/package/aptrpm.rb +9 -11
  76. data/lib/puppet/provider/package/blastwave.rb +9 -9
  77. data/lib/puppet/provider/package/darwinport.rb +12 -11
  78. data/lib/puppet/provider/package/dpkg.rb +20 -12
  79. data/lib/puppet/provider/package/fink.rb +87 -0
  80. data/lib/puppet/provider/package/freebsd.rb +10 -11
  81. data/lib/puppet/provider/package/gem.rb +15 -15
  82. data/lib/puppet/provider/package/openbsd.rb +12 -17
  83. data/lib/puppet/provider/package/pkgdmg.rb +90 -16
  84. data/lib/puppet/provider/package/portage.rb +20 -14
  85. data/lib/puppet/provider/package/ports.rb +15 -13
  86. data/lib/puppet/provider/package/rpm.rb +20 -23
  87. data/lib/puppet/provider/package/rug.rb +6 -8
  88. data/lib/puppet/provider/package/sun.rb +20 -18
  89. data/lib/puppet/provider/package/sunfreeware.rb +2 -2
  90. data/lib/puppet/provider/package/up2date.rb +6 -10
  91. data/lib/puppet/provider/package/urpmi.rb +51 -0
  92. data/lib/puppet/provider/package/yum.rb +15 -13
  93. data/lib/puppet/provider/parsedfile.rb +53 -63
  94. data/lib/puppet/provider/service/base.rb +13 -15
  95. data/lib/puppet/provider/service/debian.rb +4 -4
  96. data/lib/puppet/provider/service/gentoo.rb +4 -4
  97. data/lib/puppet/provider/service/init.rb +22 -15
  98. data/lib/puppet/provider/service/redhat.rb +6 -6
  99. data/lib/puppet/provider/service/smf.rb +6 -6
  100. data/lib/puppet/provider/user/netinfo.rb +5 -5
  101. data/lib/puppet/provider/user/pw.rb +10 -5
  102. data/lib/puppet/provider/user/useradd.rb +9 -14
  103. data/lib/puppet/provider/zone/solaris.rb +80 -45
  104. data/lib/puppet/rails.rb +3 -34
  105. data/lib/puppet/rails/database/schema.rb +45 -24
  106. data/lib/puppet/rails/fact_value.rb +1 -0
  107. data/lib/puppet/rails/host.rb +69 -40
  108. data/lib/puppet/rails/param_name.rb +3 -8
  109. data/lib/puppet/rails/param_value.rb +2 -1
  110. data/lib/puppet/rails/puppet_class.rb +0 -2
  111. data/lib/puppet/rails/puppet_tag.rb +5 -0
  112. data/lib/puppet/rails/resource.rb +41 -17
  113. data/lib/puppet/rails/resource_tag.rb +4 -0
  114. data/lib/puppet/reference/configuration.rb +149 -0
  115. data/lib/puppet/reference/function.rb +13 -0
  116. data/lib/puppet/reference/network.rb +37 -0
  117. data/lib/puppet/reference/providers.rb +118 -0
  118. data/lib/puppet/reference/report.rb +21 -0
  119. data/lib/puppet/reference/type.rb +152 -0
  120. data/lib/puppet/reports/rrdgraph.rb +21 -7
  121. data/lib/puppet/reports/tagmail.rb +4 -1
  122. data/lib/puppet/sslcertificates.rb +1 -49
  123. data/lib/puppet/sslcertificates/ca.rb +2 -79
  124. data/lib/puppet/sslcertificates/inventory.rb +0 -10
  125. data/lib/puppet/transaction.rb +24 -41
  126. data/lib/puppet/transaction/report.rb +27 -1
  127. data/lib/puppet/type.rb +7 -43
  128. data/lib/puppet/type/component.rb +198 -124
  129. data/lib/puppet/type/cron.rb +51 -42
  130. data/lib/puppet/type/exec.rb +20 -19
  131. data/lib/puppet/type/group.rb +6 -55
  132. data/lib/puppet/type/host.rb +16 -37
  133. data/lib/puppet/type/mount.rb +30 -17
  134. data/lib/puppet/type/notify.rb +7 -8
  135. data/lib/puppet/type/package.rb +44 -80
  136. data/lib/puppet/type/pfile.rb +50 -41
  137. data/lib/puppet/type/pfile/checksum.rb +82 -95
  138. data/lib/puppet/type/pfile/content.rb +21 -25
  139. data/lib/puppet/type/pfile/ensure.rb +32 -30
  140. data/lib/puppet/type/pfile/group.rb +21 -26
  141. data/lib/puppet/type/pfile/mode.rb +25 -32
  142. data/lib/puppet/type/pfile/owner.rb +23 -27
  143. data/lib/puppet/type/pfile/source.rb +42 -33
  144. data/lib/puppet/type/pfile/target.rb +20 -18
  145. data/lib/puppet/type/pfile/type.rb +6 -7
  146. data/lib/puppet/type/pfilebucket.rb +3 -3
  147. data/lib/puppet/type/port.rb +5 -7
  148. data/lib/puppet/type/property.rb +58 -61
  149. data/lib/puppet/type/resources.rb +12 -8
  150. data/lib/puppet/type/schedule.rb +8 -8
  151. data/lib/puppet/type/service.rb +26 -33
  152. data/lib/puppet/type/sshkey.rb +6 -7
  153. data/lib/puppet/type/tidy.rb +41 -35
  154. data/lib/puppet/type/user.rb +34 -67
  155. data/lib/puppet/type/yumrepo.rb +27 -12
  156. data/lib/puppet/type/zone.rb +71 -110
  157. data/lib/puppet/util.rb +46 -61
  158. data/lib/puppet/util/autoload.rb +59 -47
  159. data/lib/puppet/util/config.rb +160 -18
  160. data/lib/puppet/util/config_store.rb +61 -0
  161. data/lib/puppet/util/fact_store.rb +60 -0
  162. data/lib/puppet/util/instance_loader.rb +74 -0
  163. data/lib/puppet/util/loadedfile.rb +5 -8
  164. data/lib/puppet/util/metric.rb +17 -25
  165. data/lib/puppet/util/posix.rb +39 -7
  166. data/lib/puppet/util/provider_features.rb +9 -1
  167. data/lib/puppet/util/rails/collection_merger.rb +16 -1
  168. data/lib/puppet/util/reference.rb +189 -0
  169. data/lib/puppet/util/storage.rb +2 -2
  170. data/lib/puppet/util/subclass_loader.rb +9 -2
  171. data/test/language/ast.rb +4 -148
  172. data/test/language/ast/component.rb +10 -1
  173. data/test/language/collector.rb +1 -191
  174. data/test/language/interpreter.rb +284 -327
  175. data/test/language/lexer.rb +13 -1
  176. data/test/language/node.rb +1 -1
  177. data/test/language/parser.rb +17 -4
  178. data/test/language/resource.rb +67 -101
  179. data/test/language/scope.rb +18 -3
  180. data/test/language/snippets.rb +114 -151
  181. data/test/lib/puppettest.rb +13 -0
  182. data/test/lib/puppettest/exetest.rb +7 -0
  183. data/test/lib/puppettest/fakes.rb +39 -28
  184. data/test/lib/puppettest/railstesting.rb +1 -1
  185. data/test/lib/puppettest/support/assertions.rb +2 -2
  186. data/test/lib/puppettest/support/collection.rb +30 -0
  187. data/test/network/client/ca.rb +27 -1
  188. data/test/network/client/client.rb +3 -3
  189. data/test/network/client/master.rb +102 -1
  190. data/test/network/handler/ca.rb +35 -1
  191. data/test/network/handler/facts.rb +112 -0
  192. data/test/network/handler/fileserver.rb +25 -1
  193. data/test/network/handler/handler.rb +2 -2
  194. data/test/network/handler/master.rb +2 -49
  195. data/test/network/handler/resource.rb +5 -6
  196. data/test/network/server/mongrel_test.rb +65 -0
  197. data/test/network/server/webrick.rb +2 -2
  198. data/test/network/xmlrpc/client.rb +2 -1
  199. data/test/network/xmlrpc/processor.rb +2 -1
  200. data/test/other/pgraph.rb +6 -5
  201. data/test/other/propertychange.rb +11 -12
  202. data/test/other/report.rb +44 -27
  203. data/test/other/transactions.rb +17 -16
  204. data/test/puppet/tc_suidmanager.rb +2 -2
  205. data/test/rails/ast.rb +74 -0
  206. data/test/rails/collection.rb +214 -0
  207. data/test/rails/host.rb +49 -24
  208. data/test/rails/interpreter.rb +91 -0
  209. data/test/rails/railsparameter.rb +22 -11
  210. data/test/rails/railsresource.rb +140 -7
  211. data/test/ral/manager/attributes.rb +37 -13
  212. data/test/ral/manager/instances.rb +82 -0
  213. data/test/ral/manager/provider.rb +60 -22
  214. data/test/ral/manager/type.rb +9 -6
  215. data/test/ral/providers/cron/crontab.rb +59 -7
  216. data/test/ral/providers/group.rb +7 -7
  217. data/test/ral/providers/host/netinfo.rb +5 -6
  218. data/test/ral/providers/host/parsed.rb +4 -4
  219. data/test/ral/providers/mount/parsed.rb +11 -6
  220. data/test/ral/providers/nameservice.rb +2 -2
  221. data/test/ral/providers/package.rb +39 -14
  222. data/test/ral/providers/package/apt.rb +72 -3
  223. data/test/ral/providers/package/aptitude.rb +15 -12
  224. data/test/ral/providers/package/aptrpm.rb +3 -3
  225. data/test/ral/providers/package/dpkg.rb +2 -2
  226. data/test/ral/providers/parsedfile.rb +114 -88
  227. data/test/ral/providers/{parsedport.rb → port/parsed.rb} +1 -1
  228. data/test/ral/providers/provider.rb +93 -13
  229. data/test/ral/providers/service.rb +52 -26
  230. data/test/ral/providers/sshkey/parsed.rb +3 -3
  231. data/test/ral/providers/user.rb +19 -20
  232. data/test/ral/providers/user/useradd.rb +1 -5
  233. data/test/ral/types/cron.rb +49 -36
  234. data/test/ral/types/file.rb +38 -35
  235. data/test/ral/types/file/target.rb +4 -4
  236. data/test/ral/types/filesources.rb +24 -22
  237. data/test/ral/types/group.rb +4 -2
  238. data/test/ral/types/host.rb +17 -10
  239. data/test/ral/types/mount.rb +40 -23
  240. data/test/ral/types/package.rb +62 -5
  241. data/test/ral/types/parameter.rb +2 -2
  242. data/test/ral/types/property.rb +27 -20
  243. data/test/ral/types/resources.rb +4 -16
  244. data/test/ral/types/schedule.rb +2 -2
  245. data/test/ral/types/service.rb +2 -3
  246. data/test/ral/types/sshkey.rb +3 -3
  247. data/test/ral/types/tidy.rb +6 -15
  248. data/test/ral/types/user.rb +17 -17
  249. data/test/ral/types/yumrepo.rb +2 -2
  250. data/test/ral/types/zone.rb +71 -87
  251. data/test/util/autoload.rb +6 -21
  252. data/test/util/config.rb +201 -101
  253. data/test/util/fact_store.rb +67 -0
  254. data/test/util/features.rb +9 -6
  255. data/test/util/instance_loader.rb +53 -0
  256. data/test/util/loadedfile.rb +17 -1
  257. data/test/util/metrics.rb +54 -57
  258. data/test/util/posixtest.rb +8 -11
  259. data/test/util/utiltest.rb +31 -2
  260. metadata +520 -492
  261. data/TODO +0 -4
  262. data/lib/puppet/network/client/logger.rb +0 -6
  263. data/lib/puppet/network/handler/logger.rb +0 -52
  264. data/lib/puppet/rails/database/001_add_indexes.rb +0 -38
  265. data/lib/puppet/type/parsedtype.rb +0 -219
  266. data/test/network/handler/logger.rb +0 -183
@@ -295,72 +295,57 @@ module Util
295
295
  @@os ||= Facter.value(:operatingsystem)
296
296
  output = nil
297
297
  child_pid, child_status = nil
298
+ # There are problems with read blocking with badly behaved children
299
+ # read.partialread doesn't seem to capture either stdout or stderr
300
+ # We hack around this using a temporary file
301
+
298
302
  # The idea here is to avoid IO#read whenever possible.
299
- if arguments[:squelch]
300
- child_pid = Kernel.fork
301
- if child_pid
302
- # Parent process executes this
303
- child_status = Process.waitpid2(child_pid)[1]
304
- else
305
- # Child process executes this
306
- begin
307
- $stdin.reopen("/dev/null")
308
- $stdout.reopen("/dev/null")
309
- $stderr.reopen("/dev/null")
310
- if arguments[:gid]
311
- Process.egid = arguments[:gid]
312
- Process.gid = arguments[:gid] unless @@os == "Darwin"
313
- end
314
- if arguments[:uid]
315
- Process.euid = arguments[:uid]
316
- Process.uid = arguments[:uid] unless @@os == "Darwin"
317
- end
318
- if command.is_a?(Array)
319
- Kernel.exec(*command)
320
- else
321
- Kernel.exec(command)
322
- end
323
- rescue => detail
324
- puts detail.to_s
325
- exit!(1)
326
- end # begin; rescue
327
- end # if child_pid; else
303
+ output_file="/dev/null"
304
+ if ! arguments[:squelch]
305
+ require "tempfile"
306
+ output_file = Tempfile.new("puppet")
307
+ end
308
+
309
+ child_pid = Kernel.fork
310
+ if child_pid
311
+ # Parent process executes this
312
+ child_status = Process.waitpid2(child_pid)[1]
328
313
  else
329
- IO.popen("-") do |f|
330
- if f
331
- # Parent process executes this
332
- output = f.read
314
+ # Child process executes this
315
+ begin
316
+ $stdin.reopen("/dev/null")
317
+ $stdout.reopen(output_file)
318
+ $stderr.reopen(output_file)
319
+ if arguments[:gid]
320
+ Process.egid = arguments[:gid]
321
+ Process.gid = arguments[:gid] unless @@os == "Darwin"
322
+ end
323
+ if arguments[:uid]
324
+ Process.euid = arguments[:uid]
325
+ Process.uid = arguments[:uid] unless @@os == "Darwin"
326
+ end
327
+ ENV['LANG'] = ENV['LC_ALL'] = ENV['LC_MESSAGES'] = ENV['LANGUAGE'] = 'C'
328
+ if command.is_a?(Array)
329
+ Kernel.exec(*command)
333
330
  else
334
- # Parent process executes this
335
- begin
336
- $stdin.reopen("/dev/null")
337
- $stderr.close
338
- $stderr = $stdout.dup
339
- if arguments[:gid]
340
- Process.egid = arguments[:gid]
341
- Process.gid = arguments[:gid] unless @@os == "Darwin"
342
- end
343
- if arguments[:uid]
344
- Process.euid = arguments[:uid]
345
- Process.uid = arguments[:uid] unless @@os == "Darwin"
346
- end
347
- if command.is_a?(Array)
348
- Kernel.exec(*command)
349
- else
350
- Kernel.exec(command)
351
- end
352
- rescue => detail
353
- puts detail.to_s
354
- exit!(1)
355
- end # begin; rescue
356
- end # if f; else
357
- end # IO.popen do |f|
358
- child_status = $?
359
- end # if arguments[:squelch]; else
331
+ Kernel.exec(command)
332
+ end
333
+ rescue => detail
334
+ puts detail.to_s
335
+ exit!(1)
336
+ end # begin; rescue
337
+ end # if child_pid
338
+
339
+ # read output in if required
340
+ if ! arguments[:squelch]
341
+ output = output_file.open.read
342
+ output_file.close
343
+ output_file.delete
344
+ end
360
345
 
361
346
  if arguments[:failonfail]
362
347
  unless child_status == 0
363
- raise ExecutionFailure, "Execution of '%s' returned %s: %s" % [str, child_status.inspect, output]
348
+ raise ExecutionFailure, "Execution of '%s' returned %s: %s" % [str, child_status, output]
364
349
  end
365
350
  end
366
351
 
@@ -451,4 +436,4 @@ require 'puppet/util/logging'
451
436
  require 'puppet/util/package'
452
437
  require 'puppet/util/warnings'
453
438
 
454
- # $Id: util.rb 2427 2007-04-27 23:25:59Z luke $
439
+ # $Id: util.rb 2605 2007-06-18 18:13:23Z luke $
@@ -18,14 +18,11 @@ class Puppet::Util::Autoload
18
18
 
19
19
  Puppet::Util.proxy self, :loaded, :clear
20
20
 
21
- def handle_libdir
22
- dir = Puppet[:libdir]
23
-
24
- $: << dir unless $:.include?(dir)
25
- end
26
-
27
21
  def initialize(obj, path, options = {})
28
22
  @path = path.to_s
23
+ if @path !~ /^\w/
24
+ raise ArgumentError, "Autoload paths cannot be fully qualified"
25
+ end
29
26
  @object = obj
30
27
 
31
28
  self.class[obj] = self
@@ -46,62 +43,77 @@ class Puppet::Util::Autoload
46
43
  @loaded = {}
47
44
  end
48
45
 
46
+ # Load a single plugin by name.
49
47
  def load(name)
50
- name = symbolize(name)
51
- handle_libdir()
52
-
53
- path = File.join(@path, name.to_s + ".rb")
54
-
55
- begin
56
- Kernel.load path, @wrap
57
- @loaded[name] = true
58
- return true
59
- rescue LoadError => detail
60
- # I have no idea what's going on here, but different versions
61
- # of ruby are raising different errors on missing files.
62
- unless detail.to_s =~ /^no such file/i
63
- warn "Could not autoload %s: %s" % [name, detail]
64
- if Puppet[:trace]
65
- puts detail.backtrace
48
+ path = name.to_s + ".rb"
49
+
50
+ eachdir do |dir|
51
+ file = File.join(dir, path)
52
+ next unless FileTest.exists?(file)
53
+ begin
54
+ Kernel.load file, @wrap
55
+ name = symbolize(name)
56
+ @loaded[name] = true
57
+ return true
58
+ rescue LoadError => detail
59
+ # I have no idea what's going on here, but different versions
60
+ # of ruby are raising different errors on missing files.
61
+ unless detail.to_s =~ /^no such file/i
62
+ warn "Could not autoload %s: %s" % [name, detail]
63
+ if Puppet[:trace]
64
+ puts detail.backtrace
65
+ end
66
66
  end
67
+ return false
67
68
  end
68
- return false
69
69
  end
70
+ return false
70
71
  end
71
72
 
73
+ # Indicate whether the specfied plugin has been loaded.
72
74
  def loaded?(name)
73
- name = symbolize(name)
74
- @loaded[name]
75
+ @loaded[symbolize(name)]
75
76
  end
76
77
 
77
78
  def loadall
78
- handle_libdir()
79
79
  # Load every instance of everything we can find.
80
- $:.each do |dir|
81
- fdir = File.join(dir, @path)
82
- if FileTest.exists?(fdir) and FileTest.directory?(fdir)
83
- Dir.glob("#{fdir}/*.rb").each do |file|
84
- # Load here, rather than require, so that facts
85
- # can be reloaded. This has some short-comings, I
86
- # believe, but it works as long as real classes
87
- # aren't used.
88
- name = File.basename(file).sub(".rb", '').intern
89
- next if @loaded.include? name
90
- next if $".include?(File.join(@path, name.to_s + ".rb"))
91
- filepath = File.join(@path, name.to_s + ".rb")
92
- begin
93
- Kernel.require filepath
94
- @loaded[name] = true
95
- rescue => detail
96
- if Puppet[:trace]
97
- puts detail.backtrace
98
- end
99
- warn "Could not autoload %s: %s" % [file.inspect, detail]
80
+ eachdir do |dir|
81
+ Dir.glob("#{dir}/*.rb").each do |file|
82
+ # Load here, rather than require, so that facts
83
+ # can be reloaded. This has some short-comings, I
84
+ # believe, but it works as long as real classes
85
+ # aren't used.
86
+ name = File.basename(file).sub(".rb", '').intern
87
+ next if @loaded.include? name
88
+ next if $".include?(File.join(@path, name.to_s + ".rb"))
89
+ filepath = File.join(@path, name.to_s + ".rb")
90
+ begin
91
+ Kernel.require filepath
92
+ @loaded[name] = true
93
+ rescue => detail
94
+ if Puppet[:trace]
95
+ puts detail.backtrace
100
96
  end
97
+ warn "Could not autoload %s: %s" % [file.inspect, detail]
101
98
  end
102
99
  end
103
100
  end
104
101
  end
102
+
103
+ private
104
+
105
+ # Yield each subdir in turn.
106
+ def eachdir
107
+ searchpath.each do |dir|
108
+ subdir = File.join(dir, @path)
109
+ yield subdir if FileTest.directory?(subdir)
110
+ end
111
+ end
112
+
113
+ # The list of directories to search through for loadable plugins.
114
+ def searchpath
115
+ [Puppet[:libdir], $:].flatten
116
+ end
105
117
  end
106
118
 
107
- # $Id: autoload.rb 2178 2007-02-07 23:56:59Z luke $
119
+ # $Id: autoload.rb 2518 2007-05-16 00:00:47Z luke $
@@ -167,7 +167,7 @@ class Puppet::Util::Config
167
167
 
168
168
  # Handle a command-line argument.
169
169
  def handlearg(opt, value = nil)
170
- value = mungearg(value) if value
170
+ value = munge_value(value) if value
171
171
  str = opt.sub(/^--/,'')
172
172
  bool = true
173
173
  newstr = str.sub(/^no-/, '')
@@ -221,18 +221,6 @@ class Puppet::Util::Config
221
221
  end
222
222
  end
223
223
 
224
- # Convert arguments appropriately.
225
- def mungearg(value)
226
- # Handle different data types correctly
227
- return case value
228
- when /^false$/i: false
229
- when /^true$/i: true
230
- when /^\d+$/i: Integer(value)
231
- else
232
- value.gsub(/^["']|["']$/,'').sub(/\s+$/, '')
233
- end
234
- end
235
-
236
224
  # Return all of the parameters associated with a given section.
237
225
  def params(section)
238
226
  section = section.intern if section.is_a? String
@@ -243,8 +231,24 @@ class Puppet::Util::Config
243
231
  }
244
232
  end
245
233
 
246
- # Parse a configuration file.
234
+ # Parse the configuration file.
247
235
  def parse(file)
236
+ configmap = parse_file(file)
237
+
238
+ # We know we want the 'main' section
239
+ if main = configmap[:main]
240
+ set_parameter_hash(main)
241
+ end
242
+
243
+ # Otherwise, we only want our named section
244
+ if @config.include?(:name) and named = configmap[symbolize(self[:name])]
245
+ set_parameter_hash(named)
246
+ end
247
+ end
248
+
249
+ # Parse the configuration file. As of May 2007, this is a backward-compatibility method and
250
+ # will be deprecated soon.
251
+ def old_parse(file)
248
252
  text = nil
249
253
 
250
254
  if file.is_a? Puppet::Util::LoadedFile
@@ -253,8 +257,8 @@ class Puppet::Util::Config
253
257
  @file = Puppet::Util::LoadedFile.new(file)
254
258
  end
255
259
 
256
- # Create a timer so that this.
257
- settimer()
260
+ # Don't create a timer for the old style parsing.
261
+ # settimer()
258
262
 
259
263
  begin
260
264
  text = File.read(@file.file)
@@ -284,7 +288,7 @@ class Puppet::Util::Config
284
288
  if var == :mode
285
289
  value = $2
286
290
  else
287
- value = mungearg($2)
291
+ value = munge_value($2)
288
292
  end
289
293
 
290
294
  # Only warn if we don't know what this config var is. This
@@ -706,6 +710,144 @@ Generated on #{Time.now}.
706
710
  end
707
711
  end
708
712
 
713
+ private
714
+
715
+ # Extra extra setting information for files.
716
+ def extract_fileinfo(string)
717
+ paramregex = %r{(\w+)\s*=\s*([\w\d]+)}
718
+ result = {}
719
+ string.scan(/\{\s*([^}]+)\s*\}/) do
720
+ params = $1
721
+ params.split(/\s*,\s*/).each do |str|
722
+ if str =~ /^\s*(\w+)\s*=\s*([\w\w]+)\s*$/
723
+ param, value = $1.intern, $2
724
+ result[param] = value
725
+ unless [:owner, :mode, :group].include?(param)
726
+ raise Puppet::Error, "Invalid file option '%s'" % param
727
+ end
728
+
729
+ if param == :mode and value !~ /^\d+$/
730
+ raise Puppet::Error, "File modes must be numbers"
731
+ end
732
+ else
733
+ raise Puppet::Error, "Could not parse '%s'" % string
734
+ end
735
+ end
736
+
737
+ return result
738
+ end
739
+
740
+ return nil
741
+ end
742
+
743
+ # Convert arguments into booleans, integers, or whatever.
744
+ def munge_value(value)
745
+ # Handle different data types correctly
746
+ return case value
747
+ when /^false$/i: false
748
+ when /^true$/i: true
749
+ when /^\d+$/i: Integer(value)
750
+ else
751
+ value.gsub(/^["']|["']$/,'').sub(/\s+$/, '')
752
+ end
753
+ end
754
+
755
+ # This is an abstract method that just turns a file in to a hash of hashes.
756
+ # We mostly need this for backward compatibility -- as of May 2007 we need to
757
+ # support parsing old files with any section, or new files with just two
758
+ # valid sections.
759
+ def parse_file(file)
760
+ text = nil
761
+
762
+ if file.is_a? Puppet::Util::LoadedFile
763
+ @file = file
764
+ else
765
+ @file = Puppet::Util::LoadedFile.new(file)
766
+ end
767
+
768
+ # Create a timer so that this file will get checked automatically
769
+ # and reparsed if necessary.
770
+ settimer()
771
+
772
+ begin
773
+ text = File.read(@file.file)
774
+ rescue Errno::ENOENT
775
+ raise Puppet::Error, "No such file %s" % file
776
+ rescue Errno::EACCES
777
+ raise Puppet::Error, "Permission denied to file %s" % file
778
+ end
779
+
780
+ result = Hash.new { |names, name|
781
+ names[name] = {}
782
+ }
783
+
784
+ count = 0
785
+
786
+ # Default to 'main' for the section.
787
+ section = :main
788
+ result[section][:_meta] = {}
789
+ text.split(/\n/).each { |line|
790
+ count += 1
791
+ case line
792
+ when /^\[(\w+)\]$/:
793
+ section = $1.intern # Section names
794
+ # Add a meta section
795
+ result[section][:_meta] ||= {}
796
+ when /^\s*#/: next # Skip comments
797
+ when /^\s*$/: next # Skip blanks
798
+ when /^\s*(\w+)\s*=\s*(.+)$/: # settings
799
+ var = $1.intern
800
+
801
+ # We don't want to munge modes, because they're specified in octal, so we'll
802
+ # just leave them as a String, since Puppet handles that case correctly.
803
+ if var == :mode
804
+ value = $2
805
+ else
806
+ value = munge_value($2)
807
+ end
808
+
809
+ # Check to see if this is a file argument and it has extra options
810
+ begin
811
+ if value.is_a?(String) and options = extract_fileinfo(value)
812
+ result[section][:_meta][var] = options
813
+ end
814
+ result[section][var] = value
815
+ rescue Puppet::Error => detail
816
+ detail.file = file
817
+ detail.line = line
818
+ raise
819
+ end
820
+ else
821
+ error = Puppet::Error.new("Could not match line %s" % line)
822
+ error.file = file
823
+ error.line = line
824
+ raise error
825
+ end
826
+ }
827
+
828
+ return result
829
+ end
830
+
831
+ # Take all members of a hash and assign their values appropriately.
832
+ def set_parameter_hash(params)
833
+ params.each do |param, value|
834
+ next if param == :_meta
835
+ unless @config.include?(param)
836
+ Puppet.warning "Discarded unknown configuration parameter %s" % param
837
+ next
838
+ end
839
+ self[param] = value
840
+ end
841
+
842
+ if meta = params[:_meta]
843
+ meta.each do |var, values|
844
+ values.each do |param, value|
845
+ @config[var].send(param.to_s + "=", value)
846
+ end
847
+ end
848
+ end
849
+ end
850
+
709
851
  # The base element type.
710
852
  class CElement
711
853
  attr_accessor :name, :section, :default, :parent, :setbycli
@@ -964,4 +1106,4 @@ Generated on #{Time.now}.
964
1106
  end
965
1107
  end
966
1108
 
967
- # $Id: config.rb 2272 2007-03-08 17:07:35Z luke $
1109
+ # $Id: config.rb 2464 2007-05-06 05:42:53Z luke $