puppet 0.18.4 → 0.22.4

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (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,104 @@
1
+ # Some simple methods for helping manage automatic documentation generation.
2
+ module Puppet::Util::Docs
3
+ # Specify the actual doc string.
4
+ def desc(str)
5
+ @doc = str
6
+ end
7
+
8
+ # Add a new autodoc block. We have to define these as class methods,
9
+ # rather than just sticking them in a hash, because otherwise they're
10
+ # too difficult to do inheritance with.
11
+ def dochook(name, &block)
12
+ method = "dochook_" + name.to_s
13
+
14
+ meta_def method, &block
15
+ end
16
+
17
+ # Generate the full doc string.
18
+ def doc
19
+ extra = methods.find_all { |m| m.to_s =~ /^dochook_.+/ }.collect { |m|
20
+ self.send(m)
21
+ }.join(" ")
22
+
23
+ if defined? @doc and @doc
24
+ @doc + extra
25
+ else
26
+ extra
27
+ end
28
+ end
29
+
30
+ # Build a table
31
+ def doctable(headers, data)
32
+ str = "\n\n"
33
+
34
+ lengths = []
35
+ # Figure out the longest field for all columns
36
+ data.each do |name, values|
37
+ [name, values].flatten.each_with_index do |value, i|
38
+ lengths[i] ||= 0
39
+ lengths[i] = value.to_s.length if value.to_s.length > lengths[i]
40
+ end
41
+ end
42
+
43
+ # The headers could also be longest
44
+ headers.each_with_index do |value, i|
45
+ lengths[i] = value.to_s.length if value.to_s.length > lengths[i]
46
+ end
47
+
48
+ # Add the top header row
49
+ str += lengths.collect { |num| "=" * num }.join(" ") + "\n"
50
+
51
+ # And the header names
52
+ str += headers.zip(lengths).collect { |value, num| pad(value, num) }.join(" ") + "\n"
53
+
54
+ # And the second header row
55
+ str += lengths.collect { |num| "=" * num }.join(" ") + "\n"
56
+
57
+ # Now each data row
58
+ data.sort { |a, b| a[0].to_s <=> b[0].to_s }.each do |name, rows|
59
+ str += [name, rows].flatten.zip(lengths).collect do |value, length|
60
+ pad(value, length)
61
+ end.join(" ") + "\n"
62
+ end
63
+
64
+ # And the bottom line row
65
+ str += lengths.collect { |num| "=" * num }.join(" ") + "\n"
66
+
67
+ str + "\n"
68
+ end
69
+
70
+ # Pad a field with spaces
71
+ def pad(value, length)
72
+ value.to_s + (" " * (length - value.to_s.length))
73
+ end
74
+
75
+ # Handle the inline indentation in the docs.
76
+ def scrub(text)
77
+ # Stupid markdown
78
+ #text = text.gsub("<%=", "&lt;%=")
79
+ # For text with no carriage returns, there's nothing to do.
80
+ if text !~ /\n/
81
+ return text
82
+ end
83
+ indent = nil
84
+
85
+ # If we can match an indentation, then just remove that same level of
86
+ # indent from every line.
87
+ if text =~ /^(\s+)/
88
+ indent = $1
89
+ begin
90
+ return text.gsub(/^#{indent}/,'')
91
+ rescue => detail
92
+ puts detail.backtrace
93
+ puts detail
94
+ end
95
+ else
96
+ return text
97
+ end
98
+
99
+ end
100
+
101
+ module_function :scrub
102
+ end
103
+
104
+ # $Id: docs.rb 2408 2007-04-24 02:41:16Z luke $
@@ -0,0 +1,55 @@
1
+ # Some helper methods for throwing errors.
2
+ module Puppet::Util::Errors
3
+ # Throw a dev error.
4
+ def devfail(msg)
5
+ self.fail(Puppet::DevError, msg)
6
+ end
7
+
8
+ # Add line and file info if available and appropriate.
9
+ def adderrorcontext(error, other = nil)
10
+ error.line ||= self.line if self.respond_to?(:line) and self.line
11
+ error.file ||= self.file if self.respond_to?(:file) and self.file
12
+
13
+ if other and other.respond_to?(:backtrace)
14
+ error.set_backtrace other.backtrace
15
+ end
16
+
17
+ return error
18
+ end
19
+
20
+ # Wrap a call in such a way that we always throw the right exception and keep
21
+ # as much context as possible.
22
+ def exceptwrap(options = {})
23
+ options[:type] ||= Puppet::DevError
24
+ begin
25
+ return yield
26
+ rescue Puppet::Error => detail
27
+ raise adderrorcontext(detail)
28
+ rescue => detail
29
+ message = options[:message] || "%s failed with error %s: %s" %
30
+ [self.class, detail.class, detail.to_s]
31
+
32
+ error = options[:type].new(message)
33
+ # We can't use self.fail here because it always expects strings,
34
+ # not exceptions.
35
+ raise adderrorcontext(error, detail)
36
+ end
37
+
38
+ return retval
39
+ end
40
+
41
+ # Throw an error, defaulting to a Puppet::Error.
42
+ def fail(*args)
43
+ if args[0].is_a?(Class)
44
+ type = args.shift
45
+ else
46
+ type = Puppet::Error
47
+ end
48
+
49
+ error = adderrorcontext(type.new(args.join(" ")))
50
+
51
+ raise error
52
+ end
53
+ end
54
+
55
+ # $Id: errors.rb 1739 2006-10-06 03:13:15Z luke $
@@ -0,0 +1,22 @@
1
+ module Puppet::Util::Execution
2
+ module_function
3
+
4
+ # Run some code with a specific environment. Resets the environment back to
5
+ # what it was at the end of the code.
6
+ def withenv(hash)
7
+ oldvals = {}
8
+ hash.each do |name, val|
9
+ name = name.to_s
10
+ oldvals[name] = ENV[name]
11
+ ENV[name] = val
12
+ end
13
+
14
+ yield
15
+ ensure
16
+ oldvals.each do |name, val|
17
+ ENV[name] = val
18
+ end
19
+ end
20
+ end
21
+
22
+ # $Id: execution.rb 1568 2006-09-05 23:20:45Z luke $
@@ -0,0 +1,76 @@
1
+ # Created by Luke Kanies on 2006-11-07.
2
+ # Copyright (c) 2006. All rights reserved.
3
+
4
+ class Puppet::Util::Feature
5
+ attr_reader :path
6
+
7
+ # Create a new feature test. You have to pass the feature name,
8
+ # and it must be unique. You can either provide a block that
9
+ # will get executed immediately to determine if the feature
10
+ # is present, or you can pass an option to determine it.
11
+ # Currently, the only supported option is 'libs' (must be
12
+ # passed as a symbol), which will make sure that each lib loads
13
+ # successfully.
14
+ def add(name, options = {})
15
+ method = name.to_s + "?"
16
+ if self.class.respond_to?(method)
17
+ raise ArgumentError, "Feature %s is already defined" % name
18
+ end
19
+
20
+ result = true
21
+ if block_given?
22
+ begin
23
+ result = yield
24
+ rescue => detail
25
+ warn "Failed to load feature test for %s: %s" % [name, detail]
26
+ result = false
27
+ end
28
+ end
29
+
30
+ if ary = options[:libs]
31
+ ary = [ary] unless ary.is_a?(Array)
32
+
33
+ ary.each do |lib|
34
+ unless lib.is_a?(String)
35
+ raise ArgumentError, "Libraries must be passed as strings not %s" % lib.class
36
+ end
37
+
38
+ begin
39
+ require lib
40
+ rescue Exception
41
+ Puppet.debug "Failed to load library '%s' for feature '%s'" % [lib, name]
42
+ result = false
43
+ end
44
+ end
45
+ end
46
+
47
+ meta_def(method) do
48
+ result
49
+ end
50
+ end
51
+
52
+ # Create a new feature collection.
53
+ def initialize(path)
54
+ @path = path
55
+ @loader = Puppet::Util::Autoload.new(self, @path)
56
+ end
57
+
58
+ def load
59
+ @loader.loadall
60
+ end
61
+
62
+ def method_missing(method, *args)
63
+ return super unless method.to_s =~ /\?$/
64
+
65
+ feature = method.to_s.sub(/\?$/, '')
66
+ @loader.load(feature)
67
+
68
+ if respond_to?(method)
69
+ return self.send(method)
70
+ else
71
+ return false
72
+ end
73
+ end
74
+ end
75
+
76
+ # $Id: feature.rb 2178 2007-02-07 23:56:59Z luke $
@@ -0,0 +1,380 @@
1
+ # A mini-language for parsing files. This is only used file the ParsedFile
2
+ # provider, but it makes more sense to split it out so it's easy to maintain
3
+ # in one place.
4
+ #
5
+ # You can use this module to create simple parser/generator classes. For instance,
6
+ # the following parser should go most of the way to parsing /etc/passwd:
7
+ #
8
+ # class Parser
9
+ # include Puppet::Util::FileParsing
10
+ # record_line :user, :fields => %w{name password uid gid gecos home shell},
11
+ # :separator => ":"
12
+ # end
13
+ #
14
+ # You would use it like this:
15
+ #
16
+ # parser = Parser.new
17
+ # lines = parser.parse(File.read("/etc/passwd"))
18
+ #
19
+ # lines.each do |type, hash| # type will always be :user, since we only have one
20
+ # p hash
21
+ # end
22
+ #
23
+ # Each line in this case would be a hash, with each field set appropriately.
24
+ # You could then call 'parser.to_line(hash)' on any of those hashes to generate
25
+ # the text line again.
26
+
27
+ require 'puppet/util/methodhelper'
28
+
29
+ module Puppet::Util::FileParsing
30
+ include Puppet::Util
31
+ attr_writer :line_separator, :trailing_separator
32
+
33
+ class FileRecord
34
+ include Puppet::Util
35
+ include Puppet::Util::MethodHelper
36
+ attr_accessor :absent, :joiner, :rts, :separator, :rollup, :name, :match, :block_eval
37
+
38
+ attr_reader :fields, :optional, :type
39
+
40
+ INVALID_FIELDS = [:record_type, :target, :on_disk]
41
+
42
+ # Customize this so we can do a bit of validation.
43
+ def fields=(fields)
44
+ @fields = fields.collect do |field|
45
+ r = symbolize(field)
46
+ if INVALID_FIELDS.include?(r)
47
+ raise ArgumentError.new("Cannot have fields named %s" % r)
48
+ end
49
+ r
50
+ end
51
+ end
52
+
53
+ def initialize(type, options = {}, &block)
54
+ @type = symbolize(type)
55
+ unless [:record, :text].include?(@type)
56
+ raise ArgumentError, "Invalid record type %s" % @type
57
+ end
58
+
59
+ set_options(options)
60
+
61
+ if self.type == :record
62
+ # Now set defaults.
63
+ self.absent ||= ""
64
+ self.separator ||= /\s+/
65
+ self.joiner ||= " "
66
+ self.optional ||= []
67
+ unless defined? @rollup
68
+ @rollup = true
69
+ end
70
+ end
71
+
72
+ if block_given?
73
+ @block_eval ||= :process
74
+
75
+ # Allow the developer to specify that a block should be instance-eval'ed.
76
+ if @block_eval == :instance
77
+ instance_eval(&block)
78
+ else
79
+ meta_def(@block_eval, &block)
80
+ end
81
+ end
82
+ end
83
+
84
+ # Convert a record into a line by joining the fields together appropriately.
85
+ # This is pulled into a separate method so it can be called by the hooks.
86
+ def join(details)
87
+ joinchar = self.joiner
88
+
89
+ fields.collect { |field|
90
+ # If the field is marked absent, use the appropriate replacement
91
+ if details[field] == :absent or details[field] == [:absent] or details[field].nil?
92
+ if self.optional.include?(field)
93
+ self.absent
94
+ else
95
+ raise ArgumentError, "Field '%s' is required" % field
96
+ end
97
+ else
98
+ details[field].to_s
99
+ end
100
+ }.reject { |c| c.nil?}.join(joinchar)
101
+ end
102
+
103
+ # Customize this so we can do a bit of validation.
104
+ def optional=(optional)
105
+ @optional = optional.collect do |field|
106
+ symbolize(field)
107
+ end
108
+ end
109
+
110
+ # Create a hook that modifies the hash resulting from parsing.
111
+ def post_parse=(block)
112
+ meta_def(:post_parse, &block)
113
+ end
114
+
115
+ # Create a hook that modifies the hash just prior to generation.
116
+ def pre_gen=(block)
117
+ meta_def(:pre_gen, &block)
118
+ end
119
+
120
+ def to_line=(block)
121
+ meta_def(:to_line, &block)
122
+ end
123
+ end
124
+
125
+ # Clear all existing record definitions. Only used for testing.
126
+ def clear_records
127
+ @record_types.clear
128
+ @record_order.clear
129
+ end
130
+
131
+ def fields(type)
132
+ if record = record_type(type)
133
+ record.fields.dup
134
+ else
135
+ nil
136
+ end
137
+ end
138
+
139
+ # Try to match a specific text line.
140
+ def handle_text_line(line, record)
141
+ if line =~ record.match
142
+ return {:record_type => record.name, :line => line}
143
+ else
144
+ return nil
145
+ end
146
+ end
147
+
148
+ # Try to match a record.
149
+ def handle_record_line(line, record)
150
+ ret = nil
151
+ if record.respond_to?(:process)
152
+ if ret = record.send(:process, line.dup)
153
+ unless ret.is_a?(Hash)
154
+ raise Puppet::DevError,
155
+ "Process record type %s returned non-hash" % record.name
156
+ end
157
+ else
158
+ return nil
159
+ end
160
+ elsif regex = record.match
161
+ # In this case, we try to match the whole line and then use the
162
+ # match captures to get our fields.
163
+ if match = regex.match(line)
164
+ fields = []
165
+ ret = {}
166
+ record.fields.zip(match.captures).each do |f, v|
167
+ ret[f] = v
168
+ end
169
+ else
170
+ nil
171
+ end
172
+ else
173
+ ret = {}
174
+ sep = record.separator
175
+
176
+ # String "helpfully" replaces ' ' with /\s+/ in splitting, so we
177
+ # have to work around it.
178
+ if sep == " "
179
+ sep = / /
180
+ end
181
+ line_fields = line.split(sep)
182
+ record.fields.each do |param|
183
+ value = line_fields.shift
184
+ if value and value != record.absent
185
+ ret[param] = value
186
+ else
187
+ ret[param] = :absent
188
+ end
189
+ end
190
+
191
+ unless line_fields.empty? or ! record.rollup
192
+ last_field = record.fields[-1]
193
+ val = ([ret[last_field]] + line_fields).join(record.joiner)
194
+ ret[last_field] = val
195
+ end
196
+ end
197
+
198
+ if ret
199
+ ret[:record_type] = record.name
200
+ return ret
201
+ else
202
+ return nil
203
+ end
204
+ end
205
+
206
+ def line_separator
207
+ unless defined?(@line_separator)
208
+ @line_separator = "\n"
209
+ end
210
+
211
+ @line_separator
212
+ end
213
+
214
+ # Split text into separate lines using the record separator.
215
+ def lines(text)
216
+ # Remove any trailing separators, and then split based on them
217
+ text.sub(/#{self.line_separator}\Q/,'').split(self.line_separator)
218
+ end
219
+
220
+ # Split a bunch of text into lines and then parse them individually.
221
+ def parse(text)
222
+ lines(text).collect do |line|
223
+ parse_line(line)
224
+ end
225
+ end
226
+
227
+ # Handle parsing a single line.
228
+ def parse_line(line)
229
+ unless records?
230
+ raise Puppet::DevError, "No record types defined; cannot parse lines"
231
+ end
232
+
233
+ @record_order.each do |record|
234
+ # These are basically either text or record lines.
235
+ method = "handle_%s_line" % record.type
236
+ if respond_to?(method)
237
+ if result = send(method, line, record)
238
+ if record.respond_to?(:post_parse)
239
+ record.send(:post_parse, result)
240
+ end
241
+ return result
242
+ end
243
+ else
244
+ raise Puppet::DevError,
245
+ "Somehow got invalid line type %s" % record.type
246
+ end
247
+ end
248
+
249
+ return nil
250
+ end
251
+
252
+ # Define a new type of record. These lines get split into hashes. Valid
253
+ # options are:
254
+ # * <tt>:absent</tt>: What to use when a field is absent. Defaults to "".
255
+ # * <tt>:fields</tt>: The list of fields, as an array. By default, all
256
+ # fields are considered required.
257
+ # * <tt>:joiner</tt>: How to join fields together. Defaults to '\t'.
258
+ # * <tt>:optional</tt>: Which fields are optional. If these are missing,
259
+ # you'll just get the 'absent' value instead of an ArgumentError.
260
+ # * <tt>:rts</tt>: Whether to remove trailing whitespace. Defaults to false.
261
+ # If true, whitespace will be removed; if a regex, then whatever matches
262
+ # the regex will be removed.
263
+ # * <tt>:separator</tt>: The record separator. Defaults to /\s+/.
264
+ def record_line(name, options, &block)
265
+ unless options.include?(:fields)
266
+ raise ArgumentError, "Must include a list of fields"
267
+ end
268
+
269
+ record = FileRecord.new(:record, options, &block)
270
+ record.name = symbolize(name)
271
+
272
+ new_line_type(record)
273
+ end
274
+
275
+ # Are there any record types defined?
276
+ def records?
277
+ defined?(@record_types) and ! @record_types.empty?
278
+ end
279
+
280
+ # Define a new type of text record.
281
+ def text_line(name, options, &block)
282
+ unless options.include?(:match)
283
+ raise ArgumentError, "You must provide a :match regex for text lines"
284
+ end
285
+
286
+ record = FileRecord.new(:text, options, &block)
287
+ record.name = symbolize(name)
288
+
289
+ new_line_type(record)
290
+ end
291
+
292
+ # Generate a file from a bunch of hash records.
293
+ def to_file(records)
294
+ text = records.collect { |record| to_line(record) }.join(line_separator)
295
+
296
+ if trailing_separator
297
+ text += line_separator
298
+ end
299
+
300
+ return text
301
+ end
302
+
303
+ # Convert our parsed record into a text record.
304
+ def to_line(details)
305
+ unless record = record_type(details[:record_type])
306
+ raise ArgumentError, "Invalid record type %s" % details[:record_type]
307
+ end
308
+
309
+ if record.respond_to?(:pre_gen)
310
+ details = details.dup
311
+ record.send(:pre_gen, details)
312
+ end
313
+
314
+ case record.type
315
+ when :text: return details[:line]
316
+ else
317
+ if record.respond_to?(:to_line)
318
+ return record.to_line(details)
319
+ end
320
+
321
+ line = record.join(details)
322
+
323
+ if regex = record.rts
324
+ # If they say true, then use whitespace; else, use their regex.
325
+ if regex == true
326
+ regex = /\s+$/
327
+ end
328
+ return line.sub(regex,'')
329
+ else
330
+ return line
331
+ end
332
+ end
333
+ end
334
+
335
+ # Whether to add a trailing separator to the file. Defaults to true
336
+ def trailing_separator
337
+ if defined? @trailing_separator
338
+ return @trailing_separator
339
+ else
340
+ return true
341
+ end
342
+ end
343
+
344
+ def valid_attr?(type, attr)
345
+ type = symbolize(type)
346
+ if record = record_type(type) and record.fields.include?(symbolize(attr))
347
+ return true
348
+ else
349
+ if symbolize(attr) == :ensure
350
+ return true
351
+ else
352
+ false
353
+ end
354
+ end
355
+ end
356
+
357
+ private
358
+
359
+ # Define a new type of record.
360
+ def new_line_type(record)
361
+ @record_types ||= {}
362
+ @record_order ||= []
363
+
364
+ if @record_types.include?(record.name)
365
+ raise ArgumentError, "Line type %s is already defined" % record.name
366
+ end
367
+
368
+ @record_types[record.name] = record
369
+ @record_order << record
370
+
371
+ return record
372
+ end
373
+
374
+ # Retrive the record object.
375
+ def record_type(type)
376
+ @record_types[symbolize(type)]
377
+ end
378
+ end
379
+
380
+ # $Id: fileparsing.rb 2407 2007-04-23 18:01:36Z luke $