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
@@ -1,9 +1,9 @@
1
1
  # unlike the other client classes (again, this design sucks) this class
2
2
  # is basically just a proxy class -- it calls its methods on the driver
3
3
  # and that's about it
4
- class Puppet::Client::ProxyClient < Puppet::Client
4
+ class Puppet::Network::Client::ProxyClient < Puppet::Network::Client
5
5
  def self.mkmethods
6
- interface = @handler.interface
6
+ interface = self.handler.interface
7
7
  namespace = interface.prefix
8
8
 
9
9
 
@@ -25,4 +25,4 @@ class Puppet::Client::ProxyClient < Puppet::Client
25
25
  end
26
26
  end
27
27
 
28
- # $Id: proxy.rb 1145 2006-04-28 04:08:38Z luke $
28
+ # $Id: proxy.rb 2259 2007-03-06 19:03:05Z luke $
@@ -1,12 +1,9 @@
1
- class Puppet::Client::Reporter < Puppet::Client
2
- @drivername = :Report
3
-
4
- # set up the appropriate interface methods
5
- @handler = Puppet::Server::Report
1
+ class Puppet::Network::Client::Report < Puppet::Network::Client
2
+ @handler = Puppet::Network::Handler.handler(:report)
6
3
 
7
4
  def initialize(hash = {})
8
5
  if hash.include?(:Report)
9
- hash[:Report] = Puppet::Server::Report.new()
6
+ hash[:Report] = self.class.handler.new
10
7
  end
11
8
 
12
9
  super(hash)
@@ -31,4 +28,4 @@ class Puppet::Client::Reporter < Puppet::Client
31
28
  end
32
29
  end
33
30
 
34
- # $Id: reporter.rb 1422 2006-07-22 03:32:56Z luke $
31
+ # $Id: report.rb 2259 2007-03-06 19:03:05Z luke $
@@ -1,17 +1,14 @@
1
- class Puppet::Client::PElement < Puppet::Client
2
- @drivername = :PElementServer
3
-
4
- @handler = Puppet::Server::PElement
5
-
1
+ # The client for interacting with remote Puppet agents to query and modify
2
+ # remote system state.
3
+ class Puppet::Network::Client::Resource < Puppet::Network::Client
6
4
  def apply(bucket)
7
-
8
5
  case bucket
9
6
  when Puppet::TransObject
10
7
  tmp = Puppet::TransBucket.new
11
8
  tmp.push bucket
12
9
  bucket = tmp
13
10
  bucket.name = Facter["hostname"].value
14
- bucket.type = "pelement"
11
+ bucket.type = "resource"
15
12
  when Puppet::TransBucket
16
13
  # nothing
17
14
  else
@@ -28,7 +25,7 @@ class Puppet::Client::PElement < Puppet::Client
28
25
  end
29
26
 
30
27
  def describe(type, name, retrieve = false, ignore = false)
31
- Puppet.info "Describing %s[%s]" % [type, name]
28
+ Puppet.info "Describing %s[%s]" % [type.to_s.capitalize, name]
32
29
  text = @driver.describe(type, name, retrieve, ignore, "yaml")
33
30
 
34
31
  object = nil
@@ -41,16 +38,6 @@ class Puppet::Client::PElement < Puppet::Client
41
38
  return object
42
39
  end
43
40
 
44
- def initialize(hash = {})
45
- if hash.include?(:PElementServer)
46
- unless hash[:PElementServer].is_a?(Puppet::Server::PElement)
47
- raise Puppet::DevError, "Must pass an actual PElement server object"
48
- end
49
- end
50
-
51
- super(hash)
52
- end
53
-
54
41
  def list(type, ignore = false, base = false)
55
42
  bucket = @driver.list(type, ignore, base, "yaml")
56
43
 
@@ -62,4 +49,4 @@ class Puppet::Client::PElement < Puppet::Client
62
49
  end
63
50
  end
64
51
 
65
- # $Id: pelement.rb 1145 2006-04-28 04:08:38Z luke $
52
+ # $Id: resource.rb 2259 2007-03-06 19:03:05Z luke $
@@ -0,0 +1,13 @@
1
+ class Puppet::Network::Client::Runner < Puppet::Network::Client::ProxyClient
2
+ self.mkmethods
3
+
4
+ def initialize(hash = {})
5
+ if hash.include?(:Runner)
6
+ hash[:Runner] = self.class.handler.new()
7
+ end
8
+
9
+ super(hash)
10
+ end
11
+ end
12
+
13
+ # $Id: runner.rb 2259 2007-03-06 19:03:05Z luke $
@@ -0,0 +1,5 @@
1
+ class Puppet::Network::Client::Status < Puppet::Network::Client::ProxyClient
2
+ self.mkmethods
3
+ end
4
+
5
+ # $Id: status.rb 2259 2007-03-06 19:03:05Z luke $
@@ -0,0 +1,32 @@
1
+ module Puppet::Network # :nodoc:
2
+ # A struct-like class for passing around a client request. It's mostly
3
+ # just used for validation and authorization.
4
+ class ClientRequest
5
+ attr_accessor :name, :ip, :authenticated, :handler, :method
6
+
7
+ def authenticated?
8
+ self.authenticated
9
+ end
10
+
11
+ # A common way of talking about the full call. Individual servers
12
+ # are responsible for setting the values correctly, but this common
13
+ # format makes it possible to check rights.
14
+ def call
15
+ unless handler and method
16
+ raise ArgumentError, "Request is not set up; cannot build call"
17
+ end
18
+
19
+ [handler, method].join(".")
20
+ end
21
+
22
+ def initialize(name, ip, authenticated)
23
+ @name, @ip, @authenticated = name, ip, authenticated
24
+ end
25
+
26
+ def to_s
27
+ "%s(%s)" % [self.name, self.ip]
28
+ end
29
+ end
30
+ end
31
+
32
+ # $Id: client_request.rb 2259 2007-03-06 19:03:05Z luke $
@@ -0,0 +1,33 @@
1
+ require 'puppet/util/subclass_loader'
2
+
3
+ module Puppet::Network
4
+ # The base class for the different handlers. The handlers are each responsible
5
+ # for separate xmlrpc namespaces.
6
+ class Handler
7
+ # This is so that the handlers can subclass just 'Handler', rather
8
+ # then having to specify the full class path.
9
+ Handler = self
10
+ attr_accessor :server
11
+
12
+ extend Puppet::Util::SubclassLoader
13
+ extend Puppet::Util
14
+
15
+ handle_subclasses :handler, "puppet/network/handler"
16
+
17
+ # Return the xmlrpc interface.
18
+ def self.interface
19
+ if defined? @interface
20
+ return @interface
21
+ else
22
+ raise Puppet::DevError, "Handler %s has no defined interface" %
23
+ self
24
+ end
25
+ end
26
+
27
+ # Create an empty init method with the same signature.
28
+ def initialize(hash = {})
29
+ end
30
+ end
31
+ end
32
+
33
+ # $Id: handler.rb 2259 2007-03-06 19:03:05Z luke $
@@ -6,9 +6,7 @@ require 'xmlrpc/server'
6
6
  # Much of this was taken from QuickCert:
7
7
  # http://segment7.net/projects/ruby/QuickCert/
8
8
 
9
- module Puppet
10
- class Server
11
- class CAError < Puppet::Error; end
9
+ class Puppet::Network::Handler
12
10
  class CA < Handler
13
11
  attr_reader :ca
14
12
 
@@ -44,9 +42,11 @@ class Server
44
42
  end
45
43
  return false
46
44
  end
47
- auth = Puppet::Server::AuthStore.new
45
+ auth = Puppet::Network::AuthStore.new
48
46
  File.open(autosign) { |f|
49
47
  f.each { |line|
48
+ next if line =~ /^\s*#/
49
+ next if line =~ /^\s*$/
50
50
  auth.allow(line.chomp)
51
51
  }
52
52
  }
@@ -148,6 +148,5 @@ class Server
148
148
  end
149
149
  end
150
150
  end
151
- end
152
151
 
153
- # $Id: ca.rb 1414 2006-07-21 15:20:44Z luke $
152
+ # $Id: ca.rb 2259 2007-03-06 19:03:05Z luke $
@@ -0,0 +1,180 @@
1
+ require 'fileutils'
2
+ require 'digest/md5'
3
+ require 'puppet/external/base64'
4
+
5
+ class Puppet::Network::Handler # :nodoc:
6
+ class BucketError < RuntimeError; end
7
+ # Accept files and store them by md5 sum, returning the md5 sum back
8
+ # to the client. Alternatively, accept an md5 sum and return the
9
+ # associated content.
10
+ class FileBucket < Handler
11
+ @interface = XMLRPC::Service::Interface.new("puppetbucket") { |iface|
12
+ iface.add_method("string addfile(string, string)")
13
+ iface.add_method("string getfile(string)")
14
+ }
15
+
16
+ Puppet::Util.logmethods(self, true)
17
+ attr_reader :name, :path
18
+
19
+ # this doesn't work for relative paths
20
+ def self.oldpaths(base,md5)
21
+ return [
22
+ File.join(base, md5),
23
+ File.join(base, md5, "contents"),
24
+ File.join(base, md5, "paths")
25
+ ]
26
+ end
27
+
28
+ # this doesn't work for relative paths
29
+ def self.paths(base,md5)
30
+ dir = File.join(md5[0..7].split(""))
31
+ basedir = File.join(base, dir, md5)
32
+ return [
33
+ basedir,
34
+ File.join(basedir, "contents"),
35
+ File.join(basedir, "paths")
36
+ ]
37
+ end
38
+
39
+ # Should we check each file as it comes in to make sure the md5
40
+ # sums match? Defaults to false.
41
+ def conflict_check?
42
+ @confictchk
43
+ end
44
+
45
+ def initialize(hash)
46
+ if hash.include?(:ConflictCheck)
47
+ @conflictchk = hash[:ConflictCheck]
48
+ hash.delete(:ConflictCheck)
49
+ else
50
+ @conflictchk = false
51
+ end
52
+
53
+ if hash.include?(:Path)
54
+ @path = hash[:Path]
55
+ hash.delete(:Path)
56
+ else
57
+ if defined? Puppet
58
+ @path = Puppet[:bucketdir]
59
+ else
60
+ @path = File.expand_path("~/.filebucket")
61
+ end
62
+ end
63
+
64
+ Puppet.config.use(:filebucket)
65
+
66
+ @name = "Filebucket[#{@path}]"
67
+ end
68
+
69
+ # Accept a file from a client and store it by md5 sum, returning
70
+ # the sum.
71
+ def addfile(contents, path, client = nil, clientip = nil)
72
+ if client
73
+ contents = Base64.decode64(contents)
74
+ end
75
+ md5 = Digest::MD5.hexdigest(contents)
76
+
77
+ bpath, bfile, pathpath = FileBucket.paths(@path,md5)
78
+
79
+ # If the file already exists, just return the md5 sum.
80
+ if FileTest.exists?(bfile)
81
+ # If verification is enabled, then make sure the text matches.
82
+ if conflict_check?
83
+ verify(contents, md5, bfile)
84
+ end
85
+ return md5
86
+ end
87
+
88
+ # Make the directories if necessary.
89
+ unless FileTest.directory?(bpath)
90
+ Puppet::Util.withumask(0007) do
91
+ FileUtils.mkdir_p(bpath)
92
+ end
93
+ end
94
+
95
+ # Write the file to disk.
96
+ msg = "Adding %s(%s)" % [path, md5]
97
+ msg += " from #{client}" if client
98
+ self.info msg
99
+
100
+ # ...then just create the file
101
+ Puppet::Util.withumask(0007) do
102
+ File.open(bfile, File::WRONLY|File::CREAT, 0440) { |of|
103
+ of.print contents
104
+ }
105
+ end
106
+
107
+ # Write the path to the paths file.
108
+ add_path(path, pathpath)
109
+
110
+ return md5
111
+ end
112
+
113
+ # Return the contents associated with a given md5 sum.
114
+ def getfile(md5, client = nil, clientip = nil)
115
+ bpath, bfile, bpaths = FileBucket.paths(@path,md5)
116
+
117
+ unless FileTest.exists?(bfile)
118
+ # Try the old flat style.
119
+ bpath, bfile, bpaths = FileBucket.oldpaths(@path,md5)
120
+ unless FileTest.exists?(bfile)
121
+ return false
122
+ end
123
+ end
124
+
125
+ contents = nil
126
+ File.open(bfile) { |of|
127
+ contents = of.read
128
+ }
129
+
130
+ if client
131
+ return Base64.encode64(contents)
132
+ else
133
+ return contents
134
+ end
135
+ end
136
+
137
+ def paths(md5)
138
+ self.class(@path, md5)
139
+ end
140
+
141
+ def to_s
142
+ self.name
143
+ end
144
+
145
+ private
146
+
147
+ # Add our path to the paths file if necessary.
148
+ def add_path(path, file)
149
+ if FileTest.exists?(file)
150
+ File.open(file) { |of|
151
+ return if of.readlines.collect { |l| l.chomp }.include?(path)
152
+ }
153
+ end
154
+
155
+ # if it's a new file, or if our path isn't in the file yet, add it
156
+ File.open(file, File::WRONLY|File::CREAT|File::APPEND) { |of|
157
+ of.puts path
158
+ }
159
+ end
160
+
161
+ # If conflict_check is enabled, verify that the passed text is
162
+ # the same as the text in our file.
163
+ def verify(content, md5, bfile)
164
+ curfile = File.read(bfile)
165
+
166
+ # If the contents don't match, then we've found a conflict.
167
+ # Unlikely, but quite bad.
168
+ if curfile != contents
169
+ raise(BucketError,
170
+ "Got passed new contents for sum %s" % md5, caller)
171
+ else
172
+ msg = "Got duplicate %s(%s)" % [path, md5]
173
+ msg += " from #{client}" if client
174
+ self.info msg
175
+ end
176
+ end
177
+ end
178
+ end
179
+
180
+ # $Id: filebucket.rb 2348 2007-03-24 21:16:20Z luke $
@@ -1,75 +1,59 @@
1
1
  require 'puppet'
2
+ require 'puppet/network/authstore'
2
3
  require 'webrick/httpstatus'
3
4
  require 'cgi'
5
+ require 'delegate'
4
6
 
5
- module Puppet
6
- class FileServerError < Puppet::Error; end
7
- class Server
7
+ class Puppet::Network::Handler
8
+ class FileServerError < Puppet::Error; end
8
9
  class FileServer < Handler
9
10
  attr_accessor :local
10
11
 
11
- Puppet.setdefaults("fileserver",
12
- :fileserverconfig => ["$confdir/fileserver.conf",
13
- "Where the fileserver configuration is stored."])
14
-
15
- #CHECKPARAMS = %w{checksum type mode owner group}
16
12
  CHECKPARAMS = [:mode, :type, :owner, :group, :checksum]
17
13
 
14
+ # Special filserver module for puppet's module system
15
+ MODULES = "modules"
16
+
18
17
  @interface = XMLRPC::Service::Interface.new("fileserver") { |iface|
19
18
  iface.add_method("string describe(string, string)")
20
19
  iface.add_method("string list(string, string, boolean, array)")
21
20
  iface.add_method("string retrieve(string, string)")
22
21
  }
23
22
 
24
- def authcheck(file, mount, client, clientip)
25
- unless mount.allowed?(client, clientip)
26
- mount.warning "%s cannot access %s" %
27
- [client, file]
28
- raise Puppet::Server::AuthorizationError, "Cannot access %s" % mount
29
- end
23
+ def self.params
24
+ CHECKPARAMS.dup
30
25
  end
31
26
 
32
27
  # Describe a given file. This returns all of the manageable aspects
33
28
  # of that file.
34
- def describe(file, links = :ignore, client = nil, clientip = nil)
35
- readconfig
36
-
29
+ def describe(url, links = :ignore, client = nil, clientip = nil)
37
30
  links = links.intern if links.is_a? String
38
31
 
39
32
  if links == :manage
40
- raise Puppet::FileServerError, "Cannot currently copy links"
33
+ raise Puppet::Network::Handler::FileServerError, "Cannot currently copy links"
41
34
  end
42
35
 
43
- mount, path = splitpath(file)
44
-
45
- authcheck(file, mount, client, clientip)
36
+ mount, path = convert(url, client, clientip)
46
37
 
47
38
  if client
48
- mount.debug "Describing %s for %s" % [file, client]
49
- end
50
-
51
- sdir = nil
52
- unless sdir = subdir(mount, path)
53
- mount.notice "Could not find subdirectory %s" %
54
- "//%s/%s" % [mount, path]
55
- return ""
39
+ mount.debug "Describing %s for %s" % [url, client]
56
40
  end
57
41
 
58
42
  obj = nil
59
- unless obj = mount.check(sdir, links)
43
+ unless obj = mount.check(path, links)
60
44
  return ""
61
45
  end
62
46
 
63
47
  desc = []
64
48
  CHECKPARAMS.each { |check|
65
- if state = obj.state(check)
66
- unless state.is
49
+ if property = obj.property(check)
50
+ unless property.is
67
51
  mount.debug "Manually retrieving info for %s" % check
68
- state.retrieve
52
+ property.retrieve
69
53
  end
70
- desc << state.is
54
+ desc << property.is
71
55
  else
72
- if check == "checksum" and obj.state(:type).is == "file"
56
+ if check == "checksum" and obj.property(:type).is == "file"
73
57
  mount.notice "File %s does not have data for %s" %
74
58
  [obj.name, check]
75
59
  end
@@ -80,16 +64,6 @@ class Server
80
64
  return desc.join("\t")
81
65
  end
82
66
 
83
- # Deal with ignore parameters.
84
- def handleignore(children, path, ignore)
85
- ignore.each { |ignore|
86
- Dir.glob(File.join(path,ignore), File::FNM_DOTMATCH) { |match|
87
- children.delete(File.basename(match))
88
- }
89
- }
90
- return children
91
- end
92
-
93
67
  # Create a new fileserving module.
94
68
  def initialize(hash = {})
95
69
  @mounts = {}
@@ -104,14 +78,12 @@ class Server
104
78
  if hash[:Config] == false
105
79
  @noreadconfig = true
106
80
  else
107
- @config = hash[:Config] || Puppet[:fileserverconfig]
81
+ @config = Puppet::Util::LoadedFile.new(
82
+ hash[:Config] || Puppet[:fileserverconfig]
83
+ )
108
84
  @noreadconfig = false
109
85
  end
110
86
 
111
- @configtimeout = hash[:ConfigTimeout] || 60
112
- @configstamp = nil
113
- @congigstatted = nil
114
-
115
87
  if hash.include?(:Mount)
116
88
  @passedconfig = true
117
89
  unless hash[:Mount].is_a?(Hash)
@@ -126,35 +98,26 @@ class Server
126
98
  }
127
99
  else
128
100
  @passedconfig = false
129
- readconfig
101
+ readconfig(false) # don't check the file the first time.
130
102
  end
131
103
  end
132
104
 
133
105
  # List a specific directory's contents.
134
- def list(dir, links = :ignore, recurse = false, ignore = false, client = nil, clientip = nil)
135
- readconfig
136
- mount, path = splitpath(dir)
137
-
138
- authcheck(dir, mount, client, clientip)
106
+ def list(url, links = :ignore, recurse = false, ignore = false, client = nil, clientip = nil)
107
+ mount, path = convert(url, client, clientip)
139
108
 
140
109
  if client
141
- mount.debug "Listing %s for %s" % [dir, client]
142
- end
143
-
144
- subdir = nil
145
- unless subdir = subdir(mount, path)
146
- mount.notice "Could not find subdirectory %s" %
147
- "%s:%s" % [mount, path]
148
- return ""
110
+ mount.debug "Listing %s for %s" % [url, client]
149
111
  end
150
112
 
151
113
  obj = nil
152
- unless FileTest.exists?(subdir)
114
+ unless FileTest.exists?(path)
153
115
  return ""
154
116
  end
155
117
 
156
- rmdir = expand_mount(dir, mount)
157
- desc = reclist(mount, rmdir, subdir, recurse, ignore)
118
+ # We pass two paths here, but reclist internally changes one
119
+ # of the arguments when called internally.
120
+ desc = reclist(mount, path, path, recurse, ignore)
158
121
 
159
122
  if desc.length == 0
160
123
  mount.notice "Got no information on //%s/%s" %
@@ -166,6 +129,10 @@ class Server
166
129
  sub.join("\t")
167
130
  }.join("\n")
168
131
  end
132
+
133
+ def local?
134
+ self.local
135
+ end
169
136
 
170
137
  # Mount a new directory with a name.
171
138
  def mount(path, name)
@@ -179,51 +146,118 @@ class Server
179
146
  end
180
147
  end
181
148
 
182
- if FileTest.directory?(path)
183
- if FileTest.readable?(path)
184
- @mounts[name] = Mount.new(name, path)
185
- @mounts[name].info "Mounted %s" % path
186
- else
187
- raise FileServerError, "%s is not readable" % path
188
- end
149
+ # Let the mounts do their own error-checking.
150
+ @mounts[name] = Mount.new(name, path)
151
+ @mounts[name].info "Mounted %s" % path
152
+
153
+ return @mounts[name]
154
+ end
155
+
156
+ # Retrieve a file from the local disk and pass it to the remote
157
+ # client.
158
+ def retrieve(url, links = :ignore, client = nil, clientip = nil)
159
+ links = links.intern if links.is_a? String
160
+
161
+ mount, path = convert(url, client, clientip)
162
+
163
+ if client
164
+ mount.info "Sending %s to %s" % [url, client]
165
+ end
166
+
167
+ unless FileTest.exists?(path)
168
+ return ""
169
+ end
170
+
171
+ links = links.intern if links.is_a? String
172
+
173
+ if links == :ignore and FileTest.symlink?(path)
174
+ return ""
175
+ end
176
+
177
+ str = nil
178
+ if links == :manage
179
+ raise Puppet::Error, "Cannot copy links yet."
189
180
  else
190
- raise FileServerError, "%s is not a directory" % path
181
+ str = File.read(path)
182
+ end
183
+
184
+ if @local
185
+ return str
186
+ else
187
+ return CGI.escape(str)
188
+ end
189
+ end
190
+
191
+ def umount(name)
192
+ @mounts.delete(name) if @mounts.include? name
193
+ end
194
+
195
+ private
196
+
197
+ def authcheck(file, mount, client, clientip)
198
+ # If we're local, don't bother passing in information.
199
+ if local?
200
+ client = nil
201
+ clientip = nil
202
+ end
203
+ unless mount.allowed?(client, clientip)
204
+ mount.warning "%s cannot access %s" %
205
+ [client, file]
206
+ raise Puppet::AuthorizationError, "Cannot access %s" % mount
191
207
  end
192
208
  end
193
209
 
210
+ def convert(url, client, clientip)
211
+ readconfig
212
+
213
+ url = URI.unescape(url)
214
+
215
+ mount, stub = splitpath(url, client)
216
+
217
+ authcheck(url, mount, client, clientip)
218
+
219
+ path = nil
220
+ unless path = mount.subdir(stub, client)
221
+ mount.notice "Could not find subdirectory %s" %
222
+ "//%s/%s" % [mount, stub]
223
+ return ""
224
+ end
225
+
226
+ return mount, path
227
+ end
228
+
229
+ # Deal with ignore parameters.
230
+ def handleignore(children, path, ignore)
231
+ ignore.each { |ignore|
232
+ Dir.glob(File.join(path,ignore), File::FNM_DOTMATCH) { |match|
233
+ children.delete(File.basename(match))
234
+ }
235
+ }
236
+ return children
237
+ end
238
+
194
239
  # Read the configuration file.
195
- def readconfig
240
+ def readconfig(check = true)
196
241
  return if @noreadconfig
197
242
 
198
- if @configstamp and FileTest.exists?(@config)
199
- if @configtimeout and @configstatted
200
- if Time.now - @configstatted > @configtimeout
201
- @configstatted = Time.now
202
- tmp = File.stat(@config).ctime
203
-
204
- if tmp == @configstamp
205
- return
206
- end
207
- else
208
- return
209
- end
210
- end
243
+ if check and ! @config.changed?
244
+ return
211
245
  end
212
246
 
213
247
  newmounts = {}
214
248
  begin
215
- File.open(@config) { |f|
249
+ File.open(@config.file) { |f|
216
250
  mount = nil
217
251
  count = 1
218
252
  f.each { |line|
219
253
  case line
220
254
  when /^\s*#/: next # skip comments
221
255
  when /^\s*$/: next # skip blank lines
222
- when /\[(\w+)\]/:
256
+ when /\[([-\w]+)\]/:
223
257
  name = $1
224
258
  if newmounts.include?(name)
225
259
  raise FileServerError, "%s is already mounted at %s" %
226
- [newmounts[name], name]
260
+ [newmounts[name], name], count, @config.file
227
261
  end
228
262
  mount = Mount.new(name)
229
263
  newmounts[name] = mount
@@ -232,12 +266,16 @@ class Server
232
266
  value = $2
233
267
  case var
234
268
  when "path":
235
- begin
236
- mount.path = value
237
- rescue FileServerError => detail
238
- Puppet.err "Removing mount %s: %s" %
239
- [mount.name, detail]
240
- newmounts.delete(mount.name)
269
+ if mount.name == MODULES
270
+ Puppet.warning "The '#{MODULES}' module can not have a path. Ignoring attempt to set it"
271
+ else
272
+ begin
273
+ mount.path = value
274
+ rescue FileServerError => detail
275
+ Puppet.err "Removing mount %s: %s" %
276
+ [mount.name, detail]
277
+ newmounts.delete(mount.name)
278
+ end
241
279
  end
242
280
  when "allow":
243
281
  value.split(/\s*,\s*/).each { |val|
@@ -245,8 +283,8 @@ class Server
245
283
  mount.info "allowing %s access" % val
246
284
  mount.allow(val)
247
285
  rescue AuthStoreError => detail
248
- raise FileServerError, "%s at line %s of %s" %
249
- [detail.to_s, count, @config]
286
+ raise FileServerError.new(detail.to_s,
287
+ count, @config.file)
250
288
  end
251
289
  }
252
290
  when "deny":
@@ -255,16 +293,17 @@ class Server
255
293
  mount.info "denying %s access" % val
256
294
  mount.deny(val)
257
295
  rescue AuthStoreError => detail
258
- raise FileServerError, "%s at line %s of %s" %
259
- [detail.to_s, count, @config]
296
+ raise FileServerError.new(detail.to_s,
297
+ count, @config.file)
260
298
  end
261
299
  }
262
300
  else
263
- raise FileServerError,
264
- "Invalid argument '%s' at line %s" % [var, count]
301
+ raise FileServerError.new("Invalid argument '%s'" % var,
302
+ count, @config.file)
265
303
  end
266
304
  else
267
- raise FileServerError, "Invalid line %s: %s" % [count, line]
305
+ raise FileServerError.new("Invalid line '%s'" % line.chomp,
306
+ count, @config.file)
268
307
  end
269
308
  count += 1
270
309
  }
@@ -280,72 +319,22 @@ class Server
280
319
  # Puppet.err "FileServer error: %s" % detail
281
320
  end
282
321
 
322
+ unless newmounts[MODULES]
323
+ mount = Mount.new(MODULES)
324
+ mount.allow("*")
325
+ newmounts[MODULES] = mount
326
+ end
327
+
283
328
  # Verify each of the mounts are valid.
284
329
  # We let the check raise an error, so that it can raise an error
285
330
  # pointing to the specific problem.
286
331
  newmounts.each { |name, mount|
287
- mount.valid?
332
+ unless mount.valid?
333
+ raise FileServerError, "No path specified for mount %s" %
334
+ name
335
+ end
288
336
  }
289
337
  @mounts = newmounts
290
-
291
- @configstamp = File.stat(@config).ctime
292
- @configstatted = Time.now
293
- end
294
-
295
- # Retrieve a file from the local disk and pass it to the remote
296
- # client.
297
- def retrieve(file, links = :ignore, client = nil, clientip = nil)
298
- readconfig
299
- links = links.intern if links.is_a? String
300
- mount, path = splitpath(file)
301
-
302
- authcheck(file, mount, client, clientip)
303
-
304
- if client
305
- mount.info "Sending %s to %s" % [file, client]
306
- end
307
-
308
- fpath = nil
309
- if path
310
- fpath = File.join(mount.path, path)
311
- else
312
- fpath = mount.path
313
- end
314
-
315
- unless FileTest.exists?(fpath)
316
- return ""
317
- end
318
-
319
- links = links.intern if links.is_a? String
320
-
321
- if links == :ignore and FileTest.symlink?(fpath)
322
- return ""
323
- end
324
-
325
- str = nil
326
- if links == :manage
327
- raise Puppet::Error, "Cannot copy links yet."
328
- else
329
- str = File.read(fpath)
330
- end
331
-
332
- if @local
333
- return str
334
- else
335
- return CGI.escape(str)
336
- end
337
- end
338
-
339
- private
340
-
341
- # Convert from the '/mount/path' form to the real path on disk.
342
- def expand_mount(name, mount)
343
- # Note that the user could have passed a path with multiple /'s
344
- # in it, and we are likely to result in multiples, so we have to
345
- # get rid of all of them.
346
- name.sub(/\/#{mount.name}/, mount.path).gsub(%r{/+}, '/').sub(
347
- %r{/$}, ''
348
- )
349
338
  end
350
339
 
351
340
  # Recursively list the directory. FIXME This should be using
@@ -390,26 +379,23 @@ class Server
390
379
  end
391
380
 
392
381
  # Split the path into the separate mount point and path.
393
- def splitpath(dir)
382
+ def splitpath(dir, client)
394
383
  # the dir is based on one of the mounts
395
384
  # so first retrieve the mount path
396
385
  mount = nil
397
386
  path = nil
398
- if dir =~ %r{/(\w+)/?}
399
- mount = $1
400
- path = dir.sub(%r{/#{mount}/?}, '')
401
-
402
- unless @mounts.include?(mount)
403
- raise FileServerError, "Fileserver module '%s' not mounted" % mount
404
- end
387
+ if dir =~ %r{/([-\w]+)/?}
388
+ tmp = $1
389
+ path = dir.sub(%r{/#{tmp}/?}, '')
405
390
 
406
- unless @mounts[mount].path
407
- raise FileServerError,
408
- "Fileserver error: Mount '%s' does not have a path set" % mount
391
+ mod = Puppet::Module::find(tmp)
392
+ if mod
393
+ mount = @mounts[MODULES].copy(mod, mod.files)
394
+ else
395
+ unless mount = @mounts[tmp]
396
+ raise FileServerError, "Fileserver module '%s' not mounted" % tmp
397
+ end
409
398
  end
410
-
411
- # And now replace the name with the actual object.
412
- mount = @mounts[mount]
413
399
  else
414
400
  raise FileServerError, "Fileserver error: Invalid path '%s'" % dir
415
401
  end
@@ -424,20 +410,6 @@ class Server
424
410
  return mount, path
425
411
  end
426
412
 
427
- # Retrieve a specific directory relative to a mount point.
428
- def subdir(mount, dir)
429
- basedir = mount.path
430
-
431
- dirname = nil
432
- if dir
433
- dirname = File.join(basedir, dir.split("/").join(File::SEPARATOR))
434
- else
435
- dirname = basedir
436
- end
437
-
438
- dirname
439
- end
440
-
441
413
  def to_s
442
414
  "fileserver"
443
415
  end
@@ -445,8 +417,8 @@ class Server
445
417
  # A simple class for wrapping mount points. Instances of this class
446
418
  # don't know about the enclosing object; they're mainly just used for
447
419
  # authorization.
448
- class Mount < AuthStore
449
- attr_reader :path, :name
420
+ class Mount < Puppet::Network::AuthStore
421
+ attr_reader :name
450
422
 
451
423
  Puppet::Util.logmethods(self, true)
452
424
 
@@ -475,9 +447,50 @@ class Server
475
447
  return obj
476
448
  end
477
449
 
478
- # Create out orbject. It must have a name.
450
+ # Create a map for a specific client.
451
+ def clientmap(client)
452
+ {
453
+ "h" => client.sub(/\..*$/, ""),
454
+ "H" => client,
455
+ "d" => client.sub(/[^.]+\./, "") # domain name
456
+ }
457
+ end
458
+
459
+ # Replace % patterns as appropriate.
460
+ def expand(path, client = nil)
461
+ # This map should probably be moved into a method.
462
+ map = nil
463
+
464
+ if client
465
+ map = clientmap(client)
466
+ else
467
+ Puppet.notice "No client; expanding '%s' with local host" %
468
+ path
469
+ # Else, use the local information
470
+ map = localmap()
471
+ end
472
+ path.gsub(/%(.)/) do |v|
473
+ key = $1
474
+ if key == "%"
475
+ "%"
476
+ else
477
+ map[key] || v
478
+ end
479
+ end
480
+ end
481
+
482
+ # Do we have any patterns in our path, yo?
483
+ def expandable?
484
+ if defined? @expandable
485
+ @expandable
486
+ else
487
+ false
488
+ end
489
+ end
490
+
491
+ # Create out object. It must have a name.
479
492
  def initialize(name, path = nil)
480
- unless name =~ %r{^\w+$}
493
+ unless name =~ %r{^[-\w]+$}
481
494
  raise FileServerError, "Invalid name format '%s'" % name
482
495
  end
483
496
  @name = name
@@ -488,12 +501,6 @@ class Server
488
501
  @path = nil
489
502
  end
490
503
 
491
- @comp = Puppet.type(:component).create(
492
- :name => "mount[#{name}]"
493
- )
494
- #@comp.type = "mount"
495
- #@comp.name = name
496
-
497
504
  super()
498
505
  end
499
506
 
@@ -510,8 +517,6 @@ class Server
510
517
  :name => path,
511
518
  :check => CHECKPARAMS
512
519
  )
513
-
514
- @comp.push(obj)
515
520
  end
516
521
 
517
522
  if links == :manage
@@ -526,36 +531,89 @@ class Server
526
531
  return obj
527
532
  end
528
533
 
534
+ # Cache this manufactured map, since if it's used it's likely
535
+ # to get used a lot.
536
+ def localmap
537
+ unless defined? @@localmap
538
+ @@localmap = {
539
+ "h" => Facter.value("hostname"),
540
+ "H" => [Facter.value("hostname"),
541
+ Facter.value("domain")].join("."),
542
+ "d" => Facter.value("domain")
543
+ }
544
+ end
545
+ @@localmap
546
+ end
547
+
548
+ # Return the path as appropriate, expanding as necessary.
549
+ def path(client = nil)
550
+ if expandable?
551
+ return expand(@path, client)
552
+ else
553
+ return @path
554
+ end
555
+ end
556
+
529
557
  # Set the path.
530
558
  def path=(path)
531
- unless FileTest.exists?(path)
532
- raise FileServerError, "%s does not exist" % path
559
+ # FIXME: For now, just don't validate paths with replacement
560
+ # patterns in them.
561
+ if path =~ /%./
562
+ # Mark that we're expandable.
563
+ @expandable = true
564
+ else
565
+ unless FileTest.exists?(path)
566
+ raise FileServerError, "%s does not exist" % path
567
+ end
568
+ unless FileTest.directory?(path)
569
+ raise FileServerError, "%s is not a directory" % path
570
+ end
571
+ unless FileTest.readable?(path)
572
+ raise FileServerError, "%s is not readable" % path
573
+ end
574
+ @expandable = false
533
575
  end
534
576
  @path = path
535
577
  end
536
578
 
537
- def to_s
538
- #if @path
539
- # "mount[#{@name}]" + ":" + @path
540
- #else
541
- # "mount[#{@name}]"
542
- #end
543
- "mount[#{@name}]"
579
+ # Retrieve a specific directory relative to a mount point.
580
+ # If they pass in a client, then expand as necessary.
581
+ def subdir(dir = nil, client = nil)
582
+ basedir = self.path(client)
583
+
584
+ dirname = if dir
585
+ File.join(basedir, dir.split("/").join(File::SEPARATOR))
586
+ else
587
+ basedir
588
+ end
589
+
590
+ dirname
544
591
  end
545
592
 
546
- def type?(file)
593
+ def to_s
594
+ "mount[#{@name}]"
547
595
  end
548
596
 
549
597
  # Verify our configuration is valid. This should really check to
550
598
  # make sure at least someone will be allowed, but, eh.
551
599
  def valid?
552
- unless @path
553
- raise FileServerError, "No path specified"
600
+ if name == MODULES
601
+ return @path.nil?
602
+ else
603
+ return ! @path.nil?
554
604
  end
555
605
  end
606
+
607
+ # Return a new mount with the same properties as +self+, except
608
+ # with a different name and path.
609
+ def copy(name, path)
610
+ result = self.clone
611
+ result.path = path
612
+ result.instance_variable_set(:@name, name)
613
+ return result
614
+ end
556
615
  end
557
616
  end
558
617
  end
559
- end
560
618
 
561
- # $Id: fileserver.rb 1315 2006-06-27 05:15:51Z luke $
619
+ # $Id: fileserver.rb 2434 2007-04-30 15:57:57Z luke $