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,187 @@
1
+ # the available clients
2
+
3
+ require 'puppet'
4
+ require 'puppet/daemon'
5
+ require 'puppet/network/xmlrpc/client'
6
+ require 'puppet/util/subclass_loader'
7
+ require 'puppet/util/methodhelper'
8
+ require 'puppet/sslcertificates/support'
9
+
10
+ require 'net/http'
11
+
12
+ # Some versions of ruby don't have this method defined, which basically causes
13
+ # us to never use ssl. Yay.
14
+ class Net::HTTP
15
+ def use_ssl?
16
+ if defined? @use_ssl
17
+ @use_ssl
18
+ else
19
+ false
20
+ end
21
+ end
22
+ end
23
+
24
+ # The base class for all of the clients. Many clients just directly
25
+ # call methods, but some of them need to do some extra work or
26
+ # provide a different interface.
27
+ class Puppet::Network::Client
28
+ Client = self
29
+ include Puppet::Daemon
30
+ include Puppet::Util
31
+ extend Puppet::Util::SubclassLoader
32
+ include Puppet::Util::MethodHelper
33
+
34
+ # This handles reading in the key and such-like.
35
+ include Puppet::SSLCertificates::Support
36
+
37
+ attr_accessor :schedule, :lastrun, :local, :stopping
38
+
39
+ attr_reader :driver
40
+
41
+ # Set up subclass loading
42
+ handle_subclasses :client, "puppet/network/client"
43
+
44
+ # Determine what clients look for when being passed an object for local
45
+ # client/server stuff. E.g., you could call Client::CA.new(:CA => ca).
46
+ def self.drivername
47
+ unless defined? @drivername
48
+ @drivername = self.name
49
+ end
50
+ @drivername
51
+ end
52
+
53
+ # Figure out the handler for our client.
54
+ def self.handler
55
+ unless defined? @handler
56
+ @handler = Puppet::Network::Handler.handler(self.name)
57
+ end
58
+ @handler
59
+ end
60
+
61
+ # The class that handles xmlrpc interaction for us.
62
+ def self.xmlrpc_client
63
+ unless defined? @xmlrpc_client
64
+ @xmlrpc_client = Puppet::Network::XMLRPCClient.handler_class(self.handler)
65
+ end
66
+ @xmlrpc_client
67
+ end
68
+
69
+ # Create our client.
70
+ def initialize(hash)
71
+ # to whom do we connect?
72
+ @server = nil
73
+
74
+ if hash.include?(:Cache)
75
+ @cache = hash[:Cache]
76
+ else
77
+ @cache = true
78
+ end
79
+
80
+ driverparam = self.class.drivername
81
+ if hash.include?(:Server)
82
+ args = {:Server => hash[:Server]}
83
+ @server = hash[:Server]
84
+ args[:Port] = hash[:Port] || Puppet[:masterport]
85
+
86
+ @driver = self.class.xmlrpc_client.new(args)
87
+
88
+ if self.read_cert
89
+ @driver.cert_setup(self)
90
+ end
91
+
92
+ @local = false
93
+ elsif hash.include?(driverparam)
94
+ @driver = hash[driverparam]
95
+ if @driver == true
96
+ @driver = self.class.handler.new
97
+ end
98
+ @local = true
99
+ else
100
+ raise Puppet::Network::ClientError, "%s must be passed a Server or %s" %
101
+ [self.class, driverparam]
102
+ end
103
+ end
104
+
105
+ # Are we a local client?
106
+ def local?
107
+ if defined? @local and @local
108
+ true
109
+ else
110
+ false
111
+ end
112
+ end
113
+
114
+ # Make sure we set the driver up when we read the cert in.
115
+ def read_cert
116
+ if super
117
+ @driver.cert_setup(self) if @driver.respond_to?(:cert_setup)
118
+ return true
119
+ else
120
+ return false
121
+ end
122
+ end
123
+
124
+ # A wrapper method to run and then store the last run time
125
+ def runnow
126
+ if self.stopping
127
+ Puppet.notice "In shutdown progress; skipping run"
128
+ return
129
+ end
130
+ begin
131
+ self.run
132
+ self.lastrun = Time.now.to_i
133
+ rescue => detail
134
+ if Puppet[:trace]
135
+ puts detail.backtrace
136
+ end
137
+ Puppet.err "Could not run %s: %s" % [self.class, detail]
138
+ end
139
+ end
140
+
141
+ def run
142
+ raise Puppet::DevError, "Client type %s did not override run" %
143
+ self.class
144
+ end
145
+
146
+ def scheduled?
147
+ if sched = self.schedule
148
+ return sched.match?(self.lastrun)
149
+ else
150
+ return true
151
+ end
152
+ end
153
+
154
+ def shutdown
155
+ if self.stopping
156
+ Puppet.notice "Already in shutdown"
157
+ else
158
+ self.stopping = true
159
+ if self.respond_to? :running? and self.running?
160
+ Puppet::Util::Storage.store
161
+ end
162
+ rmpidfile()
163
+ end
164
+ end
165
+
166
+ # Start listening for events. We're pretty much just listening for
167
+ # timer events here.
168
+ def start
169
+ # Create our timer. Puppet will handle observing it and such.
170
+ timer = Puppet.newtimer(
171
+ :interval => Puppet[:runinterval],
172
+ :tolerance => 1,
173
+ :start? => true
174
+ ) do
175
+ if self.scheduled?
176
+ self.runnow
177
+ end
178
+ end
179
+
180
+ # Run once before we start following the timer
181
+ self.runnow
182
+ end
183
+
184
+ require 'puppet/network/client/proxy'
185
+ end
186
+
187
+ # $Id: client.rb 2375 2007-03-30 23:17:40Z luke $
@@ -0,0 +1,56 @@
1
+ require 'puppet/network/client'
2
+
3
+ # Request a certificate from the remote system.
4
+ class Puppet::Network::Client::CA < Puppet::Network::Client
5
+ class InvalidCertificate < Puppet::Error; end
6
+
7
+ def initialize(options = {})
8
+ options = symbolize_options(options)
9
+ unless options.include?(:Server) or options.include?(:CA)
10
+ options[:Server] = Puppet[:ca_server]
11
+ options[:Port] = Puppet[:ca_port]
12
+ end
13
+ super(options)
14
+ end
15
+
16
+ # This client is really only able to request certificates for the
17
+ # current host. It uses the Puppet.config settings to figure everything out.
18
+ def request_cert
19
+ Puppet.config.use(:puppet, :certificates)
20
+
21
+ if cert = read_cert
22
+ return cert
23
+ end
24
+
25
+ begin
26
+ cert, cacert = @driver.getcert(csr.to_pem)
27
+ rescue => detail
28
+ if Puppet[:trace]
29
+ puts detail.backtrace
30
+ end
31
+ raise Puppet::Error.new("Certificate retrieval failed: %s" % detail)
32
+ end
33
+
34
+ if cert.nil? or cert == ""
35
+ return nil
36
+ end
37
+ Puppet.config.write(:hostcert) do |f| f.print cert end
38
+ Puppet.config.write(:localcacert) do |f| f.print cacert end
39
+
40
+ begin
41
+ @cert = OpenSSL::X509::Certificate.new(cert)
42
+ @cacert = OpenSSL::X509::Certificate.new(cacert)
43
+ rescue => detail
44
+ raise InvalidCertificate.new(
45
+ "Invalid certificate: %s" % detail
46
+ )
47
+ end
48
+
49
+ unless @cert.check_private_key(key)
50
+ raise InvalidCertificate, "Certificate does not match private key"
51
+ end
52
+ return @cert
53
+ end
54
+ end
55
+
56
+ # $Id: ca.rb 2259 2007-03-06 19:03:05Z luke $
@@ -0,0 +1,81 @@
1
+ # The client class for filebuckets.
2
+ class Puppet::Network::Client::Dipper < Puppet::Network::Client
3
+ @handler = Puppet::Network::Handler.handler(:filebucket)
4
+ @drivername = :Bucket
5
+
6
+ attr_accessor :name
7
+
8
+ # Create our bucket client
9
+ def initialize(hash = {})
10
+ if hash.include?(:Path)
11
+ bucket = self.class.handler.new(:Path => hash[:Path])
12
+ hash.delete(:Path)
13
+ hash[:Bucket] = bucket
14
+ end
15
+
16
+ super(hash)
17
+ end
18
+
19
+ # Back up a file to our bucket
20
+ def backup(file)
21
+ unless FileTest.exists?(file)
22
+ raise(BucketError, "File %s does not exist" % file)
23
+ end
24
+ contents = ::File.read(file)
25
+ unless local?
26
+ contents = Base64.encode64(contents)
27
+ end
28
+ return @driver.addfile(contents,file)
29
+ end
30
+
31
+ # Retrieve a file by sum.
32
+ def getfile(sum)
33
+ if newcontents = @driver.getfile(sum)
34
+ unless local?
35
+ newcontents = Base64.decode64(newcontents)
36
+ end
37
+ return newcontents
38
+ end
39
+ return nil
40
+ end
41
+
42
+ # Restore the file
43
+ def restore(file,sum)
44
+ restore = true
45
+ if FileTest.exists?(file)
46
+ cursum = Digest::MD5.hexdigest(::File.read(file))
47
+
48
+ # if the checksum has changed...
49
+ # this might be extra effort
50
+ if cursum == sum
51
+ restore = false
52
+ end
53
+ end
54
+
55
+ if restore
56
+ if newcontents = getfile(sum)
57
+ tmp = ""
58
+ newsum = Digest::MD5.hexdigest(newcontents)
59
+ changed = nil
60
+ if FileTest.exists?(file) and ! FileTest.writable?(file)
61
+ changed = ::File.stat(file).mode
62
+ ::File.chmod(changed | 0200, file)
63
+ end
64
+ ::File.open(file, ::File::WRONLY|::File::TRUNC|::File::CREAT) { |of|
65
+ of.print(newcontents)
66
+ }
67
+ if changed
68
+ ::File.chmod(changed, file)
69
+ end
70
+ else
71
+ Puppet.err "Could not find file with checksum %s" % sum
72
+ return nil
73
+ end
74
+ return newsum
75
+ else
76
+ return nil
77
+ end
78
+ end
79
+ end
80
+
81
+ # $Id: dipper.rb 2348 2007-03-24 21:16:20Z luke $
@@ -0,0 +1,7 @@
1
+ class Puppet::Network::Client::File < Puppet::Network::Client::ProxyClient
2
+ @handler = Puppet::Network::Handler.handler(:fileserver)
3
+ @drivername = :FileServer
4
+ self.mkmethods
5
+ end
6
+
7
+ # $Id: file.rb 2259 2007-03-06 19:03:05Z luke $
@@ -0,0 +1,6 @@
1
+ class Puppet::Network::Client::Logger < Puppet::Network::Client::ProxyClient
2
+ @handler = Puppet::Network::Handler.handler(:logger)
3
+ self.mkmethods
4
+ end
5
+
6
+ # $Id: logger.rb 2259 2007-03-06 19:03:05Z luke $
@@ -0,0 +1,644 @@
1
+ # The client for interacting with the puppetmaster config server.
2
+ require 'sync'
3
+ require 'timeout'
4
+
5
+ class Puppet::Network::Client::Master < Puppet::Network::Client
6
+ unless defined? @@sync
7
+ @@sync = Sync.new
8
+ end
9
+
10
+ attr_accessor :objects
11
+ attr_reader :compile_time
12
+
13
+ class << self
14
+ # Puppetd should only have one instance running, and we need a way
15
+ # to retrieve it.
16
+ attr_accessor :instance
17
+ include Puppet::Util
18
+ end
19
+
20
+ def self.facts
21
+ # Retrieve the facts from the central server.
22
+ if Puppet[:factsync]
23
+ self.getfacts()
24
+ end
25
+
26
+ down = Puppet[:downcasefacts]
27
+
28
+ facts = {}
29
+ Facter.each { |name,fact|
30
+ if down
31
+ facts[name] = fact.to_s.downcase
32
+ else
33
+ facts[name] = fact.to_s
34
+ end
35
+ }
36
+
37
+ # Add our client version to the list of facts, so people can use it
38
+ # in their manifests
39
+ facts["clientversion"] = Puppet.version.to_s
40
+
41
+ facts
42
+ end
43
+
44
+ # This method actually applies the configuration.
45
+ def apply(tags = nil, ignoreschedules = false)
46
+ unless defined? @objects
47
+ raise Puppet::Error, "Cannot apply; objects not defined"
48
+ end
49
+
50
+ transaction = @objects.evaluate
51
+
52
+ if tags
53
+ transaction.tags = tags
54
+ end
55
+
56
+ if ignoreschedules
57
+ transaction.ignoreschedules = true
58
+ end
59
+
60
+ transaction.addtimes :config_retrieval => @configtime
61
+
62
+ begin
63
+ transaction.evaluate
64
+ rescue Puppet::Error => detail
65
+ Puppet.err "Could not apply complete configuration: %s" %
66
+ detail
67
+ rescue => detail
68
+ Puppet.err "Got an uncaught exception of type %s: %s" %
69
+ [detail.class, detail]
70
+ if Puppet[:trace]
71
+ puts detail.backtrace
72
+ end
73
+ ensure
74
+ Puppet::Util::Storage.store
75
+ end
76
+
77
+ if Puppet[:report]
78
+ report(transaction)
79
+ end
80
+
81
+ return transaction
82
+ ensure
83
+ if defined? transaction and transaction
84
+ transaction.cleanup
85
+ end
86
+ end
87
+
88
+ # Cache the config
89
+ def cache(text)
90
+ Puppet.info "Caching configuration at %s" % self.cachefile
91
+ confdir = ::File.dirname(Puppet[:localconfig])
92
+ ::File.open(self.cachefile + ".tmp", "w", 0660) { |f|
93
+ f.print text
94
+ }
95
+ ::File.rename(self.cachefile + ".tmp", self.cachefile)
96
+ end
97
+
98
+ def cachefile
99
+ unless defined? @cachefile
100
+ @cachefile = Puppet[:localconfig] + ".yaml"
101
+ end
102
+ @cachefile
103
+ end
104
+
105
+ def clear
106
+ @objects.remove(true)
107
+ Puppet::Type.allclear
108
+ mkdefault_objects
109
+ @objects = nil
110
+ end
111
+
112
+ # Initialize and load storage
113
+ def dostorage
114
+ begin
115
+ Puppet::Util::Storage.load
116
+ @compile_time ||= Puppet::Util::Storage.cache(:configuration)[:compile_time]
117
+ rescue => detail
118
+ if Puppet[:trace]
119
+ puts detail.backtrace
120
+ end
121
+ Puppet.err "Corrupt state file %s: %s" % [Puppet[:statefile], detail]
122
+ begin
123
+ ::File.unlink(Puppet[:statefile])
124
+ retry
125
+ rescue => detail
126
+ raise Puppet::Error.new("Cannot remove %s: %s" %
127
+ [Puppet[:statefile], detail])
128
+ end
129
+ end
130
+ end
131
+
132
+ # Check whether our configuration is up to date
133
+ def fresh?(facts)
134
+ if Puppet[:ignorecache]
135
+ Puppet.notice "Ignoring cache"
136
+ return false
137
+ end
138
+ unless self.compile_time
139
+ Puppet.debug "No cached compile time"
140
+ return false
141
+ end
142
+ if facts_changed?(facts)
143
+ Puppet.info "Facts have changed; recompiling" unless local?
144
+ return false
145
+ end
146
+
147
+ # We're willing to give a 2 second drift
148
+ newcompile = @driver.freshness
149
+ if newcompile - @compile_time.to_i < 1
150
+ return true
151
+ else
152
+ Puppet.debug "Server compile time is %s vs %s" % [newcompile, @compile_time]
153
+ return false
154
+ end
155
+ end
156
+
157
+ # Let the daemon run again, freely in the filesystem. Frolick, little
158
+ # daemon!
159
+ def enable
160
+ lockfile.unlock(:anonymous => true)
161
+ end
162
+
163
+ # Stop the daemon from making any configuration runs.
164
+ def disable
165
+ lockfile.lock(:anonymous => true)
166
+ end
167
+
168
+ # Retrieve the config from a remote server. If this fails, then
169
+ # use the cached copy.
170
+ def getconfig
171
+ dostorage()
172
+
173
+ facts = self.class.facts
174
+
175
+ if self.objects or FileTest.exists?(self.cachefile)
176
+ if self.fresh?(facts)
177
+ Puppet.info "Config is up to date"
178
+ if self.objects
179
+ return
180
+ end
181
+ if oldtext = self.retrievecache
182
+ begin
183
+ @objects = YAML.load(oldtext).to_type
184
+ rescue => detail
185
+ Puppet.warning "Could not load cached configuration: %s" % detail
186
+ end
187
+ return
188
+ end
189
+ end
190
+ end
191
+ Puppet.debug("getting config")
192
+
193
+ # Retrieve the plugins.
194
+ if Puppet[:pluginsync]
195
+ getplugins()
196
+ end
197
+
198
+ unless facts.length > 0
199
+ raise Puppet::Network::ClientError.new(
200
+ "Could not retrieve any facts"
201
+ )
202
+ end
203
+
204
+ unless objects = get_actual_config(facts)
205
+ @objects = nil
206
+ return
207
+ end
208
+
209
+ unless objects.is_a?(Puppet::TransBucket)
210
+ raise NetworkClientError,
211
+ "Invalid returned objects of type %s" % objects.class
212
+ end
213
+
214
+ self.setclasses(objects.classes)
215
+
216
+ # Clear all existing objects, so we can recreate our stack.
217
+ if self.objects
218
+ clear()
219
+ end
220
+
221
+ # Now convert the objects to real Puppet objects
222
+ @objects = objects.to_type
223
+
224
+ if @objects.nil?
225
+ raise Puppet::Error, "Configuration could not be processed"
226
+ end
227
+
228
+ # and perform any necessary final actions before we evaluate.
229
+ @objects.finalize
230
+
231
+ return @objects
232
+ end
233
+
234
+ # A simple proxy method, so it's easy to test.
235
+ def getplugins
236
+ self.class.getplugins
237
+ end
238
+
239
+ # Just so we can specify that we are "the" instance.
240
+ def initialize(*args)
241
+ Puppet.config.use(:puppet, :sslcertificates, :puppetd)
242
+ super
243
+
244
+ # This might be nil
245
+ @configtime = 0
246
+
247
+ self.class.instance = self
248
+ @running = false
249
+
250
+ mkdefault_objects
251
+ end
252
+
253
+ # Make the default objects necessary for function.
254
+ def mkdefault_objects
255
+ # First create the default scheduling objects
256
+ Puppet::Type.type(:schedule).mkdefaultschedules
257
+
258
+ # And filebuckets
259
+ Puppet::Type.type(:filebucket).mkdefaultbucket
260
+ end
261
+
262
+ # Mark that we should restart. The Puppet module checks whether we're running,
263
+ # so this only gets called if we're in the middle of a run.
264
+ def restart
265
+ # If we're currently running, then just mark for later
266
+ Puppet.notice "Received signal to restart; waiting until run is complete"
267
+ @restart = true
268
+ end
269
+
270
+ # Should we restart?
271
+ def restart?
272
+ if defined? @restart
273
+ @restart
274
+ else
275
+ false
276
+ end
277
+ end
278
+
279
+ # Retrieve the cached config
280
+ def retrievecache
281
+ if FileTest.exists?(self.cachefile)
282
+ return ::File.read(self.cachefile)
283
+ else
284
+ return nil
285
+ end
286
+ end
287
+
288
+ # The code that actually runs the configuration.
289
+ def run(tags = nil, ignoreschedules = false)
290
+ got_lock = false
291
+ Puppet::Util.sync(:puppetrun).synchronize(Sync::EX) do
292
+ if !lockfile.lock
293
+ Puppet.notice "Lock file %s exists; skipping configuration run" %
294
+ lockfile.lockfile
295
+ else
296
+ got_lock = true
297
+ @configtime = thinmark do
298
+ self.getconfig
299
+ end
300
+
301
+ if defined? @objects and @objects
302
+ unless @local
303
+ Puppet.notice "Starting configuration run"
304
+ end
305
+ benchmark(:notice, "Finished configuration run") do
306
+ self.apply(tags, ignoreschedules)
307
+ end
308
+ end
309
+ end
310
+
311
+ lockfile.unlock
312
+
313
+ # Did we get HUPped during the run? If so, then restart now that we're
314
+ # done with the run.
315
+ if self.restart?
316
+ Process.kill(:HUP, $$)
317
+ end
318
+ end
319
+ ensure
320
+ # Just make sure we remove the lock file if we set it.
321
+ lockfile.unlock if got_lock and lockfile.locked?
322
+ end
323
+
324
+ def running?
325
+ lockfile.locked?
326
+ end
327
+
328
+ # Store the classes in the classfile, but only if we're not local.
329
+ def setclasses(ary)
330
+ if @local
331
+ return
332
+ end
333
+ unless ary and ary.length > 0
334
+ Puppet.info "No classes to store"
335
+ return
336
+ end
337
+ begin
338
+ ::File.open(Puppet[:classfile], "w") { |f|
339
+ f.puts ary.join("\n")
340
+ }
341
+ rescue => detail
342
+ Puppet.err "Could not create class file %s: %s" %
343
+ [Puppet[:classfile], detail]
344
+ end
345
+ end
346
+
347
+ private
348
+
349
+ # Download files from the remote server, returning a list of all
350
+ # changed files.
351
+ def self.download(args)
352
+ objects = Puppet::Type.type(:component).create(
353
+ :name => "#{args[:name]}_collector"
354
+ )
355
+ hash = {
356
+ :path => args[:dest],
357
+ :recurse => true,
358
+ :source => args[:source],
359
+ :tag => "#{args[:name]}s",
360
+ :owner => Process.uid,
361
+ :group => Process.gid,
362
+ :purge => true,
363
+ :backup => false
364
+ }
365
+
366
+ if args[:ignore]
367
+ hash[:ignore] = args[:ignore].split(/\s+/)
368
+ end
369
+ objects.push Puppet::Type.type(:file).create(hash)
370
+
371
+ Puppet.info "Retrieving #{args[:name]}s"
372
+
373
+ noop = Puppet[:noop]
374
+ Puppet[:noop] = false
375
+
376
+ begin
377
+ trans = objects.evaluate
378
+ trans.ignoretags = true
379
+ Timeout::timeout(self.timeout) do
380
+ trans.evaluate
381
+ end
382
+ rescue Puppet::Error, Timeout::Error => detail
383
+ if Puppet[:debug]
384
+ puts detail.backtrace
385
+ end
386
+ Puppet.err "Could not retrieve #{args[:name]}s: %s" % detail
387
+ end
388
+
389
+ # Now source all of the changed objects, but only source those
390
+ # that are top-level.
391
+ files = []
392
+ trans.changed?.find_all do |object|
393
+ yield object if block_given?
394
+ files << object[:path]
395
+ end
396
+ trans.cleanup
397
+
398
+ # Now clean up after ourselves
399
+ objects.remove
400
+ files
401
+ ensure
402
+ # I can't imagine why this is necessary, but apparently at last one person has had problems with noop
403
+ # being nil here.
404
+ if noop.nil?
405
+ Puppet[:noop] = false
406
+ else
407
+ Puppet[:noop] = noop
408
+ end
409
+ end
410
+
411
+ # Retrieve facts from the central server.
412
+ def self.getfacts
413
+ # Clear all existing definitions.
414
+ Facter.clear
415
+
416
+ # Download the new facts
417
+ path = Puppet[:factpath].split(":")
418
+ files = []
419
+ download(:dest => Puppet[:factdest], :source => Puppet[:factsource],
420
+ :ignore => Puppet[:factsignore], :name => "fact") do |object|
421
+
422
+ next unless path.include?(::File.dirname(object[:path]))
423
+
424
+ files << object[:path]
425
+
426
+ end
427
+ ensure
428
+ # Reload everything.
429
+ if Facter.respond_to? :loadfacts
430
+ Facter.loadfacts
431
+ elsif Facter.respond_to? :load
432
+ Facter.load
433
+ else
434
+ raise Puppet::Error,
435
+ "You must upgrade your version of Facter to use centralized facts"
436
+ end
437
+
438
+ # This loads all existing facts and any new ones. We have to remove and
439
+ # reload because there's no way to unload specific facts.
440
+ loadfacts()
441
+ end
442
+
443
+ # Retrieve the plugins from the central server. We only have to load the
444
+ # changed plugins, because Puppet::Type loads plugins on demand.
445
+ def self.getplugins
446
+ path = Puppet[:pluginpath].split(":")
447
+ download(:dest => Puppet[:plugindest], :source => Puppet[:pluginsource],
448
+ :ignore => Puppet[:pluginsignore], :name => "plugin") do |object|
449
+
450
+ next unless path.include?(::File.dirname(object[:path]))
451
+
452
+ begin
453
+ Puppet.info "Reloading plugin %s" %
454
+ ::File.basename(::File.basename(object[:path])).sub(".rb",'')
455
+ load object[:path]
456
+ rescue => detail
457
+ Puppet.warning "Could not reload plugin %s: %s" %
458
+ [object[:path], detail]
459
+ end
460
+ end
461
+ end
462
+
463
+ def self.loaddir(dir, type)
464
+ return unless FileTest.directory?(dir)
465
+
466
+ Dir.entries(dir).find_all { |e| e =~ /\.rb$/ }.each do |file|
467
+ fqfile = ::File.join(dir, file)
468
+ begin
469
+ Puppet.info "Loading #{type} %s" % ::File.basename(file.sub(".rb",''))
470
+ Timeout::timeout(self.timeout) do
471
+ load fqfile
472
+ end
473
+ rescue => detail
474
+ Puppet.warning "Could not load #{type} %s: %s" % [fqfile, detail]
475
+ end
476
+ end
477
+ end
478
+
479
+ def self.loadfacts
480
+ Puppet[:factpath].split(":").each do |dir|
481
+ loaddir(dir, "fact")
482
+ end
483
+ end
484
+
485
+ def self.timeout
486
+ @timeout = Puppet[:configtimeout]
487
+ case @timeout
488
+ when String:
489
+ if @timeout =~ /^\d+$/
490
+ @timeout = Integer(@timeout)
491
+ else
492
+ raise ArgumentError, "Configuration timeout must be an integer"
493
+ end
494
+ when Integer: # nothing
495
+ else
496
+ raise ArgumentError, "Configuration timeout must be an integer"
497
+ end
498
+ end
499
+
500
+ # Send off the transaction report.
501
+ def report(transaction)
502
+ begin
503
+ report = transaction.generate_report()
504
+ if Puppet[:rrdgraph] == true
505
+ report.graph()
506
+ end
507
+ reportclient().report(report)
508
+ rescue => detail
509
+ Puppet.err "Reporting failed: %s" % detail
510
+ end
511
+ end
512
+
513
+ def reportclient
514
+ unless defined? @reportclient
515
+ @reportclient = Puppet::Network::Client.report.new(
516
+ :Server => Puppet[:reportserver]
517
+ )
518
+ end
519
+
520
+ @reportclient
521
+ end
522
+
523
+ loadfacts()
524
+
525
+ private
526
+
527
+ # Have the facts changed since we last compiled?
528
+ def facts_changed?(facts)
529
+ oldfacts = Puppet::Util::Storage.cache(:configuration)[:facts]
530
+ newfacts = facts
531
+ if oldfacts == newfacts
532
+ return false
533
+ else
534
+ # unless oldfacts
535
+ # puts "no old facts"
536
+ # return true
537
+ # end
538
+ # newfacts.keys.each do |k|
539
+ # unless newfacts[k] == oldfacts[k]
540
+ # puts "%s: %s vs %s" % [k, newfacts[k], oldfacts[k]]
541
+ # end
542
+ # end
543
+ return true
544
+ end
545
+ end
546
+
547
+ # Actually retrieve the configuration, either from the server or from a
548
+ # local master.
549
+ def get_actual_config(facts)
550
+ if @local
551
+ return get_local_config(facts)
552
+ else
553
+ begin
554
+ Timeout::timeout(self.class.timeout) do
555
+ return get_remote_config(facts)
556
+ end
557
+ rescue Timeout::Error
558
+ Puppet.err "Configuration retrieval timed out"
559
+ return nil
560
+ end
561
+ end
562
+ end
563
+
564
+ # Retrieve a configuration from a local master.
565
+ def get_local_config(facts)
566
+ # If we're local, we don't have to do any of the conversion
567
+ # stuff.
568
+ objects = @driver.getconfig(facts, "yaml")
569
+ @compile_time = Time.now
570
+
571
+ if objects == ""
572
+ raise Puppet::Error, "Could not retrieve configuration"
573
+ end
574
+
575
+ return objects
576
+ end
577
+
578
+ # Retrieve a config from a remote master.
579
+ def get_remote_config(facts)
580
+ textobjects = ""
581
+
582
+ textfacts = CGI.escape(YAML.dump(facts))
583
+
584
+ benchmark(:debug, "Retrieved configuration") do
585
+ # error handling for this is done in the network client
586
+ begin
587
+ textobjects = @driver.getconfig(textfacts, "yaml")
588
+ begin
589
+ textobjects = CGI.unescape(textobjects)
590
+ rescue => detail
591
+ raise Puppet::Error, "Could not CGI.unescape configuration"
592
+ end
593
+
594
+ rescue => detail
595
+ Puppet.err "Could not retrieve configuration: %s" % detail
596
+
597
+ unless Puppet[:usecacheonfailure]
598
+ @objects = nil
599
+ Puppet.warning "Not using cache on failed configuration"
600
+ return
601
+ end
602
+ end
603
+ end
604
+
605
+ fromcache = false
606
+ if textobjects == ""
607
+ unless textobjects = self.retrievecache
608
+ raise Puppet::Error.new(
609
+ "Cannot connect to server and there is no cached configuration"
610
+ )
611
+ end
612
+ Puppet.warning "Could not get config; using cached copy"
613
+ fromcache = true
614
+ else
615
+ @compile_time = Time.now
616
+ Puppet::Util::Storage.cache(:configuration)[:facts] = facts
617
+ Puppet::Util::Storage.cache(:configuration)[:compile_time] = @compile_time
618
+ end
619
+
620
+ begin
621
+ objects = YAML.load(textobjects)
622
+ rescue => detail
623
+ raise Puppet::Error,
624
+ "Could not understand configuration: %s" %
625
+ detail.to_s
626
+ end
627
+
628
+ if @cache and ! fromcache
629
+ self.cache(textobjects)
630
+ end
631
+
632
+ return objects
633
+ end
634
+
635
+ def lockfile
636
+ unless defined?(@lockfile)
637
+ @lockfile = Puppet::Util::Pidlock.new(Puppet[:puppetdlockfile])
638
+ end
639
+
640
+ @lockfile
641
+ end
642
+ end
643
+
644
+ # $Id: master.rb 2435 2007-04-30 16:19:37Z luke $