puppet 0.22.4 → 0.23.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 (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
data/install.rb CHANGED
@@ -30,7 +30,7 @@
30
30
  # 5) Install all library files ending in .rb from lib/ into Ruby's
31
31
  # site_lib/version directory.
32
32
  #
33
- # $Id: install.rb 1479 2006-08-21 23:04:32Z luke $
33
+ # $Id: install.rb 2580 2007-06-14 06:11:46Z luke $
34
34
  #++
35
35
 
36
36
  require 'rbconfig'
@@ -61,13 +61,14 @@ def glob(list)
61
61
  end
62
62
 
63
63
  # Set these values to what you want installed.
64
- bins = glob(%w{bin/**/*})
65
- rdoc = glob(%w{bin/**/* lib/**/*.rb README README-library CHANGELOG TODO Install}).reject { |e| e=~ /\.(bat|cmd)$/ }
66
- ri = glob(%w(bin/**/*.rb lib/**/*.rb)).reject { |e| e=~ /\.(bat|cmd)$/ }
64
+ sbins = glob(%w{sbin/*})
65
+ bins = glob(%w{bin/*})
66
+ rdoc = glob(%w{bin/* sbin/* lib/**/*.rb README README-library CHANGELOG TODO Install}).reject { |e| e=~ /\.(bat|cmd)$/ }
67
+ ri = glob(%w(bin/*.rb sbin/* lib/**/*.rb)).reject { |e| e=~ /\.(bat|cmd)$/ }
67
68
  libs = glob(%w{lib/**/*.rb})
68
69
  tests = glob(%w{tests/**/*.rb})
69
70
 
70
- def do_bins(bins, target, strip = 'bin/')
71
+ def do_bins(bins, target, strip = 's?bin/')
71
72
  bins.each do |bf|
72
73
  obf = bf.gsub(/#{strip}/, '')
73
74
  install_binfile(bf, obf, target)
@@ -145,37 +146,41 @@ def prepare_installation
145
146
  opts.parse!
146
147
  end
147
148
 
148
- bds = [".", ENV['TMP'], ENV['TEMP']]
149
+ tmpdirs = [".", ENV['TMP'], ENV['TEMP'], "/tmp", "/var/tmp"]
149
150
 
150
151
  version = [Config::CONFIG["MAJOR"], Config::CONFIG["MINOR"]].join(".")
151
- ld = File.join(Config::CONFIG["libdir"], "ruby", version)
152
-
153
- sd = Config::CONFIG["sitelibdir"]
154
- if sd.nil?
155
- sd = $:.find { |x| x =~ /site_ruby/ }
156
- if sd.nil?
157
- sd = File.join(ld, "site_ruby")
158
- elsif sd !~ Regexp.quote(version)
159
- sd = File.join(sd, version)
152
+ libdir = File.join(Config::CONFIG["libdir"], "ruby", version)
153
+
154
+ sitelibdir = Config::CONFIG["sitelibdir"]
155
+ if sitelibdir.nil?
156
+ sitelibdir = $:.find { |x| x =~ /site_ruby/ }
157
+ if sitelibdir.nil?
158
+ sitelibdir = File.join(libdir, "site_ruby")
159
+ elsif sitelibdir !~ Regexp.quote(version)
160
+ sitelibdir = File.join(sitelibdir, version)
160
161
  end
161
162
  end
162
163
 
163
164
  if (destdir = ENV['DESTDIR'])
164
- bd = "#{destdir}#{Config::CONFIG['bindir']}"
165
- sd = "#{destdir}#{sd}"
166
- bds << bd
167
-
168
- FileUtils.makedirs(bd)
169
- FileUtils.makedirs(sd)
165
+ bindir = "#{destdir}#{Config::CONFIG['bindir']}"
166
+ sbindir = "#{destdir}#{Config::CONFIG['sbindir']}"
167
+ sitelibdir = "#{destdir}#{sitelibdir}"
168
+ tmpdirs << bindir
169
+
170
+ FileUtils.makedirs(bindir)
171
+ FileUtils.makedirs(sbindir)
172
+ FileUtils.makedirs(sitelibdir)
170
173
  else
171
- bd = Config::CONFIG['bindir']
172
- bds << Config::CONFIG['bindir']
174
+ bindir = Config::CONFIG['bindir']
175
+ sbindir = Config::CONFIG['sbindir']
176
+ tmpdirs << Config::CONFIG['bindir']
173
177
  end
174
178
 
175
- InstallOptions.bin_dirs = bds.compact
176
- InstallOptions.site_dir = sd
177
- InstallOptions.bin_dir = bd
178
- InstallOptions.lib_dir = ld
179
+ InstallOptions.tmp_dirs = tmpdirs.compact
180
+ InstallOptions.site_dir = sitelibdir
181
+ InstallOptions.bin_dir = bindir
182
+ InstallOptions.sbin_dir = sbindir
183
+ InstallOptions.lib_dir = libdir
179
184
  end
180
185
 
181
186
  ##
@@ -236,7 +241,7 @@ end
236
241
  # windows, we add an '.rb' extension and let file associations do their stuff.
237
242
  def install_binfile(from, op_file, target)
238
243
  tmp_dir = nil
239
- InstallOptions.bin_dirs.each do |t|
244
+ InstallOptions.tmp_dirs.each do |t|
240
245
  if File.directory?(t) and File.writable?(t)
241
246
  tmp_dir = t
242
247
  break
@@ -251,11 +256,15 @@ def install_binfile(from, op_file, target)
251
256
  File.open(tmp_file, "w") do |op|
252
257
  ruby = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
253
258
  op.puts "#!#{ruby}"
254
- op.write ip.read
259
+ contents = ip.readlines
260
+ if contents[0] =~ /^#!/
261
+ contents.shift
262
+ end
263
+ op.write contents.join()
255
264
  end
256
265
  end
257
266
 
258
- if Config::CONFIG["target_os"] =~ /win/io
267
+ if Config::CONFIG["target_os"] =~ /win/io and Config::CONFIG["target_os"] !~ /darwin/io
259
268
  installed_wrapper = false
260
269
 
261
270
  if File.exists?("#{from}.bat")
@@ -280,7 +289,6 @@ def install_binfile(from, op_file, target)
280
289
  installed_wrapper = true
281
290
  end
282
291
  end
283
- p target
284
292
  FileUtils.install(tmp_file, File.join(target, op_file), :mode => 0755, :verbose => true)
285
293
  File.unlink(tmp_file)
286
294
  end
@@ -302,5 +310,6 @@ prepare_installation
302
310
  run_tests(tests) if InstallOptions.tests
303
311
  #build_rdoc(rdoc) if InstallOptions.rdoc
304
312
  #build_ri(ri) if InstallOptions.ri
313
+ do_bins(sbins, InstallOptions.sbin_dir)
305
314
  do_bins(bins, InstallOptions.bin_dir)
306
315
  do_libs(libs)
@@ -1,3 +1,9 @@
1
+ # Try to load rubygems. Hey rubygems, I hate you.
2
+ begin
3
+ require 'rubygems'
4
+ rescue LoadError
5
+ end
6
+
1
7
  # see the bottom of the file for further inclusions
2
8
  require 'singleton'
3
9
  require 'facter'
@@ -19,7 +25,7 @@ require 'puppet/util/suidmanager'
19
25
  # it's also a place to find top-level commands like 'debug'
20
26
 
21
27
  module Puppet
22
- PUPPETVERSION = '0.22.4'
28
+ PUPPETVERSION = '0.23.0'
23
29
 
24
30
  def Puppet.version
25
31
  return PUPPETVERSION
@@ -128,10 +134,22 @@ module Puppet
128
134
  end
129
135
  elsif val =~ /,/
130
136
  val.split(/\s*,\s*/).sort.each do |v|
131
- puts "%s = %s" % [v, Puppet[v]]
137
+ if Puppet.config.include?(v)
138
+ puts "%s = %s" % [v, Puppet[v]]
139
+ else
140
+ puts "invalid parameter: %s" % v
141
+ exit(1)
142
+ end
132
143
  end
133
144
  else
134
- puts Puppet[val]
145
+ val.split(/\s*,\s*/).sort.each do |v|
146
+ if Puppet.config.include?(v)
147
+ puts Puppet[val]
148
+ else
149
+ puts "invalid parameter: %s" % v
150
+ exit(1)
151
+ end
152
+ end
135
153
  end
136
154
  exit(0)
137
155
  end
@@ -184,6 +202,23 @@ module Puppet
184
202
  timer
185
203
  end
186
204
 
205
+ # Parse the config file for this process.
206
+ def self.parse_config(oldconfig = nil)
207
+ # First look for the old configuration file.
208
+ oldconfig ||= File.join(Puppet[:confdir], Puppet[:name].to_s + ".conf")
209
+ if FileTest.exists?(oldconfig) and Puppet[:name] != "puppet"
210
+ Puppet.warning "Individual config files are deprecated; remove %s and use puppet.conf" % oldconfig
211
+ Puppet.config.old_parse(oldconfig)
212
+ return
213
+ end
214
+
215
+ # Now check for the normal config.
216
+ if Puppet[:config] and File.exists? Puppet[:config]
217
+ Puppet.debug "Parsing %s" % Puppet[:config]
218
+ Puppet.config.parse(Puppet[:config])
219
+ end
220
+ end
221
+
187
222
  # Relaunch the executable.
188
223
  def self.restart
189
224
  command = $0 + " " + self.args.join(" ")
@@ -393,4 +428,4 @@ if Puppet[:storeconfigs]
393
428
  require 'puppet/rails'
394
429
  end
395
430
 
396
- # $Id: puppet.rb 2446 2007-05-01 03:52:33Z luke $
431
+ # $Id: puppet.rb 2631 2007-06-19 23:12:23Z luke $
@@ -0,0 +1,60 @@
1
+ Puppet::Util::ConfigStore.newstore(:rest) do
2
+ desc "Store client configurations via a REST web service."
3
+
4
+ require 'net/http'
5
+
6
+ # Get a client's config. (called in collector?)
7
+ def get(client, config)
8
+ # Assuming this comes in as Puppet::Parser objects
9
+ # we may need way to choose which transport data type we use.
10
+
11
+ # hmm.. is this even useful for stored configs? I suppose there could
12
+ # be scenarios where it'd be cool, like ralsh or something.
13
+ end
14
+
15
+ def initialize
16
+ @host = Puppet[:puppetstorehost]
17
+ @port = Puppet[:puppetstoreport]
18
+
19
+ # Not sure if this is bad idea to share.
20
+ @http = Net::HTTP.new(@host, @port)
21
+ end
22
+
23
+ # Store config to the web service. (called in getconfig?)
24
+ def store(client, config)
25
+ # Probably store as yaml...
26
+ puppetstore = Thread.new do
27
+ benchmark(:notice, "Stored configuration for %s" % client) do
28
+ begin
29
+ # config should come from elsewhere; probably in getconfig I assume.
30
+ # should probably allow a config option for the serialization type.
31
+ yaml = YAML.dump(config)
32
+ url = "/collector/create"
33
+ @http.post(url, yaml, { 'Content-Type' => 'text/yaml' })
34
+ rescue => detail
35
+ Puppet.err("ERROR: storeconfig failed: ", detail.to_s)
36
+ end
37
+ end
38
+ end
39
+ puppetstore.run
40
+ end
41
+
42
+ # Rough first try... assuming the calling method handles the data type conversion
43
+ # Can we use a thread here? Probably needs to be the caller's thread.
44
+ def collect_exported(client, conditions)
45
+ begin
46
+ # Gotta be a better way... seems goofy to me.
47
+ # maybe using a nested rails rest route...
48
+
49
+ # filterhost so we don't get exported resources for the current client
50
+ url = "/resources?restype=exported&filterhost=#{client}"
51
+ conditions.each_pair {|k,v| url << "&#{k}=#{v}"}
52
+ res = @http.get(url)
53
+ rescue => detail
54
+ Puppet.err("ERROR: collect_exported failed: ", detail.to_s)
55
+ end
56
+
57
+ return res.body unless !res.is_a?(Net::HTTPOK)
58
+ end
59
+
60
+ end
@@ -5,6 +5,7 @@ module Puppet
5
5
  conf = nil
6
6
  var = nil
7
7
  name = $0.gsub(/.+#{File::SEPARATOR}/,'').sub(/\.rb$/, '')
8
+
8
9
  if name != "puppetmasterd" and Puppet::Util::SUIDManager.uid != 0
9
10
  conf = File.expand_path("~/.puppet")
10
11
  var = File.expand_path("~/.puppet/var")
@@ -14,7 +15,7 @@ module Puppet
14
15
  var = "/var/puppet"
15
16
  end
16
17
 
17
- self.setdefaults(:puppet,
18
+ self.setdefaults(:main,
18
19
  :confdir => [conf, "The main Puppet configuration directory. The default for this parameter is calculated based on the user. If the process
19
20
  is runnig as root or the user that ``puppetmasterd`` is supposed to run as, it defaults to a system directory, but if it's running as any other user,
20
21
  it defaults to being in ``~``."],
@@ -33,7 +34,7 @@ module Puppet
33
34
  else
34
35
  logopts = ["$vardir/log", "The Puppet log directory."]
35
36
  end
36
- setdefaults(:puppet, :logdir => logopts)
37
+ setdefaults(:main, :logdir => logopts)
37
38
 
38
39
  # This name hackery is necessary so that the rundir is set reasonably during
39
40
  # unit tests.
@@ -43,7 +44,7 @@ module Puppet
43
44
  rundir = "$vardir/run"
44
45
  end
45
46
 
46
- self.setdefaults(:puppet,
47
+ self.setdefaults(:main,
47
48
  :trace => [false, "Whether to print stack traces on some errors"],
48
49
  :autoflush => [false, "Whether log files should always flush to disk."],
49
50
  :syslogfacility => ["daemon", "What syslog facility to use when logging to
@@ -124,9 +125,141 @@ module Puppet
124
125
  ]
125
126
  )
126
127
 
128
+ hostname = Facter["hostname"].value
129
+ domain = Facter["domain"].value
130
+ if domain and domain != ""
131
+ fqdn = [hostname, domain].join(".")
132
+ else
133
+ fqdn = hostname
134
+ end
135
+
136
+ Puppet.setdefaults(:ssl,
137
+ :certname => [fqdn, "The name to use when handling certificates. Defaults
138
+ to the fully qualified domain name."],
139
+ :certdir => ["$ssldir/certs", "The certificate directory."],
140
+ :publickeydir => ["$ssldir/public_keys", "The public key directory."],
141
+ :privatekeydir => { :default => "$ssldir/private_keys",
142
+ :mode => 0750,
143
+ :desc => "The private key directory."
144
+ },
145
+ :privatedir => { :default => "$ssldir/private",
146
+ :mode => 0750,
147
+ :desc => "Where the client stores private certificate information."
148
+ },
149
+ :passfile => { :default => "$privatedir/password",
150
+ :mode => 0640,
151
+ :desc => "Where puppetd stores the password for its private key.
152
+ Generally unused."
153
+ },
154
+ :hostcsr => { :default => "$ssldir/csr_$certname.pem",
155
+ :mode => 0644,
156
+ :desc => "Where individual hosts store and look for their certificates."
157
+ },
158
+ :hostcert => { :default => "$certdir/$certname.pem",
159
+ :mode => 0644,
160
+ :desc => "Where individual hosts store and look for their certificates."
161
+ },
162
+ :hostprivkey => { :default => "$privatekeydir/$certname.pem",
163
+ :mode => 0600,
164
+ :desc => "Where individual hosts store and look for their private key."
165
+ },
166
+ :hostpubkey => { :default => "$publickeydir/$certname.pem",
167
+ :mode => 0644,
168
+ :desc => "Where individual hosts store and look for their public key."
169
+ },
170
+ :localcacert => { :default => "$certdir/ca.pem",
171
+ :mode => 0644,
172
+ :desc => "Where each client stores the CA certificate."
173
+ }
174
+ )
175
+
176
+ setdefaults(:ca,
177
+ :cadir => { :default => "$ssldir/ca",
178
+ :owner => "$user",
179
+ :group => "$group",
180
+ :mode => 0770,
181
+ :desc => "The root directory for the certificate authority."
182
+ },
183
+ :cacert => { :default => "$cadir/ca_crt.pem",
184
+ :owner => "$user",
185
+ :group => "$group",
186
+ :mode => 0660,
187
+ :desc => "The CA certificate."
188
+ },
189
+ :cakey => { :default => "$cadir/ca_key.pem",
190
+ :owner => "$user",
191
+ :group => "$group",
192
+ :mode => 0660,
193
+ :desc => "The CA private key."
194
+ },
195
+ :capub => { :default => "$cadir/ca_pub.pem",
196
+ :owner => "$user",
197
+ :group => "$group",
198
+ :desc => "The CA public key."
199
+ },
200
+ :cacrl => { :default => "$cadir/ca_crl.pem",
201
+ :owner => "$user",
202
+ :group => "$group",
203
+ :mode => 0664,
204
+ :desc => "The certificate revocation list (CRL) for the CA. Set this to 'none' if you do not want to use a CRL."
205
+ },
206
+ :caprivatedir => { :default => "$cadir/private",
207
+ :owner => "$user",
208
+ :group => "$group",
209
+ :mode => 0770,
210
+ :desc => "Where the CA stores private certificate information."
211
+ },
212
+ :csrdir => { :default => "$cadir/requests",
213
+ :owner => "$user",
214
+ :group => "$group",
215
+ :desc => "Where the CA stores certificate requests"
216
+ },
217
+ :signeddir => { :default => "$cadir/signed",
218
+ :owner => "$user",
219
+ :group => "$group",
220
+ :mode => 0770,
221
+ :desc => "Where the CA stores signed certificates."
222
+ },
223
+ :capass => { :default => "$caprivatedir/ca.pass",
224
+ :owner => "$user",
225
+ :group => "$group",
226
+ :mode => 0660,
227
+ :desc => "Where the CA stores the password for the private key"
228
+ },
229
+ :serial => { :default => "$cadir/serial",
230
+ :owner => "$user",
231
+ :group => "$group",
232
+ :desc => "Where the serial number for certificates is stored."
233
+ },
234
+ :autosign => { :default => "$confdir/autosign.conf",
235
+ :mode => 0644,
236
+ :desc => "Whether to enable autosign. Valid values are true (which
237
+ autosigns any key request, and is a very bad idea), false (which
238
+ never autosigns any key request), and the path to a file, which
239
+ uses that configuration file to determine which keys to sign."},
240
+ :ca_days => ["", "How long a certificate should be valid.
241
+ This parameter is deprecated, use ca_ttl instead"],
242
+ :ca_ttl => ["5y", "The default TTL for new certificates; valid values
243
+ must be an integer, optionally followed by one of the units
244
+ 'y' (years of 365 days), 'd' (days), 'h' (hours), or
245
+ 's' (seconds). The unit defaults to seconds. If this parameter
246
+ is set, ca_days is ignored. Examples are '3600' (one hour)
247
+ and '1825d', which is the same as '5y' (5 years) "],
248
+ :ca_md => ["md5", "The type of hash used in certificates."],
249
+ :req_bits => [2048, "The bit length of the certificates."],
250
+ :keylength => [1024, "The bit length of keys."],
251
+ :cert_inventory => {
252
+ :default => "$cadir/inventory.txt",
253
+ :mode => 0644,
254
+ :owner => "$user",
255
+ :group => "$group",
256
+ :desc => "A Complete listing of all certificates"
257
+ }
258
+ )
259
+
127
260
  # Define the config default.
128
- self.setdefaults(self.name,
129
- :config => ["$confdir/#{Puppet[:name]}.conf",
261
+ self.setdefaults(self.config[:name],
262
+ :config => ["$confdir/puppet.conf",
130
263
  "The configuration file for #{Puppet[:name]}."],
131
264
  :pidfile => ["", "The pid file"],
132
265
  :bindaddress => ["", "The address to bind to. Mongrel servers
@@ -137,7 +270,7 @@ module Puppet
137
270
  speak SSL."]
138
271
  )
139
272
 
140
- self.setdefaults("puppetmasterd",
273
+ self.setdefaults(:puppetmasterd,
141
274
  :user => ["puppet", "The user puppetmasterd should run as."],
142
275
  :group => ["puppet", "The group puppetmasterd should run as."],
143
276
  :manifestdir => ["$confdir/manifests",
@@ -176,16 +309,20 @@ module Puppet
176
309
  :ca => [true, "Wether the master should function as a certificate authority."],
177
310
  :modulepath => [ "$confdir/modules:/usr/share/puppet/modules",
178
311
  "The search path for modules as a colon-separated list of
179
- directories." ]
312
+ directories." ],
313
+ :ssl_client_header => ["HTTP_X_CLIENT_DN", "The header containing an authenticated
314
+ client's SSL DN. Only used with Mongrel. This header must be set by the proxy
315
+ to the authenticated client's SSL DN (e.g., ``/CN=puppet.reductivelabs.com``).
316
+ See the `UsingMongrel`:trac: wiki page for more information."]
180
317
  )
181
318
 
182
- self.setdefaults("puppetd",
319
+ self.setdefaults(:puppetd,
183
320
  :localconfig => { :default => "$statedir/localconfig",
184
321
  :owner => "root",
185
322
  :mode => 0660,
186
323
  :desc => "Where puppetd caches the local configuration. An
187
324
  extension indicating the cache format is added automatically."},
188
- :classfile => { :default => "$confdir/classes.txt",
325
+ :classfile => { :default => "$statedir/classes.txt",
189
326
  :owner => "root",
190
327
  :mode => 0644,
191
328
  :desc => "The file in which puppetd stores a list of the classes
@@ -222,14 +359,14 @@ module Puppet
222
359
  :ca_port => ["$masterport", "The port to use for the certificate authority."]
223
360
  )
224
361
 
225
- self.setdefaults("filebucket",
362
+ self.setdefaults(:filebucket,
226
363
  :clientbucketdir => {
227
364
  :default => "$vardir/clientbucket",
228
365
  :mode => 0750,
229
366
  :desc => "Where FileBucket files are stored locally."
230
367
  }
231
368
  )
232
- self.setdefaults("fileserver",
369
+ self.setdefaults(:fileserver,
233
370
  :fileserverconfig => ["$confdir/fileserver.conf",
234
371
  "Where the fileserver configuration is stored."]
235
372
  )
@@ -247,7 +384,7 @@ module Puppet
247
384
  received from the client. Each client gets a separate
248
385
  subdirectory."}
249
386
  )
250
- self.setdefaults("puppetd",
387
+ self.setdefaults(:puppetd,
251
388
  :puppetdlockfile => [ "$statedir/puppetdlock",
252
389
  "A lock file to temporarily stop puppetd from doing anything."],
253
390
  :usecacheonfailure => [true,
@@ -263,7 +400,17 @@ module Puppet
263
400
  change or if the server changes."
264
401
  ],
265
402
  :downcasefacts => [false,
266
- "Whether facts should be made all lowercase when sent to the server."]
403
+ "Whether facts should be made all lowercase when sent to the server."],
404
+ :dynamicfacts => ["memorysize,memoryfree,swapsize,swapfree",
405
+ "Facts that are dynamic; these facts will be ignored when deciding whether
406
+ changed facts should result in a recompile. Multiple facts should be
407
+ comma-separated."],
408
+ :splaylimit => ["$runinterval",
409
+ "The maximum time to delay before runs. Defaults to being the same as the
410
+ run interval."],
411
+ :splay => [false,
412
+ "Whether to sleep for a pseudo-random (but consistent) amount of time before
413
+ a run."]
267
414
  )
268
415
 
269
416
  self.setdefaults(:puppetd,
@@ -281,7 +428,7 @@ module Puppet
281
428
  )
282
429
 
283
430
  # Plugin information.
284
- self.setdefaults("puppet",
431
+ self.setdefaults(:main,
285
432
  :pluginpath => ["$vardir/plugins",
286
433
  "Where Puppet should look for plugins. Multiple directories should
287
434
  be colon-separated, like normal PATH variables."],
@@ -299,7 +446,7 @@ module Puppet
299
446
  )
300
447
 
301
448
  # Central fact information.
302
- self.setdefaults("puppet",
449
+ self.setdefaults(:main,
303
450
  :factpath => ["$vardir/facts",
304
451
  "Where Puppet should look for facts. Multiple directories should
305
452
  be colon-separated, like normal PATH variables."],
@@ -316,7 +463,7 @@ module Puppet
316
463
  "What files to ignore when pulling down facts."]
317
464
  )
318
465
 
319
- self.setdefaults(:reporting,
466
+ self.setdefaults(:tagmail,
320
467
  :tagmap => ["$confdir/tagmail.conf",
321
468
  "The mapping between reporting tags and email addresses."],
322
469
  :sendmail => [%x{which sendmail 2>/dev/null}.chomp,
@@ -326,6 +473,154 @@ module Puppet
326
473
  :smtpserver => ["none",
327
474
  "The server through which to send email reports."]
328
475
  )
476
+
477
+ self.setdefaults(:facts,
478
+ :factstore => ["yaml",
479
+ "The backend store to use for client facts."]
480
+ )
481
+
482
+ self.setdefaults(:yamlfacts,
483
+ :yamlfactdir => ["$vardir/facts",
484
+ "The directory in which client facts are stored when the yaml fact store is used."]
485
+ )
486
+
487
+ self.setdefaults(:rails,
488
+ :dblocation => { :default => "$statedir/clientconfigs.sqlite3",
489
+ :mode => 0660,
490
+ :owner => "$user",
491
+ :group => "$group",
492
+ :desc => "The database cache for client configurations. Used for
493
+ querying within the language."
494
+ },
495
+ :dbadapter => [ "sqlite3", "The type of database to use." ],
496
+ :dbmigrate => [ false, "Whether to automatically migrate the database." ],
497
+ :dbname => [ "puppet", "The name of the database to use." ],
498
+ :dbserver => [ "localhost", "The database server for Client caching. Only
499
+ used when networked databases are used."],
500
+ :dbuser => [ "puppet", "The database user for Client caching. Only
501
+ used when networked databases are used."],
502
+ :dbpassword => [ "puppet", "The database password for Client caching. Only
503
+ used when networked databases are used."],
504
+ :railslog => {:default => "$logdir/rails.log",
505
+ :mode => 0600,
506
+ :owner => "$user",
507
+ :group => "$group",
508
+ :desc => "Where Rails-specific logs are sent"
509
+ }
510
+ )
511
+
512
+ setdefaults(:graphing,
513
+ :graph => [false, "Whether to create dot graph files for the different
514
+ configuration graphs. These dot files can be interpreted by tools
515
+ like OmniGraffle or dot (which is part of ImageMagick)."],
516
+ :graphdir => ["$statedir/graphs", "Where to store dot-outputted graphs."]
517
+ )
518
+
519
+ setdefaults(:transaction,
520
+ :tags => ["", "Tags to use to find resources. If this is set, then
521
+ only resources tagged with the specified tags will be applied.
522
+ Values must be comma-separated."],
523
+ :evaltrace => [false, "Whether each resource should log when it is
524
+ being evaluated. This allows you to interactively see exactly
525
+ what is being done."],
526
+ :summarize => [false,
527
+ "Whether to print a transaction summary."
528
+ ]
529
+ )
530
+
531
+ setdefaults(:parser,
532
+ :typecheck => [true, "Whether to validate types during parsing."],
533
+ :paramcheck => [true, "Whether to validate parameters during parsing."]
534
+ )
535
+
536
+ setdefaults(:main,
537
+ :casesensitive => [false,
538
+ "Whether matching in case statements and selectors
539
+ should be case-sensitive. Case insensitivity is
540
+ handled by downcasing all values before comparison."],
541
+ :external_nodes => ["none",
542
+ "An external command that can produce node information. The output
543
+ must be a YAML dump of a hash, and that hash must have one or both of
544
+ ``classes`` and ``parameters``, where ``classes`` is an array and
545
+ ``parameters`` is a hash. For unknown nodes, the commands should
546
+ exit with a non-zero exit code.
547
+
548
+ This command makes it straightforward to store your node mapping
549
+ information in other data sources like databases."])
550
+
551
+ setdefaults(:ldap,
552
+ :ldapnodes => [false,
553
+ "Whether to search for node configurations in LDAP."],
554
+ :ldapssl => [false,
555
+ "Whether SSL should be used when searching for nodes.
556
+ Defaults to false because SSL usually requires certificates
557
+ to be set up on the client side."],
558
+ :ldaptls => [false,
559
+ "Whether TLS should be used when searching for nodes.
560
+ Defaults to false because TLS usually requires certificates
561
+ to be set up on the client side."],
562
+ :ldapserver => ["ldap",
563
+ "The LDAP server. Only used if ``ldapnodes`` is enabled."],
564
+ :ldapport => [389,
565
+ "The LDAP port. Only used if ``ldapnodes`` is enabled."],
566
+ :ldapstring => ["(&(objectclass=puppetClient)(cn=%s))",
567
+ "The search string used to find an LDAP node."],
568
+ :ldapclassattrs => ["puppetclass",
569
+ "The LDAP attributes to use to define Puppet classes. Values
570
+ should be comma-separated."],
571
+ :ldapattrs => ["all",
572
+ "The LDAP attributes to include when querying LDAP for nodes. All
573
+ returned attributes are set as variables in the top-level scope.
574
+ Multiple values should be comma-separated. The value 'all' returns
575
+ all attributes."],
576
+ :ldapparentattr => ["parentnode",
577
+ "The attribute to use to define the parent node."],
578
+ :ldapuser => ["",
579
+ "The user to use to connect to LDAP. Must be specified as a
580
+ full DN."],
581
+ :ldappassword => ["",
582
+ "The password to use to connect to LDAP."],
583
+ :ldapbase => ["",
584
+ "The search base for LDAP searches. It's impossible to provide
585
+ a meaningful default here, although the LDAP libraries might
586
+ have one already set. Generally, it should be the 'ou=Hosts'
587
+ branch under your main directory."]
588
+ )
589
+
590
+ setdefaults(:puppetmasterd,
591
+ :storeconfigs => [false,
592
+ "Whether to store each client's configuration. This
593
+ requires ActiveRecord from Ruby on Rails."]
594
+ )
595
+
596
+ # This doesn't actually work right now.
597
+ setdefaults(:parser,
598
+ :lexical => [false, "Whether to use lexical scoping (vs. dynamic)."],
599
+ :templatedir => ["$vardir/templates",
600
+ "Where Puppet looks for template files."
601
+ ]
602
+ )
603
+
604
+ setdefaults(:main,
605
+ :filetimeout => [ 15,
606
+ "The minimum time to wait (in seconds) between checking for updates in
607
+ configuration files. This timeout determines how quickly Puppet checks whether
608
+ a file (such as manifests or templates) has changed on disk."
609
+ ]
610
+ )
611
+
612
+ setdefaults(:metrics,
613
+ :rrddir => {:default => "$vardir/rrd",
614
+ :owner => "$user",
615
+ :group => "$group",
616
+ :desc => "The directory where RRD database files are stored.
617
+ Directories for each reporting host will be created under
618
+ this directory."
619
+ },
620
+ :rrdgraph => [false, "Whether RRD information should be graphed."],
621
+ :rrdinterval => ["$runinterval", "How often RRD should expect data.
622
+ This should match how often the hosts report back to the server."]
623
+ )
329
624
  end
330
625
 
331
- # $Id: configuration.rb 2411 2007-04-24 18:59:20Z luke $
626
+ # $Id: configuration.rb 2587 2007-06-15 02:40:20Z luke $