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
@@ -61,15 +61,12 @@ class Puppet::Type
61
61
  # we've set up our naming stuff correctly everywhere.
62
62
 
63
63
  # Mark found objects as present
64
- obj.is = [:ensure, :present]
65
64
  hash.each { |param, value|
66
65
  if property = obj.property(param)
67
- property.is = value
68
66
  elsif val = obj[param]
69
67
  obj[param] = val
70
68
  else
71
69
  # There is a value on disk, but it should go away
72
- obj.is = [param, value]
73
70
  obj[param] = :absent
74
71
  end
75
72
  }
@@ -82,33 +79,13 @@ class Puppet::Type
82
79
  # because it sets the should value, not the is value.
83
80
  hash.delete(namevar)
84
81
  hash.each { |param, value|
85
- obj.is = [param, value]
82
+ obj[param] = value unless obj.add_property_parameter(param)
86
83
  }
87
84
  end
88
85
 
89
86
  return obj
90
87
  end
91
88
 
92
- # Create a list method that just calls our providers.
93
- def self.mkprovider_list
94
- unless respond_to?(:list)
95
- meta_def(:list) do
96
- suitableprovider.find_all { |p| p.respond_to?(:list) }.collect { |prov|
97
- prov.list.each { |h| h[:provider] = prov.name }
98
- }.flatten.collect do |hash|
99
- if hash.is_a?(Hash)
100
- hash2obj(hash)
101
- elsif hash.is_a?(self)
102
- hash
103
- else
104
- raise Puppet::DevError, "Provider %s returned object of type %s in list" %
105
- [prov.name, hash.class]
106
- end
107
- end
108
- end
109
- end
110
- end
111
-
112
89
  # Retrieve a provider by name.
113
90
  def self.provider(name)
114
91
  name = Puppet::Util.symbolize(name)
@@ -153,7 +130,7 @@ class Puppet::Type
153
130
  Puppet::Type::Provider
154
131
  end
155
132
 
156
- options[:model] ||= self
133
+ options[:resource_type] ||= self
157
134
 
158
135
  self.providify
159
136
 
@@ -174,9 +151,7 @@ class Puppet::Type
174
151
  # are providers.
175
152
  def self.providify
176
153
  return if @paramhash.has_key? :provider
177
- model = self
178
154
 
179
- mkprovider_list()
180
155
  newparam(:provider) do
181
156
  desc "The specific backend for #{self.name.to_s} to use. You will
182
157
  seldom need to specify this -- Puppet will usually discover the
@@ -198,20 +173,24 @@ class Puppet::Type
198
173
  end
199
174
 
200
175
  defaultto {
201
- @parent.class.defaultprovider.name
176
+ @resource.class.defaultprovider.name
202
177
  }
203
178
 
204
- validate do |value|
205
- value = value[0] if value.is_a? Array
206
- if provider = @parent.class.provider(value)
179
+ validate do |provider_class|
180
+ provider_class = provider_class[0] if provider_class.is_a? Array
181
+ if provider_class.is_a?(Puppet::Provider)
182
+ provider_class = provider_class.class.name
183
+ end
184
+
185
+ if provider = @resource.class.provider(provider_class)
207
186
  unless provider.suitable?
208
187
  raise ArgumentError,
209
188
  "Provider '%s' is not functional on this platform" %
210
- [value]
189
+ [provider_class]
211
190
  end
212
191
  else
213
192
  raise ArgumentError, "Invalid %s provider '%s'" %
214
- [@parent.class.name, value]
193
+ [@resource.class.name, provider_class]
215
194
  end
216
195
  end
217
196
 
@@ -220,8 +199,13 @@ class Puppet::Type
220
199
  if provider.is_a? String
221
200
  provider = provider.intern
222
201
  end
223
- @parent.provider = provider
224
- provider
202
+ @resource.provider = provider
203
+
204
+ if provider.is_a?(Puppet::Provider)
205
+ provider.class.name
206
+ else
207
+ provider
208
+ end
225
209
  end
226
210
  end.parenttype = self
227
211
  end
@@ -248,13 +232,16 @@ class Puppet::Type
248
232
  end
249
233
 
250
234
  def provider=(name)
251
- if klass = self.class.provider(name)
235
+ if name.is_a?(Puppet::Provider)
236
+ @provider = name
237
+ @provider.resource = self
238
+ elsif klass = self.class.provider(name)
252
239
  @provider = klass.new(self)
253
240
  else
254
- raise UnknownProviderError, "Could not find %s provider of %s" %
241
+ raise ArgumentError, "Could not find %s provider of %s" %
255
242
  [name, self.class.name]
256
243
  end
257
244
  end
258
245
  end
259
246
 
260
- # $Id: providers.rb 2327 2007-03-19 20:24:08Z luke $
247
+ # $Id: providers.rb 2552 2007-06-05 01:17:00Z luke $
@@ -16,7 +16,7 @@ class Puppet::Network::Client::CA < Puppet::Network::Client
16
16
  # This client is really only able to request certificates for the
17
17
  # current host. It uses the Puppet.config settings to figure everything out.
18
18
  def request_cert
19
- Puppet.config.use(:puppet, :certificates)
19
+ Puppet.config.use(:main, :ssl)
20
20
 
21
21
  if cert = read_cert
22
22
  return cert
@@ -34,8 +34,6 @@ class Puppet::Network::Client::CA < Puppet::Network::Client
34
34
  if cert.nil? or cert == ""
35
35
  return nil
36
36
  end
37
- Puppet.config.write(:hostcert) do |f| f.print cert end
38
- Puppet.config.write(:localcacert) do |f| f.print cacert end
39
37
 
40
38
  begin
41
39
  @cert = OpenSSL::X509::Certificate.new(cert)
@@ -47,10 +45,15 @@ class Puppet::Network::Client::CA < Puppet::Network::Client
47
45
  end
48
46
 
49
47
  unless @cert.check_private_key(key)
50
- raise InvalidCertificate, "Certificate does not match private key"
48
+ raise InvalidCertificate, "Certificate does not match private key. Try 'puppetca --clean %s' on the server." % Facter.value(:fqdn)
51
49
  end
50
+
51
+ # Only write the cert out if it passes validating.
52
+ Puppet.config.write(:hostcert) do |f| f.print cert end
53
+ Puppet.config.write(:localcacert) do |f| f.print cacert end
54
+
52
55
  return @cert
53
56
  end
54
57
  end
55
58
 
56
- # $Id: ca.rb 2259 2007-03-06 19:03:05Z luke $
59
+ # $Id: ca.rb 2611 2007-06-18 19:33:15Z luke $
@@ -41,6 +41,11 @@ class Puppet::Network::Client::Master < Puppet::Network::Client
41
41
  facts
42
42
  end
43
43
 
44
+ # Return the list of dynamic facts as an array of symbols
45
+ def self.dynamic_facts
46
+ Puppet.config[:dynamicfacts].split(/\s*,\s*/).collect { |fact| fact.downcase }
47
+ end
48
+
44
49
  # This method actually applies the configuration.
45
50
  def apply(tags = nil, ignoreschedules = false)
46
51
  unless defined? @objects
@@ -74,7 +79,7 @@ class Puppet::Network::Client::Master < Puppet::Network::Client
74
79
  Puppet::Util::Storage.store
75
80
  end
76
81
 
77
- if Puppet[:report]
82
+ if Puppet[:report] or Puppet[:summarize]
78
83
  report(transaction)
79
84
  end
80
85
 
@@ -103,7 +108,7 @@ class Puppet::Network::Client::Master < Puppet::Network::Client
103
108
  end
104
109
 
105
110
  def clear
106
- @objects.remove(true)
111
+ @objects.remove(true) if @objects
107
112
  Puppet::Type.allclear
108
113
  mkdefault_objects
109
114
  @objects = nil
@@ -238,7 +243,7 @@ class Puppet::Network::Client::Master < Puppet::Network::Client
238
243
 
239
244
  # Just so we can specify that we are "the" instance.
240
245
  def initialize(*args)
241
- Puppet.config.use(:puppet, :sslcertificates, :puppetd)
246
+ Puppet.config.use(:main, :ssl, :puppetd)
242
247
  super
243
248
 
244
249
  # This might be nil
@@ -288,6 +293,7 @@ class Puppet::Network::Client::Master < Puppet::Network::Client
288
293
  # The code that actually runs the configuration.
289
294
  def run(tags = nil, ignoreschedules = false)
290
295
  got_lock = false
296
+ splay
291
297
  Puppet::Util.sync(:puppetrun).synchronize(Sync::EX) do
292
298
  if !lockfile.lock
293
299
  Puppet.notice "Lock file %s exists; skipping configuration run" %
@@ -319,6 +325,7 @@ class Puppet::Network::Client::Master < Puppet::Network::Client
319
325
  ensure
320
326
  # Just make sure we remove the lock file if we set it.
321
327
  lockfile.unlock if got_lock and lockfile.locked?
328
+ clear()
322
329
  end
323
330
 
324
331
  def running?
@@ -483,11 +490,11 @@ class Puppet::Network::Client::Master < Puppet::Network::Client
483
490
  end
484
491
 
485
492
  def self.timeout
486
- @timeout = Puppet[:configtimeout]
487
- case @timeout
493
+ timeout = Puppet[:configtimeout]
494
+ case timeout
488
495
  when String:
489
- if @timeout =~ /^\d+$/
490
- @timeout = Integer(@timeout)
496
+ if timeout =~ /^\d+$/
497
+ timeout = Integer(timeout)
491
498
  else
492
499
  raise ArgumentError, "Configuration timeout must be an integer"
493
500
  end
@@ -495,18 +502,33 @@ class Puppet::Network::Client::Master < Puppet::Network::Client
495
502
  else
496
503
  raise ArgumentError, "Configuration timeout must be an integer"
497
504
  end
505
+
506
+ return timeout
498
507
  end
499
508
 
500
509
  # Send off the transaction report.
501
510
  def report(transaction)
502
511
  begin
503
512
  report = transaction.generate_report()
504
- if Puppet[:rrdgraph] == true
505
- report.graph()
506
- end
507
- reportclient().report(report)
508
513
  rescue => detail
509
- Puppet.err "Reporting failed: %s" % detail
514
+ Puppet.err "Could not generate report: %s" % detail
515
+ return
516
+ end
517
+
518
+ if Puppet[:rrdgraph] == true
519
+ report.graph()
520
+ end
521
+
522
+ if Puppet[:summarize]
523
+ puts report.summary
524
+ end
525
+
526
+ if Puppet[:report]
527
+ begin
528
+ reportclient().report(report)
529
+ rescue => detail
530
+ Puppet.err "Reporting failed: %s" % detail
531
+ end
510
532
  end
511
533
  end
512
534
 
@@ -521,13 +543,17 @@ class Puppet::Network::Client::Master < Puppet::Network::Client
521
543
  end
522
544
 
523
545
  loadfacts()
524
-
525
- private
526
546
 
527
547
  # Have the facts changed since we last compiled?
528
548
  def facts_changed?(facts)
529
- oldfacts = Puppet::Util::Storage.cache(:configuration)[:facts]
530
- newfacts = facts
549
+ oldfacts = (Puppet::Util::Storage.cache(:configuration)[:facts] || {}).dup
550
+ newfacts = facts.dup
551
+ self.class.dynamic_facts.each do |fact|
552
+ [oldfacts, newfacts].each do |facthash|
553
+ facthash.delete(fact) if facthash.include?(fact)
554
+ end
555
+ end
556
+
531
557
  if oldfacts == newfacts
532
558
  return false
533
559
  else
@@ -639,6 +665,22 @@ class Puppet::Network::Client::Master < Puppet::Network::Client
639
665
 
640
666
  @lockfile
641
667
  end
668
+
669
+ # Sleep when splay is enabled; else just return.
670
+ def splay
671
+ return unless Puppet[:splay]
672
+
673
+ limit = Integer(Puppet[:splaylimit])
674
+
675
+ # Pick a splay time and then cache it.
676
+ unless time = Puppet::Util::Storage.cache(:configuration)[:splay_time]
677
+ time = rand(limit)
678
+ Puppet::Util::Storage.cache(:configuration)[:splay_time] = time
679
+ end
680
+
681
+ Puppet.info "Sleeping for %s seconds (splay is enabled)" % time
682
+ sleep(time)
683
+ end
642
684
  end
643
685
 
644
- # $Id: master.rb 2435 2007-04-30 16:19:37Z luke $
686
+ # $Id: master.rb 2602 2007-06-18 15:35:57Z luke $
@@ -1,9 +1,12 @@
1
+ require 'puppet/util/docs'
1
2
  require 'puppet/util/subclass_loader'
2
3
 
3
4
  module Puppet::Network
4
5
  # The base class for the different handlers. The handlers are each responsible
5
6
  # for separate xmlrpc namespaces.
6
7
  class Handler
8
+ extend Puppet::Util::Docs
9
+
7
10
  # This is so that the handlers can subclass just 'Handler', rather
8
11
  # then having to specify the full class path.
9
12
  Handler = self
@@ -24,10 +27,24 @@ module Puppet::Network
24
27
  end
25
28
  end
26
29
 
30
+ # Set/Determine whether we're a client- or server-side handler.
31
+ def self.side(side = nil)
32
+ if side
33
+ side = side.intern if side.is_a?(String)
34
+ unless [:client, :server].include?(side)
35
+ raise ArgumentError, "Invalid side registration '%s' for %s" % [side, self.name]
36
+ end
37
+ @side = side
38
+ else
39
+ @side ||= :server
40
+ return @side
41
+ end
42
+ end
43
+
27
44
  # Create an empty init method with the same signature.
28
45
  def initialize(hash = {})
29
46
  end
30
47
  end
31
48
  end
32
49
 
33
- # $Id: handler.rb 2259 2007-03-06 19:03:05Z luke $
50
+ # $Id: handler.rb 2479 2007-05-07 22:29:44Z luke $
@@ -10,6 +10,10 @@ class Puppet::Network::Handler
10
10
  class CA < Handler
11
11
  attr_reader :ca
12
12
 
13
+ desc "Provides an interface for signing CSRs. Accepts a CSR and returns
14
+ the CA certificate and the signed certificate, or returns nil if
15
+ the cert is not signed."
16
+
13
17
  @interface = XMLRPC::Service::Interface.new("puppetca") { |iface|
14
18
  iface.add_method("array getcert(csr)")
15
19
  }
@@ -56,7 +60,7 @@ class Puppet::Network::Handler
56
60
  end
57
61
 
58
62
  def initialize(hash = {})
59
- Puppet.config.use(:puppet, :certificates, :ca)
63
+ Puppet.config.use(:main, :ssl, :ca)
60
64
  if hash.include? :autosign
61
65
  @autosign = hash[:autosign]
62
66
  end
@@ -100,7 +104,9 @@ class Puppet::Network::Handler
100
104
  cert, cacert = ca.getclientcert(hostname)
101
105
  if cert and cacert
102
106
  Puppet.info "Retrieving existing certificate for %s" % hostname
103
- #Puppet.info "Cert: %s; Cacert: %s" % [cert.class, cacert.class]
107
+ unless csr.public_key.to_s == cert.public_key.to_s
108
+ raise Puppet::Error, "Certificate request does not match existing certificate; run 'puppetca --clean %s'." % hostname
109
+ end
104
110
  return [cert.to_pem, cacert.to_pem]
105
111
  elsif @ca
106
112
  if self.autosign?(hostname) or client.nil?
@@ -149,4 +155,4 @@ class Puppet::Network::Handler
149
155
  end
150
156
  end
151
157
 
152
- # $Id: ca.rb 2259 2007-03-06 19:03:05Z luke $
158
+ # $Id: ca.rb 2612 2007-06-18 19:51:17Z luke $
@@ -0,0 +1,70 @@
1
+ require 'yaml'
2
+ require 'puppet/util/fact_store'
3
+
4
+ class Puppet::Network::Handler
5
+ # Receive logs from remote hosts.
6
+ class Facts < Handler
7
+ desc "An interface for storing and retrieving client facts. Currently only
8
+ used internally by Puppet."
9
+
10
+ @interface = XMLRPC::Service::Interface.new("facts") { |iface|
11
+ iface.add_method("void set(string, string)")
12
+ iface.add_method("string get(string)")
13
+ iface.add_method("integer store_date(string)")
14
+ }
15
+
16
+ def initialize(hash = {})
17
+ super
18
+
19
+ backend = Puppet[:factstore]
20
+
21
+ unless klass = Puppet::Util::FactStore.store(backend)
22
+ raise Puppet::Error, "Could not find fact store %s" % backend
23
+ end
24
+
25
+ @backend = klass.new
26
+ end
27
+
28
+ # Get the facts from our back end.
29
+ def get(node)
30
+ if facts = @backend.get(node)
31
+ return strip_internal(facts)
32
+ else
33
+ return nil
34
+ end
35
+ end
36
+
37
+ # Set the facts in the backend.
38
+ def set(node, facts)
39
+ @backend.set(node, add_internal(facts))
40
+ nil
41
+ end
42
+
43
+ # Retrieve a client's storage date.
44
+ def store_date(node)
45
+ if facts = get(node)
46
+ facts[:_puppet_timestamp].to_i
47
+ else
48
+ nil
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ # Add internal data to the facts for storage.
55
+ def add_internal(facts)
56
+ facts = facts.dup
57
+ facts[:_puppet_timestamp] = Time.now
58
+ facts
59
+ end
60
+
61
+ # Strip out that internal data.
62
+ def strip_internal(facts)
63
+ facts = facts.dup
64
+ facts.find_all { |name, value| name.to_s =~ /^_puppet_/ }.each { |name, value| facts.delete(name) }
65
+ facts
66
+ end
67
+ end
68
+ end
69
+
70
+ # $Id: facts.rb 2479 2007-05-07 22:29:44Z luke $