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,129 @@
1
+ require 'puppet/sslcertificates'
2
+ require 'openssl'
3
+ require 'puppet/external/base64'
4
+
5
+ require 'xmlrpc/client'
6
+ require 'yaml'
7
+
8
+ module Puppet::Network
9
+ class ClientError < Puppet::Error; end
10
+ class XMLRPCClientError < Puppet::Error; end
11
+ class XMLRPCClient < ::XMLRPC::Client
12
+ attr_accessor :puppet_server, :puppet_port
13
+ @clients = {}
14
+
15
+ class << self
16
+ include Puppet::Util
17
+ include Puppet::Util::ClassGen
18
+ end
19
+
20
+ # Create a netclient for each handler
21
+ def self.mkclient(handler)
22
+ interface = handler.interface
23
+ namespace = interface.prefix
24
+
25
+ # Create a subclass for every client type. This is
26
+ # so that all of the methods are on their own class,
27
+ # so that they namespaces can define the same methods if
28
+ # they want.
29
+ constant = handler.name.to_s.capitalize
30
+ name = namespace.downcase
31
+ newclient = genclass(name, :hash => @clients,
32
+ :constant => constant)
33
+
34
+ interface.methods.each { |ary|
35
+ method = ary[0]
36
+ if public_method_defined?(method)
37
+ raise Puppet::DevError, "Method %s is already defined" %
38
+ method
39
+ end
40
+ newclient.send(:define_method,method) { |*args|
41
+ Puppet.debug "Calling %s.%s" % [namespace, method]
42
+ begin
43
+ call("%s.%s" % [namespace, method.to_s],*args)
44
+ rescue OpenSSL::SSL::SSLError => detail
45
+ raise XMLRPCClientError,
46
+ "Certificates were not trusted: %s" % detail
47
+ rescue ::XMLRPC::FaultException => detail
48
+ #Puppet.err "Could not call %s.%s: %s" %
49
+ # [namespace, method, detail.faultString]
50
+ #raise XMLRPCClientError,
51
+ # "XMLRPC Error: %s" % detail.faultString
52
+ raise XMLRPCClientError, detail.faultString
53
+ rescue Errno::ECONNREFUSED => detail
54
+ msg = "Could not connect to %s on port %s" %
55
+ [@host, @port]
56
+ raise XMLRPCClientError, msg
57
+ rescue SocketError => detail
58
+ Puppet.err "Could not find server %s: %s" %
59
+ [@puppet_server, detail.to_s]
60
+ error = XMLRPCClientError.new(
61
+ "Could not find server %s" % @puppet_server
62
+ )
63
+ error.set_backtrace detail.backtrace
64
+ raise error
65
+ rescue => detail
66
+ Puppet.err "Could not call %s.%s: %s" %
67
+ [namespace, method, detail.inspect]
68
+ error = XMLRPCClientError.new(detail.to_s)
69
+ error.set_backtrace detail.backtrace
70
+ raise error
71
+ end
72
+ }
73
+ }
74
+
75
+ return newclient
76
+ end
77
+
78
+ def self.handler_class(handler)
79
+ @clients[handler] || self.mkclient(handler)
80
+ end
81
+
82
+ # Use cert information from a Puppet client to set up the http object.
83
+ def cert_setup(client)
84
+ unless FileTest.exists?(Puppet[:localcacert])
85
+ raise Puppet::SSLCertificates::Support::MissingCertificate,
86
+ "Could not find ca certificate %s" % Puppet[:localcacert]
87
+ end
88
+ @http.ca_file = Puppet[:localcacert]
89
+ store = OpenSSL::X509::Store.new
90
+ store.add_file Puppet[:localcacert]
91
+ store.purpose = OpenSSL::X509::PURPOSE_SSL_CLIENT
92
+ @http.cert_store = store
93
+ @http.cert = client.cert
94
+ @http.verify_mode = OpenSSL::SSL::VERIFY_PEER
95
+ @http.key = client.key
96
+ end
97
+
98
+ def initialize(hash = {})
99
+ hash[:Path] ||= "/RPC2"
100
+ hash[:Server] ||= Puppet[:server]
101
+ hash[:Port] ||= Puppet[:masterport]
102
+
103
+ @puppet_server = hash[:Server]
104
+ @puppet_port = hash[:Port]
105
+
106
+ super(
107
+ hash[:Server],
108
+ hash[:Path],
109
+ hash[:Port],
110
+ nil, # proxy_host
111
+ nil, # proxy_port
112
+ nil, # user
113
+ nil, # password
114
+ true, # use_ssl
115
+ 120 # a two minute timeout, instead of 30 seconds
116
+ )
117
+ end
118
+
119
+ def local
120
+ false
121
+ end
122
+
123
+ def local?
124
+ false
125
+ end
126
+ end
127
+ end
128
+
129
+ # $Id: client.rb 2259 2007-03-06 19:03:05Z luke $
@@ -0,0 +1,91 @@
1
+ require 'puppet/network/authorization'
2
+ require 'xmlrpc/server'
3
+
4
+ # Just silly.
5
+ class ::XMLRPC::FaultException
6
+ def to_s
7
+ self.message
8
+ end
9
+ end
10
+
11
+ module Puppet::Network
12
+ # Most of our subclassing is just so that we can get
13
+ # access to information from the request object, like
14
+ # the client name and IP address.
15
+ module XMLRPCProcessor
16
+ include Puppet::Network::Authorization
17
+
18
+ ERR_UNAUTHORIZED = 30
19
+
20
+ def add_handler(interface, handler)
21
+ @loadedhandlers << interface.prefix
22
+ super(interface, handler)
23
+ end
24
+
25
+ def handler_loaded?(handler)
26
+ @loadedhandlers.include?(handler.to_s)
27
+ end
28
+
29
+ # Convert our data and client request into xmlrpc calls, and verify
30
+ # they're authorized and such-like. This method differs from the
31
+ # default in that it expects a ClientRequest object in addition to the
32
+ # data.
33
+ def process(data, request)
34
+ call, params = parser().parseMethodCall(data)
35
+ params << request.name << request.ip
36
+ handler, method = call.split(".")
37
+ request.handler = handler
38
+ request.method = method
39
+ begin
40
+ verify(request)
41
+ rescue InvalidClientRequest => detail
42
+ raise ::XMLRPC::FaultException.new(ERR_UNAUTHORIZED, detail.to_s)
43
+ end
44
+ handle(request.call, *params)
45
+ end
46
+
47
+ private
48
+
49
+ # Provide error handling for method calls.
50
+ def protect_service(obj, *args)
51
+ begin
52
+ obj.call(*args)
53
+ rescue ::XMLRPC::FaultException
54
+ raise
55
+ rescue Puppet::AuthorizationError => detail
56
+ Puppet.err "Permission denied: %s" % detail.to_s
57
+ raise ::XMLRPC::FaultException.new(
58
+ 1, detail.to_s
59
+ )
60
+ rescue Puppet::Error => detail
61
+ if Puppet[:trace]
62
+ puts detail.backtrace
63
+ end
64
+ Puppet.err detail.to_s
65
+ error = ::XMLRPC::FaultException.new(
66
+ 1, detail.to_s
67
+ )
68
+ error.set_backtrace detail.backtrace
69
+ raise error
70
+ rescue => detail
71
+ if Puppet[:trace]
72
+ puts detail.backtrace
73
+ end
74
+ Puppet.err "Could not call: %s" % detail.to_s
75
+ error = ::XMLRPC::FaultException.new(1, detail.to_s)
76
+ error.set_backtrace detail.backtrace
77
+ raise error
78
+ end
79
+ end
80
+
81
+ # Set up our service hook and init our handler list.
82
+ def setup_processor
83
+ @loadedhandlers = []
84
+ self.set_service_hook do |obj, *args|
85
+ protect_service(obj, *args)
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ # $Id: processor.rb 2259 2007-03-06 19:03:05Z luke $
@@ -0,0 +1,20 @@
1
+ require 'xmlrpc/server'
2
+ require 'puppet/network/authorization'
3
+ require 'puppet/network/xmlrpc/processor'
4
+
5
+ module Puppet::Network
6
+ # Most of our subclassing is just so that we can get
7
+ # access to information from the request object, like
8
+ # the client name and IP address.
9
+ class XMLRPCServer < ::XMLRPC::BasicServer
10
+ include Puppet::Util
11
+ include Puppet::Network::XMLRPCProcessor
12
+
13
+ def initialize
14
+ super()
15
+ setup_processor()
16
+ end
17
+ end
18
+ end
19
+
20
+ # $Id: server.rb 2259 2007-03-06 19:03:05Z luke $
@@ -0,0 +1,121 @@
1
+ require 'xmlrpc/server'
2
+ require 'puppet/network/authorization'
3
+ require 'puppet/network/xmlrpc/processor'
4
+
5
+ module Puppet::Network::XMLRPC
6
+ class ServletError < RuntimeError; end
7
+ class WEBrickServlet < ::XMLRPC::WEBrickServlet
8
+ include Puppet::Network::XMLRPCProcessor
9
+
10
+ # This is a hackish way to avoid an auth message every time we have a
11
+ # normal operation
12
+ def self.log(msg)
13
+ unless defined? @logs
14
+ @logs = {}
15
+ end
16
+ if @logs.include?(msg)
17
+ @logs[msg] += 1
18
+ else
19
+ Puppet.info msg
20
+ @logs[msg] = 1
21
+ end
22
+ end
23
+
24
+ # Accept a list of handlers and register them all.
25
+ def initialize(handlers)
26
+ # the servlet base class does not consume any arguments
27
+ # and its BasicServer base class only accepts a 'class_delim'
28
+ # option which won't change in Puppet at all
29
+ # thus, we don't need to pass any args to our base class,
30
+ # and we can consume them all ourselves
31
+ super()
32
+
33
+ setup_processor()
34
+
35
+ # Set up each of the passed handlers.
36
+ handlers.each do |handler|
37
+ add_handler(handler.class.interface, handler)
38
+ end
39
+ end
40
+
41
+ # Handle the actual request. We can't use the super() method, because
42
+ # we need to pass a ClientRequest object to process() so we can do
43
+ # authorization. It's the only way to stay thread-safe.
44
+ def service(request, response)
45
+ if @valid_ip
46
+ raise WEBrick::HTTPStatus::Forbidden unless @valid_ip.any? { |ip| request.peeraddr[3] =~ ip }
47
+ end
48
+
49
+ if request.request_method != "POST"
50
+ raise WEBrick::HTTPStatus::MethodNotAllowed,
51
+ "unsupported method `#{request.request_method}'."
52
+ end
53
+
54
+ if parse_content_type(request['Content-type']).first != "text/xml"
55
+ raise WEBrick::HTTPStatus::BadRequest
56
+ end
57
+
58
+ length = (request['Content-length'] || 0).to_i
59
+
60
+ raise WEBrick::HTTPStatus::LengthRequired unless length > 0
61
+
62
+ data = request.body
63
+
64
+ if data.nil? or data.size != length
65
+ raise WEBrick::HTTPStatus::BadRequest
66
+ end
67
+
68
+ resp = process(data, client_request(request))
69
+ if resp.nil? or resp.size <= 0
70
+ raise WEBrick::HTTPStatus::InternalServerError
71
+ end
72
+
73
+ response.status = 200
74
+ response['Content-Length'] = resp.size
75
+ response['Content-Type'] = "text/xml; charset=utf-8"
76
+ response.body = resp
77
+ end
78
+
79
+ private
80
+
81
+ # Generate a ClientRequest object for later validation.
82
+ def client_request(request)
83
+ if peer = request.peeraddr
84
+ client = peer[2]
85
+ clientip = peer[3]
86
+ else
87
+ raise ::XMLRPC::FaultException.new(
88
+ ERR_UNCAUGHT_EXCEPTION,
89
+ "Could not retrieve client information"
90
+ )
91
+ end
92
+
93
+ # If they have a certificate (which will almost always be true)
94
+ # then we get the hostname from the cert, instead of via IP
95
+ # info
96
+ valid = false
97
+ if cert = request.client_cert
98
+ nameary = cert.subject.to_a.find { |ary|
99
+ ary[0] == "CN"
100
+ }
101
+
102
+ if nameary.nil?
103
+ Puppet.warning "Could not retrieve server name from cert"
104
+ else
105
+ unless client == nameary[1]
106
+ Puppet.debug "Overriding %s with cert name %s" %
107
+ [client, nameary[1]]
108
+ client = nameary[1]
109
+ end
110
+ valid = true
111
+ end
112
+ end
113
+
114
+ info = Puppet::Network::ClientRequest.new(client, clientip, valid)
115
+
116
+ return info
117
+ end
118
+ end
119
+ end
120
+
121
+ # $Id: webrick_servlet.rb 2259 2007-03-06 19:03:05Z luke $
@@ -1,431 +1,475 @@
1
- module Puppet
2
- class Parameter < Puppet::Element
3
- class << self
4
- attr_reader :validater, :munger, :name, :default
5
- attr_accessor :ismetaparameter, :element
6
-
7
- # Define the default value for a given parameter or parameter. This
8
- # means that 'nil' is an invalid default value. This defines
9
- # the 'default' instance method.
10
- def defaultto(value = nil, &block)
11
- if block
12
- define_method(:default, &block)
13
- else
14
- if value.nil?
15
- raise Puppet::DevError,
16
- "Either a default value or block must be provided"
17
- end
18
- define_method(:default) do value end
1
+ require 'puppet/util/methodhelper'
2
+
3
+ class Puppet::Parameter < Puppet::Element
4
+ include Puppet::Util::MethodHelper
5
+ class << self
6
+ attr_reader :validater, :munger, :name, :default, :required_features
7
+ attr_accessor :metaparam, :element
8
+
9
+ # Define the default value for a given parameter or parameter. This
10
+ # means that 'nil' is an invalid default value. This defines
11
+ # the 'default' instance method.
12
+ def defaultto(value = nil, &block)
13
+ if block
14
+ define_method(:default, &block)
15
+ else
16
+ if value.nil?
17
+ raise Puppet::DevError,
18
+ "Either a default value or block must be provided"
19
19
  end
20
+ define_method(:default) do value end
20
21
  end
22
+ end
21
23
 
22
- # Return a documentation string. If there are valid values,
23
- # then tack them onto the string.
24
- def doc
25
- @doc ||= ""
26
-
27
- unless defined? @addeddocvals
28
- unless values.empty?
29
- if @aliasvalues.empty?
30
- @doc += " Valid values are ``" +
31
- values.join("``, ``") + "``."
32
- else
33
- @doc += " Valid values are "
34
-
35
- @doc += values.collect do |value|
36
- ary = @aliasvalues.find do |name, val|
37
- val == value
38
- end
39
- if ary
40
- "``%s`` (also called ``%s``)" % [value, ary[0]]
41
- else
42
- "``#{value}``"
43
- end
44
- end.join(", ") + "."
45
- end
46
- end
24
+ # Return a documentation string. If there are valid values,
25
+ # then tack them onto the string.
26
+ def doc
27
+ @doc ||= ""
47
28
 
48
- if defined? @parameterregexes and ! @parameterregexes.empty?
49
- regs = @parameterregexes
50
- if @parameterregexes.is_a? Hash
51
- regs = @parameterregexes.keys
52
- end
53
- unless regs.empty?
54
- @doc += " Values can also match ``" +
55
- regs.join("``, ``") + "``."
56
- end
29
+ unless defined? @addeddocvals
30
+ unless values.empty?
31
+ if @aliasvalues.empty?
32
+ @doc += " Valid values are ``" +
33
+ values.join("``, ``") + "``."
34
+ else
35
+ @doc += " Valid values are "
36
+
37
+ @doc += values.collect do |value|
38
+ ary = @aliasvalues.find do |name, val|
39
+ val == value
40
+ end
41
+ if ary
42
+ "``%s`` (also called ``%s``)" % [value, ary[0]]
43
+ else
44
+ "``#{value}``"
45
+ end
46
+ end.join(", ") + "."
57
47
  end
58
- @addeddocvals = true
59
48
  end
60
49
 
61
- @doc
62
- end
50
+ if defined? @parameterregexes and ! @parameterregexes.empty?
51
+ regs = @parameterregexes
52
+ if @parameterregexes.is_a? Hash
53
+ regs = @parameterregexes.keys
54
+ end
55
+ unless regs.empty?
56
+ @doc += " Values can also match ``" +
57
+ regs.join("``, ``") + "``."
58
+ end
59
+ end
63
60
 
64
- def nodefault
65
- if public_method_defined? :default
66
- undef_method :default
61
+ if f = self.required_features
62
+ @doc += " Requires features %s." % f.flatten.collect { |f| f.to_s }.join(" ")
67
63
  end
64
+ @addeddocvals = true
68
65
  end
69
66
 
70
- # Store documentation for this parameter.
71
- def desc(str)
72
- @doc = str
73
- end
67
+ @doc
68
+ end
74
69
 
75
- def initvars
76
- @parametervalues = []
77
- @aliasvalues = {}
78
- @parameterregexes = []
70
+ def nodefault
71
+ if public_method_defined? :default
72
+ undef_method :default
79
73
  end
74
+ end
80
75
 
81
- # This is how we munge the value. Basically, this is our
82
- # opportunity to convert the value from one form into another.
83
- def munge(&block)
84
- # I need to wrap the unsafe version in begin/rescue parameterments,
85
- # but if I directly call the block then it gets bound to the
86
- # class's context, not the instance's, thus the two methods,
87
- # instead of just one.
88
- define_method(:unsafe_munge, &block)
89
-
90
- define_method(:munge) do |*args|
91
- begin
92
- unsafe_munge(*args)
93
- rescue Puppet::Error => detail
94
- Puppet.debug "Reraising %s" % detail
95
- raise
96
- rescue => detail
97
- if Puppet[:debug]
98
- puts detail.backtrace
99
- end
100
- raise Puppet::DevError, "Munging failed for class %s: %s" %
101
- [self.name, detail]
102
- end
103
- end
104
- #@munger = block
105
- end
76
+ # Store documentation for this parameter.
77
+ def desc(str)
78
+ @doc = str
79
+ end
106
80
 
107
- # Mark whether we're the namevar.
108
- def isnamevar
109
- @isnamevar = true
110
- @required = true
111
- end
81
+ def initvars
82
+ @parametervalues = []
83
+ @aliasvalues = {}
84
+ @parameterregexes = []
85
+ end
112
86
 
113
- # Is this parameter the namevar? Defaults to false.
114
- def isnamevar?
115
- if defined? @isnamevar
116
- return @isnamevar
117
- else
118
- return false
87
+ # This is how we munge the value. Basically, this is our
88
+ # opportunity to convert the value from one form into another.
89
+ def munge(&block)
90
+ # I need to wrap the unsafe version in begin/rescue parameterments,
91
+ # but if I directly call the block then it gets bound to the
92
+ # class's context, not the instance's, thus the two methods,
93
+ # instead of just one.
94
+ define_method(:unsafe_munge, &block)
95
+
96
+ define_method(:munge) do |*args|
97
+ begin
98
+ ret = unsafe_munge(*args)
99
+ rescue Puppet::Error => detail
100
+ Puppet.debug "Reraising %s" % detail
101
+ raise
102
+ rescue => detail
103
+ raise Puppet::DevError, "Munging failed for value %s in class %s: %s" %
104
+ [args.inspect, self.name, detail], detail.backtrace
119
105
  end
120
- end
121
106
 
122
- # This parameter is required.
123
- def isrequired
124
- @required = true
125
- end
126
-
127
- # Is this parameter required? Defaults to false.
128
- def required?
129
- if defined? @required
130
- return @required
131
- else
132
- return false
107
+ if self.shadow
108
+ self.shadow.munge(*args)
133
109
  end
110
+ ret
134
111
  end
112
+ end
135
113
 
136
- def to_s
137
- if self.ismetaparameter
138
- "Puppet::Type::" + @name.to_s.capitalize
139
- else
140
- self.element.to_s + @name.to_s.capitalize
141
- end
142
- end
114
+ # Mark whether we're the namevar.
115
+ def isnamevar
116
+ @isnamevar = true
117
+ @required = true
118
+ end
143
119
 
144
- # Verify that we got a good value
145
- def validate(&block)
146
- #@validater = block
147
- define_method(:unsafe_validate, &block)
148
-
149
- define_method(:validate) do |*args|
150
- begin
151
- unsafe_validate(*args)
152
- rescue ArgumentError, Puppet::Error, TypeError
153
- raise
154
- rescue => detail
155
- if Puppet[:debug]
156
- puts detail.backtrace
157
- end
158
- raise Puppet::DevError,
159
- "Validate method failed for class %s: %s" %
160
- [self.name, detail]
161
- end
162
- end
120
+ # Is this parameter the namevar? Defaults to false.
121
+ def isnamevar?
122
+ if defined? @isnamevar
123
+ return @isnamevar
124
+ else
125
+ return false
163
126
  end
127
+ end
164
128
 
165
- # Does the value match any of our regexes?
166
- def match?(value)
167
- value = value.to_s unless value.is_a? String
168
- @parameterregexes.find { |r|
169
- r = r[0] if r.is_a? Array # States use a hash here
170
- r =~ value
171
- }
172
- end
129
+ # This parameter is required.
130
+ def isrequired
131
+ @required = true
132
+ end
173
133
 
174
- # Define a new value for our parameter.
175
- def newvalues(*names)
176
- names.each { |name|
177
- name = name.intern if name.is_a? String
178
-
179
- case name
180
- when Symbol
181
- if @parametervalues.include?(name)
182
- Puppet.warning "%s already has a value for %s" %
183
- [name, name]
184
- end
185
- @parametervalues << name
186
- when Regexp
187
- if @parameterregexes.include?(name)
188
- Puppet.warning "%s already has a value for %s" %
189
- [name, name]
190
- end
191
- @parameterregexes << name
192
- else
193
- raise ArgumentError, "Invalid value %s of type %s" %
194
- [name, name.class]
195
- end
196
- }
134
+ # Is this parameter required? Defaults to false.
135
+ def required?
136
+ if defined? @required
137
+ return @required
138
+ else
139
+ return false
197
140
  end
141
+ end
198
142
 
199
- def aliasvalue(name, other)
200
- unless @parametervalues.include?(other)
143
+ # Verify that we got a good value
144
+ def validate(&block)
145
+ #@validater = block
146
+ define_method(:unsafe_validate, &block)
147
+
148
+ define_method(:validate) do |*args|
149
+ begin
150
+ unsafe_validate(*args)
151
+ rescue ArgumentError, Puppet::Error, TypeError
152
+ raise
153
+ rescue => detail
201
154
  raise Puppet::DevError,
202
- "Cannot alias nonexistent value %s" % other
155
+ "Validate method failed for class %s: %s" %
156
+ [self.name, detail], detail.backtrace
203
157
  end
204
-
205
- @aliasvalues[name] = other
206
158
  end
159
+ end
207
160
 
208
- def alias(name)
209
- @aliasvalues[name]
210
- end
161
+ # Does the value match any of our regexes?
162
+ def match?(value)
163
+ value = value.to_s unless value.is_a? String
164
+ @parameterregexes.find { |r|
165
+ r = r[0] if r.is_a? Array # Properties use a hash here
166
+ r =~ value
167
+ }
168
+ end
211
169
 
212
- def regexes
213
- return @parameterregexes.dup
214
- end
170
+ # Define a new value for our parameter.
171
+ def newvalues(*names)
172
+ names.each { |name|
173
+ name = name.intern if name.is_a? String
215
174
 
216
- # Return the list of valid values.
217
- def values
218
- #[@aliasvalues.keys, @parametervalues.keys].flatten
219
- if @parametervalues.is_a? Array
220
- return @parametervalues.dup
221
- elsif @parametervalues.is_a? Hash
222
- return @parametervalues.keys
175
+ case name
176
+ when Symbol
177
+ if @parametervalues.include?(name)
178
+ Puppet.warning "%s already has a value for %s" %
179
+ [name, name]
180
+ end
181
+ @parametervalues << name
182
+ when Regexp
183
+ if @parameterregexes.include?(name)
184
+ Puppet.warning "%s already has a value for %s" %
185
+ [name, name]
186
+ end
187
+ @parameterregexes << name
223
188
  else
224
- return []
189
+ raise ArgumentError, "Invalid value %s of type %s" %
190
+ [name, name.class]
225
191
  end
226
- end
192
+ }
227
193
  end
228
194
 
229
- # Just a simple method to proxy instance methods to class methods
230
- def self.proxymethods(*values)
231
- values.each { |val|
232
- define_method(val) do
233
- self.class.send(val)
234
- end
235
- }
195
+ def aliasvalue(name, other)
196
+ other = symbolize(other)
197
+ unless @parametervalues.include?(other)
198
+ raise Puppet::DevError,
199
+ "Cannot alias nonexistent value %s" % other
200
+ end
201
+
202
+ @aliasvalues[name] = other
236
203
  end
237
204
 
238
- # And then define one of these proxies for each method in our
239
- # ParamHandler class.
240
- proxymethods("required?", "isnamevar?")
205
+ def alias(name)
206
+ @aliasvalues[name]
207
+ end
241
208
 
242
- attr_accessor :parent
209
+ def regexes
210
+ return @parameterregexes.dup
211
+ end
243
212
 
244
- def devfail(msg)
245
- self.fail(Puppet::DevError, msg)
213
+ def required_features=(*args)
214
+ @required_features = args.flatten.collect { |a| a.to_s.downcase.intern }
246
215
  end
247
216
 
248
- def fail(*args)
249
- type = nil
250
- if args[0].is_a?(Class)
251
- type = args.shift
217
+ # Return the list of valid values.
218
+ def values
219
+ #[@aliasvalues.keys, @parametervalues.keys].flatten
220
+ if @parametervalues.is_a? Array
221
+ return @parametervalues.dup
222
+ elsif @parametervalues.is_a? Hash
223
+ return @parametervalues.keys
252
224
  else
253
- type = Puppet::Error
225
+ return []
254
226
  end
227
+ end
228
+ end
255
229
 
256
- error = type.new(args.join(" "))
257
-
258
- if defined? @parent and @parent and @parent.line
259
- error.line = @parent.line
230
+ # Just a simple method to proxy instance methods to class methods
231
+ def self.proxymethods(*values)
232
+ values.each { |val|
233
+ define_method(val) do
234
+ self.class.send(val)
260
235
  end
236
+ }
237
+ end
261
238
 
262
- if defined? @parent and @parent and @parent.file
263
- error.file = @parent.file
264
- end
239
+ # And then define one of these proxies for each method in our
240
+ # ParamHandler class.
241
+ proxymethods("required?", "isnamevar?")
265
242
 
266
- raise error
267
- end
243
+ attr_accessor :parent
244
+ attr_reader :shadow
268
245
 
269
- # Log a message using the parent's log level.
270
- def log(msg)
271
- unless @parent[:loglevel]
272
- p @parent
273
- self.devfail "Parent %s has no loglevel" %
274
- @parent.name
275
- end
276
- Puppet::Log.create(
277
- :level => @parent[:loglevel],
278
- :message => msg,
279
- :source => self
280
- )
246
+ def devfail(msg)
247
+ self.fail(Puppet::DevError, msg)
248
+ end
249
+
250
+ def fail(*args)
251
+ type = nil
252
+ if args[0].is_a?(Class)
253
+ type = args.shift
254
+ else
255
+ type = Puppet::Error
281
256
  end
282
257
 
283
- # each parameter class must define the name() method, and parameter
284
- # instances do not change that name this implicitly means that a given
285
- # object can only have one parameter instance of a given parameter
286
- # class
287
- def name
288
- return self.class.name
258
+ error = type.new(args.join(" "))
259
+
260
+ if defined? @parent and @parent and @parent.line
261
+ error.line = @parent.line
289
262
  end
290
263
 
291
- # for testing whether we should actually do anything
292
- def noop
293
- unless defined? @noop
294
- @noop = false
295
- end
296
- tmp = @noop || self.parent.noop || Puppet[:noop] || false
297
- #debug "noop is %s" % tmp
298
- return tmp
264
+ if defined? @parent and @parent and @parent.file
265
+ error.file = @parent.file
299
266
  end
300
267
 
301
- # return the full path to us, for logging and rollback; not currently
302
- # used
303
- def path
304
- return [@parent.path, self.name].join("/")
268
+ raise error
269
+ end
270
+
271
+ # Basic parameter initialization.
272
+ def initialize(options = {})
273
+ options = symbolize_options(options)
274
+ if parent = options[:parent]
275
+ self.parent = parent
276
+ options.delete(:parent)
277
+ else
278
+ raise Puppet::DevError, "No parent set for %s" % self.class.name
305
279
  end
306
280
 
307
- # If the specified value is allowed, then munge appropriately.
308
- munge do |value|
309
- if self.class.values.empty? and self.class.regexes.empty?
310
- # This parameter isn't using defined values to do its work.
311
- return value
312
- end
281
+ if ! self.metaparam? and klass = Puppet::Type.metaparamclass(self.class.name)
282
+ setup_shadow(klass)
283
+ end
313
284
 
314
- # We convert to a string and then a symbol so that things like
315
- # booleans work as we expect.
316
- intern = value.to_s.intern
317
-
318
- # If it's a valid value, always return it as a symbol.
319
- if self.class.values.include?(intern)
320
- retval = intern
321
- elsif other = self.class.alias(intern)
322
- retval = other
323
- elsif ary = self.class.match?(value)
324
- retval = value
325
- else
326
- # If it passed the validation but is not a registered value,
327
- # we just return it as is.
328
- retval = value
329
- end
285
+ set_options(options)
286
+ end
330
287
 
331
- retval
288
+ # Log a message using the parent's log level.
289
+ def log(msg)
290
+ unless @parent[:loglevel]
291
+ p @parent
292
+ self.devfail "Parent %s has no loglevel" %
293
+ @parent.name
332
294
  end
295
+ Puppet::Util::Log.create(
296
+ :level => @parent[:loglevel],
297
+ :message => msg,
298
+ :source => self
299
+ )
300
+ end
333
301
 
334
- # Verify that the passed value is valid.
335
- validate do |value|
336
- vals = self.class.values
337
- regs = self.class.regexes
302
+ # Is this parameter a metaparam?
303
+ def metaparam?
304
+ self.class.metaparam
305
+ end
338
306
 
339
- if regs.is_a? Hash # this is true on states
340
- regs = regs.keys
341
- end
342
- if vals.empty? and regs.empty?
343
- # This parameter isn't using defined values to do its work.
344
- return
345
- end
346
- newval = value
347
- unless value.is_a?(Symbol)
348
- newval = value.to_s.intern
349
- end
307
+ # each parameter class must define the name() method, and parameter
308
+ # instances do not change that name this implicitly means that a given
309
+ # object can only have one parameter instance of a given parameter
310
+ # class
311
+ def name
312
+ return self.class.name
313
+ end
350
314
 
351
- unless vals.include?(newval) or
352
- self.class.alias(newval) or
353
- self.class.match?(value) # We match the string, not the symbol
354
- str = "Invalid '%s' value %s. " %
355
- [self.class.name, value.inspect]
315
+ # for testing whether we should actually do anything
316
+ def noop
317
+ unless defined? @noop
318
+ @noop = false
319
+ end
320
+ tmp = @noop || self.parent.noop || Puppet[:noop] || false
321
+ #debug "noop is %s" % tmp
322
+ return tmp
323
+ end
356
324
 
357
- unless vals.empty?
358
- str += "Valid values are %s. " % vals.join(", ")
359
- end
325
+ # return the full path to us, for logging and rollback; not currently
326
+ # used
327
+ def pathbuilder
328
+ if defined? @parent and @parent
329
+ return [@parent.pathbuilder, self.name]
330
+ else
331
+ return [self.name]
332
+ end
333
+ end
360
334
 
361
- unless regs.empty?
362
- str += "Valid values match %s." % regs.collect { |r|
363
- r.to_s
364
- }.join(", ")
365
- end
335
+ # If the specified value is allowed, then munge appropriately.
336
+ munge do |value|
337
+ if self.class.values.empty? and self.class.regexes.empty?
338
+ # This parameter isn't using defined values to do its work.
339
+ return value
340
+ end
366
341
 
367
- raise ArgumentError, str
368
- end
342
+ # We convert to a string and then a symbol so that things like
343
+ # booleans work as we expect.
344
+ intern = value.to_s.intern
345
+
346
+ # If it's a valid value, always return it as a symbol.
347
+ if self.class.values.include?(intern)
348
+ retval = intern
349
+ elsif other = self.class.alias(intern)
350
+ retval = other
351
+ elsif ary = self.class.match?(value)
352
+ retval = value
353
+ else
354
+ # If it passed the validation but is not a registered value,
355
+ # we just return it as is.
356
+ retval = value
369
357
  end
370
358
 
371
- def remove
372
- @parent = nil
359
+ retval
360
+ end
361
+
362
+ # Verify that the passed value is valid.
363
+ validate do |value|
364
+ vals = self.class.values
365
+ regs = self.class.regexes
366
+
367
+ if regs.is_a? Hash # this is true on properties
368
+ regs = regs.keys
369
+ end
370
+ if vals.empty? and regs.empty?
371
+ # This parameter isn't using defined values to do its work.
372
+ return
373
+ end
374
+ newval = value
375
+ unless value.is_a?(Symbol)
376
+ newval = value.to_s.intern
373
377
  end
374
378
 
375
- # This should only be called for parameters, but go ahead and make
376
- # it possible to call for states, too.
377
- def value
378
- if self.is_a?(Puppet::State)
379
- # We should return the 'is' value if there's not 'should'
380
- # value. This might be bad, though, because the 'should'
381
- # method knows whether to return an array or not and that info
382
- # is not exposed, and the 'is' value could be a symbol. I
383
- # can't seem to create a test in which this is a problem, but
384
- # that doesn't mean it's not one.
385
- if self.should
386
- return self.should
387
- else
388
- return self.is
379
+ unless vals.include?(newval) or
380
+ self.class.alias(newval) or
381
+ self.class.match?(value) # We match the string, not the symbol
382
+ str = "Invalid '%s' value %s. " %
383
+ [self.class.name, value.inspect]
384
+
385
+ unless vals.empty?
386
+ str += "Valid values are %s. " % vals.join(", ")
389
387
  end
390
- else
391
- if defined? @value
392
- return @value
393
- else
394
- return nil
388
+
389
+ unless regs.empty?
390
+ str += "Valid values match %s." % regs.collect { |r|
391
+ r.to_s
392
+ }.join(", ")
395
393
  end
396
- end
394
+
395
+ raise ArgumentError, str
397
396
  end
397
+ end
398
398
 
399
- # Store the value provided. All of the checking should possibly be
400
- # late-binding (e.g., users might not exist when the value is assigned
401
- # but might when it is asked for).
402
- def value=(value)
403
- # If we're a parameter, just hand the processing off to the should
404
- # method.
405
- if self.is_a?(Puppet::State)
406
- return self.should = value
399
+ def remove
400
+ @parent = nil
401
+ @shadow = nil
402
+ end
403
+
404
+ # This should only be called for parameters, but go ahead and make
405
+ # it possible to call for properties, too.
406
+ def value
407
+ if self.is_a?(Puppet::Property)
408
+ # We should return the 'is' value if there's not 'should'
409
+ # value. This might be bad, though, because the 'should'
410
+ # method knows whether to return an array or not and that info
411
+ # is not exposed, and the 'is' value could be a symbol. I
412
+ # can't seem to create a test in which this is a problem, but
413
+ # that doesn't mean it's not one.
414
+ if self.should
415
+ return self.should
416
+ else
417
+ return self.is
407
418
  end
408
- if respond_to?(:validate)
409
- validate(value)
419
+ else
420
+ if defined? @value
421
+ return @value
422
+ else
423
+ return nil
410
424
  end
425
+ end
426
+ end
411
427
 
412
- if respond_to?(:munge)
413
- value = munge(value)
414
- end
415
- @value = value
428
+ # Store the value provided. All of the checking should possibly be
429
+ # late-binding (e.g., users might not exist when the value is assigned
430
+ # but might when it is asked for).
431
+ def value=(value)
432
+ # If we're a parameter, just hand the processing off to the should
433
+ # method.
434
+ if self.is_a?(Puppet::Property)
435
+ return self.should = value
436
+ end
437
+ if respond_to?(:validate)
438
+ validate(value)
416
439
  end
417
440
 
418
- def inspect
419
- s = "Parameter(%s = %s" % [self.name, self.value || "nil"]
420
- if defined? @parent
421
- s += ", @parent = %s)" % @parent
422
- else
423
- s += ")"
424
- end
441
+ if respond_to?(:munge)
442
+ value = munge(value)
425
443
  end
444
+ @value = value
445
+ end
426
446
 
427
- def to_s
428
- s = "Parameter(%s)" % self.name
447
+ def inspect
448
+ s = "Parameter(%s = %s" % [self.name, self.value || "nil"]
449
+ if defined? @parent
450
+ s += ", @parent = %s)" % @parent
451
+ else
452
+ s += ")"
429
453
  end
430
454
  end
455
+
456
+ # Retrieve the parent's provider. Some types don't have providers, in which
457
+ # case we return the parent object itself.
458
+ def provider
459
+ @parent.provider || @parent
460
+ end
461
+
462
+ # If there's a shadowing metaparam, instantiate it now.
463
+ # This allows us to create a property or parameter with the
464
+ # same name as a metaparameter, and the metaparam will only be
465
+ # stored as a shadow.
466
+ def setup_shadow(klass)
467
+ @shadow = klass.new(:parent => self.parent)
468
+ end
469
+
470
+ def to_s
471
+ s = "Parameter(%s)" % self.name
472
+ end
431
473
  end
474
+
475
+ # $Id: parameter.rb 2414 2007-04-25 20:59:00Z luke $