puppet 0.18.4 → 0.22.4

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 (673) hide show
  1. data/CHANGELOG +288 -0
  2. data/README +2 -2
  3. data/Rakefile +78 -5
  4. data/bin/puppet +28 -36
  5. data/bin/puppetca +81 -38
  6. data/bin/puppetd +65 -62
  7. data/bin/puppetdoc +409 -140
  8. data/bin/puppetmasterd +59 -47
  9. data/bin/puppetrun +38 -23
  10. data/conf/freebsd/puppetd +26 -0
  11. data/conf/freebsd/puppetmasterd +26 -0
  12. data/conf/gentoo/conf.d/puppet +5 -0
  13. data/conf/gentoo/conf.d/puppetmaster +12 -0
  14. data/conf/gentoo/init.d/puppet +38 -0
  15. data/conf/gentoo/init.d/puppetmaster +50 -0
  16. data/conf/gentoo/puppet/fileserver.conf +12 -0
  17. data/conf/gentoo/puppet/puppetca.conf +29 -0
  18. data/conf/gentoo/puppet/puppetd.conf +29 -0
  19. data/conf/gentoo/puppet/puppetmasterd.conf +29 -0
  20. data/conf/redhat/client.init +10 -5
  21. data/conf/redhat/client.sysconfig +1 -1
  22. data/conf/redhat/fileserver.conf +2 -2
  23. data/conf/redhat/logrotate +1 -1
  24. data/conf/redhat/no-lockdir.patch +13 -0
  25. data/conf/redhat/puppet.spec +65 -8
  26. data/conf/redhat/puppetd.conf +0 -4
  27. data/conf/redhat/server.init +3 -6
  28. data/conf/solaris/pkginfo +1 -1
  29. data/conf/solaris/smf/svc-puppetd +2 -2
  30. data/conf/suse/client.init +142 -0
  31. data/conf/suse/puppet.spec +221 -0
  32. data/conf/suse/server.init +162 -0
  33. data/examples/code/mac_automount.pp +16 -0
  34. data/examples/root/bin/sleeper +3 -5
  35. data/examples/root/etc/init.d/sleeper +8 -2
  36. data/examples/root/etc/puppet/fileserver.conf +12 -2
  37. data/examples/root/etc/puppet/namespaceauth.conf +20 -0
  38. data/examples/root/etc/puppet/puppetd.conf +4 -0
  39. data/examples/root/etc/puppet/puppetmasterd.conf +6 -9
  40. data/examples/root/etc/puppet/tagmail.conf +1 -0
  41. data/ext/emacs/puppet-mode.el +46 -1
  42. data/ext/logcheck/puppet +15 -0
  43. data/ext/module_puppet +15 -23
  44. data/ext/vim/puppet.vim +4 -2
  45. data/install.rb +2 -1
  46. data/lib/puppet.rb +76 -207
  47. data/lib/puppet/configuration.rb +331 -0
  48. data/lib/puppet/daemon.rb +63 -246
  49. data/lib/puppet/dsl.rb +371 -0
  50. data/lib/puppet/element.rb +8 -26
  51. data/lib/puppet/error.rb +54 -0
  52. data/lib/puppet/event.rb +8 -243
  53. data/lib/puppet/{base64.rb → external/base64.rb} +0 -0
  54. data/lib/puppet/external/event-loop.rb +1 -0
  55. data/lib/puppet/{event-loop → external/event-loop}/better-definers.rb +0 -0
  56. data/lib/puppet/{event-loop → external/event-loop}/event-loop.rb +2 -2
  57. data/lib/puppet/{event-loop → external/event-loop}/signal-system.rb +1 -1
  58. data/lib/puppet/external/gratr.rb +33 -0
  59. data/lib/puppet/external/gratr/adjacency_graph.rb +257 -0
  60. data/lib/puppet/external/gratr/base.rb +34 -0
  61. data/lib/puppet/external/gratr/biconnected.rb +116 -0
  62. data/lib/puppet/external/gratr/chinese_postman.rb +123 -0
  63. data/lib/puppet/external/gratr/common.rb +73 -0
  64. data/lib/puppet/external/gratr/comparability.rb +92 -0
  65. data/lib/puppet/external/gratr/digraph.rb +116 -0
  66. data/lib/puppet/external/gratr/digraph_distance.rb +185 -0
  67. data/lib/puppet/external/gratr/dot.rb +90 -0
  68. data/lib/puppet/external/gratr/edge.rb +145 -0
  69. data/lib/puppet/external/gratr/graph.rb +303 -0
  70. data/lib/puppet/external/gratr/graph_api.rb +83 -0
  71. data/lib/puppet/external/gratr/import.rb +44 -0
  72. data/lib/puppet/external/gratr/labels.rb +90 -0
  73. data/lib/puppet/external/gratr/maximum_flow.rb +64 -0
  74. data/lib/puppet/external/gratr/rdot.rb +327 -0
  75. data/lib/puppet/external/gratr/search.rb +409 -0
  76. data/lib/puppet/external/gratr/strong_components.rb +127 -0
  77. data/lib/puppet/external/gratr/undirected_graph.rb +153 -0
  78. data/lib/puppet/{lock.rb → external/lock.rb} +1 -1
  79. data/lib/puppet/feature/base.rb +20 -0
  80. data/lib/puppet/feature/rails.rb +52 -0
  81. data/lib/puppet/metatype/attributes.rb +719 -0
  82. data/lib/puppet/metatype/closure.rb +111 -0
  83. data/lib/puppet/metatype/container.rb +94 -0
  84. data/lib/puppet/metatype/evaluation.rb +118 -0
  85. data/lib/puppet/metatype/instances.rb +261 -0
  86. data/lib/puppet/metatype/manager.rb +169 -0
  87. data/lib/puppet/metatype/metaparams.rb +409 -0
  88. data/lib/puppet/metatype/providers.rb +260 -0
  89. data/lib/puppet/metatype/relationships.rb +116 -0
  90. data/lib/puppet/metatype/schedules.rb +39 -0
  91. data/lib/puppet/metatype/tags.rb +39 -0
  92. data/lib/puppet/modules.rb +113 -0
  93. data/lib/puppet/network/authconfig.rb +168 -0
  94. data/lib/puppet/network/authorization.rb +84 -0
  95. data/lib/puppet/network/authstore.rb +293 -0
  96. data/lib/puppet/network/client.rb +187 -0
  97. data/lib/puppet/network/client/ca.rb +56 -0
  98. data/lib/puppet/network/client/dipper.rb +81 -0
  99. data/lib/puppet/network/client/file.rb +7 -0
  100. data/lib/puppet/network/client/logger.rb +6 -0
  101. data/lib/puppet/network/client/master.rb +644 -0
  102. data/lib/puppet/{client → network/client}/proxy.rb +3 -3
  103. data/lib/puppet/{client/reporter.rb → network/client/report.rb} +4 -7
  104. data/lib/puppet/{client/pelement.rb → network/client/resource.rb} +6 -19
  105. data/lib/puppet/network/client/runner.rb +13 -0
  106. data/lib/puppet/network/client/status.rb +5 -0
  107. data/lib/puppet/network/client_request.rb +32 -0
  108. data/lib/puppet/network/handler.rb +33 -0
  109. data/lib/puppet/{server → network/handler}/ca.rb +5 -6
  110. data/lib/puppet/network/handler/filebucket.rb +180 -0
  111. data/lib/puppet/{server → network/handler}/fileserver.rb +277 -219
  112. data/lib/puppet/{server → network/handler}/logger.rb +3 -5
  113. data/lib/puppet/{server → network/handler}/master.rb +42 -8
  114. data/lib/puppet/network/handler/report.rb +158 -0
  115. data/lib/puppet/network/handler/resource.rb +190 -0
  116. data/lib/puppet/{server → network/handler}/runner.rb +17 -18
  117. data/lib/puppet/network/handler/status.rb +13 -0
  118. data/lib/puppet/network/rights.rb +74 -0
  119. data/lib/puppet/network/server.rb +5 -0
  120. data/lib/puppet/network/server/mongrel.rb +138 -0
  121. data/lib/puppet/network/server/webrick.rb +153 -0
  122. data/lib/puppet/network/xmlrpc/client.rb +129 -0
  123. data/lib/puppet/network/xmlrpc/processor.rb +91 -0
  124. data/lib/puppet/network/xmlrpc/server.rb +20 -0
  125. data/lib/puppet/network/xmlrpc/webrick_servlet.rb +121 -0
  126. data/lib/puppet/parameter.rb +390 -346
  127. data/lib/puppet/parser/ast.rb +116 -147
  128. data/lib/puppet/parser/ast/astarray.rb +17 -33
  129. data/lib/puppet/parser/ast/branch.rb +2 -0
  130. data/lib/puppet/parser/ast/caseopt.rb +7 -12
  131. data/lib/puppet/parser/ast/casestatement.rb +23 -32
  132. data/lib/puppet/parser/ast/collection.rb +19 -80
  133. data/lib/puppet/parser/ast/collexpr.rb +81 -0
  134. data/lib/puppet/parser/ast/component.rb +160 -89
  135. data/lib/puppet/parser/ast/else.rb +30 -0
  136. data/lib/puppet/parser/ast/function.rb +9 -2
  137. data/lib/puppet/parser/ast/hostclass.rb +47 -131
  138. data/lib/puppet/parser/ast/ifstatement.rb +43 -0
  139. data/lib/puppet/parser/ast/leaf.rb +10 -21
  140. data/lib/puppet/parser/ast/node.rb +32 -79
  141. data/lib/puppet/parser/ast/resourcedef.rb +222 -0
  142. data/lib/puppet/parser/ast/{typedefaults.rb → resourcedefaults.rb} +10 -16
  143. data/lib/puppet/parser/ast/resourceoverride.rb +62 -0
  144. data/lib/puppet/parser/ast/{objectparam.rb → resourceparam.rb} +12 -6
  145. data/lib/puppet/parser/ast/resourceref.rb +44 -0
  146. data/lib/puppet/parser/ast/selector.rb +16 -8
  147. data/lib/puppet/parser/ast/tag.rb +3 -1
  148. data/lib/puppet/parser/ast/vardef.rb +8 -12
  149. data/lib/puppet/parser/collector.rb +181 -0
  150. data/lib/puppet/parser/functions.rb +191 -36
  151. data/lib/puppet/parser/interpreter.rb +802 -380
  152. data/lib/puppet/parser/lexer.rb +86 -19
  153. data/lib/puppet/parser/parser.rb +1123 -960
  154. data/lib/puppet/parser/resource.rb +353 -0
  155. data/lib/puppet/parser/resource/param.rb +57 -0
  156. data/lib/puppet/parser/resource/reference.rb +71 -0
  157. data/lib/puppet/parser/scope.rb +573 -1000
  158. data/lib/puppet/parser/templatewrapper.rb +54 -0
  159. data/lib/puppet/pgraph.rb +208 -0
  160. data/lib/puppet/propertychange.rb +143 -0
  161. data/lib/puppet/provider.rb +302 -0
  162. data/lib/puppet/provider/cron/crontab.rb +187 -0
  163. data/lib/puppet/provider/group/groupadd.rb +29 -0
  164. data/lib/puppet/provider/group/netinfo.rb +12 -0
  165. data/lib/puppet/provider/group/pw.rb +31 -0
  166. data/lib/puppet/provider/host/netinfo.rb +18 -0
  167. data/lib/puppet/provider/host/parsed.rb +73 -0
  168. data/lib/puppet/provider/mount.rb +57 -0
  169. data/lib/puppet/provider/mount/netinfo.rb +38 -0
  170. data/lib/puppet/provider/mount/parsed.rb +37 -0
  171. data/lib/puppet/provider/nameservice.rb +344 -0
  172. data/lib/puppet/provider/nameservice/netinfo.rb +210 -0
  173. data/lib/puppet/provider/nameservice/objectadd.rb +45 -0
  174. data/lib/puppet/provider/nameservice/pw.rb +22 -0
  175. data/lib/puppet/provider/package/apple.rb +53 -0
  176. data/lib/puppet/provider/package/apt.rb +119 -0
  177. data/lib/puppet/provider/package/aptitude.rb +30 -0
  178. data/lib/puppet/provider/package/aptrpm.rb +79 -0
  179. data/lib/puppet/provider/package/blastwave.rb +114 -0
  180. data/lib/puppet/provider/package/darwinport.rb +88 -0
  181. data/lib/puppet/provider/package/dpkg.rb +109 -0
  182. data/lib/puppet/provider/package/freebsd.rb +43 -0
  183. data/lib/puppet/provider/package/gem.rb +104 -0
  184. data/lib/puppet/provider/package/openbsd.rb +93 -0
  185. data/lib/puppet/provider/package/pkgdmg.rb +119 -0
  186. data/lib/puppet/provider/package/portage.rb +112 -0
  187. data/lib/puppet/provider/package/ports.rb +94 -0
  188. data/lib/puppet/provider/package/rpm.rb +125 -0
  189. data/lib/puppet/provider/package/rug.rb +53 -0
  190. data/lib/puppet/provider/package/sun.rb +168 -0
  191. data/lib/puppet/provider/package/sunfreeware.rb +9 -0
  192. data/lib/puppet/provider/package/up2date.rb +45 -0
  193. data/lib/puppet/provider/package/yum.rb +54 -0
  194. data/lib/puppet/provider/parsedfile.rb +342 -0
  195. data/lib/puppet/provider/port/parsed.rb +174 -0
  196. data/lib/puppet/provider/service/base.rb +136 -0
  197. data/lib/puppet/provider/service/debian.rb +32 -0
  198. data/lib/puppet/provider/service/gentoo.rb +49 -0
  199. data/lib/puppet/{type → provider}/service/init.rb +42 -40
  200. data/lib/puppet/provider/service/redhat.rb +59 -0
  201. data/lib/puppet/{type → provider}/service/smf.rb +24 -13
  202. data/lib/puppet/provider/sshkey/parsed.rb +36 -0
  203. data/lib/puppet/provider/user/netinfo.rb +106 -0
  204. data/lib/puppet/provider/user/pw.rb +41 -0
  205. data/lib/puppet/provider/user/useradd.rb +67 -0
  206. data/lib/puppet/provider/zone/solaris.rb +208 -0
  207. data/lib/puppet/rails.rb +102 -66
  208. data/lib/puppet/rails/database/001_add_indexes.rb +38 -0
  209. data/lib/puppet/rails/database/schema.rb +89 -0
  210. data/lib/puppet/rails/external/tagging/acts_as_taggable.rb +62 -0
  211. data/lib/puppet/rails/external/tagging/init.rb +5 -0
  212. data/lib/puppet/rails/external/tagging/tag.rb +50 -0
  213. data/lib/puppet/rails/external/tagging/tagging.rb +12 -0
  214. data/lib/puppet/rails/fact_name.rb +7 -0
  215. data/lib/puppet/rails/fact_value.rb +5 -0
  216. data/lib/puppet/rails/host.rb +95 -46
  217. data/lib/puppet/rails/param_name.rb +28 -0
  218. data/lib/puppet/rails/param_value.rb +5 -0
  219. data/lib/puppet/rails/puppet_class.rb +9 -0
  220. data/lib/puppet/rails/resource.rb +95 -0
  221. data/lib/puppet/rails/source_file.rb +5 -0
  222. data/lib/puppet/relationship.rb +63 -0
  223. data/lib/puppet/reports/log.rb +14 -0
  224. data/lib/puppet/reports/rrdgraph.rb +114 -10
  225. data/lib/puppet/reports/store.rb +64 -0
  226. data/lib/puppet/reports/tagmail.rb +144 -71
  227. data/lib/puppet/sslcertificates.rb +38 -5
  228. data/lib/puppet/sslcertificates/ca.rb +142 -37
  229. data/lib/puppet/sslcertificates/certificate.rb +3 -3
  230. data/lib/puppet/sslcertificates/inventory.rb +53 -0
  231. data/lib/puppet/sslcertificates/support.rb +128 -0
  232. data/lib/puppet/transaction.rb +568 -189
  233. data/lib/puppet/transaction/report.rb +14 -3
  234. data/lib/puppet/transportable.rb +18 -10
  235. data/lib/puppet/type.rb +279 -2299
  236. data/lib/puppet/type/component.rb +63 -63
  237. data/lib/puppet/type/cron.rb +294 -710
  238. data/lib/puppet/type/exec.rb +185 -129
  239. data/lib/puppet/type/group.rb +38 -89
  240. data/lib/puppet/type/host.rb +110 -0
  241. data/lib/puppet/type/mount.rb +189 -0
  242. data/lib/puppet/type/notify.rb +47 -0
  243. data/lib/puppet/type/package.rb +129 -257
  244. data/lib/puppet/type/parsedtype.rb +172 -297
  245. data/lib/puppet/type/pfile.rb +540 -319
  246. data/lib/puppet/type/pfile/checksum.rb +103 -76
  247. data/lib/puppet/type/pfile/content.rb +16 -10
  248. data/lib/puppet/type/pfile/ensure.rb +52 -34
  249. data/lib/puppet/type/pfile/group.rb +25 -18
  250. data/lib/puppet/type/pfile/mode.rb +7 -4
  251. data/lib/puppet/type/pfile/{uid.rb → owner.rb} +21 -17
  252. data/lib/puppet/type/pfile/source.rb +119 -124
  253. data/lib/puppet/type/pfile/target.rb +29 -45
  254. data/lib/puppet/type/pfile/type.rb +2 -2
  255. data/lib/puppet/type/pfilebucket.rb +18 -14
  256. data/lib/puppet/type/port.rb +121 -0
  257. data/lib/puppet/type/property.rb +530 -0
  258. data/lib/puppet/type/resources.rb +150 -0
  259. data/lib/puppet/type/schedule.rb +38 -22
  260. data/lib/puppet/type/service.rb +70 -326
  261. data/lib/puppet/type/sshkey.rb +76 -0
  262. data/lib/puppet/type/tidy.rb +197 -97
  263. data/lib/puppet/type/user.rb +107 -183
  264. data/lib/puppet/type/yumrepo.rb +53 -34
  265. data/lib/puppet/type/zone.rb +55 -208
  266. data/lib/puppet/util.rb +239 -201
  267. data/lib/puppet/util/autoload.rb +107 -0
  268. data/lib/puppet/util/classgen.rb +208 -0
  269. data/lib/puppet/{config.rb → util/config.rb} +102 -54
  270. data/lib/puppet/util/docs.rb +104 -0
  271. data/lib/puppet/util/errors.rb +55 -0
  272. data/lib/puppet/util/execution.rb +22 -0
  273. data/lib/puppet/util/feature.rb +76 -0
  274. data/lib/puppet/util/fileparsing.rb +380 -0
  275. data/lib/puppet/util/filetype.rb +300 -0
  276. data/lib/puppet/util/graph.rb +39 -0
  277. data/lib/puppet/util/inifile.rb +209 -0
  278. data/lib/puppet/util/loadedfile.rb +71 -0
  279. data/lib/puppet/util/log.rb +549 -0
  280. data/lib/puppet/util/logging.rb +20 -0
  281. data/lib/puppet/util/metaid.rb +22 -0
  282. data/lib/puppet/util/methodhelper.rb +37 -0
  283. data/lib/puppet/util/metric.rb +160 -0
  284. data/lib/puppet/util/package.rb +31 -0
  285. data/lib/puppet/util/pidlock.rb +68 -0
  286. data/lib/puppet/util/plist.rb +24 -0
  287. data/lib/puppet/util/plist/generator.rb +226 -0
  288. data/lib/puppet/util/plist/parser.rb +227 -0
  289. data/lib/puppet/util/posix.rb +87 -0
  290. data/lib/puppet/util/provider_features.rb +170 -0
  291. data/lib/puppet/util/rails/collection_merger.rb +42 -0
  292. data/lib/puppet/util/storage.rb +103 -0
  293. data/lib/puppet/util/subclass_loader.rb +83 -0
  294. data/lib/puppet/util/suidmanager.rb +86 -0
  295. data/lib/puppet/util/variables.rb +39 -0
  296. data/lib/puppet/util/warnings.rb +15 -0
  297. data/test/Rakefile +97 -0
  298. data/test/certmgr/ca.rb +81 -0
  299. data/test/certmgr/certmgr.rb +77 -50
  300. data/test/certmgr/inventory.rb +79 -0
  301. data/test/certmgr/support.rb +81 -0
  302. data/test/executables/filebucket.rb +49 -0
  303. data/test/executables/puppetbin.rb +28 -12
  304. data/test/executables/puppetca.rb +75 -54
  305. data/test/executables/puppetd.rb +10 -13
  306. data/test/executables/puppetmasterd.rb +12 -17
  307. data/test/executables/puppetmodule.rb +18 -17
  308. data/test/language/ast.rb +242 -798
  309. data/test/language/ast/casestatement.rb +104 -0
  310. data/test/language/ast/component.rb +133 -0
  311. data/test/language/ast/hostclass.rb +162 -0
  312. data/test/language/ast/selector.rb +62 -0
  313. data/test/language/ast/variable.rb +31 -0
  314. data/test/language/collector.rb +369 -0
  315. data/test/language/functions.rb +305 -18
  316. data/test/language/interpreter.rb +894 -125
  317. data/test/language/lexer.rb +98 -12
  318. data/test/language/node.rb +37 -53
  319. data/test/language/parser.rb +455 -148
  320. data/test/language/resource.rb +535 -0
  321. data/test/language/scope.rb +451 -561
  322. data/test/language/snippets.rb +101 -111
  323. data/test/language/transportable.rb +6 -8
  324. data/test/lib/mocha.rb +19 -0
  325. data/test/lib/mocha/any_instance_method.rb +35 -0
  326. data/test/lib/mocha/auto_verify.rb +113 -0
  327. data/test/lib/mocha/central.rb +35 -0
  328. data/test/lib/mocha/class_method.rb +62 -0
  329. data/test/lib/mocha/expectation.rb +295 -0
  330. data/test/lib/mocha/expectation_error.rb +6 -0
  331. data/test/lib/mocha/infinite_range.rb +27 -0
  332. data/test/lib/mocha/inspect.rb +37 -0
  333. data/test/lib/mocha/instance_method.rb +8 -0
  334. data/test/lib/mocha/metaclass.rb +7 -0
  335. data/test/lib/mocha/mock.rb +20 -0
  336. data/test/lib/mocha/mock_methods.rb +122 -0
  337. data/test/lib/mocha/object.rb +100 -0
  338. data/test/lib/mocha/pretty_parameters.rb +28 -0
  339. data/test/lib/mocha/setup_and_teardown.rb +23 -0
  340. data/test/lib/mocha/standalone.rb +30 -0
  341. data/test/lib/mocha/test_case_adapter.rb +49 -0
  342. data/test/lib/mocha_standalone.rb +2 -0
  343. data/test/lib/puppettest.rb +294 -0
  344. data/test/lib/puppettest/certificates.rb +61 -0
  345. data/test/lib/puppettest/exetest.rb +123 -0
  346. data/test/lib/puppettest/fakes.rb +194 -0
  347. data/test/lib/puppettest/fileparsing.rb +33 -0
  348. data/test/lib/puppettest/filetesting.rb +231 -0
  349. data/test/lib/puppettest/graph.rb +41 -0
  350. data/test/lib/puppettest/parsertesting.rb +392 -0
  351. data/test/lib/puppettest/railstesting.rb +56 -0
  352. data/test/lib/puppettest/reporttesting.rb +19 -0
  353. data/test/lib/puppettest/resourcetesting.rb +73 -0
  354. data/test/lib/puppettest/servertest.rb +72 -0
  355. data/test/lib/puppettest/support.rb +8 -0
  356. data/test/lib/puppettest/support/assertions.rb +101 -0
  357. data/test/lib/puppettest/support/helpers.rb +23 -0
  358. data/test/lib/puppettest/support/resources.rb +37 -0
  359. data/test/lib/puppettest/support/utils.rb +160 -0
  360. data/test/lib/puppettest/testcase.rb +48 -0
  361. data/test/lib/rake/puppet_test_loader.rb +17 -0
  362. data/test/lib/rake/puppet_testtask.rb +17 -0
  363. data/test/lib/spec.rb +8 -0
  364. data/test/lib/spec/callback.rb +11 -0
  365. data/test/lib/spec/callback/callback_container.rb +60 -0
  366. data/test/lib/spec/callback/extensions/module.rb +24 -0
  367. data/test/lib/spec/callback/extensions/object.rb +37 -0
  368. data/test/lib/spec/deprecated.rb +3 -0
  369. data/test/lib/spec/expectations.rb +59 -0
  370. data/test/lib/spec/expectations/differs/default.rb +62 -0
  371. data/test/lib/spec/expectations/errors.rb +6 -0
  372. data/test/lib/spec/expectations/extensions.rb +3 -0
  373. data/test/lib/spec/expectations/extensions/object.rb +109 -0
  374. data/test/lib/spec/expectations/extensions/proc.rb +57 -0
  375. data/test/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
  376. data/test/lib/spec/expectations/handler.rb +47 -0
  377. data/test/lib/spec/expectations/should.rb +5 -0
  378. data/test/lib/spec/expectations/should/base.rb +64 -0
  379. data/test/lib/spec/expectations/should/change.rb +69 -0
  380. data/test/lib/spec/expectations/should/have.rb +128 -0
  381. data/test/lib/spec/expectations/should/not.rb +74 -0
  382. data/test/lib/spec/expectations/should/should.rb +81 -0
  383. data/test/lib/spec/expectations/sugar.rb +47 -0
  384. data/test/lib/spec/matchers.rb +160 -0
  385. data/test/lib/spec/matchers/be.rb +161 -0
  386. data/test/lib/spec/matchers/be_close.rb +37 -0
  387. data/test/lib/spec/matchers/change.rb +120 -0
  388. data/test/lib/spec/matchers/eql.rb +43 -0
  389. data/test/lib/spec/matchers/equal.rb +43 -0
  390. data/test/lib/spec/matchers/has.rb +44 -0
  391. data/test/lib/spec/matchers/have.rb +140 -0
  392. data/test/lib/spec/matchers/include.rb +50 -0
  393. data/test/lib/spec/matchers/match.rb +41 -0
  394. data/test/lib/spec/matchers/raise_error.rb +100 -0
  395. data/test/lib/spec/matchers/respond_to.rb +35 -0
  396. data/test/lib/spec/matchers/satisfy.rb +47 -0
  397. data/test/lib/spec/matchers/throw_symbol.rb +75 -0
  398. data/test/lib/spec/mocks.rb +232 -0
  399. data/test/lib/spec/mocks/argument_expectation.rb +132 -0
  400. data/test/lib/spec/mocks/error_generator.rb +85 -0
  401. data/test/lib/spec/mocks/errors.rb +10 -0
  402. data/test/lib/spec/mocks/extensions/object.rb +3 -0
  403. data/test/lib/spec/mocks/message_expectation.rb +231 -0
  404. data/test/lib/spec/mocks/methods.rb +40 -0
  405. data/test/lib/spec/mocks/mock.rb +26 -0
  406. data/test/lib/spec/mocks/mock_handler.rb +166 -0
  407. data/test/lib/spec/mocks/order_group.rb +29 -0
  408. data/test/lib/spec/rake/spectask.rb +173 -0
  409. data/test/lib/spec/rake/verify_rcov.rb +47 -0
  410. data/test/lib/spec/runner.rb +132 -0
  411. data/test/lib/spec/runner/backtrace_tweaker.rb +55 -0
  412. data/test/lib/spec/runner/command_line.rb +34 -0
  413. data/test/lib/spec/runner/context.rb +154 -0
  414. data/test/lib/spec/runner/context_eval.rb +142 -0
  415. data/test/lib/spec/runner/context_runner.rb +55 -0
  416. data/test/lib/spec/runner/drb_command_line.rb +21 -0
  417. data/test/lib/spec/runner/execution_context.rb +17 -0
  418. data/test/lib/spec/runner/extensions/kernel.rb +17 -0
  419. data/test/lib/spec/runner/extensions/object.rb +32 -0
  420. data/test/lib/spec/runner/formatter.rb +5 -0
  421. data/test/lib/spec/runner/formatter/base_text_formatter.rb +118 -0
  422. data/test/lib/spec/runner/formatter/html_formatter.rb +219 -0
  423. data/test/lib/spec/runner/formatter/progress_bar_formatter.rb +27 -0
  424. data/test/lib/spec/runner/formatter/rdoc_formatter.rb +22 -0
  425. data/test/lib/spec/runner/formatter/specdoc_formatter.rb +23 -0
  426. data/test/lib/spec/runner/heckle_runner.rb +71 -0
  427. data/test/lib/spec/runner/heckle_runner_win.rb +10 -0
  428. data/test/lib/spec/runner/option_parser.rb +224 -0
  429. data/test/lib/spec/runner/reporter.rb +105 -0
  430. data/test/lib/spec/runner/spec_matcher.rb +25 -0
  431. data/test/lib/spec/runner/spec_parser.rb +41 -0
  432. data/test/lib/spec/runner/spec_should_raise_handler.rb +74 -0
  433. data/test/lib/spec/runner/specification.rb +114 -0
  434. data/test/lib/spec/translator.rb +87 -0
  435. data/test/lib/spec/version.rb +30 -0
  436. data/test/lib/stubba.rb +2 -0
  437. data/test/network/authconfig.rb +72 -0
  438. data/test/network/authorization.rb +138 -0
  439. data/test/network/authstore.rb +450 -0
  440. data/test/network/client/ca.rb +38 -0
  441. data/test/{client → network/client}/client.rb +107 -24
  442. data/test/network/client/dipper.rb +35 -0
  443. data/test/network/client/master.rb +627 -0
  444. data/test/{client/pelement.rb → network/client/resource.rb} +13 -29
  445. data/test/network/client_request.rb +39 -0
  446. data/test/network/daemon.rb +71 -0
  447. data/test/{server → network/handler}/bucket.rb +103 -27
  448. data/test/{server → network/handler}/ca.rb +14 -19
  449. data/test/{server → network/handler}/fileserver.rb +443 -68
  450. data/test/network/handler/handler.rb +64 -0
  451. data/test/{server → network/handler}/logger.rb +26 -26
  452. data/test/network/handler/master.rb +352 -0
  453. data/test/network/handler/report.rb +185 -0
  454. data/test/{server/pelement.rb → network/handler/resource.rb} +25 -38
  455. data/test/{server → network/handler}/runner.rb +17 -16
  456. data/test/network/rights.rb +38 -0
  457. data/test/network/server/webrick.rb +140 -0
  458. data/test/network/xmlrpc/client.rb +68 -0
  459. data/test/network/xmlrpc/processor.rb +80 -0
  460. data/test/network/xmlrpc/server.rb +28 -0
  461. data/test/network/xmlrpc/webrick_servlet.rb +26 -0
  462. data/test/other/dsl.rb +218 -0
  463. data/test/other/events.rb +22 -15
  464. data/test/other/overrides.rb +9 -14
  465. data/test/other/pgraph.rb +289 -0
  466. data/test/other/propertychange.rb +142 -0
  467. data/test/other/provider.rb +162 -0
  468. data/test/other/puppet.rb +63 -10
  469. data/test/other/relationship.rb +74 -0
  470. data/test/other/relationships.rb +199 -123
  471. data/test/other/report.rb +152 -23
  472. data/test/other/transactions.rb +824 -78
  473. data/test/puppet/conffiles.rb +16 -11
  474. data/test/puppet/defaults.rb +7 -10
  475. data/test/puppet/{error.rb → errortest.rb} +5 -8
  476. data/test/puppet/modules.rb +58 -0
  477. data/test/puppet/tc_suidmanager.rb +107 -0
  478. data/test/rails/host.rb +177 -0
  479. data/test/rails/rails.rb +27 -0
  480. data/test/rails/railsparameter.rb +62 -0
  481. data/test/rails/railsresource.rb +100 -0
  482. data/test/ral/manager/attributes.rb +296 -0
  483. data/test/ral/manager/manager.rb +55 -0
  484. data/test/ral/manager/provider.rb +54 -0
  485. data/test/ral/manager/type.rb +837 -0
  486. data/test/ral/providers/cron/crontab.rb +346 -0
  487. data/test/ral/providers/group.rb +252 -0
  488. data/test/ral/providers/host/netinfo.rb +58 -0
  489. data/test/ral/providers/host/parsed.rb +226 -0
  490. data/test/ral/providers/mount/netinfo.rb +80 -0
  491. data/test/ral/providers/mount/parsed.rb +223 -0
  492. data/test/ral/providers/nameservice.rb +33 -0
  493. data/test/ral/providers/package.rb +253 -0
  494. data/test/ral/providers/package/apt.rb +89 -0
  495. data/test/ral/providers/package/aptitude.rb +69 -0
  496. data/test/ral/providers/package/aptrpm.rb +89 -0
  497. data/test/ral/providers/package/dpkg.rb +64 -0
  498. data/test/ral/providers/parsedfile.rb +668 -0
  499. data/test/ral/providers/parsedport.rb +233 -0
  500. data/test/ral/providers/provider.rb +423 -0
  501. data/test/{types → ral/providers}/service.rb +20 -121
  502. data/test/ral/providers/service/base.rb +75 -0
  503. data/test/ral/providers/sshkey/parsed.rb +111 -0
  504. data/test/ral/providers/user.rb +567 -0
  505. data/test/ral/providers/user/useradd.rb +250 -0
  506. data/test/ral/types/basic.rb +90 -0
  507. data/test/ral/types/component.rb +113 -0
  508. data/test/ral/types/cron.rb +480 -0
  509. data/test/{types → ral/types}/exec.rb +278 -82
  510. data/test/ral/types/file.rb +1799 -0
  511. data/test/ral/types/file/target.rb +363 -0
  512. data/test/{types → ral/types}/filebucket.rb +15 -17
  513. data/test/{types → ral/types}/fileignoresource.rb +9 -15
  514. data/test/ral/types/filesources.rb +1046 -0
  515. data/test/ral/types/group.rb +169 -0
  516. data/test/ral/types/host.rb +155 -0
  517. data/test/ral/types/mount.rb +312 -0
  518. data/test/ral/types/package.rb +85 -0
  519. data/test/ral/types/parameter.rb +172 -0
  520. data/test/ral/types/port.rb +148 -0
  521. data/test/ral/types/property.rb +343 -0
  522. data/test/ral/types/resources.rb +221 -0
  523. data/test/{types → ral/types}/schedule.rb +34 -12
  524. data/test/ral/types/service.rb +37 -0
  525. data/test/{types → ral/types}/sshkey.rb +75 -65
  526. data/test/ral/types/tidy.rb +240 -0
  527. data/test/ral/types/user.rb +493 -0
  528. data/test/{types → ral/types}/yumrepo.rb +7 -11
  529. data/test/{types → ral/types}/zone.rb +45 -45
  530. data/test/tagging/tagging.rb +17 -26
  531. data/test/util/autoload.rb +130 -0
  532. data/test/util/classgen.rb +227 -0
  533. data/test/{other → util}/config.rb +373 -113
  534. data/test/util/execution.rb +34 -0
  535. data/test/util/features.rb +94 -0
  536. data/test/util/fileparsing.rb +677 -0
  537. data/test/{other → util}/filetype.rb +9 -12
  538. data/test/util/graph.rb +108 -0
  539. data/test/{other → util}/inifile.rb +24 -11
  540. data/test/util/loadedfile.rb +106 -0
  541. data/test/{other → util}/log.rb +96 -50
  542. data/test/{other → util}/metrics.rb +7 -17
  543. data/test/util/package.rb +27 -0
  544. data/test/util/pidlock.rb +126 -0
  545. data/test/util/posixtest.rb +173 -0
  546. data/test/util/storage.rb +123 -0
  547. data/test/util/subclass_loader.rb +100 -0
  548. data/test/util/utiltest.rb +368 -0
  549. metadata +449 -169
  550. data/examples/code/classing +0 -35
  551. data/examples/code/failers/badclassnoparam +0 -10
  552. data/examples/code/failers/badclassparam +0 -10
  553. data/examples/code/failers/badcompnoparam +0 -9
  554. data/examples/code/failers/badcompparam +0 -9
  555. data/examples/code/failers/badtypeparam +0 -3
  556. data/examples/code/failers/noobjectrvalue +0 -1
  557. data/examples/code/snippets/aliastest.pp +0 -16
  558. data/examples/code/snippets/argumentdefaults +0 -14
  559. data/examples/code/snippets/casestatement.pp +0 -58
  560. data/examples/code/snippets/classheirarchy.pp +0 -15
  561. data/examples/code/snippets/classincludes.pp +0 -17
  562. data/examples/code/snippets/classpathtest +0 -11
  563. data/examples/code/snippets/componentmetaparams.pp +0 -11
  564. data/examples/code/snippets/deepclassheirarchy.pp +0 -23
  565. data/examples/code/snippets/defineoverrides.pp +0 -17
  566. data/examples/code/snippets/dirchmod +0 -19
  567. data/examples/code/snippets/emptyclass.pp +0 -9
  568. data/examples/code/snippets/emptyexec.pp +0 -3
  569. data/examples/code/snippets/failmissingexecpath.pp +0 -13
  570. data/examples/code/snippets/falsevalues.pp +0 -3
  571. data/examples/code/snippets/filecreate +0 -11
  572. data/examples/code/snippets/implicititeration +0 -15
  573. data/examples/code/snippets/multipleinstances +0 -7
  574. data/examples/code/snippets/namevartest +0 -9
  575. data/examples/code/snippets/scopetest +0 -13
  576. data/examples/code/snippets/selectorvalues.pp +0 -42
  577. data/examples/code/snippets/simpledefaults +0 -5
  578. data/examples/code/snippets/simpleselector +0 -38
  579. data/examples/code/snippets/singleary.pp +0 -19
  580. data/examples/code/snippets/singlequote.pp +0 -11
  581. data/examples/code/snippets/singleselector.pp +0 -22
  582. data/examples/code/snippets/tag.pp +0 -9
  583. data/examples/code/snippets/tagged.pp +0 -35
  584. data/lib/puppet/client.rb +0 -177
  585. data/lib/puppet/client/ca.rb +0 -21
  586. data/lib/puppet/client/dipper.rb +0 -76
  587. data/lib/puppet/client/file.rb +0 -20
  588. data/lib/puppet/client/log.rb +0 -17
  589. data/lib/puppet/client/master.rb +0 -531
  590. data/lib/puppet/client/runner.rb +0 -17
  591. data/lib/puppet/client/status.rb +0 -7
  592. data/lib/puppet/event-loop.rb +0 -1
  593. data/lib/puppet/filetype.rb +0 -308
  594. data/lib/puppet/inifile.rb +0 -201
  595. data/lib/puppet/log.rb +0 -524
  596. data/lib/puppet/metric.rb +0 -132
  597. data/lib/puppet/networkclient.rb +0 -175
  598. data/lib/puppet/parsedfile.rb +0 -58
  599. data/lib/puppet/parser/ast/classdef.rb +0 -79
  600. data/lib/puppet/parser/ast/compdef.rb +0 -75
  601. data/lib/puppet/parser/ast/nodedef.rb +0 -73
  602. data/lib/puppet/parser/ast/objectdef.rb +0 -284
  603. data/lib/puppet/parser/ast/objectref.rb +0 -77
  604. data/lib/puppet/rails/database.rb +0 -40
  605. data/lib/puppet/rails/rails_object.rb +0 -42
  606. data/lib/puppet/rails/rails_parameter.rb +0 -5
  607. data/lib/puppet/server.rb +0 -196
  608. data/lib/puppet/server/authconfig.rb +0 -177
  609. data/lib/puppet/server/authstore.rb +0 -226
  610. data/lib/puppet/server/filebucket.rb +0 -155
  611. data/lib/puppet/server/pelement.rb +0 -188
  612. data/lib/puppet/server/report.rb +0 -184
  613. data/lib/puppet/server/rights.rb +0 -78
  614. data/lib/puppet/server/servlet.rb +0 -274
  615. data/lib/puppet/statechange.rb +0 -129
  616. data/lib/puppet/storage.rb +0 -98
  617. data/lib/puppet/type/nameservice.rb +0 -264
  618. data/lib/puppet/type/nameservice/netinfo.rb +0 -232
  619. data/lib/puppet/type/nameservice/objectadd.rb +0 -146
  620. data/lib/puppet/type/nameservice/posix.rb +0 -12
  621. data/lib/puppet/type/nameservice/pw.rb +0 -107
  622. data/lib/puppet/type/package/apple.rb +0 -41
  623. data/lib/puppet/type/package/apt.rb +0 -107
  624. data/lib/puppet/type/package/blastwave.rb +0 -136
  625. data/lib/puppet/type/package/darwinport.rb +0 -97
  626. data/lib/puppet/type/package/dpkg.rb +0 -113
  627. data/lib/puppet/type/package/freebsd.rb +0 -19
  628. data/lib/puppet/type/package/gem.rb +0 -119
  629. data/lib/puppet/type/package/openbsd.rb +0 -112
  630. data/lib/puppet/type/package/ports.rb +0 -103
  631. data/lib/puppet/type/package/rpm.rb +0 -121
  632. data/lib/puppet/type/package/sun.rb +0 -174
  633. data/lib/puppet/type/package/sunfreeware.rb +0 -7
  634. data/lib/puppet/type/package/yum.rb +0 -52
  635. data/lib/puppet/type/parsedtype/host.rb +0 -144
  636. data/lib/puppet/type/parsedtype/mount.rb +0 -271
  637. data/lib/puppet/type/parsedtype/port.rb +0 -261
  638. data/lib/puppet/type/parsedtype/sshkey.rb +0 -123
  639. data/lib/puppet/type/service/base.rb +0 -12
  640. data/lib/puppet/type/service/debian.rb +0 -46
  641. data/lib/puppet/type/service/redhat.rb +0 -38
  642. data/lib/puppet/type/state.rb +0 -393
  643. data/lib/puppet/type/symlink.rb +0 -186
  644. data/test/client/master.rb +0 -207
  645. data/test/language/rails.rb +0 -105
  646. data/test/other/parsedfile.rb +0 -58
  647. data/test/other/storage.rb +0 -100
  648. data/test/puppet/utiltest.rb +0 -299
  649. data/test/puppettest.rb +0 -1170
  650. data/test/server/authconfig.rb +0 -56
  651. data/test/server/authstore.rb +0 -218
  652. data/test/server/master.rb +0 -201
  653. data/test/server/report.rb +0 -93
  654. data/test/server/rights.rb +0 -41
  655. data/test/server/server.rb +0 -152
  656. data/test/test +0 -61
  657. data/test/types/basic.rb +0 -117
  658. data/test/types/component.rb +0 -298
  659. data/test/types/cron.rb +0 -718
  660. data/test/types/file.rb +0 -1314
  661. data/test/types/filesources.rb +0 -590
  662. data/test/types/group.rb +0 -323
  663. data/test/types/host.rb +0 -186
  664. data/test/types/mount.rb +0 -294
  665. data/test/types/package.rb +0 -538
  666. data/test/types/parameter.rb +0 -107
  667. data/test/types/port.rb +0 -201
  668. data/test/types/query.rb +0 -101
  669. data/test/types/state.rb +0 -92
  670. data/test/types/symlink.rb +0 -120
  671. data/test/types/tidy.rb +0 -102
  672. data/test/types/type.rb +0 -469
  673. data/test/types/user.rb +0 -563
@@ -93,7 +93,7 @@ class Puppet::SSLCertificates::Certificate
93
93
  end
94
94
  }
95
95
 
96
- @days = hash[:length] || 365
96
+ @ttl = hash[:ttl] || 365 * 24 * 60 * 60
97
97
  @selfsign = hash[:selfsign] || false
98
98
  @encrypt = hash[:encrypt] || false
99
99
  @replace = hash[:replace] || false
@@ -206,7 +206,7 @@ class Puppet::SSLCertificates::Certificate
206
206
 
207
207
  args = {
208
208
  :name => self.certname,
209
- :days => @days,
209
+ :ttl => @ttl,
210
210
  :issuer => nil,
211
211
  :serial => 0x0,
212
212
  :publickey => @key.public_key
@@ -280,4 +280,4 @@ class Puppet::SSLCertificates::Certificate
280
280
  end
281
281
  end
282
282
 
283
- # $Id: certificate.rb 873 2006-02-07 23:12:33Z luke $
283
+ # $Id: certificate.rb 1581 2006-09-13 16:50:43Z lutter $
@@ -0,0 +1,53 @@
1
+ # A module for keeping track of all the certificates issued by the CA, ever
2
+ # Maintains the file "$cadir/inventory.txt"
3
+ module Puppet::SSLCertificates
4
+ module Inventory
5
+
6
+ Puppet.config.setdefaults(:ca,
7
+ :cert_inventory => {
8
+ :default => "$cadir/inventory.txt",
9
+ :mode => 0644,
10
+ :owner => "$user",
11
+ :group => "$group",
12
+ :desc => "A Complete listing of all certificates"
13
+ }
14
+ )
15
+
16
+ # Add CERT to the inventory of issued certs in '$cadir/inventory.txt'
17
+ # If no inventory exists yet, build an inventory and list all the
18
+ # certificates that have been signed so far
19
+ def self.add(cert)
20
+ unless FileTest.exists?(Puppet[:cert_inventory])
21
+ inited = false
22
+ end
23
+
24
+ Puppet.config.write(:cert_inventory, "a") do |f|
25
+ unless inited
26
+ f.puts self.init
27
+ end
28
+ f.puts format(cert)
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def self.init
35
+ inv = "# Inventory of signed certificates\n"
36
+ inv += "# SERIAL NOT_BEFORE NOT_AFTER SUBJECT\n"
37
+ Dir.glob(File::join(Puppet[:signeddir], "*.pem")) do |f|
38
+ inv += format(OpenSSL::X509::Certificate.new(File::read(f))) + "\n"
39
+ end
40
+ return inv
41
+ end
42
+
43
+ def self.format(cert)
44
+ iso = '%Y-%m-%dT%H:%M:%S%Z'
45
+ return "0x%04x %s %s %s" % [cert.serial,
46
+ cert.not_before.strftime(iso),
47
+ cert.not_after.strftime(iso),
48
+ cert.subject]
49
+ end
50
+ end
51
+ end
52
+
53
+ # $Id$
@@ -0,0 +1,128 @@
1
+ require 'puppet/sslcertificates'
2
+
3
+ # A module to handle reading of certificates.
4
+ module Puppet::SSLCertificates::Support
5
+ class MissingCertificate < Puppet::Error; end
6
+ class InvalidCertificate < Puppet::Error; end
7
+
8
+ attr_reader :cacert
9
+
10
+ # Some metaprogramming to create methods for retrieving and creating keys.
11
+ # This probably isn't fewer lines than defining each separately...
12
+ def self.keytype(name, options, &block)
13
+ var = "@%s" % name
14
+
15
+ maker = "mk_%s" % name
16
+ reader = "read_%s" % name
17
+
18
+ unless param = options[:param]
19
+ raise ArgumentError, "You must specify the parameter for the key"
20
+ end
21
+
22
+ unless klass = options[:class]
23
+ raise ArgumentError, "You must specify the class for the key"
24
+ end
25
+
26
+ # Define the method that creates it.
27
+ define_method(maker, &block)
28
+
29
+ # Define the reading method.
30
+ define_method(reader) do
31
+ return nil unless FileTest.exists?(Puppet[param])
32
+ begin
33
+ instance_variable_set(var,
34
+ klass.new(File.read(Puppet[param])))
35
+ rescue => detail
36
+ raise InvalidCertificate, "Could not read %s: %s" %
37
+ [param, detail]
38
+ end
39
+ end
40
+
41
+ # Define the overall method, which just calls the reader and maker
42
+ # as appropriate.
43
+ define_method(name) do
44
+ unless instance_variable_get(var)
45
+ unless cert = send(reader)
46
+ cert = send(maker)
47
+ Puppet.config.write(param) { |f| f.puts cert.to_pem }
48
+ end
49
+ instance_variable_set(var, cert)
50
+ end
51
+ instance_variable_get(var)
52
+ end
53
+ end
54
+
55
+ # The key pair.
56
+ keytype :key, :param => :hostprivkey, :class => OpenSSL::PKey::RSA do
57
+ Puppet.info "Creating a new SSL key at %s" % Puppet[:hostprivkey]
58
+ key = OpenSSL::PKey::RSA.new(Puppet[:keylength])
59
+
60
+ # Our key meta programming can only handle one file, so we have
61
+ # to separately write out the public key.
62
+ Puppet.config.write(:hostpubkey) do |f|
63
+ f.print key.public_key.to_pem
64
+ end
65
+ return key
66
+ end
67
+
68
+ # Our certificate request
69
+ keytype :csr, :param => :hostcsr, :class => OpenSSL::X509::Request do
70
+ Puppet.info "Creating a new certificate request for %s" %
71
+ Puppet[:certname]
72
+
73
+ csr = OpenSSL::X509::Request.new
74
+ csr.version = 0
75
+ csr.subject = OpenSSL::X509::Name.new([["CN", Puppet[:certname]]])
76
+ csr.public_key = key.public_key
77
+ csr.sign(key, OpenSSL::Digest::MD5.new)
78
+
79
+ return csr
80
+ end
81
+
82
+ keytype :cert, :param => :hostcert, :class => OpenSSL::X509::Certificate do
83
+ raise MissingCertificate, "No host certificate"
84
+ end
85
+
86
+ keytype :ca_cert, :param => :localcacert, :class => OpenSSL::X509::Certificate do
87
+ raise MissingCertificate, "No CA certificate"
88
+ end
89
+
90
+ # Request a certificate from the remote system. This does all of the work
91
+ # of creating the cert request, contacting the remote system, and
92
+ # storing the cert locally.
93
+ def requestcert
94
+ begin
95
+ cert, cacert = caclient.getcert(@csr.to_pem)
96
+ rescue => detail
97
+ if Puppet[:trace]
98
+ puts detail.backtrace
99
+ end
100
+ raise Puppet::Error.new("Certificate retrieval failed: %s" %
101
+ detail)
102
+ end
103
+
104
+ if cert.nil? or cert == ""
105
+ return nil
106
+ end
107
+ Puppet.config.write(:hostcert) do |f| f.print cert end
108
+ Puppet.config.write(:localcacert) do |f| f.print cacert end
109
+ #File.open(@certfile, "w", 0644) { |f| f.print cert }
110
+ #File.open(@cacertfile, "w", 0644) { |f| f.print cacert }
111
+ begin
112
+ @cert = OpenSSL::X509::Certificate.new(cert)
113
+ @cacert = OpenSSL::X509::Certificate.new(cacert)
114
+ retrieved = true
115
+ rescue => detail
116
+ raise Puppet::Error.new(
117
+ "Invalid certificate: %s" % detail
118
+ )
119
+ end
120
+
121
+ unless @cert.check_private_key(@key)
122
+ raise Puppet::DevError, "Received invalid certificate"
123
+ end
124
+ return retrieved
125
+ end
126
+ end
127
+
128
+ # $Id: support.rb 2259 2007-03-06 19:03:05Z luke $
@@ -1,19 +1,33 @@
1
- # the class that actually walks our object/state tree, collects the changes,
1
+ # the class that actually walks our resource/property tree, collects the changes,
2
2
  # and performs them
3
3
 
4
4
  require 'puppet'
5
- require 'puppet/statechange'
5
+ require 'puppet/propertychange'
6
6
 
7
7
  module Puppet
8
8
  class Transaction
9
- attr_accessor :component, :objects, :tags, :ignoreschedules
9
+ attr_accessor :component, :resources, :ignoreschedules, :ignoretags
10
+ attr_accessor :relgraph, :sorted_resources, :configurator
11
+
12
+ attr_reader :report
13
+
14
+ attr_writer :tags
10
15
 
11
16
  include Puppet::Util
12
17
 
18
+ Puppet.config.setdefaults(:puppet,
19
+ :graph => [false, "Whether to create dot graph files for the different
20
+ configuration graphs. These dot files can be interpreted by tools
21
+ like OmniGraffle or dot (which is part of ImageMagick)."],
22
+ :graphdir => ["$statedir/graphs", "Where to store dot-outputted graphs."]
23
+ )
13
24
  Puppet.config.setdefaults(:transaction,
14
- :tags => ["", "Tags to use to find objects. If this is set, then
15
- only objects tagged with the specified tags will be applied.
16
- Values must be comma-separated."]
25
+ :tags => ["", "Tags to use to find resources. If this is set, then
26
+ only resources tagged with the specified tags will be applied.
27
+ Values must be comma-separated."],
28
+ :evaltrace => [false, "Whether each resource should log when it is
29
+ being evaluated. This allows you to interactively see exactly
30
+ what is being done."]
17
31
  )
18
32
 
19
33
  # Add some additional times for reporting
@@ -23,50 +37,78 @@ class Transaction
23
37
  end
24
38
  end
25
39
 
26
- # Apply all changes for a child, returning a list of the events
27
- # generated.
28
- def apply(child)
29
- # First make sure there are no failed dependencies
30
- child.eachdependency do |dep|
31
- skip = false
32
- if @failures[dep] > 0
33
- child.notice "Dependency %s[%s] has %s failures" %
34
- [dep.class.name, dep.name, @failures[dep]]
35
- skip = true
36
- end
37
-
38
- if skip
39
- child.warning "Skipping because of failed dependencies"
40
- @objectmetrics[:skipped] += 1
41
- return []
40
+ # Check to see if we should actually allow deleition.
41
+ def allow_processing?(resource, changes)
42
+ # If a resource is going to be deleted but it still has
43
+ # dependencies, then don't delete it unless it's implicit or the
44
+ # dependency is itself being deleted.
45
+ if resource.purging? and resource.deleting?
46
+ if deps = @relgraph.dependents(resource) and ! deps.empty? and deps.detect { |d| ! d.deleting? }
47
+ resource.warning "%s still depend%s on me -- not purging" %
48
+ [deps.collect { |r| r.ref }.join(","), deps.length > 1 ? "":"s"]
49
+ return false
42
50
  end
43
51
  end
44
52
 
53
+ return true
54
+ end
55
+
56
+ # Apply all changes for a resource, returning a list of the events
57
+ # generated.
58
+ def apply(resource)
45
59
  begin
46
- changes = child.evaluate
60
+ changes = resource.evaluate
47
61
  rescue => detail
48
- if Puppet[:debug]
62
+ if Puppet[:trace]
49
63
  puts detail.backtrace
50
64
  end
51
65
 
52
- child.err "Failed to retrieve current state: %s" % detail
66
+ resource.err "Failed to retrieve current state of resource: %s" % detail
53
67
 
54
68
  # Mark that it failed
55
- @failures[child] += 1
69
+ @failures[resource] += 1
56
70
 
57
71
  # And then return
58
72
  return []
59
73
  end
60
74
 
61
- unless changes.is_a? Array
62
- changes = [changes]
63
- end
75
+ changes = [changes] unless changes.is_a?(Array)
64
76
 
65
77
  if changes.length > 0
66
- @objectmetrics[:out_of_sync] += 1
78
+ @resourcemetrics[:out_of_sync] += 1
67
79
  end
68
80
 
69
- childevents = changes.collect { |change|
81
+ return [] if changes.empty? or ! allow_processing?(resource, changes)
82
+
83
+ resourceevents = apply_changes(resource, changes)
84
+
85
+ # If there were changes and the resource isn't in noop mode...
86
+ unless changes.empty? or changes.include?(:noop)
87
+ # Record when we last synced
88
+ resource.cache(:synced, Time.now)
89
+
90
+ # Flush, if appropriate
91
+ if resource.respond_to?(:flush)
92
+ resource.flush
93
+ end
94
+
95
+ # And set a trigger for refreshing this resource if it's a
96
+ # self-refresher
97
+ if resource.self_refresh? and ! resource.deleting?
98
+ # Create an edge with this resource as both the source and
99
+ # target. The triggering method treats these specially for
100
+ # logging.
101
+ events = resourceevents.collect { |e| e.event }
102
+ set_trigger(Puppet::Relationship.new(resource, resource, :callback => :refresh, :event => events))
103
+ end
104
+ end
105
+
106
+ resourceevents
107
+ end
108
+
109
+ # Apply each change in turn.
110
+ def apply_changes(resource, changes)
111
+ changes.collect { |change|
70
112
  @changes << change
71
113
  @count += 1
72
114
  change.transaction = self
@@ -76,9 +118,12 @@ class Transaction
76
118
  # event if they want
77
119
  events = [change.forward].flatten.reject { |e| e.nil? }
78
120
  rescue => detail
79
- change.state.err "change from %s to %s failed: %s" %
80
- [change.state.is_to_s, change.state.should_to_s, detail]
81
- @failures[child] += 1
121
+ if Puppet[:trace]
122
+ puts detail.backtrace
123
+ end
124
+ change.property.err "change from %s to %s failed: %s" %
125
+ [change.property.is_to_s, change.property.should_to_s, detail]
126
+ @failures[resource] += 1
82
127
  next
83
128
  # FIXME this should support using onerror to determine
84
129
  # behaviour; or more likely, the client calling us
@@ -87,46 +132,164 @@ class Transaction
87
132
 
88
133
  # Mark that our change happened, so it can be reversed
89
134
  # if we ever get to that point
90
- unless events.nil? or (events.is_a?(Array) and events.empty?)
135
+ unless events.nil? or (events.is_a?(Array) and (events.empty?) or events.include?(:noop))
91
136
  change.changed = true
92
- @objectmetrics[:applied] += 1
137
+ @resourcemetrics[:applied] += 1
93
138
  end
94
139
 
95
140
  events
96
141
  }.flatten.reject { |e| e.nil? }
97
-
98
- unless changes.empty?
99
- # Record when we last synced
100
- child.cache(:synced, Time.now)
101
- end
102
-
103
- childevents
104
142
  end
105
143
 
106
- # Find all of the changed objects.
144
+ # Find all of the changed resources.
107
145
  def changed?
108
146
  @changes.find_all { |change| change.changed }.collect { |change|
109
- change.state.parent
147
+ change.property.parent
110
148
  }.uniq
111
149
  end
150
+
151
+ # Do any necessary cleanup. If we don't get rid of the graphs, the
152
+ # contained resources might never get cleaned up.
153
+ def cleanup
154
+ if defined? @generated
155
+ @generated.each do |resource|
156
+ resource.remove
157
+ end
158
+ end
159
+ if defined? @relgraph
160
+ @relgraph.clear
161
+ end
162
+ @resources.clear
163
+ end
164
+
165
+ # Copy an important relationships from the parent to the newly-generated
166
+ # child resource.
167
+ def copy_relationships(resource, children)
168
+ depthfirst = resource.depthfirst?
169
+
170
+ children.each do |gen_child|
171
+ if depthfirst
172
+ edge = [gen_child, resource]
173
+ else
174
+ edge = [resource, gen_child]
175
+ end
176
+ unless @relgraph.edge?(edge[1], edge[0])
177
+ @relgraph.add_edge!(*edge)
178
+ else
179
+ @relgraph.add_vertex!(gen_child)
180
+ resource.debug "Skipping automatic relationship to %s" % gen_child
181
+ end
182
+ end
183
+ end
184
+
185
+ # Are we deleting this resource?
186
+ def deleting?(changes)
187
+ changes.detect { |change|
188
+ change.property.name == :ensure and change.should == :absent
189
+ }
190
+ end
191
+
192
+ # See if the resource generates new resources at evaluation time.
193
+ def eval_generate(resource)
194
+ if resource.respond_to?(:eval_generate)
195
+ begin
196
+ children = resource.eval_generate
197
+ rescue => detail
198
+ if Puppet[:trace]
199
+ puts detail.backtrace
200
+ end
201
+ resource.err "Failed to generate additional resources during transaction: %s" %
202
+ detail
203
+ return nil
204
+ end
205
+
206
+ if children
207
+ children.each do |child|
208
+ child.finish
209
+ # Make sure that the vertex is in the relationship graph.
210
+ @relgraph.add_vertex!(child)
211
+ end
212
+ @generated += children
213
+ return children
214
+ end
215
+ end
216
+ end
217
+
218
+ # Evaluate a single resource.
219
+ def eval_resource(resource, checkskip = true)
220
+ events = []
221
+
222
+ if resource.is_a?(Puppet::Type::Component)
223
+ raise Puppet::DevError, "Got a component to evaluate"
224
+ end
225
+
226
+ if checkskip and skip?(resource)
227
+ @resourcemetrics[:skipped] += 1
228
+ else
229
+ @resourcemetrics[:scheduled] += 1
230
+
231
+ changecount = @changes.length
232
+
233
+ # We need to generate first regardless, because the recursive
234
+ # actions sometimes change how the top resource is applied.
235
+ children = eval_generate(resource)
236
+
237
+ if children and resource.depthfirst?
238
+ children.each do |child|
239
+ # The child will never be skipped when the parent isn't
240
+ events += eval_resource(child, false)
241
+ end
242
+ end
243
+
244
+ # Perform the actual changes
245
+ seconds = thinmark do
246
+ events += apply(resource)
247
+ end
112
248
 
113
- # Collect all of the targets for the list of events. This is an unintuitive
114
- # method because it recurses up through the source the event.
115
- def collecttargets(events)
116
- events.each do |event|
117
- source = event.source
118
- start = source
119
-
120
- while source
121
- Puppet::Event::Subscription.targets_of(event, source) do |sub|
122
- start.info "Scheduling %s of %s[%s]" %
123
- [sub.callback, sub.target.class.name, sub.target.name]
124
- @targets[sub.target][event] = sub
249
+ if children and ! resource.depthfirst?
250
+ children.each do |child|
251
+ events += eval_resource(child, false)
125
252
  end
253
+ end
126
254
 
127
- source = source.parent
255
+ # Create a child/parent relationship. We do this after everything else because
256
+ # we want explicit relationships to be able to override automatic relationships,
257
+ # including this one.
258
+ if children
259
+ copy_relationships(resource, children)
260
+ end
261
+
262
+ # A bit of hackery here -- if skipcheck is true, then we're the
263
+ # top-level resource. If that's the case, then make sure all of
264
+ # the changes list this resource as a proxy. This is really only
265
+ # necessary for rollback, since we know the generating resource
266
+ # during forward changes.
267
+ if children and checkskip
268
+ @changes[changecount..-1].each { |change| change.proxy = resource }
128
269
  end
270
+
271
+ # Keep track of how long we spend in each type of resource
272
+ @timemetrics[resource.class.name] += seconds
129
273
  end
274
+
275
+ # Check to see if there are any events for this resource
276
+ if triggedevents = trigger(resource)
277
+ events += triggedevents
278
+ end
279
+
280
+ # Collect the targets of any subscriptions to those events. We pass
281
+ # the parent resource in so it will override the source in the events,
282
+ # since eval_generated children can't have direct relationships.
283
+ @relgraph.matching_edges(events, resource).each do |edge|
284
+ edge = edge.dup
285
+ label = edge.label
286
+ label[:event] = events.collect { |e| e.event }
287
+ edge.label = label
288
+ set_trigger(edge)
289
+ end
290
+
291
+ # And return the events for collection
292
+ events
130
293
  end
131
294
 
132
295
  # This method does all the actual work of running a transaction. It
@@ -134,54 +297,33 @@ class Transaction
134
297
  # necessary events.
135
298
  def evaluate
136
299
  @count = 0
137
-
138
- # Allow the tags to be overriden
139
- tags = self.tags || Puppet[:tags]
140
- if tags.nil? or tags == ""
141
- tags = nil
142
- else
143
- tags = [tags] unless tags.is_a? Array
144
- tags = tags.collect do |tag|
145
- tag.split(/\s*,\s*/)
146
- end.flatten
147
- end
148
-
300
+
301
+ graph(@resources, :resources)
302
+
149
303
  # Start logging.
150
- Puppet::Log.newdestination(@report)
304
+ Puppet::Util::Log.newdestination(@report)
305
+
306
+ prepare()
151
307
 
152
308
  begin
153
- allevents = @objects.collect { |child|
154
- events = nil
155
- if (tags.nil? or child.tagged?(tags))
156
- if self.ignoreschedules or child.scheduled?
157
- @objectmetrics[:scheduled] += 1
158
- # Perform the actual changes
159
-
160
- seconds = thinmark do
161
- events = apply(child)
162
- end
163
-
164
- # Keep track of how long we spend in each type of object
165
- @timemetrics[child.class.name] += seconds
166
-
167
- # Collect the targets of any subscriptions to those events
168
- collecttargets(events)
169
- else
170
- child.debug "Not scheduled"
171
- end
172
- else
173
- child.debug "Not tagged with %s" % tags.join(", ")
309
+ allevents = @sorted_resources.collect { |resource|
310
+ if resource.is_a?(Puppet::Type::Component)
311
+ Puppet.warning "Somehow left a component in the relationship graph"
312
+ next
313
+ end
314
+ ret = nil
315
+ seconds = thinmark do
316
+ ret = eval_resource(resource)
174
317
  end
175
318
 
176
- # Now check to see if there are any events for this child
177
- trigger(child)
178
-
179
- # And return the events for collection
180
- events
319
+ if Puppet[:evaltrace]
320
+ resource.info "Evaluated in %0.2f seconds" % seconds
321
+ end
322
+ ret
181
323
  }.flatten.reject { |e| e.nil? }
182
324
  ensure
183
325
  # And then close the transaction log.
184
- Puppet::Log.close(@report)
326
+ Puppet::Util::Log.close(@report)
185
327
  end
186
328
 
187
329
  Puppet.debug "Finishing transaction %s with %s changes" %
@@ -190,54 +332,74 @@ class Transaction
190
332
  allevents
191
333
  end
192
334
 
193
- # Determine whether a given object has failed.
335
+ # Determine whether a given resource has failed.
194
336
  def failed?(obj)
195
- @failures[obj] > 0
337
+ if @failures[obj] > 0
338
+ return @failures[obj]
339
+ else
340
+ return false
341
+ end
196
342
  end
197
343
 
198
- # this should only be called by a Puppet::Container object now
199
- # and it should only receive an array
200
- def initialize(objects)
201
- @objects = objects
202
-
203
- @objectmetrics = {
204
- :total => @objects.length,
205
- :out_of_sync => 0, # The number of objects that had changes
206
- :applied => 0, # The number of objects fixed
207
- :skipped => 0, # The number of objects skipped
208
- :restarted => 0, # The number of objects triggered
209
- :failed_restarts => 0, # The number of objects that fail a trigger
210
- :scheduled => 0 # The number of objects scheduled
211
- }
212
-
213
- # Metrics for distributing times across the different types.
214
- @timemetrics = Hash.new(0)
215
-
216
- # The number of objects that were triggered in this run
217
- @triggered = Hash.new { |hash, key|
218
- hash[key] = Hash.new(0)
219
- }
220
-
221
- # Targets of being triggered.
222
- @targets = Hash.new do |hash, key|
223
- hash[key] = {}
344
+ # Does this resource have any failed dependencies?
345
+ def failed_dependencies?(resource)
346
+ # First make sure there are no failed dependencies. To do this,
347
+ # we check for failures in any of the vertexes above us. It's not
348
+ # enough to check the immediate dependencies, which is why we use
349
+ # a tree from the reversed graph.
350
+ skip = false
351
+ deps = @relgraph.dependencies(resource)
352
+ deps.each do |dep|
353
+ if fails = failed?(dep)
354
+ resource.notice "Dependency %s[%s] has %s failures" %
355
+ [dep.class.name, dep.name, @failures[dep]]
356
+ skip = true
357
+ end
224
358
  end
225
-
226
- # The changes we're performing
227
- @changes = []
228
-
229
- # The objects that have failed and the number of failures each. This
230
- # is used for skipping objects because of failed dependencies.
231
- @failures = Hash.new do |h, key|
232
- h[key] = 0
359
+
360
+ return skip
361
+ end
362
+
363
+ # Collect any dynamically generated resources.
364
+ def generate
365
+ list = @resources.vertices
366
+
367
+ # Store a list of all generated resources, so that we can clean them up
368
+ # after the transaction closes.
369
+ @generated = []
370
+
371
+ newlist = []
372
+ while ! list.empty?
373
+ list.each do |resource|
374
+ if resource.respond_to?(:generate)
375
+ begin
376
+ made = resource.generate
377
+ rescue => detail
378
+ resource.err "Failed to generate additional resources: %s" %
379
+ detail
380
+ end
381
+ next unless made
382
+ unless made.is_a?(Array)
383
+ made = [made]
384
+ end
385
+ made.uniq!
386
+ made.each do |res|
387
+ @resources.add_vertex!(res)
388
+ newlist << res
389
+ @generated << res
390
+ res.finish
391
+ end
392
+ end
393
+ end
394
+ list.clear
395
+ list = newlist
396
+ newlist = []
233
397
  end
234
-
235
- @report = Report.new
236
398
  end
237
399
 
238
400
  # Generate a transaction report.
239
- def report
240
- @objectmetrics[:failed] = @failures.find_all do |name, num|
401
+ def generate_report
402
+ @resourcemetrics[:failed] = @failures.find_all do |name, num|
241
403
  num > 0
242
404
  end.length
243
405
 
@@ -257,10 +419,10 @@ class Transaction
257
419
  end
258
420
  end
259
421
 
260
- # Add all of the metrics related to object count and status
261
- @report.newmetric(:objects, @objectmetrics)
422
+ # Add all of the metrics related to resource count and status
423
+ @report.newmetric(:resources, @resourcemetrics)
262
424
 
263
- # Record the relative time spent in each object.
425
+ # Record the relative time spent in each resource.
264
426
  @report.newmetric(:time, @timemetrics)
265
427
 
266
428
  # Then all of the change-related metrics
@@ -273,6 +435,133 @@ class Transaction
273
435
  return @report
274
436
  end
275
437
 
438
+ # Produce the graph files if requested.
439
+ def graph(gr, name)
440
+ # We don't want to graph the configuration process.
441
+ return if self.configurator
442
+
443
+ return unless Puppet[:graph]
444
+
445
+ file = File.join(Puppet[:graphdir], "%s.dot" % name.to_s)
446
+ File.open(file, "w") { |f|
447
+ f.puts gr.to_dot("name" => name.to_s.capitalize)
448
+ }
449
+ end
450
+
451
+ # this should only be called by a Puppet::Type::Component resource now
452
+ # and it should only receive an array
453
+ def initialize(resources)
454
+ if resources.is_a?(Puppet::PGraph)
455
+ @resources = resources
456
+ else
457
+ @resources = resources.to_graph
458
+ end
459
+
460
+ @resourcemetrics = {
461
+ :total => @resources.vertices.length,
462
+ :out_of_sync => 0, # The number of resources that had changes
463
+ :applied => 0, # The number of resources fixed
464
+ :skipped => 0, # The number of resources skipped
465
+ :restarted => 0, # The number of resources triggered
466
+ :failed_restarts => 0, # The number of resources that fail a trigger
467
+ :scheduled => 0 # The number of resources scheduled
468
+ }
469
+
470
+ # Metrics for distributing times across the different types.
471
+ @timemetrics = Hash.new(0)
472
+
473
+ # The number of resources that were triggered in this run
474
+ @triggered = Hash.new { |hash, key|
475
+ hash[key] = Hash.new(0)
476
+ }
477
+
478
+ # Targets of being triggered.
479
+ @targets = Hash.new do |hash, key|
480
+ hash[key] = []
481
+ end
482
+
483
+ # The changes we're performing
484
+ @changes = []
485
+
486
+ # The resources that have failed and the number of failures each. This
487
+ # is used for skipping resources because of failed dependencies.
488
+ @failures = Hash.new do |h, key|
489
+ h[key] = 0
490
+ end
491
+
492
+ @report = Report.new
493
+ @count = 0
494
+ end
495
+
496
+ # Prefetch any providers that support it. We don't support prefetching
497
+ # types, just providers.
498
+ def prefetch
499
+ @resources.collect { |obj|
500
+ if pro = obj.provider
501
+ pro.class
502
+ else
503
+ nil
504
+ end
505
+ }.reject { |o| o.nil? }.uniq.each do |klass|
506
+ # XXX We need to do something special here in case of failure.
507
+ if klass.respond_to?(:prefetch)
508
+ klass.prefetch
509
+ end
510
+ end
511
+ end
512
+
513
+ # Prepare to evaluate the elements in a transaction.
514
+ def prepare
515
+ prefetch()
516
+
517
+ # Now add any dynamically generated resources
518
+ generate()
519
+
520
+ # Create a relationship graph from our resource graph
521
+ @relgraph = relationship_graph
522
+
523
+ @sorted_resources = @relgraph.topsort
524
+
525
+ # Now make sure no cycles crept into our graph.
526
+ @relgraph.check_cycle(@sorted_resources)
527
+ end
528
+
529
+ # Create a graph of all of the relationships in our resource graph.
530
+ def relationship_graph
531
+ graph = Puppet::PGraph.new
532
+
533
+ # First create the dependency graph
534
+ @resources.vertices.each do |vertex|
535
+ graph.add_vertex!(vertex)
536
+ vertex.builddepends.each do |edge|
537
+ graph.add_edge!(edge)
538
+ end
539
+ end
540
+
541
+ # Lastly, add in any autorequires
542
+ graph.vertices.each do |vertex|
543
+ vertex.autorequire.each do |edge|
544
+ unless graph.edge?(edge)
545
+ unless graph.edge?(edge.target, edge.source)
546
+ vertex.debug "Autorequiring %s" % [edge.source]
547
+ graph.add_edge!(edge)
548
+ else
549
+ vertex.debug "Skipping automatic relationship with %s" % (edge.source == vertex ? edge.target : edge.source)
550
+ end
551
+ end
552
+ end
553
+ end
554
+
555
+ graph(graph, :relationships)
556
+
557
+ # Then splice in the container information
558
+ graph.splice!(@resources, Puppet::Type::Component)
559
+
560
+ graph(graph, :expanded_relationships)
561
+
562
+ return graph
563
+ end
564
+
276
565
  # Roll all completed changes back.
277
566
  def rollback
278
567
  @targets.clear
@@ -287,92 +576,182 @@ class Transaction
287
576
  events = change.backward
288
577
  rescue => detail
289
578
  Puppet.err("%s rollback failed: %s" % [change,detail])
290
- if Puppet[:debug]
579
+ if Puppet[:trace]
291
580
  puts detail.backtrace
292
581
  end
293
582
  next
294
583
  # at this point, we would normally do error handling
295
584
  # but i haven't decided what to do for that yet
296
- # so just record that a sync failed for a given object
297
- #@@failures[change.state.parent] += 1
585
+ # so just record that a sync failed for a given resource
586
+ #@@failures[change.property.parent] += 1
298
587
  # this still could get hairy; what if file contents changed,
299
588
  # but a chmod failed? how would i handle that error? dern
300
589
  end
301
-
302
- collecttargets(events)
590
+
591
+ # FIXME This won't work right now.
592
+ @relgraph.matching_edges(events).each do |edge|
593
+ @targets[edge.target] << edge
594
+ end
303
595
 
304
596
  # Now check to see if there are any events for this child.
305
597
  # Kind of hackish, since going backwards goes a change at a
306
598
  # time, not a child at a time.
307
- trigger(change.state.parent)
599
+ trigger(change.property.parent)
308
600
 
309
601
  # And return the events for collection
310
602
  events
311
603
  }.flatten.reject { |e| e.nil? }
312
604
  end
605
+
606
+ # Is the resource currently scheduled?
607
+ def scheduled?(resource)
608
+ self.ignoreschedules or resource.scheduled?
609
+ end
610
+
611
+ # Set an edge to be triggered when we evaluate its target.
612
+ def set_trigger(edge)
613
+ return unless method = edge.callback
614
+ return unless edge.target.respond_to?(method)
615
+ if edge.target.respond_to?(:ref)
616
+ unless edge.source == edge.target
617
+ edge.source.info "Scheduling %s of %s" % [edge.callback, edge.target.ref]
618
+ end
619
+ end
620
+ @targets[edge.target] << edge
621
+ end
622
+
623
+ # Should this resource be skipped?
624
+ def skip?(resource)
625
+ skip = false
626
+ if ! tagged?(resource)
627
+ resource.debug "Not tagged with %s" % tags.join(", ")
628
+ elsif ! scheduled?(resource)
629
+ resource.debug "Not scheduled"
630
+ elsif failed_dependencies?(resource)
631
+ resource.warning "Skipping because of failed dependencies"
632
+ else
633
+ return false
634
+ end
635
+ return true
636
+ end
637
+
638
+ # The tags we should be checking.
639
+ def tags
640
+ # Allow the tags to be overridden
641
+ unless defined? @tags
642
+ @tags = Puppet[:tags]
643
+ end
644
+
645
+ unless defined? @processed_tags
646
+ if @tags.nil? or @tags == ""
647
+ @tags = []
648
+ else
649
+ @tags = [@tags] unless @tags.is_a? Array
650
+ @tags = @tags.collect do |tag|
651
+ tag.split(/\s*,\s*/)
652
+ end.flatten
653
+ end
654
+ @processed_tags = true
655
+ end
656
+
657
+ @tags
658
+ end
659
+
660
+ # Is this resource tagged appropriately?
661
+ def tagged?(resource)
662
+ self.ignoretags or tags.empty? or resource.tagged?(tags)
663
+ end
664
+
665
+ # Are there any edges that target this resource?
666
+ def targeted?(resource)
667
+ # The default value is a new array so we have to test the length of it.
668
+ @targets.include?(resource) and @targets[resource].length > 0
669
+ end
313
670
 
314
671
  # Trigger any subscriptions to a child. This does an upwardly recursive
315
- # search -- it triggers the passed object, but also the object's parent
672
+ # search -- it triggers the passed resource, but also the resource's parent
316
673
  # and so on up the tree.
317
- def trigger(child)
318
- obj = child
674
+ def trigger(resource)
675
+ return nil unless targeted?(resource)
319
676
  callbacks = Hash.new { |hash, key| hash[key] = [] }
320
- sources = Hash.new { |hash, key| hash[key] = [] }
321
-
322
- while obj
323
- if @targets.include?(obj)
324
- callbacks.clear
325
- sources.clear
326
- @targets[obj].each do |event, sub|
327
- # Collect all of the subs for each callback
328
- callbacks[sub.callback] << sub
329
-
330
- # And collect the sources for logging
331
- sources[event.source] << sub.callback
332
- end
333
677
 
334
- sources.each do |source, callbacklist|
335
- obj.debug "%s[%s] results in triggering %s" %
336
- [source.class.name, source.name, callbacklist.join(", ")]
678
+ trigged = []
679
+ @targets[resource].each do |edge|
680
+ # Collect all of the subs for each callback
681
+ callbacks[edge.callback] << edge
682
+ end
683
+
684
+ callbacks.each do |callback, subs|
685
+ noop = true
686
+ subs.each do |edge|
687
+ if edge.event.nil? or ! edge.event.include?(:noop)
688
+ noop = false
337
689
  end
690
+ end
338
691
 
339
- callbacks.each do |callback, subs|
340
- obj.info "Triggering '%s' from %s dependencies" %
341
- [callback, subs.length]
342
- # At this point, just log failures, don't try to react
343
- # to them in any way.
344
- begin
345
- obj.send(callback)
346
- @objectmetrics[:restarted] += 1
347
- rescue => detail
348
- obj.err "Failed to call %s on %s: %s" %
349
- [callback, obj, detail]
692
+ if noop
693
+ resource.notice "Would have triggered %s from %s dependencies" %
694
+ [callback, subs.length]
350
695
 
351
- @objectmetrics[:failed_restarts] += 1
696
+ # And then add an event for it.
697
+ return [Puppet::Event.new(
698
+ :event => :noop,
699
+ :transaction => self,
700
+ :source => resource
701
+ )]
702
+ end
352
703
 
353
- if Puppet[:debug]
354
- puts detail.backtrace
355
- end
356
- end
704
+ if subs.length == 1 and subs[0].source == resource
705
+ message = "Refreshing self"
706
+ else
707
+ message = "Triggering '%s' from %s dependencies" %
708
+ [callback, subs.length]
709
+ end
710
+ resource.notice message
711
+
712
+ # At this point, just log failures, don't try to react
713
+ # to them in any way.
714
+ begin
715
+ resource.send(callback)
716
+ @resourcemetrics[:restarted] += 1
717
+ rescue => detail
718
+ resource.err "Failed to call %s on %s: %s" %
719
+ [callback, resource, detail]
720
+
721
+ @resourcemetrics[:failed_restarts] += 1
357
722
 
358
- triggered(obj, callback)
723
+ if Puppet[:trace]
724
+ puts detail.backtrace
359
725
  end
360
726
  end
361
727
 
362
- obj = obj.parent
728
+ # And then add an event for it.
729
+ trigged << Puppet::Event.new(
730
+ :event => :triggered,
731
+ :transaction => self,
732
+ :source => resource
733
+ )
734
+
735
+ triggered(resource, callback)
736
+ end
737
+
738
+ if trigged.empty?
739
+ return nil
740
+ else
741
+ return trigged
363
742
  end
364
743
  end
365
744
 
366
- def triggered(object, method)
367
- @triggered[object][method] += 1
745
+ def triggered(resource, method)
746
+ @triggered[resource][method] += 1
368
747
  end
369
748
 
370
- def triggered?(object, method)
371
- @triggered[object][method]
749
+ def triggered?(resource, method)
750
+ @triggered[resource][method]
372
751
  end
373
752
  end
374
753
  end
375
754
 
376
755
  require 'puppet/transaction/report'
377
756
 
378
- # $Id: transaction.rb 1351 2006-07-01 17:27:54Z luke $
757
+ # $Id: transaction.rb 2372 2007-03-30 00:47:03Z luke $