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
@@ -0,0 +1,64 @@
1
+ require 'puppet'
2
+
3
+ Puppet::Network::Handler.report.newreport(:store, :useyaml => true) do
4
+ Puppet.config.use(:reporting)
5
+
6
+ desc "Store the yaml report on disk. Each host sends its report as a YAML dump
7
+ and this just stores the file on disk, in the ``reportdir`` directory.
8
+
9
+ These files collect quickly -- one every half hour -- so it is a good idea
10
+ to perform some maintenance on them if you use this report (it's the only
11
+ default report)."
12
+
13
+ def mkclientdir(client, dir)
14
+ config = Puppet::Util::Config.new
15
+ config.setdefaults("reportclient-#{client}",
16
+ "clientdir-#{client}" => { :default => dir,
17
+ :mode => 0750,
18
+ :desc => "Client dir for %s" % client,
19
+ :owner => Puppet[:user],
20
+ :group => Puppet[:group]
21
+ }
22
+ )
23
+
24
+ config.use("reportclient-#{client}")
25
+ end
26
+
27
+ def process(yaml)
28
+ # We don't want any tracking back in the fs. Unlikely, but there
29
+ # you go.
30
+ client = self.host.gsub("..",".")
31
+
32
+ dir = File.join(Puppet[:reportdir], client)
33
+
34
+ unless FileTest.exists?(dir)
35
+ mkclientdir(client, dir)
36
+ end
37
+
38
+ # Now store the report.
39
+ now = Time.now.gmtime
40
+ name = %w{year month day hour min}.collect do |method|
41
+ # Make sure we're at least two digits everywhere
42
+ "%02d" % now.send(method).to_s
43
+ end.join("") + ".yaml"
44
+
45
+ file = File.join(dir, name)
46
+
47
+ begin
48
+ File.open(file, "w", 0640) do |f|
49
+ f.print yaml
50
+ end
51
+ rescue => detail
52
+ if Puppet[:trace]
53
+ puts detail.backtrace
54
+ end
55
+ Puppet.warning "Could not write report for %s at %s: %s" %
56
+ [client, file, detail]
57
+ end
58
+
59
+ # Only testing cares about the return value
60
+ return file
61
+ end
62
+ end
63
+
64
+ # $Id: store.rb 2259 2007-03-06 19:03:05Z luke $
@@ -1,94 +1,167 @@
1
1
  require 'puppet'
2
-
3
- Puppet.config.setdefaults(:reporting,
4
- :tagmap => ["$confdir/tagmail.conf",
5
- "The mapping between reporting tags and email addresses."],
6
- :sendmail => [%x{which sendmail 2>/dev/null}.chomp,
7
- "Where to find the sendmail binary with which to send email."],
8
- :reportfrom => ["report@" + [Facter["hostname"].value, Facter["domain"].value].join("."),
9
- "The 'from' email address for the reports."],
10
- :smtpserver => ["none",
11
- "The server through which to send email reports."]
12
- )
2
+ require 'pp'
13
3
 
14
4
  require 'net/smtp'
15
5
 
16
- Puppet::Server::Report.newreport(:tagmail) do |report|
17
- unless FileTest.exists?(Puppet[:tagmap])
18
- Puppet.notice "Cannot send tagmail report; no tagmap file %s" %
19
- Puppet[:tagmap]
20
- return
21
- end
6
+ Puppet::Network::Handler.report.newreport(:tagmail) do
7
+ desc "This report sends specific log messages to specific email addresses
8
+ based on the tags in the log messages. See the
9
+ `UsingTags tag documentation`:trac: for more information
10
+ on tags.
11
+
12
+ To use this report, you must create a ``tagmail.conf`` (in the location
13
+ specified by ``tagmap``). This is a simple file that maps tags to
14
+ email addresses: Any log messages in the report that match the specified
15
+ tags will be sent to the specified email addresses.
16
+
17
+ Tags must be comma-separated, and they can be negated so that messages
18
+ only match when they do not have that tag. The tags are separated from
19
+ the email addresses by a colon, and the email addresses should also
20
+ be comma-separated.
22
21
 
23
- # Load the config file
24
- tags = {}
25
- File.readlines(Puppet[:tagmap]).each do |line|
26
- taglist, emails = line.chomp.split(/\s*:\s*/)
22
+ Lastly, there is an ``all`` tag that will always match all log messages.
23
+
24
+ Here is an example tagmail.conf::
25
+
26
+ all: me@domain.com
27
+ webserver, !mailserver: httpadmins@domain.com
28
+
29
+ This will send all messages to ``me@domain.com``, and all messages from
30
+ webservers that are not also from mailservers to ``httpadmins@domain.com``.
31
+ "
32
+
33
+ # Find all matching messages.
34
+ def match(taglists)
35
+ reports = []
36
+ taglists.each do |emails, pos, neg|
37
+ # First find all of the messages matched by our positive tags
38
+ messages = nil
39
+ if pos.include?("all")
40
+ messages = self.logs
41
+ else
42
+ # Find all of the messages that are tagged with any of our
43
+ # tags.
44
+ messages = self.logs.find_all do |log|
45
+ pos.detect { |tag| log.tagged?(tag) }
46
+ end
47
+ end
48
+
49
+ # Now go through and remove any messages that match our negative tags
50
+ messages = messages.reject do |log|
51
+ if neg.detect do |tag| log.tagged?(tag) end
52
+ true
53
+ end
54
+ end
27
55
 
28
- emails = emails.split(/\s*,\s*/)
29
- taglist.split(/\s*,\s*/).each do |tag|
30
- tags[tag] = emails
56
+ if messages.empty?
57
+ Puppet.info "No messages to report to %s" % emails.join(",")
58
+ next
59
+ else
60
+ reports << [emails, messages.collect { |m| m.to_report }.join("\n")]
61
+ end
31
62
  end
63
+
64
+ return reports
32
65
  end
66
+
67
+ # Load the config file
68
+ def parse(text)
69
+ taglists = []
70
+ text.split("\n").each do |line|
71
+ taglist = emails = nil
72
+ case line.chomp
73
+ when /^\s*#/: next
74
+ when /^\s*$/: next
75
+ when /^\s*(.+)\s*:\s*(.+)\s*$/:
76
+ taglist = $1
77
+ emails = $2.sub(/#.*$/,'')
78
+ else
79
+ raise ArgumentError, "Invalid tagmail config file"
80
+ end
33
81
 
34
- # Now find any appropriately tagged messages.
35
- reports = {}
36
- tags.each do |tag, emails|
37
- messages = nil
38
- if tag == "all"
39
- messages = report.logs
40
- else
41
- messages = report.logs.find_all do |log|
42
- log.tagged?(tag)
82
+ pos = []
83
+ neg = []
84
+ taglist.sub(/\s+$/,'').split(/\s*,\s*/).each do |tag|
85
+ unless tag =~ /^!?[-\w]+$/
86
+ raise ArgumentError, "Invalid tag %s" % tag.inspect
87
+ end
88
+ case tag
89
+ when /^\w+/: pos << tag
90
+ when /^!\w+/: neg << tag.sub("!", '')
91
+ else
92
+ raise Puppet::Error, "Invalid tag '%s'" % tag
93
+ end
43
94
  end
44
- end
45
95
 
46
- if messages and ! messages.empty?
47
- reports[emails] = messages.collect { |m| m.to_report }.join("\n")
48
- else
49
- Puppet.info "No messages to report"
96
+ # Now split the emails
97
+ emails = emails.sub(/\s+$/,'').split(/\s*,\s*/)
98
+ taglists << [emails, pos, neg]
50
99
  end
100
+ return taglists
51
101
  end
52
102
 
53
- # Let's fork for the sending of the email, since you never know what might
54
- # happen.
55
- fork do
56
- if Puppet[:smtpserver] != "none"
57
- begin
58
- Net::SMTP.start(Puppet[:smtpserver]) do |smtp|
103
+ # Process the report. This just calls the other associated messages.
104
+ def process
105
+ unless FileTest.exists?(Puppet[:tagmap])
106
+ Puppet.notice "Cannot send tagmail report; no tagmap file %s" %
107
+ Puppet[:tagmap]
108
+ return
109
+ end
110
+
111
+ taglists = parse(File.read(Puppet[:tagmap]))
112
+
113
+ # Now find any appropriately tagged messages.
114
+ reports = match(taglists)
115
+
116
+ send(reports)
117
+ end
118
+
119
+ # Send the email reports.
120
+ def send(reports)
121
+ pid = fork do
122
+ if Puppet[:smtpserver] != "none"
123
+ begin
124
+ Net::SMTP.start(Puppet[:smtpserver]) do |smtp|
125
+ reports.each do |emails, messages|
126
+ Puppet.info "Sending report to %s" % emails.join(", ")
127
+ smtp.send_message(messages, Puppet[:reportfrom], *emails)
128
+ end
129
+ end
130
+ rescue => detail
131
+ if Puppet[:debug]
132
+ puts detail.backtrace
133
+ end
134
+ raise Puppet::Error,
135
+ "Could not send report emails through smtp: %s" % detail
136
+ end
137
+ elsif Puppet[:sendmail] != ""
138
+ begin
59
139
  reports.each do |emails, messages|
60
140
  Puppet.info "Sending report to %s" % emails.join(", ")
61
- smtp.send_message(messages, Puppet[:reportfrom], *emails)
141
+ # We need to open a separate process for every set of email addresses
142
+ IO.popen(Puppet[:sendmail] + " " + emails.join(" "), "w") do |p|
143
+ p.puts "From: #{Puppet[:reportfrom]}"
144
+ p.puts "Subject: Puppet Report for %s" % self.host
145
+ p.puts "To: " + emails.join(", ")
146
+
147
+ p.puts messages
148
+ end
62
149
  end
63
- end
64
- rescue => detail
65
- if Puppet[:debug]
66
- puts detail.backtrace
67
- end
68
- raise Puppet::Error,
69
- "Could not send report emails through smtp: %s" % detail
70
- end
71
- elsif Puppet[:sendmail] != ""
72
- begin
73
- reports.each do |emails, messages|
74
- Puppet.info "Sending report to %s" % emails.join(", ")
75
- # We need to open a separate process for every set of email addresses
76
- IO.popen(Puppet[:sendmail] + " " + emails.join(" "), "w") do |p|
77
- p.puts "From: #{Puppet[:reportfrom]}"
78
- p.puts "Subject: Puppet Report for %s" % report.host
79
-
80
- p.puts messages
150
+ rescue => detail
151
+ if Puppet[:debug]
152
+ puts detail.backtrace
81
153
  end
154
+ raise Puppet::Error,
155
+ "Could not send report emails via sendmail: %s" % detail
82
156
  end
83
- rescue => detail
84
- if Puppet[:debug]
85
- puts detail.backtrace
86
- end
87
- raise Puppet::Error,
88
- "Could not send report emails via sendmail: %s" % detail
157
+ else
158
+ raise Puppet::Error, "SMTP server is unset and could not find sendmail"
89
159
  end
90
- else
91
- raise Puppet::Error, "SMTP server is unset and could not find sendmail"
92
160
  end
161
+
162
+ # Don't bother waiting for the pid to return.
163
+ Process.detach(pid)
93
164
  end
94
165
  end
166
+
167
+ # $Id: tagmail.rb 2406 2007-04-23 06:16:10Z luke $
@@ -9,7 +9,17 @@ rescue LoadError
9
9
  end
10
10
 
11
11
  module Puppet::SSLCertificates
12
+ hostname = Facter["hostname"].value
13
+ domain = Facter["domain"].value
14
+ if domain and domain != ""
15
+ fqdn = [hostname, domain].join(".")
16
+ else
17
+ fqdn = hostname
18
+ end
19
+
12
20
  Puppet.setdefaults("certificates",
21
+ :certname => [fqdn, "The name to use when handling certificates. Defaults
22
+ to the fully qualified domain name."],
13
23
  :certdir => ["$ssldir/certs", "The certificate directory."],
14
24
  :publickeydir => ["$ssldir/public_keys", "The public key directory."],
15
25
  :privatekeydir => { :default => "$ssldir/private_keys",
@@ -24,19 +34,41 @@ module Puppet::SSLCertificates
24
34
  :mode => 0640,
25
35
  :desc => "Where puppetd stores the password for its private key.
26
36
  Generally unused."
37
+ },
38
+ :hostcsr => { :default => "$ssldir/csr_$certname.pem",
39
+ :mode => 0644,
40
+ :desc => "Where individual hosts store and look for their certificates."
41
+ },
42
+ :hostcert => { :default => "$certdir/$certname.pem",
43
+ :mode => 0644,
44
+ :desc => "Where individual hosts store and look for their certificates."
45
+ },
46
+ :hostprivkey => { :default => "$privatekeydir/$certname.pem",
47
+ :mode => 0600,
48
+ :desc => "Where individual hosts store and look for their private key."
49
+ },
50
+ :hostpubkey => { :default => "$publickeydir/$certname.pem",
51
+ :mode => 0644,
52
+ :desc => "Where individual hosts store and look for their public key."
53
+ },
54
+ :localcacert => { :default => "$certdir/ca.pem",
55
+ :mode => 0644,
56
+ :desc => "Where each client stores the CA certificate."
27
57
  }
28
58
  )
29
59
 
30
- #def self.mkcert(type, name, days, issuercert, issuername, serial, publickey)
60
+ #def self.mkcert(type, name, ttl, issuercert, issuername, serial, publickey)
31
61
  def self.mkcert(hash)
32
- [:type, :name, :days, :issuer, :serial, :publickey].each { |param|
62
+ [:type, :name, :ttl, :issuer, :serial, :publickey].each { |param|
33
63
  unless hash.include?(param)
34
64
  raise ArgumentError, "mkcert called without %s" % param
35
65
  end
36
66
  }
37
67
 
38
68
  cert = OpenSSL::X509::Certificate.new
39
- from = Time.now
69
+ # Make the certificate valid as of yesterday, because
70
+ # so many people's clocks are out of sync.
71
+ from = Time.now - (60*60*24)
40
72
 
41
73
  cert.subject = hash[:name]
42
74
  if hash[:issuer]
@@ -46,7 +78,7 @@ module Puppet::SSLCertificates
46
78
  cert.issuer = hash[:name]
47
79
  end
48
80
  cert.not_before = from
49
- cert.not_after = from + (hash[:days] * 24 * 60 * 60)
81
+ cert.not_after = from + hash[:ttl]
50
82
  cert.version = 2 # X509v3
51
83
 
52
84
  cert.public_key = hash[:publickey]
@@ -154,7 +186,8 @@ module Puppet::SSLCertificates
154
186
  return hashpath
155
187
  end
156
188
  require 'puppet/sslcertificates/certificate'
189
+ require 'puppet/sslcertificates/inventory'
157
190
  require 'puppet/sslcertificates/ca'
158
191
  end
159
192
 
160
- # $Id: sslcertificates.rb 1117 2006-04-19 15:35:04Z luke $
193
+ # $Id: sslcertificates.rb 2376 2007-03-30 23:45:48Z luke $
@@ -1,6 +1,8 @@
1
1
  class Puppet::SSLCertificates::CA
2
+ include Puppet::Util::Warnings
3
+
2
4
  Certificate = Puppet::SSLCertificates::Certificate
3
- attr_accessor :keyfile, :file, :config, :dir, :cert
5
+ attr_accessor :keyfile, :file, :config, :dir, :cert, :crl
4
6
 
5
7
  Puppet.setdefaults(:ca,
6
8
  :cadir => { :default => "$ssldir/ca",
@@ -26,6 +28,12 @@ class Puppet::SSLCertificates::CA
26
28
  :group => "$group",
27
29
  :desc => "The CA public key."
28
30
  },
31
+ :cacrl => { :default => "$cadir/ca_crl.pem",
32
+ :owner => "$user",
33
+ :group => "$group",
34
+ :mode => 0664,
35
+ :desc => "The certificate revocation list (CRL) for the CA. Set this to 'none' if you do not want to use a CRL."
36
+ },
29
37
  :caprivatedir => { :default => "$cadir/private",
30
38
  :owner => "$user",
31
39
  :group => "$group",
@@ -55,12 +63,19 @@ class Puppet::SSLCertificates::CA
55
63
  :desc => "Where the serial number for certificates is stored."
56
64
  },
57
65
  :autosign => { :default => "$confdir/autosign.conf",
58
- :mode => 0640,
66
+ :mode => 0644,
59
67
  :desc => "Whether to enable autosign. Valid values are true (which
60
68
  autosigns any key request, and is a very bad idea), false (which
61
69
  never autosigns any key request), and the path to a file, which
62
70
  uses that configuration file to determine which keys to sign."},
63
- :ca_days => [1825, "How long a certificate should be valid."],
71
+ :ca_days => ["", "How long a certificate should be valid.
72
+ This parameter is deprecated, use ca_ttl instead"],
73
+ :ca_ttl => ["5y", "The default TTL for new certificates; valid values
74
+ must be an integer, optionally followed by one of the units
75
+ 'y' (years of 365 days), 'd' (days), 'h' (hours), or
76
+ 's' (seconds). The unit defaults to seconds. If this parameter
77
+ is set, ca_days is ignored. Examples are '3600' (one hour)
78
+ and '1825d', which is the same as '5y' (5 years) "],
64
79
  :ca_md => ["md5", "The type of hash used in certificates."],
65
80
  :req_bits => [2048, "The bit length of the certificates."],
66
81
  :keylength => [1024, "The bit length of keys."]
@@ -72,6 +87,7 @@ class Puppet::SSLCertificates::CA
72
87
 
73
88
  # Remove all traces of a given host. This is kind of hackish, but, eh.
74
89
  def clean(host)
90
+ host = host.downcase
75
91
  [:csrdir, :signeddir, :publickeydir, :privatekeydir, :certdir].each do |name|
76
92
  dir = Puppet[name]
77
93
 
@@ -79,7 +95,7 @@ class Puppet::SSLCertificates::CA
79
95
 
80
96
  if FileTest.exists?(file)
81
97
  begin
82
- if Puppet.name == "puppetca"
98
+ if Puppet[:name] == "puppetca"
83
99
  puts "Removing %s" % file
84
100
  else
85
101
  Puppet.info "Removing %s" % file
@@ -95,13 +111,13 @@ class Puppet::SSLCertificates::CA
95
111
  end
96
112
 
97
113
  def host2csrfile(hostname)
98
- File.join(Puppet[:csrdir], [hostname, "pem"].join("."))
114
+ File.join(Puppet[:csrdir], [hostname.downcase, "pem"].join("."))
99
115
  end
100
116
 
101
117
  # this stores signed certs in a directory unrelated to
102
118
  # normal client certs
103
119
  def host2certfile(hostname)
104
- File.join(Puppet[:signeddir], [hostname, "pem"].join("."))
120
+ File.join(Puppet[:signeddir], [hostname.downcase, "pem"].join("."))
105
121
  end
106
122
 
107
123
  # Turn our hostname into a Name object
@@ -130,6 +146,7 @@ class Puppet::SSLCertificates::CA
130
146
  end
131
147
 
132
148
  self.getcert
149
+ init_crl
133
150
  unless FileTest.exists?(@config[:serial])
134
151
  Puppet.config.write(:serial) do |f|
135
152
  f << "%04X" % 1
@@ -190,7 +207,8 @@ class Puppet::SSLCertificates::CA
190
207
  return [OpenSSL::X509::Certificate.new(File.read(certfile)), @cert]
191
208
  end
192
209
 
193
- # List certificates waiting to be signed.
210
+ # List certificates waiting to be signed. This returns a list of hostnames, not actual
211
+ # files -- the names can be converted to full paths with host2csrfile.
194
212
  def list
195
213
  return Dir.entries(Puppet[:csrdir]).find_all { |file|
196
214
  file =~ /\.pem$/
@@ -212,18 +230,20 @@ class Puppet::SSLCertificates::CA
212
230
  :encrypt => @config[:capass],
213
231
  :key => @config[:cakey],
214
232
  :selfsign => true,
215
- :length => 1825,
233
+ :ttl => ttl,
216
234
  :type => :ca
217
235
  )
218
236
 
219
237
  # This creates the cakey file
220
- Puppet::Util.asuser(Puppet[:user], Puppet[:group]) do
238
+ Puppet::Util::SUIDManager.asuser(Puppet[:user], Puppet[:group]) do
221
239
  @cert = cert.mkselfsigned
222
240
  end
223
241
  Puppet.config.write(:cacert) do |f|
224
242
  f.puts @cert.to_pem
225
243
  end
226
- @key = cert.key
244
+ Puppet.config.write(:capub) do |f|
245
+ f.puts @cert.public_key
246
+ end
227
247
  return cert
228
248
  end
229
249
 
@@ -236,6 +256,23 @@ class Puppet::SSLCertificates::CA
236
256
  File.unlink(csrfile)
237
257
  end
238
258
 
259
+ # Revoke the certificate with serial number SERIAL issued by this
260
+ # CA. The REASON must be one of the OpenSSL::OCSP::REVOKED_* reasons
261
+ def revoke(serial, reason = OpenSSL::OCSP::REVOKED_STATUS_KEYCOMPROMISE)
262
+ if @config[:cacrl] == 'none'
263
+ raise Puppet::Error, "Revocation requires a CRL, but ca_crl is set to 'none'"
264
+ end
265
+ time = Time.now
266
+ revoked = OpenSSL::X509::Revoked.new
267
+ revoked.serial = serial
268
+ revoked.time = time
269
+ enum = OpenSSL::ASN1::Enumerated(reason)
270
+ ext = OpenSSL::X509::Extension.new("CRLReason", enum)
271
+ revoked.add_extension(ext)
272
+ @crl.add_revoked(revoked)
273
+ store_crl
274
+ end
275
+
239
276
  # Take the Puppet config and store it locally.
240
277
  def setconfig(hash)
241
278
  @config = {}
@@ -278,34 +315,12 @@ class Puppet::SSLCertificates::CA
278
315
  raise Puppet::Error, "CSR sign verification failed"
279
316
  end
280
317
 
281
- # i should probably check key length...
282
-
283
- # read the ca cert in
284
- cacert = OpenSSL::X509::Certificate.new(
285
- File.read(@config[:cacert])
286
- )
287
-
288
- cakey = nil
289
- if @config[:password]
290
- cakey = OpenSSL::PKey::RSA.new(
291
- File.read(@config[:cakey]), @config[:password]
292
- )
293
- else
294
- cakey = OpenSSL::PKey::RSA.new(
295
- File.read(@config[:cakey])
296
- )
297
- end
298
-
299
- unless cacert.check_private_key(cakey)
300
- raise Puppet::Error, "CA Certificate is invalid"
301
- end
302
-
303
318
  serial = File.read(@config[:serial]).chomp.hex
304
319
  newcert = Puppet::SSLCertificates.mkcert(
305
320
  :type => :server,
306
321
  :name => csr.subject,
307
- :days => @config[:ca_days],
308
- :issuer => cacert,
322
+ :ttl => ttl,
323
+ :issuer => @cert,
309
324
  :serial => serial,
310
325
  :publickey => csr.public_key
311
326
  )
@@ -315,11 +330,11 @@ class Puppet::SSLCertificates::CA
315
330
  f << "%04X" % (serial + 1)
316
331
  end
317
332
 
318
- newcert.sign(cakey, OpenSSL::Digest::SHA1.new)
333
+ sign_with_key(newcert)
319
334
 
320
335
  self.storeclientcert(newcert)
321
336
 
322
- return [newcert, cacert]
337
+ return [newcert, @cert]
323
338
  end
324
339
 
325
340
  # Store the client's CSR for later signing. This is called from
@@ -348,10 +363,100 @@ class Puppet::SSLCertificates::CA
348
363
  [certfile, host]
349
364
  end
350
365
 
366
+ Puppet::SSLCertificates::Inventory::add(cert)
351
367
  Puppet.config.writesub(:signeddir, certfile) do |f|
352
368
  f.print cert.to_pem
353
369
  end
354
370
  end
371
+
372
+ # TTL for new certificates in seconds. If config param :ca_ttl is set,
373
+ # use that, otherwise use :ca_days for backwards compatibility
374
+ def ttl
375
+ days = @config[:ca_days]
376
+ if days && days.size > 0
377
+ warnonce "Parameter ca_ttl is not set. Using depecated ca_days instead."
378
+ return @config[:ca_days] * 24 * 60 * 60
379
+ else
380
+ ttl = @config[:ca_ttl]
381
+ if ttl.is_a?(String)
382
+ unless ttl =~ /^(\d+)(y|d|h|s)$/
383
+ raise ArgumentError, "Invalid ca_ttl #{ttl}"
384
+ end
385
+ case $2
386
+ when 'y'
387
+ unit = 365 * 24 * 60 * 60
388
+ when 'd'
389
+ unit = 24 * 60 * 60
390
+ when 'h'
391
+ unit = 60 * 60
392
+ when 's'
393
+ unit = 1
394
+ else
395
+ raise ArgumentError, "Invalid unit for ca_ttl #{ttl}"
396
+ end
397
+ return $1.to_i * unit
398
+ else
399
+ return ttl
400
+ end
401
+ end
402
+ end
403
+
404
+ private
405
+ def init_crl
406
+ if FileTest.exists?(@config[:cacrl])
407
+ @crl = OpenSSL::X509::CRL.new(
408
+ File.read(@config[:cacrl])
409
+ )
410
+ elsif @config[:cacrl] == 'none'
411
+ @crl = nil
412
+ else
413
+ # Create new CRL
414
+ @crl = OpenSSL::X509::CRL.new
415
+ @crl.issuer = @cert.subject
416
+ @crl.version = 1
417
+ store_crl
418
+ @crl
419
+ end
420
+ end
421
+
422
+ def store_crl
423
+ # Increment the crlNumber
424
+ e = @crl.extensions.find { |e| e.oid == 'crlNumber' }
425
+ ext = @crl.extensions.reject { |e| e.oid == 'crlNumber' }
426
+ crlNum = OpenSSL::ASN1::Integer(e ? e.value.to_i + 1 : 0)
427
+ ext << OpenSSL::X509::Extension.new("crlNumber", crlNum)
428
+ @crl.extensions = ext
429
+
430
+ # Set last/next update
431
+ now = Time.now
432
+ @crl.last_update = now
433
+ # Keep CRL valid for 5 years
434
+ @crl.next_update = now + 5 * 365*24*60*60
435
+
436
+ sign_with_key(@crl)
437
+ Puppet.config.write(:cacrl) do |f|
438
+ f.puts @crl.to_pem
439
+ end
440
+ end
441
+
442
+ def sign_with_key(signable, digest = OpenSSL::Digest::SHA1.new)
443
+ cakey = nil
444
+ if @config[:password]
445
+ cakey = OpenSSL::PKey::RSA.new(
446
+ File.read(@config[:cakey]), @config[:password]
447
+ )
448
+ else
449
+ cakey = OpenSSL::PKey::RSA.new(
450
+ File.read(@config[:cakey])
451
+ )
452
+ end
453
+
454
+ unless @cert.check_private_key(cakey)
455
+ raise Puppet::Error, "CA Certificate is invalid"
456
+ end
457
+
458
+ signable.sign(cakey, digest)
459
+ end
355
460
  end
356
461
 
357
- # $Id: ca.rb 1145 2006-04-28 04:08:38Z luke $
462
+ # $Id: ca.rb 2259 2007-03-06 19:03:05Z luke $