puppet 0.25.5 → 2.6.0

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 (1474) hide show
  1. data/CHANGELOG +667 -0
  2. data/LICENSE +2 -2
  3. data/README +5 -1
  4. data/README.queueing +1 -1
  5. data/README.rst +7 -4
  6. data/Rakefile +6 -18
  7. data/bin/filebucket +0 -94
  8. data/bin/pi +2 -47
  9. data/bin/puppet +2 -69
  10. data/bin/puppetca +2 -100
  11. data/bin/puppetd +2 -158
  12. data/bin/puppetdoc +2 -63
  13. data/bin/puppetmasterd +2 -64
  14. data/bin/puppetqd +2 -51
  15. data/bin/puppetrun +2 -127
  16. data/bin/ralsh +2 -87
  17. data/conf/epm.list +2 -2
  18. data/conf/osx/PackageInfo.plist +1 -1
  19. data/conf/redhat/client.init +11 -8
  20. data/conf/redhat/puppet.conf +1 -1
  21. data/conf/redhat/puppet.spec +1 -1
  22. data/conf/redhat/rundir-perms.patch +13 -13
  23. data/conf/redhat/server.init +11 -5
  24. data/conf/solaris/pkginfo +2 -2
  25. data/conf/solaris/smf/puppetd.xml +3 -3
  26. data/conf/solaris/smf/puppetmasterd.xml +3 -3
  27. data/conf/suse/client.init +3 -2
  28. data/conf/suse/puppet.spec +22 -18
  29. data/conf/suse/server.init +12 -11
  30. data/examples/modules/sample-module/README.txt +3 -3
  31. data/examples/modules/sample-module/lib/puppet/parser/functions/hostname_to_dn.rb +4 -4
  32. data/ext/extlookup.rb +94 -96
  33. data/ext/nagios/check_puppet.rb +94 -88
  34. data/ext/nagios/naggen +3 -3
  35. data/ext/puppet-test +27 -3
  36. data/ext/puppetlisten/puppetlisten.rb +39 -39
  37. data/ext/puppetlisten/puppetrun.rb +6 -6
  38. data/ext/puppetstoredconfigclean.rb +49 -43
  39. data/ext/pure_ruby_dsl/dsl_test.rb +7 -0
  40. data/ext/regexp_nodes/regexp_nodes.rb +133 -133
  41. data/ext/yaml_nodes.rb +99 -0
  42. data/install.rb +109 -118
  43. data/lib/puppet.rb +118 -131
  44. data/lib/puppet/agent.rb +86 -119
  45. data/lib/puppet/agent/locker.rb +28 -30
  46. data/lib/puppet/application.rb +276 -184
  47. data/lib/puppet/application/agent.rb +266 -0
  48. data/lib/puppet/application/apply.rb +165 -0
  49. data/lib/puppet/application/cert.rb +85 -0
  50. data/lib/puppet/application/describe.rb +203 -0
  51. data/lib/puppet/application/doc.rb +215 -0
  52. data/lib/puppet/application/filebucket.rb +73 -73
  53. data/lib/puppet/application/kick.rb +212 -0
  54. data/lib/puppet/application/master.rb +156 -0
  55. data/lib/puppet/application/queue.rb +91 -0
  56. data/lib/puppet/application/resource.rb +118 -0
  57. data/lib/puppet/configurer.rb +214 -197
  58. data/lib/puppet/configurer/downloader.rb +63 -63
  59. data/lib/puppet/configurer/fact_handler.rb +51 -51
  60. data/lib/puppet/configurer/plugin_handler.rb +19 -19
  61. data/lib/puppet/daemon.rb +100 -103
  62. data/lib/puppet/defaults.rb +793 -796
  63. data/lib/puppet/dsl.rb +5 -269
  64. data/lib/puppet/dsl/resource_api.rb +120 -0
  65. data/lib/puppet/dsl/resource_type_api.rb +40 -0
  66. data/lib/puppet/error.rb +34 -36
  67. data/lib/puppet/external/base64.rb +8 -8
  68. data/lib/puppet/external/dot.rb +262 -262
  69. data/lib/puppet/external/event-loop/better-definers.rb +297 -297
  70. data/lib/puppet/external/event-loop/event-loop.rb +264 -272
  71. data/lib/puppet/external/event-loop/signal-system.rb +161 -163
  72. data/lib/puppet/external/lock.rb +41 -41
  73. data/lib/puppet/external/nagios.rb +32 -32
  74. data/lib/puppet/external/nagios/base.rb +453 -458
  75. data/lib/puppet/external/nagios/parser.rb +264 -287
  76. data/lib/puppet/external/pson/common.rb +8 -5
  77. data/lib/puppet/external/pson/pure/generator.rb +26 -26
  78. data/lib/puppet/external/pson/pure/parser.rb +43 -48
  79. data/lib/puppet/feature/base.rb +21 -1
  80. data/lib/puppet/feature/pson.rb +4 -4
  81. data/lib/puppet/feature/rack.rb +14 -14
  82. data/lib/puppet/feature/rails.rb +23 -25
  83. data/lib/puppet/file_bucket.rb +4 -0
  84. data/lib/puppet/file_bucket/dipper.rb +99 -0
  85. data/lib/puppet/file_bucket/file.rb +136 -0
  86. data/lib/puppet/file_bucket/file/indirection_hooks.rb +9 -0
  87. data/lib/puppet/file_collection.rb +20 -20
  88. data/lib/puppet/file_collection/lookup.rb +11 -11
  89. data/lib/puppet/file_serving/base.rb +67 -71
  90. data/lib/puppet/file_serving/configuration.rb +84 -86
  91. data/lib/puppet/file_serving/configuration/parser.rb +103 -102
  92. data/lib/puppet/file_serving/content.rb +34 -33
  93. data/lib/puppet/file_serving/fileset.rb +131 -133
  94. data/lib/puppet/file_serving/indirection_hooks.rb +17 -17
  95. data/lib/puppet/file_serving/metadata.rb +98 -95
  96. data/lib/puppet/file_serving/mount.rb +22 -22
  97. data/lib/puppet/file_serving/mount/file.rb +101 -106
  98. data/lib/puppet/file_serving/mount/modules.rb +15 -15
  99. data/lib/puppet/file_serving/mount/plugins.rb +15 -16
  100. data/lib/puppet/file_serving/terminus_helper.rb +13 -13
  101. data/lib/puppet/indirector.rb +48 -49
  102. data/lib/puppet/indirector/active_record.rb +19 -19
  103. data/lib/puppet/indirector/catalog/active_record.rb +25 -25
  104. data/lib/puppet/indirector/catalog/compiler.rb +134 -145
  105. data/lib/puppet/indirector/catalog/rest.rb +1 -1
  106. data/lib/puppet/indirector/catalog/yaml.rb +13 -13
  107. data/lib/puppet/indirector/certificate/ca.rb +3 -3
  108. data/lib/puppet/indirector/certificate/file.rb +3 -3
  109. data/lib/puppet/indirector/certificate/rest.rb +8 -8
  110. data/lib/puppet/indirector/certificate_request/ca.rb +7 -7
  111. data/lib/puppet/indirector/certificate_request/file.rb +2 -2
  112. data/lib/puppet/indirector/certificate_request/rest.rb +3 -3
  113. data/lib/puppet/indirector/certificate_revocation_list/ca.rb +2 -2
  114. data/lib/puppet/indirector/certificate_revocation_list/file.rb +2 -2
  115. data/lib/puppet/indirector/certificate_revocation_list/rest.rb +3 -3
  116. data/lib/puppet/indirector/couch.rb +76 -0
  117. data/lib/puppet/indirector/direct_file_server.rb +11 -11
  118. data/lib/puppet/indirector/envelope.rb +4 -4
  119. data/lib/puppet/indirector/exec.rb +38 -42
  120. data/lib/puppet/indirector/facts/active_record.rb +24 -24
  121. data/lib/puppet/indirector/facts/couch.rb +31 -0
  122. data/lib/puppet/indirector/facts/facter.rb +63 -61
  123. data/lib/puppet/indirector/facts/memory.rb +4 -4
  124. data/lib/puppet/indirector/facts/rest.rb +1 -1
  125. data/lib/puppet/indirector/facts/yaml.rb +2 -2
  126. data/lib/puppet/indirector/file.rb +67 -46
  127. data/lib/puppet/indirector/file_bucket_file/file.rb +146 -0
  128. data/lib/puppet/indirector/file_bucket_file/rest.rb +8 -0
  129. data/lib/puppet/indirector/file_content/file.rb +1 -1
  130. data/lib/puppet/indirector/file_content/file_server.rb +1 -1
  131. data/lib/puppet/indirector/file_content/rest.rb +1 -1
  132. data/lib/puppet/indirector/file_metadata/file.rb +11 -11
  133. data/lib/puppet/indirector/file_metadata/file_server.rb +1 -1
  134. data/lib/puppet/indirector/file_metadata/rest.rb +1 -1
  135. data/lib/puppet/indirector/file_server.rb +44 -44
  136. data/lib/puppet/indirector/indirection.rb +249 -260
  137. data/lib/puppet/indirector/key/ca.rb +5 -5
  138. data/lib/puppet/indirector/key/file.rb +29 -29
  139. data/lib/puppet/indirector/ldap.rb +62 -64
  140. data/lib/puppet/indirector/memory.rb +13 -13
  141. data/lib/puppet/indirector/node/active_record.rb +6 -6
  142. data/lib/puppet/indirector/node/exec.rb +40 -44
  143. data/lib/puppet/indirector/node/ldap.rb +246 -212
  144. data/lib/puppet/indirector/node/memory.rb +5 -5
  145. data/lib/puppet/indirector/node/plain.rb +12 -12
  146. data/lib/puppet/indirector/node/rest.rb +2 -2
  147. data/lib/puppet/indirector/node/yaml.rb +2 -2
  148. data/lib/puppet/indirector/plain.rb +4 -4
  149. data/lib/puppet/indirector/queue.rb +49 -51
  150. data/lib/puppet/indirector/report/processor.rb +34 -37
  151. data/lib/puppet/indirector/report/rest.rb +3 -3
  152. data/lib/puppet/indirector/request.rb +171 -157
  153. data/lib/puppet/indirector/resource/ral.rb +48 -0
  154. data/lib/puppet/indirector/resource/rest.rb +5 -0
  155. data/lib/puppet/indirector/resource_type.rb +5 -0
  156. data/lib/puppet/indirector/resource_type/parser.rb +27 -0
  157. data/lib/puppet/indirector/resource_type/rest.rb +7 -0
  158. data/lib/puppet/indirector/rest.rb +83 -79
  159. data/lib/puppet/indirector/run/local.rb +8 -0
  160. data/lib/puppet/indirector/run/rest.rb +6 -0
  161. data/lib/puppet/indirector/ssl_file.rb +165 -165
  162. data/lib/puppet/indirector/status.rb +3 -0
  163. data/lib/puppet/indirector/status/local.rb +7 -0
  164. data/lib/puppet/indirector/status/rest.rb +5 -0
  165. data/lib/puppet/indirector/terminus.rb +129 -133
  166. data/lib/puppet/indirector/yaml.rb +47 -49
  167. data/lib/puppet/metatype/manager.rb +120 -114
  168. data/lib/puppet/module.rb +182 -124
  169. data/lib/puppet/network/authconfig.rb +146 -156
  170. data/lib/puppet/network/authorization.rb +63 -70
  171. data/lib/puppet/network/authstore.rb +226 -232
  172. data/lib/puppet/network/client.rb +141 -152
  173. data/lib/puppet/network/client/ca.rb +47 -49
  174. data/lib/puppet/network/client/file.rb +3 -3
  175. data/lib/puppet/network/client/proxy.rb +19 -19
  176. data/lib/puppet/network/client/report.rb +17 -21
  177. data/lib/puppet/network/client/runner.rb +5 -7
  178. data/lib/puppet/network/client/status.rb +1 -1
  179. data/lib/puppet/network/client_request.rb +20 -22
  180. data/lib/puppet/network/format.rb +79 -81
  181. data/lib/puppet/network/format_handler.rb +135 -130
  182. data/lib/puppet/network/formats.rb +128 -154
  183. data/lib/puppet/network/handler.rb +43 -46
  184. data/lib/puppet/network/handler/ca.rb +129 -135
  185. data/lib/puppet/network/handler/filebucket.rb +39 -170
  186. data/lib/puppet/network/handler/fileserver.rb +624 -656
  187. data/lib/puppet/network/handler/master.rb +62 -75
  188. data/lib/puppet/network/handler/report.rb +60 -67
  189. data/lib/puppet/network/handler/runner.rb +20 -20
  190. data/lib/puppet/network/handler/status.rb +9 -9
  191. data/lib/puppet/network/http.rb +12 -12
  192. data/lib/puppet/network/http/api/v1.rb +49 -44
  193. data/lib/puppet/network/http/compression.rb +111 -0
  194. data/lib/puppet/network/http/handler.rb +183 -183
  195. data/lib/puppet/network/http/mongrel.rb +46 -48
  196. data/lib/puppet/network/http/mongrel/rest.rb +73 -66
  197. data/lib/puppet/network/http/rack.rb +45 -45
  198. data/lib/puppet/network/http/rack/httphandler.rb +7 -7
  199. data/lib/puppet/network/http/rack/rest.rb +84 -61
  200. data/lib/puppet/network/http/rack/xmlrpc.rb +49 -49
  201. data/lib/puppet/network/http/webrick.rb +108 -112
  202. data/lib/puppet/network/http/webrick/rest.rb +60 -57
  203. data/lib/puppet/network/http_pool.rb +95 -83
  204. data/lib/puppet/network/http_server/mongrel.rb +90 -90
  205. data/lib/puppet/network/http_server/webrick.rb +139 -148
  206. data/lib/puppet/network/rest_authconfig.rb +76 -71
  207. data/lib/puppet/network/rest_authorization.rb +11 -13
  208. data/lib/puppet/network/rights.rb +217 -226
  209. data/lib/puppet/network/server.rb +147 -151
  210. data/lib/puppet/network/xmlrpc/client.rb +197 -205
  211. data/lib/puppet/network/xmlrpc/processor.rb +68 -72
  212. data/lib/puppet/network/xmlrpc/server.rb +10 -10
  213. data/lib/puppet/network/xmlrpc/webrick_servlet.rb +94 -100
  214. data/lib/puppet/node.rb +99 -107
  215. data/lib/puppet/node/environment.rb +109 -62
  216. data/lib/puppet/node/facts.rb +48 -43
  217. data/lib/puppet/parameter.rb +246 -498
  218. data/lib/puppet/parameter/value.rb +63 -0
  219. data/lib/puppet/parameter/value_collection.rb +143 -0
  220. data/lib/puppet/parser.rb +4 -0
  221. data/lib/puppet/parser/ast.rb +81 -67
  222. data/lib/puppet/parser/ast/arithmetic_operator.rb +27 -29
  223. data/lib/puppet/parser/ast/astarray.rb +50 -50
  224. data/lib/puppet/parser/ast/asthash.rb +37 -0
  225. data/lib/puppet/parser/ast/boolean_operator.rb +33 -35
  226. data/lib/puppet/parser/ast/branch.rb +29 -31
  227. data/lib/puppet/parser/ast/caseopt.rb +50 -56
  228. data/lib/puppet/parser/ast/casestatement.rb +30 -30
  229. data/lib/puppet/parser/ast/collection.rb +43 -37
  230. data/lib/puppet/parser/ast/collexpr.rb +66 -69
  231. data/lib/puppet/parser/ast/comparison_operator.rb +32 -35
  232. data/lib/puppet/parser/ast/else.rb +13 -13
  233. data/lib/puppet/parser/ast/function.rb +34 -43
  234. data/lib/puppet/parser/ast/ifstatement.rb +23 -27
  235. data/lib/puppet/parser/ast/in_operator.rb +24 -0
  236. data/lib/puppet/parser/ast/leaf.rb +173 -156
  237. data/lib/puppet/parser/ast/match_operator.rb +16 -19
  238. data/lib/puppet/parser/ast/minus.rb +13 -13
  239. data/lib/puppet/parser/ast/nop.rb +6 -6
  240. data/lib/puppet/parser/ast/not.rb +9 -9
  241. data/lib/puppet/parser/ast/relationship.rb +60 -0
  242. data/lib/puppet/parser/ast/resource.rb +58 -57
  243. data/lib/puppet/parser/ast/resource_defaults.rb +16 -16
  244. data/lib/puppet/parser/ast/resource_override.rb +51 -51
  245. data/lib/puppet/parser/ast/resource_reference.rb +17 -72
  246. data/lib/puppet/parser/ast/resourceparam.rb +20 -17
  247. data/lib/puppet/parser/ast/selector.rb +30 -34
  248. data/lib/puppet/parser/ast/tag.rb +16 -16
  249. data/lib/puppet/parser/ast/vardef.rb +20 -16
  250. data/lib/puppet/parser/collector.rb +181 -189
  251. data/lib/puppet/parser/compiler.rb +395 -364
  252. data/lib/puppet/parser/files.rb +65 -69
  253. data/lib/puppet/parser/functions.rb +85 -97
  254. data/lib/puppet/parser/functions/defined.rb +23 -23
  255. data/lib/puppet/parser/functions/fail.rb +2 -2
  256. data/lib/puppet/parser/functions/file.rb +21 -19
  257. data/lib/puppet/parser/functions/fqdn_rand.rb +7 -7
  258. data/lib/puppet/parser/functions/generate.rb +24 -26
  259. data/lib/puppet/parser/functions/include.rb +16 -18
  260. data/lib/puppet/parser/functions/inline_template.rb +16 -17
  261. data/lib/puppet/parser/functions/realize.rb +8 -8
  262. data/lib/puppet/parser/functions/regsubst.rb +74 -59
  263. data/lib/puppet/parser/functions/require.rb +35 -33
  264. data/lib/puppet/parser/functions/search.rb +5 -5
  265. data/lib/puppet/parser/functions/sha1.rb +3 -4
  266. data/lib/puppet/parser/functions/shellquote.rb +31 -33
  267. data/lib/puppet/parser/functions/split.rb +8 -8
  268. data/lib/puppet/parser/functions/sprintf.rb +10 -9
  269. data/lib/puppet/parser/functions/tag.rb +3 -3
  270. data/lib/puppet/parser/functions/tagged.rb +13 -13
  271. data/lib/puppet/parser/functions/template.rb +18 -19
  272. data/lib/puppet/parser/functions/versioncmp.rb +17 -14
  273. data/lib/puppet/parser/grammar.ra +485 -422
  274. data/lib/puppet/parser/lexer.rb +500 -442
  275. data/lib/puppet/parser/parser.rb +1438 -1084
  276. data/lib/puppet/parser/parser_support.rb +227 -502
  277. data/lib/puppet/parser/relationship.rb +43 -0
  278. data/lib/puppet/parser/resource.rb +280 -375
  279. data/lib/puppet/parser/resource/param.rb +18 -18
  280. data/lib/puppet/parser/scope.rb +450 -447
  281. data/lib/puppet/parser/templatewrapper.rb +92 -94
  282. data/lib/puppet/parser/type_loader.rb +146 -0
  283. data/lib/puppet/parser/yaml_trimmer.rb +6 -8
  284. data/lib/puppet/property.rb +290 -453
  285. data/lib/puppet/property/ensure.rb +92 -0
  286. data/lib/puppet/property/keyvalue.rb +74 -82
  287. data/lib/puppet/property/list.rb +71 -81
  288. data/lib/puppet/property/ordered_list.rb +15 -15
  289. data/lib/puppet/provider.rb +229 -241
  290. data/lib/puppet/provider/augeas/augeas.rb +318 -320
  291. data/lib/puppet/provider/computer/computer.rb +13 -13
  292. data/lib/puppet/provider/confine.rb +63 -63
  293. data/lib/puppet/provider/confine/exists.rb +14 -14
  294. data/lib/puppet/provider/confine/false.rb +12 -12
  295. data/lib/puppet/provider/confine/feature.rb +10 -10
  296. data/lib/puppet/provider/confine/true.rb +13 -13
  297. data/lib/puppet/provider/confine/variable.rb +51 -54
  298. data/lib/puppet/provider/confine_collection.rb +38 -38
  299. data/lib/puppet/provider/confiner.rb +10 -14
  300. data/lib/puppet/provider/cron/crontab.rb +172 -173
  301. data/lib/puppet/provider/file/posix.rb +99 -0
  302. data/lib/puppet/provider/file/win32.rb +74 -0
  303. data/lib/puppet/provider/group/directoryservice.rb +6 -6
  304. data/lib/puppet/provider/group/groupadd.rb +18 -20
  305. data/lib/puppet/provider/group/ldap.rb +40 -43
  306. data/lib/puppet/provider/group/pw.rb +23 -23
  307. data/lib/puppet/provider/host/parsed.rb +51 -50
  308. data/lib/puppet/provider/ldap.rb +121 -123
  309. data/lib/puppet/provider/macauthorization/macauthorization.rb +263 -272
  310. data/lib/puppet/provider/mailalias/aliases.rb +34 -31
  311. data/lib/puppet/provider/maillist/mailman.rb +87 -93
  312. data/lib/puppet/provider/mcx/mcxcontent.rb +155 -151
  313. data/lib/puppet/provider/mount.rb +36 -40
  314. data/lib/puppet/provider/mount/parsed.rb +28 -26
  315. data/lib/puppet/provider/naginator.rb +46 -48
  316. data/lib/puppet/provider/nameservice.rb +215 -257
  317. data/lib/puppet/provider/nameservice/directoryservice.rb +455 -471
  318. data/lib/puppet/provider/nameservice/objectadd.rb +21 -21
  319. data/lib/puppet/provider/nameservice/pw.rb +13 -13
  320. data/lib/puppet/provider/package.rb +18 -20
  321. data/lib/puppet/provider/package/aix.rb +128 -0
  322. data/lib/puppet/provider/package/appdmg.rb +78 -82
  323. data/lib/puppet/provider/package/apple.rb +39 -40
  324. data/lib/puppet/provider/package/apt.rb +95 -104
  325. data/lib/puppet/provider/package/aptitude.rb +19 -21
  326. data/lib/puppet/provider/package/aptrpm.rb +70 -72
  327. data/lib/puppet/provider/package/blastwave.rb +88 -94
  328. data/lib/puppet/provider/package/darwinport.rb +67 -69
  329. data/lib/puppet/provider/package/dpkg.rb +123 -97
  330. data/lib/puppet/provider/package/fink.rb +66 -68
  331. data/lib/puppet/provider/package/freebsd.rb +38 -40
  332. data/lib/puppet/provider/package/gem.rb +98 -102
  333. data/lib/puppet/provider/package/hpux.rb +37 -39
  334. data/lib/puppet/provider/package/nim.rb +35 -0
  335. data/lib/puppet/provider/package/openbsd.rb +100 -75
  336. data/lib/puppet/provider/package/pkg.rb +108 -0
  337. data/lib/puppet/provider/package/pkgdmg.rb +95 -87
  338. data/lib/puppet/provider/package/portage.rb +101 -104
  339. data/lib/puppet/provider/package/ports.rb +71 -73
  340. data/lib/puppet/provider/package/portupgrade.rb +251 -0
  341. data/lib/puppet/provider/package/rpm.rb +113 -115
  342. data/lib/puppet/provider/package/rug.rb +46 -46
  343. data/lib/puppet/provider/package/sun.rb +135 -151
  344. data/lib/puppet/provider/package/sunfreeware.rb +5 -5
  345. data/lib/puppet/provider/package/up2date.rb +31 -31
  346. data/lib/puppet/provider/package/urpmi.rb +51 -51
  347. data/lib/puppet/provider/package/yum.rb +90 -98
  348. data/lib/puppet/provider/package/zypper.rb +52 -0
  349. data/lib/puppet/provider/parsedfile.rb +306 -329
  350. data/lib/puppet/provider/port/parsed.rb +5 -5
  351. data/lib/puppet/provider/selboolean/getsetsebool.rb +34 -34
  352. data/lib/puppet/provider/selmodule/semodule.rb +103 -111
  353. data/lib/puppet/provider/service/base.rb +134 -139
  354. data/lib/puppet/provider/service/bsd.rb +48 -0
  355. data/lib/puppet/provider/service/daemontools.rb +158 -162
  356. data/lib/puppet/provider/service/debian.rb +36 -36
  357. data/lib/puppet/provider/service/freebsd.rb +118 -38
  358. data/lib/puppet/provider/service/gentoo.rb +33 -39
  359. data/lib/puppet/provider/service/init.rb +125 -125
  360. data/lib/puppet/provider/service/launchd.rb +234 -254
  361. data/lib/puppet/provider/service/redhat.rb +58 -58
  362. data/lib/puppet/provider/service/runit.rb +74 -74
  363. data/lib/puppet/provider/service/smf.rb +81 -85
  364. data/lib/puppet/provider/service/src.rb +87 -0
  365. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +73 -81
  366. data/lib/puppet/provider/sshkey/parsed.rb +24 -21
  367. data/lib/puppet/provider/user/directoryservice.rb +71 -71
  368. data/lib/puppet/provider/user/hpux.rb +20 -20
  369. data/lib/puppet/provider/user/ldap.rb +106 -110
  370. data/lib/puppet/provider/user/pw.rb +33 -37
  371. data/lib/puppet/provider/user/user_role_add.rb +168 -183
  372. data/lib/puppet/provider/user/useradd.rb +50 -51
  373. data/lib/puppet/provider/zfs/solaris.rb +35 -35
  374. data/lib/puppet/provider/zone/solaris.rb +206 -205
  375. data/lib/puppet/provider/zpool/solaris.rb +95 -97
  376. data/lib/puppet/rails.rb +115 -122
  377. data/lib/puppet/rails/benchmark.rb +43 -49
  378. data/lib/puppet/rails/database/001_add_created_at_to_all_tables.rb +8 -12
  379. data/lib/puppet/rails/database/002_remove_duplicated_index_on_all_tables.rb +8 -12
  380. data/lib/puppet/rails/database/003_add_environment_to_host.rb +6 -10
  381. data/lib/puppet/rails/database/schema.rb +100 -97
  382. data/lib/puppet/rails/fact_name.rb +1 -1
  383. data/lib/puppet/rails/fact_value.rb +5 -5
  384. data/lib/puppet/rails/host.rb +252 -249
  385. data/lib/puppet/rails/param_name.rb +15 -15
  386. data/lib/puppet/rails/param_value.rb +55 -55
  387. data/lib/puppet/rails/puppet_tag.rb +4 -4
  388. data/lib/puppet/rails/resource.rb +189 -203
  389. data/lib/puppet/rails/resource_tag.rb +19 -19
  390. data/lib/puppet/rails/source_file.rb +5 -5
  391. data/lib/puppet/reference/configuration.rb +53 -56
  392. data/lib/puppet/reference/function.rb +1 -1
  393. data/lib/puppet/reference/indirection.rb +13 -13
  394. data/lib/puppet/reference/metaparameter.rb +40 -40
  395. data/lib/puppet/reference/network.rb +16 -16
  396. data/lib/puppet/reference/providers.rb +97 -98
  397. data/lib/puppet/reference/report.rb +1 -1
  398. data/lib/puppet/reference/type.rb +67 -70
  399. data/lib/puppet/relationship.rb +65 -67
  400. data/lib/puppet/reports.rb +32 -34
  401. data/lib/puppet/reports/http.rb +22 -0
  402. data/lib/puppet/reports/log.rb +7 -6
  403. data/lib/puppet/reports/rrdgraph.rb +105 -114
  404. data/lib/puppet/reports/store.rb +53 -56
  405. data/lib/puppet/reports/tagmail.rb +149 -157
  406. data/lib/puppet/resource.rb +428 -194
  407. data/lib/puppet/resource/catalog.rb +496 -512
  408. data/lib/puppet/resource/status.rb +58 -0
  409. data/lib/puppet/resource/type.rb +311 -0
  410. data/lib/puppet/resource/type_collection.rb +217 -0
  411. data/lib/puppet/resource/type_collection_helper.rb +7 -0
  412. data/lib/puppet/run.rb +77 -0
  413. data/lib/puppet/simple_graph.rb +381 -413
  414. data/lib/puppet/ssl.rb +2 -1
  415. data/lib/puppet/ssl/base.rb +60 -43
  416. data/lib/puppet/ssl/certificate.rb +21 -21
  417. data/lib/puppet/ssl/certificate_authority.rb +215 -229
  418. data/lib/puppet/ssl/certificate_authority/interface.rb +84 -68
  419. data/lib/puppet/ssl/certificate_factory.rb +119 -119
  420. data/lib/puppet/ssl/certificate_request.rb +52 -45
  421. data/lib/puppet/ssl/certificate_revocation_list.rb +78 -78
  422. data/lib/puppet/ssl/host.rb +230 -228
  423. data/lib/puppet/ssl/inventory.rb +33 -33
  424. data/lib/puppet/ssl/key.rb +37 -37
  425. data/lib/puppet/sslcertificates.rb +124 -123
  426. data/lib/puppet/sslcertificates/ca.rb +327 -344
  427. data/lib/puppet/sslcertificates/certificate.rb +197 -224
  428. data/lib/puppet/sslcertificates/inventory.rb +27 -29
  429. data/lib/puppet/sslcertificates/support.rb +113 -119
  430. data/lib/puppet/status.rb +28 -0
  431. data/lib/puppet/transaction.rb +349 -696
  432. data/lib/puppet/transaction/change.rb +80 -85
  433. data/lib/puppet/transaction/event.rb +54 -14
  434. data/lib/puppet/transaction/event_manager.rb +99 -0
  435. data/lib/puppet/transaction/report.rb +121 -59
  436. data/lib/puppet/transaction/resource_harness.rb +150 -0
  437. data/lib/puppet/transportable.rb +215 -226
  438. data/lib/puppet/type.rb +1644 -1849
  439. data/lib/puppet/type/augeas.rb +153 -134
  440. data/lib/puppet/type/component.rb +63 -65
  441. data/lib/puppet/type/computer.rb +44 -44
  442. data/lib/puppet/type/cron.rb +364 -384
  443. data/lib/puppet/type/exec.rb +583 -521
  444. data/lib/puppet/type/file.rb +786 -823
  445. data/lib/puppet/type/file/checksum.rb +23 -240
  446. data/lib/puppet/type/file/content.rb +193 -129
  447. data/lib/puppet/type/file/ensure.rb +149 -153
  448. data/lib/puppet/type/file/group.rb +94 -104
  449. data/lib/puppet/type/file/mode.rb +109 -122
  450. data/lib/puppet/type/file/owner.rb +39 -131
  451. data/lib/puppet/type/file/selcontext.rb +69 -73
  452. data/lib/puppet/type/file/source.rb +165 -153
  453. data/lib/puppet/type/file/target.rb +56 -60
  454. data/lib/puppet/type/file/type.rb +18 -18
  455. data/lib/puppet/type/filebucket.rb +91 -92
  456. data/lib/puppet/type/group.rb +77 -82
  457. data/lib/puppet/type/host.rb +85 -85
  458. data/lib/puppet/type/k5login.rb +65 -65
  459. data/lib/puppet/type/macauthorization.rb +141 -143
  460. data/lib/puppet/type/mailalias.rb +37 -37
  461. data/lib/puppet/type/maillist.rb +51 -51
  462. data/lib/puppet/type/mcx.rb +62 -62
  463. data/lib/puppet/type/mount.rb +199 -193
  464. data/lib/puppet/type/notify.rb +33 -33
  465. data/lib/puppet/type/package.rb +301 -298
  466. data/lib/puppet/type/port.rb +4 -4
  467. data/lib/puppet/type/resources.rb +107 -123
  468. data/lib/puppet/type/schedule.rb +317 -326
  469. data/lib/puppet/type/selboolean.rb +19 -19
  470. data/lib/puppet/type/selmodule.rb +34 -34
  471. data/lib/puppet/type/service.rb +152 -152
  472. data/lib/puppet/type/ssh_authorized_key.rb +74 -78
  473. data/lib/puppet/type/sshkey.rb +52 -56
  474. data/lib/puppet/type/stage.rb +18 -0
  475. data/lib/puppet/type/tidy.rb +289 -300
  476. data/lib/puppet/type/user.rb +300 -312
  477. data/lib/puppet/type/yumrepo.rb +300 -335
  478. data/lib/puppet/type/zfs.rb +36 -36
  479. data/lib/puppet/type/zone.rb +376 -347
  480. data/lib/puppet/type/zpool.rb +71 -77
  481. data/lib/puppet/util.rb +383 -387
  482. data/lib/puppet/util/autoload.rb +125 -143
  483. data/lib/puppet/util/autoload/file_cache.rb +78 -101
  484. data/lib/puppet/util/backups.rb +66 -66
  485. data/lib/puppet/util/cacher.rb +112 -120
  486. data/lib/puppet/util/checksums.rb +119 -84
  487. data/lib/puppet/util/classgen.rb +157 -167
  488. data/lib/puppet/util/command_line.rb +95 -0
  489. data/lib/puppet/util/command_line/filebucket +97 -0
  490. data/lib/puppet/util/command_line/pi +48 -0
  491. data/lib/puppet/util/command_line/puppet +69 -0
  492. data/lib/puppet/util/command_line/puppetca +110 -0
  493. data/lib/puppet/util/command_line/puppetd +186 -0
  494. data/lib/puppet/util/command_line/puppetdoc +67 -0
  495. data/lib/puppet/util/command_line/puppetmasterd +65 -0
  496. data/lib/puppet/util/command_line/puppetqd +53 -0
  497. data/lib/puppet/util/command_line/puppetrun +128 -0
  498. data/lib/puppet/util/command_line/ralsh +89 -0
  499. data/lib/puppet/util/constant_inflector.rb +7 -7
  500. data/lib/puppet/util/diff.rb +59 -56
  501. data/lib/puppet/util/docs.rb +97 -99
  502. data/lib/puppet/util/errors.rb +53 -44
  503. data/lib/puppet/util/execution.rb +15 -15
  504. data/lib/puppet/util/feature.rb +62 -72
  505. data/lib/puppet/util/file_locking.rb +33 -33
  506. data/lib/puppet/util/fileparsing.rb +292 -318
  507. data/lib/puppet/util/filetype.rb +246 -263
  508. data/lib/puppet/util/graph.rb +16 -18
  509. data/lib/puppet/util/inifile.rb +170 -184
  510. data/lib/puppet/util/inline_docs.rb +26 -0
  511. data/lib/puppet/util/instance_loader.rb +58 -58
  512. data/lib/puppet/util/ldap/connection.rb +57 -59
  513. data/lib/puppet/util/ldap/generator.rb +31 -31
  514. data/lib/puppet/util/ldap/manager.rb +233 -235
  515. data/lib/puppet/util/loadedfile.rb +49 -51
  516. data/lib/puppet/util/log.rb +210 -494
  517. data/lib/puppet/util/log/destination.rb +49 -0
  518. data/lib/puppet/util/log/destinations.rb +217 -0
  519. data/lib/puppet/util/log_paths.rb +15 -17
  520. data/lib/puppet/util/logging.rb +34 -13
  521. data/lib/puppet/util/metaid.rb +15 -15
  522. data/lib/puppet/util/methodhelper.rb +24 -26
  523. data/lib/puppet/util/metric.rb +123 -125
  524. data/lib/puppet/util/monkey_patches.rb +21 -20
  525. data/lib/puppet/util/nagios_maker.rb +41 -41
  526. data/lib/puppet/util/package.rb +24 -26
  527. data/lib/puppet/util/pidlock.rb +49 -49
  528. data/lib/puppet/util/posix.rb +115 -115
  529. data/lib/puppet/util/provider_features.rb +147 -155
  530. data/lib/puppet/util/pson.rb +5 -5
  531. data/lib/puppet/util/queue.rb +55 -55
  532. data/lib/puppet/util/queue/stomp.rb +27 -27
  533. data/lib/puppet/util/rails/cache_accumulator.rb +49 -49
  534. data/lib/puppet/util/rails/collection_merger.rb +13 -13
  535. data/lib/puppet/util/rails/reference_serializer.rb +26 -26
  536. data/lib/puppet/util/rdoc.rb +77 -74
  537. data/lib/puppet/util/rdoc/code_objects.rb +235 -217
  538. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +732 -676
  539. data/lib/puppet/util/rdoc/generators/template/puppet/puppet.rb +38 -12
  540. data/lib/puppet/util/rdoc/parser.rb +418 -392
  541. data/lib/puppet/util/reference.rb +168 -174
  542. data/lib/puppet/util/resource_template.rb +17 -17
  543. data/lib/puppet/util/run_mode.rb +81 -0
  544. data/lib/puppet/util/selinux.rb +184 -200
  545. data/lib/puppet/util/settings.rb +886 -919
  546. data/lib/puppet/util/settings/boolean_setting.rb +20 -23
  547. data/lib/puppet/util/settings/file_setting.rb +98 -99
  548. data/lib/puppet/util/settings/setting.rb +71 -87
  549. data/lib/puppet/util/storage.rb +73 -84
  550. data/lib/puppet/util/subclass_loader.rb +59 -66
  551. data/lib/puppet/util/suidmanager.rb +87 -84
  552. data/lib/puppet/util/tagging.rb +37 -39
  553. data/lib/puppet/util/user_attr.rb +14 -14
  554. data/lib/puppet/util/warnings.rb +20 -20
  555. data/lib/puppet/util/zaml.rb +242 -241
  556. data/man/man5/puppet.conf.5 +148 -76
  557. data/man/man8/filebucket.8 +6 -6
  558. data/man/man8/pi.8 +5 -5
  559. data/man/man8/puppet.8 +2 -73
  560. data/man/man8/puppetca.8 +47 -32
  561. data/man/man8/puppetd.8 +118 -76
  562. data/man/man8/puppetdoc.8 +16 -12
  563. data/man/man8/puppetmasterd.8 +4 -4
  564. data/man/man8/puppetqd.8 +4 -4
  565. data/man/man8/puppetrun.8 +23 -22
  566. data/man/man8/ralsh.8 +16 -17
  567. data/spec/fixtures/yaml/test.local.yaml +16 -0
  568. data/spec/integration/application/apply_spec.rb +33 -0
  569. data/spec/integration/configurer_spec.rb +35 -0
  570. data/spec/integration/defaults_spec.rb +258 -0
  571. data/spec/integration/file_serving/content_spec.rb +20 -0
  572. data/spec/integration/file_serving/fileset_spec.rb +14 -0
  573. data/spec/integration/file_serving/metadata_spec.rb +21 -0
  574. data/spec/integration/file_serving/terminus_helper_spec.rb +22 -0
  575. data/spec/integration/indirector/bucket_file/rest_spec.rb +68 -0
  576. data/spec/integration/indirector/catalog/compiler_spec.rb +68 -0
  577. data/spec/integration/indirector/catalog/queue_spec.rb +61 -0
  578. data/spec/integration/indirector/certificate/rest_spec.rb +68 -0
  579. data/spec/integration/indirector/certificate_request/rest_spec.rb +88 -0
  580. data/spec/integration/indirector/certificate_revocation_list/rest_spec.rb +76 -0
  581. data/spec/integration/indirector/direct_file_server_spec.rb +73 -0
  582. data/spec/integration/indirector/file_content/file_server_spec.rb +94 -0
  583. data/spec/integration/indirector/file_metadata/file_server_spec.rb +18 -0
  584. data/spec/integration/indirector/node/ldap_spec.rb +15 -0
  585. data/spec/integration/indirector/report/rest_spec.rb +96 -0
  586. data/spec/integration/indirector/rest_spec.rb +524 -0
  587. data/spec/integration/network/client_spec.rb +19 -0
  588. data/spec/integration/network/formats_spec.rb +110 -0
  589. data/spec/integration/network/handler_spec.rb +25 -0
  590. data/spec/integration/network/server/mongrel_spec.rb +66 -0
  591. data/spec/integration/network/server/webrick_spec.rb +85 -0
  592. data/spec/integration/node/environment_spec.rb +58 -0
  593. data/spec/integration/node/facts_spec.rb +47 -0
  594. data/spec/integration/node_spec.rb +93 -0
  595. data/spec/integration/parser/collector_spec.rb +38 -0
  596. data/spec/integration/parser/compiler_spec.rb +29 -0
  597. data/spec/integration/parser/functions/require_spec.rb +44 -0
  598. data/spec/integration/parser/parser_spec.rb +113 -0
  599. data/spec/integration/provider/mailalias/aliases_spec.rb +25 -0
  600. data/spec/integration/provider/package_spec.rb +26 -0
  601. data/spec/integration/provider/service/init_spec.rb +32 -0
  602. data/spec/integration/reference/providers_spec.rb +17 -0
  603. data/spec/integration/reports_spec.rb +18 -0
  604. data/spec/integration/resource/catalog_spec.rb +61 -0
  605. data/spec/integration/resource/type_collection_spec.rb +96 -0
  606. data/spec/integration/ssl/certificate_authority_spec.rb +135 -0
  607. data/spec/integration/ssl/certificate_request_spec.rb +61 -0
  608. data/spec/integration/ssl/certificate_revocation_list_spec.rb +42 -0
  609. data/spec/integration/ssl/host_spec.rb +90 -0
  610. data/spec/integration/transaction/report_spec.rb +29 -0
  611. data/spec/integration/transaction_spec.rb +284 -0
  612. data/spec/integration/type/file_spec.rb +506 -0
  613. data/spec/integration/type/package_spec.rb +25 -0
  614. data/spec/integration/type/tidy_spec.rb +32 -0
  615. data/spec/integration/type_spec.rb +22 -0
  616. data/spec/integration/util/autoload_spec.rb +114 -0
  617. data/spec/integration/util/feature_spec.rb +54 -0
  618. data/spec/integration/util/file_locking_spec.rb +37 -0
  619. data/spec/integration/util/rdoc/parser_spec.rb +59 -0
  620. data/spec/integration/util/settings_spec.rb +30 -0
  621. data/spec/lib/puppet_spec/files.rb +16 -6
  622. data/spec/monkey_patches/add_confine_and_runnable_to_rspec_dsl.rb +27 -27
  623. data/spec/monkey_patches/alias_should_to_must.rb +4 -4
  624. data/spec/shared_behaviours/file_server_terminus.rb +28 -28
  625. data/spec/shared_behaviours/file_serving.rb +53 -53
  626. data/spec/shared_behaviours/memory_terminus.rb +22 -22
  627. data/spec/spec.opts +1 -0
  628. data/spec/spec_helper.rb +61 -18
  629. data/spec/spec_specs/runnable_spec.rb +95 -0
  630. data/spec/unit/agent/locker_spec.rb +100 -0
  631. data/spec/unit/agent_spec.rb +281 -0
  632. data/spec/unit/application/agent_spec.rb +588 -0
  633. data/spec/unit/application/apply_spec.rb +387 -0
  634. data/spec/unit/application/cert_spec.rb +194 -0
  635. data/spec/unit/application/describe_spec.rb +84 -0
  636. data/spec/unit/application/doc_spec.rb +368 -0
  637. data/spec/unit/application/filebucket_spec.rb +223 -0
  638. data/spec/unit/application/kick_spec.rb +313 -0
  639. data/spec/unit/application/master_spec.rb +453 -0
  640. data/spec/unit/application/queue_spec.rb +186 -0
  641. data/spec/unit/application/resource_spec.rb +233 -0
  642. data/spec/unit/application_spec.rb +531 -0
  643. data/spec/unit/configurer/downloader_spec.rb +188 -0
  644. data/spec/unit/configurer/fact_handler_spec.rb +164 -0
  645. data/spec/unit/configurer/plugin_handler_spec.rb +112 -0
  646. data/spec/unit/configurer_spec.rb +494 -0
  647. data/spec/unit/daemon_spec.rb +306 -0
  648. data/spec/unit/dsl/resource_api_spec.rb +181 -0
  649. data/spec/unit/dsl/resource_type_api_spec.rb +46 -0
  650. data/spec/unit/file_bucket/dipper_spec.rb +122 -0
  651. data/spec/unit/file_bucket/file_spec.rb +230 -0
  652. data/spec/unit/file_collection/lookup_spec.rb +46 -0
  653. data/spec/unit/file_collection_spec.rb +53 -0
  654. data/spec/unit/file_serving/base_spec.rb +132 -0
  655. data/spec/unit/file_serving/configuration/parser_spec.rb +181 -0
  656. data/spec/unit/file_serving/configuration_spec.rb +249 -0
  657. data/spec/unit/file_serving/content_spec.rb +118 -0
  658. data/spec/unit/file_serving/fileset_spec.rb +347 -0
  659. data/spec/unit/file_serving/indirection_hooks_spec.rb +63 -0
  660. data/spec/unit/file_serving/metadata_spec.rb +286 -0
  661. data/spec/unit/file_serving/mount/file_spec.rb +196 -0
  662. data/spec/unit/file_serving/mount/modules_spec.rb +63 -0
  663. data/spec/unit/file_serving/mount/plugins_spec.rb +61 -0
  664. data/spec/unit/file_serving/mount_spec.rb +32 -0
  665. data/spec/unit/file_serving/terminus_helper_spec.rb +98 -0
  666. data/spec/unit/indirector/active_record_spec.rb +76 -0
  667. data/spec/unit/indirector/catalog/active_record_spec.rb +141 -0
  668. data/spec/unit/indirector/catalog/compiler_spec.rb +275 -0
  669. data/spec/unit/indirector/catalog/queue_spec.rb +20 -0
  670. data/spec/unit/indirector/catalog/rest_spec.rb +11 -0
  671. data/spec/unit/indirector/catalog/yaml_spec.rb +25 -0
  672. data/spec/unit/indirector/certificate/ca_spec.rb +28 -0
  673. data/spec/unit/indirector/certificate/file_spec.rb +28 -0
  674. data/spec/unit/indirector/certificate/rest_spec.rb +58 -0
  675. data/spec/unit/indirector/certificate_request/ca_spec.rb +19 -0
  676. data/spec/unit/indirector/certificate_request/file_spec.rb +19 -0
  677. data/spec/unit/indirector/certificate_request/rest_spec.rb +23 -0
  678. data/spec/unit/indirector/certificate_revocation_list/ca_spec.rb +21 -0
  679. data/spec/unit/indirector/certificate_revocation_list/file_spec.rb +20 -0
  680. data/spec/unit/indirector/certificate_revocation_list/rest_spec.rb +23 -0
  681. data/spec/unit/indirector/code_spec.rb +33 -0
  682. data/spec/unit/indirector/direct_file_server_spec.rb +84 -0
  683. data/spec/unit/indirector/envelope_spec.rb +47 -0
  684. data/spec/unit/indirector/exec_spec.rb +56 -0
  685. data/spec/unit/indirector/facts/active_record_spec.rb +104 -0
  686. data/spec/unit/indirector/facts/couch_spec.rb +98 -0
  687. data/spec/unit/indirector/facts/facter_spec.rb +143 -0
  688. data/spec/unit/indirector/facts/rest_spec.rb +11 -0
  689. data/spec/unit/indirector/facts/yaml_spec.rb +26 -0
  690. data/spec/unit/indirector/file_bucket_file/file_spec.rb +290 -0
  691. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +11 -0
  692. data/spec/unit/indirector/file_content/file_server_spec.rb +18 -0
  693. data/spec/unit/indirector/file_content/file_spec.rb +18 -0
  694. data/spec/unit/indirector/file_content/rest_spec.rb +11 -0
  695. data/spec/unit/indirector/file_metadata/file_server_spec.rb +18 -0
  696. data/spec/unit/indirector/file_metadata/file_spec.rb +52 -0
  697. data/spec/unit/indirector/file_metadata/rest_spec.rb +9 -0
  698. data/spec/unit/indirector/file_server_spec.rb +267 -0
  699. data/spec/unit/indirector/file_spec.rb +181 -0
  700. data/spec/unit/indirector/indirection_spec.rb +795 -0
  701. data/spec/unit/indirector/key/ca_spec.rb +28 -0
  702. data/spec/unit/indirector/key/file_spec.rb +104 -0
  703. data/spec/unit/indirector/ldap_spec.rb +143 -0
  704. data/spec/unit/indirector/memory_spec.rb +29 -0
  705. data/spec/unit/indirector/node/active_record_spec.rb +41 -0
  706. data/spec/unit/indirector/node/exec_spec.rb +70 -0
  707. data/spec/unit/indirector/node/ldap_spec.rb +456 -0
  708. data/spec/unit/indirector/node/memory_spec.rb +19 -0
  709. data/spec/unit/indirector/node/plain_spec.rb +19 -0
  710. data/spec/unit/indirector/node/rest_spec.rb +13 -0
  711. data/spec/unit/indirector/node/yaml_spec.rb +25 -0
  712. data/spec/unit/indirector/plain_spec.rb +29 -0
  713. data/spec/unit/indirector/queue_spec.rb +123 -0
  714. data/spec/unit/indirector/report/processor_spec.rb +81 -0
  715. data/spec/unit/indirector/report/rest_spec.rb +28 -0
  716. data/spec/unit/indirector/request_spec.rb +304 -0
  717. data/spec/unit/indirector/resource/ral_spec.rb +129 -0
  718. data/spec/unit/indirector/resource/rest_spec.rb +11 -0
  719. data/spec/unit/indirector/resource_type/parser_spec.rb +75 -0
  720. data/spec/unit/indirector/resource_type/rest_spec.rb +15 -0
  721. data/spec/unit/indirector/rest_spec.rb +455 -0
  722. data/spec/unit/indirector/run/local_spec.rb +20 -0
  723. data/spec/unit/indirector/run/rest_spec.rb +11 -0
  724. data/spec/unit/indirector/ssl_file_spec.rb +281 -0
  725. data/spec/unit/indirector/status/rest_spec.rb +11 -0
  726. data/spec/unit/indirector/terminus_spec.rb +245 -0
  727. data/spec/unit/indirector/yaml_spec.rb +146 -0
  728. data/spec/unit/indirector_spec.rb +157 -0
  729. data/spec/unit/module_spec.rb +547 -0
  730. data/spec/unit/network/authconfig_spec.rb +292 -0
  731. data/spec/unit/network/authstore_spec.rb +370 -0
  732. data/spec/unit/network/client_spec.rb +45 -0
  733. data/spec/unit/network/format_handler_spec.rb +336 -0
  734. data/spec/unit/network/format_spec.rb +198 -0
  735. data/spec/unit/network/formats_spec.rb +337 -0
  736. data/spec/unit/network/handler/fileserver_spec.rb +172 -0
  737. data/spec/unit/network/http/api/v1_spec.rb +122 -0
  738. data/spec/unit/network/http/compression_spec.rb +199 -0
  739. data/spec/unit/network/http/handler_spec.rb +455 -0
  740. data/spec/unit/network/http/mongrel/rest_spec.rb +249 -0
  741. data/spec/unit/network/http/mongrel/{xmlrpc.rb → xmlrpc_spec.rb} +0 -0
  742. data/spec/unit/network/http/mongrel_spec.rb +131 -0
  743. data/spec/unit/network/http/rack/rest_spec.rb +249 -0
  744. data/spec/unit/network/http/rack/xmlrpc_spec.rb +157 -0
  745. data/spec/unit/network/http/rack_spec.rb +102 -0
  746. data/spec/unit/network/http/webrick/rest_spec.rb +180 -0
  747. data/spec/unit/network/http/webrick/{xmlrpc.rb → xmlrpc_spec.rb} +0 -0
  748. data/spec/unit/network/http/webrick_spec.rb +339 -0
  749. data/spec/unit/network/http_pool_spec.rb +206 -0
  750. data/spec/unit/network/http_spec.rb +35 -0
  751. data/spec/unit/network/rest_authconfig_spec.rb +148 -0
  752. data/spec/unit/network/rest_authorization_spec.rb +43 -0
  753. data/spec/unit/network/rights_spec.rb +519 -0
  754. data/spec/unit/network/server_spec.rb +534 -0
  755. data/spec/unit/network/xmlrpc/client_spec.rb +171 -0
  756. data/spec/unit/node/environment_spec.rb +248 -0
  757. data/spec/unit/node/facts_spec.rb +102 -0
  758. data/spec/unit/node_spec.rb +210 -0
  759. data/spec/unit/other/selinux_spec.rb +94 -0
  760. data/spec/unit/other/transbucket_spec.rb +188 -0
  761. data/spec/unit/other/transobject_spec.rb +112 -0
  762. data/spec/unit/parameter/value_collection_spec.rb +167 -0
  763. data/spec/unit/parameter/value_spec.rb +88 -0
  764. data/spec/unit/parameter_spec.rb +172 -0
  765. data/spec/unit/parser/ast/arithmetic_operator_spec.rb +73 -0
  766. data/spec/unit/parser/ast/astarray_spec.rb +72 -0
  767. data/spec/unit/parser/ast/asthash_spec.rb +98 -0
  768. data/spec/unit/parser/ast/boolean_operator_spec.rb +53 -0
  769. data/spec/unit/parser/ast/casestatement_spec.rb +161 -0
  770. data/spec/unit/parser/ast/collection_spec.rb +63 -0
  771. data/spec/unit/parser/ast/collexpr_spec.rb +115 -0
  772. data/spec/unit/parser/ast/comparison_operator_spec.rb +116 -0
  773. data/spec/unit/parser/ast/function_spec.rb +83 -0
  774. data/spec/unit/parser/ast/ifstatement_spec.rb +76 -0
  775. data/spec/unit/parser/ast/in_operator_spec.rb +60 -0
  776. data/spec/unit/parser/ast/leaf_spec.rb +362 -0
  777. data/spec/unit/parser/ast/match_operator_spec.rb +50 -0
  778. data/spec/unit/parser/ast/minus_spec.rb +36 -0
  779. data/spec/unit/parser/ast/nop_spec.rb +20 -0
  780. data/spec/unit/parser/ast/not_spec.rb +30 -0
  781. data/spec/unit/parser/ast/relationship_spec.rb +88 -0
  782. data/spec/unit/parser/ast/resource_defaults_spec.rb +22 -0
  783. data/spec/unit/parser/ast/resource_override_spec.rb +51 -0
  784. data/spec/unit/parser/ast/resource_reference_spec.rb +46 -0
  785. data/spec/unit/parser/ast/resource_spec.rb +120 -0
  786. data/spec/unit/parser/ast/selector_spec.rb +139 -0
  787. data/spec/unit/parser/ast/vardef_spec.rb +60 -0
  788. data/spec/unit/parser/ast_spec.rb +111 -0
  789. data/spec/unit/parser/collector_spec.rb +559 -0
  790. data/spec/unit/parser/compiler_spec.rb +754 -0
  791. data/spec/unit/parser/files_spec.rb +201 -0
  792. data/spec/unit/parser/functions/defined_spec.rb +50 -0
  793. data/spec/unit/parser/functions/fqdn_rand_spec.rb +62 -0
  794. data/spec/unit/parser/functions/generate_spec.rb +41 -0
  795. data/spec/unit/parser/functions/inline_template_spec.rb +59 -0
  796. data/spec/unit/parser/functions/realize_spec.rb +51 -0
  797. data/spec/unit/parser/functions/regsubst_spec.rb +192 -0
  798. data/spec/unit/parser/functions/require_spec.rb +74 -0
  799. data/spec/unit/parser/functions/shellquote_spec.rb +81 -0
  800. data/spec/unit/parser/functions/split_spec.rb +49 -0
  801. data/spec/unit/parser/functions/sprintf_spec.rb +41 -0
  802. data/spec/unit/parser/functions/tag_spec.rb +24 -0
  803. data/spec/unit/parser/functions/template_spec.rb +62 -0
  804. data/spec/unit/parser/functions/versioncmp_spec.rb +29 -0
  805. data/spec/unit/parser/functions_spec.rb +102 -0
  806. data/spec/unit/parser/lexer_spec.rb +646 -0
  807. data/spec/unit/parser/parser_spec.rb +412 -0
  808. data/spec/unit/parser/relationship_spec.rb +70 -0
  809. data/spec/unit/parser/resource_spec.rb +564 -0
  810. data/spec/unit/parser/scope_spec.rb +629 -0
  811. data/spec/unit/parser/templatewrapper_spec.rb +144 -0
  812. data/spec/unit/parser/type_loader_spec.rb +201 -0
  813. data/spec/unit/property/ensure_spec.rb +13 -0
  814. data/spec/unit/property/keyvalue_spec.rb +168 -0
  815. data/spec/unit/property/list_spec.rb +166 -0
  816. data/spec/unit/property/ordered_list_spec.rb +64 -0
  817. data/spec/unit/property_spec.rb +410 -0
  818. data/spec/unit/provider/augeas/augeas_spec.rb +413 -0
  819. data/spec/unit/provider/confine/exists_spec.rb +81 -0
  820. data/spec/unit/provider/confine/false_spec.rb +53 -0
  821. data/spec/unit/provider/confine/feature_spec.rb +60 -0
  822. data/spec/unit/provider/confine/true_spec.rb +53 -0
  823. data/spec/unit/provider/confine/variable_spec.rb +107 -0
  824. data/spec/unit/provider/confine_collection_spec.rb +134 -0
  825. data/spec/unit/provider/confine_spec.rb +78 -0
  826. data/spec/unit/provider/confiner_spec.rb +63 -0
  827. data/spec/unit/provider/group/groupadd_spec.rb +31 -0
  828. data/spec/unit/provider/group/ldap_spec.rb +105 -0
  829. data/spec/unit/provider/ldap_spec.rb +248 -0
  830. data/spec/unit/provider/macauthorization_spec.rb +147 -0
  831. data/spec/unit/provider/mcx/mcxcontent_spec.rb +175 -0
  832. data/spec/unit/provider/mount/parsed_spec.rb +193 -0
  833. data/spec/unit/provider/mount_spec.rb +130 -0
  834. data/spec/unit/provider/naginator_spec.rb +58 -0
  835. data/spec/unit/provider/package/aix_spec.rb +66 -0
  836. data/spec/unit/provider/package/apt_spec.rb +145 -0
  837. data/spec/unit/provider/package/dpkg_spec.rb +225 -0
  838. data/spec/unit/provider/package/gem_spec.rb +87 -0
  839. data/spec/unit/provider/package/hpux_spec.rb +52 -0
  840. data/spec/unit/provider/package/nim_spec.rb +42 -0
  841. data/spec/unit/provider/package/pkg_spec.rb +63 -0
  842. data/spec/unit/provider/package/pkgdmg_spec.rb +84 -0
  843. data/spec/unit/provider/package/zypper_spec.rb +81 -0
  844. data/spec/unit/provider/parsedfile_spec.rb +95 -0
  845. data/spec/unit/provider/selboolean_spec.rb +37 -0
  846. data/spec/unit/provider/selmodule_spec.rb +66 -0
  847. data/spec/unit/provider/service/daemontools_spec.rb +166 -0
  848. data/spec/unit/provider/service/debian_spec.rb +89 -0
  849. data/spec/unit/provider/service/init_spec.rb +168 -0
  850. data/spec/unit/provider/service/launchd_spec.rb +200 -0
  851. data/spec/unit/provider/service/redhat_spec.rb +121 -0
  852. data/spec/unit/provider/service/runit_spec.rb +140 -0
  853. data/spec/unit/provider/service/src_spec.rb +97 -0
  854. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +228 -0
  855. data/spec/unit/provider/sshkey/parsed_spec.rb +38 -0
  856. data/spec/unit/provider/user/hpux_spec.rb +25 -0
  857. data/spec/unit/provider/user/ldap_spec.rb +279 -0
  858. data/spec/unit/provider/user/user_role_add_spec.rb +249 -0
  859. data/spec/unit/provider/user/useradd_spec.rb +115 -0
  860. data/spec/unit/provider/zfs/solaris_spec.rb +99 -0
  861. data/spec/unit/provider/zone/solaris_spec.rb +55 -0
  862. data/spec/unit/provider/zpool/solaris_spec.rb +179 -0
  863. data/spec/unit/provider_spec.rb +31 -0
  864. data/spec/unit/puppet_spec.rb +12 -0
  865. data/spec/unit/rails/host_spec.rb +163 -0
  866. data/spec/unit/rails/param_value_spec.rb +49 -0
  867. data/spec/unit/rails/resource_spec.rb +123 -0
  868. data/spec/unit/rails_spec.rb +258 -0
  869. data/spec/unit/relationship_spec.rb +236 -0
  870. data/spec/unit/reports/http_spec.rb +56 -0
  871. data/spec/unit/reports/tagmail_spec.rb +94 -0
  872. data/spec/unit/reports_spec.rb +61 -0
  873. data/spec/unit/resource/catalog_spec.rb +1078 -0
  874. data/spec/unit/resource/status_spec.rb +103 -0
  875. data/spec/unit/resource/type_collection_helper_spec.rb +25 -0
  876. data/spec/unit/resource/type_collection_spec.rb +432 -0
  877. data/spec/unit/resource/type_spec.rb +722 -0
  878. data/spec/unit/resource_spec.rb +818 -0
  879. data/spec/unit/run_spec.rb +137 -0
  880. data/spec/unit/simple_graph_spec.rb +544 -0
  881. data/spec/unit/ssl/base_spec.rb +43 -0
  882. data/spec/unit/ssl/certificate_authority/interface_spec.rb +333 -0
  883. data/spec/unit/ssl/certificate_authority_spec.rb +772 -0
  884. data/spec/unit/ssl/certificate_factory_spec.rb +107 -0
  885. data/spec/unit/ssl/certificate_request_spec.rb +220 -0
  886. data/spec/unit/ssl/certificate_revocation_list_spec.rb +168 -0
  887. data/spec/unit/ssl/certificate_spec.rb +124 -0
  888. data/spec/unit/ssl/host_spec.rb +707 -0
  889. data/spec/unit/ssl/inventory_spec.rb +180 -0
  890. data/spec/unit/ssl/key_spec.rb +198 -0
  891. data/spec/unit/status_spec.rb +31 -0
  892. data/spec/unit/transaction/change_spec.rb +193 -0
  893. data/spec/unit/transaction/event_manager_spec.rb +260 -0
  894. data/spec/unit/transaction/event_spec.rb +108 -0
  895. data/spec/unit/transaction/report_spec.rb +234 -0
  896. data/spec/unit/transaction/resource_harness_spec.rb +401 -0
  897. data/spec/unit/transaction_spec.rb +452 -0
  898. data/spec/unit/transportable_spec.rb +0 -0
  899. data/spec/unit/type/augeas_spec.rb +122 -0
  900. data/spec/unit/type/component_spec.rb +63 -0
  901. data/spec/unit/type/computer_spec.rb +81 -0
  902. data/spec/unit/type/cron_spec.rb +33 -0
  903. data/spec/unit/type/exec_spec.rb +162 -0
  904. data/spec/unit/type/file/checksum_spec.rb +73 -0
  905. data/spec/unit/type/file/content_spec.rb +460 -0
  906. data/spec/unit/type/file/ensure_spec.rb +84 -0
  907. data/spec/unit/type/file/group_spec.rb +123 -0
  908. data/spec/unit/type/file/owner_spec.rb +150 -0
  909. data/spec/unit/type/file/selinux_spec.rb +83 -0
  910. data/spec/unit/type/file/source_spec.rb +272 -0
  911. data/spec/unit/type/file_spec.rb +1070 -0
  912. data/spec/unit/type/filebucket_spec.rb +74 -0
  913. data/spec/unit/type/group_spec.rb +57 -0
  914. data/spec/unit/type/macauthorization_spec.rb +111 -0
  915. data/spec/unit/type/maillist_spec.rb +42 -0
  916. data/spec/unit/type/mcx_spec.rb +100 -0
  917. data/spec/unit/type/mount_spec.rb +261 -0
  918. data/spec/unit/type/nagios_spec.rb +63 -0
  919. data/spec/unit/type/noop_metaparam_spec.rb +37 -0
  920. data/spec/unit/type/package_spec.rb +240 -0
  921. data/spec/unit/type/resources_spec.rb +102 -0
  922. data/spec/unit/type/schedule_spec.rb +333 -0
  923. data/spec/unit/type/selboolean_spec.rb +45 -0
  924. data/spec/unit/type/selmodule_spec.rb +18 -0
  925. data/spec/unit/type/service_spec.rb +222 -0
  926. data/spec/unit/type/ssh_authorized_key_spec.rb +152 -0
  927. data/spec/unit/type/stage_spec.rb +9 -0
  928. data/spec/unit/type/tidy_spec.rb +424 -0
  929. data/spec/unit/type/user_spec.rb +281 -0
  930. data/spec/unit/type/zfs_spec.rb +45 -0
  931. data/spec/unit/type/zone_spec.rb +60 -0
  932. data/spec/unit/type/zpool_spec.rb +110 -0
  933. data/spec/unit/type_spec.rb +566 -0
  934. data/spec/unit/util/autoload/file_cache_spec.rb +159 -0
  935. data/spec/unit/util/autoload_spec.rb +120 -0
  936. data/spec/unit/util/backups_spec.rb +159 -0
  937. data/spec/unit/util/cache_accumulator_spec.rb +75 -0
  938. data/spec/unit/util/cacher_spec.rb +185 -0
  939. data/spec/unit/util/checksums_spec.rb +153 -0
  940. data/spec/unit/util/command_line_spec.rb +108 -0
  941. data/spec/unit/util/constant_inflector_spec.rb +70 -0
  942. data/spec/unit/util/errors_spec.rb +38 -0
  943. data/spec/unit/util/feature_spec.rb +72 -0
  944. data/spec/unit/util/file_locking_spec.rb +156 -0
  945. data/spec/unit/util/filetype_spec.rb +100 -0
  946. data/spec/unit/util/inline_docs_spec.rb +32 -0
  947. data/spec/unit/util/json_spec.rb +21 -0
  948. data/spec/unit/util/ldap/connection_spec.rb +169 -0
  949. data/spec/unit/util/ldap/generator_spec.rb +54 -0
  950. data/spec/unit/util/ldap/manager_spec.rb +654 -0
  951. data/spec/unit/util/loadedfile_spec.rb +65 -0
  952. data/spec/unit/util/log/destinations_spec.rb +24 -0
  953. data/spec/unit/util/log_spec.rb +215 -0
  954. data/spec/unit/util/logging_spec.rb +95 -0
  955. data/spec/unit/util/metric_spec.rb +95 -0
  956. data/spec/unit/util/monkey_patches_spec.rb +7 -0
  957. data/spec/unit/util/nagios_maker_spec.rb +126 -0
  958. data/spec/unit/util/package_spec.rb +21 -0
  959. data/spec/unit/util/posix_spec.rb +256 -0
  960. data/spec/unit/util/queue/stomp_spec.rb +140 -0
  961. data/spec/unit/util/queue_spec.rb +96 -0
  962. data/spec/unit/util/rdoc/parser_spec.rb +540 -0
  963. data/spec/unit/util/rdoc_spec.rb +165 -0
  964. data/spec/unit/util/reference_serializer_spec.rb +52 -0
  965. data/spec/unit/util/resource_template_spec.rb +58 -0
  966. data/spec/unit/util/run_mode_spec.rb +51 -0
  967. data/spec/unit/util/selinux_spec.rb +278 -0
  968. data/spec/unit/util/settings/file_setting_spec.rb +256 -0
  969. data/spec/unit/util/settings_spec.rb +1099 -0
  970. data/spec/unit/util/storage_spec.rb +235 -0
  971. data/spec/unit/util/tagging_spec.rb +102 -0
  972. data/spec/unit/util/user_attr_spec.rb +47 -0
  973. data/spec/unit/util/warnings_spec.rb +39 -0
  974. data/spec/unit/util/zaml_spec.rb +38 -0
  975. data/tasks/rake/git_workflow.rake +1 -1
  976. data/tasks/rake/sign.rake +2 -2
  977. data/test/certmgr/ca.rb +61 -61
  978. data/test/certmgr/certmgr.rb +292 -283
  979. data/test/certmgr/inventory.rb +44 -42
  980. data/test/certmgr/support.rb +78 -77
  981. data/test/data/providers/ssh_authorized_key/parsed/authorized_keys +1 -1
  982. data/test/data/snippets/hash.pp +33 -0
  983. data/test/language/ast.rb +68 -117
  984. data/test/language/ast/variable.rb +14 -15
  985. data/test/language/functions.rb +404 -463
  986. data/test/language/parser.rb +670 -1135
  987. data/test/language/scope.rb +198 -402
  988. data/test/language/snippets.rb +439 -447
  989. data/test/language/transportable.rb +67 -66
  990. data/test/lib/puppettest.rb +260 -268
  991. data/test/lib/puppettest/certificates.rb +51 -53
  992. data/test/lib/puppettest/exetest.rb +107 -111
  993. data/test/lib/puppettest/fakes.rb +153 -158
  994. data/test/lib/puppettest/fileparsing.rb +17 -17
  995. data/test/lib/puppettest/filetesting.rb +204 -213
  996. data/test/lib/puppettest/parsertesting.rb +382 -365
  997. data/test/lib/puppettest/railstesting.rb +49 -50
  998. data/test/lib/puppettest/reporttesting.rb +10 -10
  999. data/test/lib/puppettest/resourcetesting.rb +45 -36
  1000. data/test/lib/puppettest/runnable_test.rb +36 -28
  1001. data/test/lib/puppettest/servertest.rb +54 -51
  1002. data/test/lib/puppettest/support/assertions.rb +48 -55
  1003. data/test/lib/puppettest/support/helpers.rb +12 -16
  1004. data/test/lib/puppettest/support/resources.rb +23 -25
  1005. data/test/lib/puppettest/support/utils.rb +138 -148
  1006. data/test/lib/puppettest/testcase.rb +15 -17
  1007. data/test/lib/rake/puppet_test_loader.rb +1 -3
  1008. data/test/lib/rake/puppet_testtask.rb +10 -10
  1009. data/test/network/authconfig.rb +48 -50
  1010. data/test/network/authorization.rb +114 -113
  1011. data/test/network/authstore.rb +454 -406
  1012. data/test/network/client/ca.rb +46 -48
  1013. data/test/network/client/dipper.rb +22 -22
  1014. data/test/network/client_request.rb +20 -20
  1015. data/test/network/handler/ca.rb +251 -252
  1016. data/test/network/handler/fileserver.rb +1071 -1001
  1017. data/test/network/handler/master.rb +58 -58
  1018. data/test/network/handler/report.rb +64 -64
  1019. data/test/network/handler/runner.rb +8 -8
  1020. data/test/network/rights.rb +22 -19
  1021. data/test/network/server/mongrel_test.rb +87 -87
  1022. data/test/network/server/webrick.rb +99 -87
  1023. data/test/network/xmlrpc/client.rb +30 -30
  1024. data/test/network/xmlrpc/processor.rb +52 -53
  1025. data/test/network/xmlrpc/server.rb +10 -11
  1026. data/test/network/xmlrpc/webrick_servlet.rb +21 -18
  1027. data/test/other/provider.rb +69 -84
  1028. data/test/other/puppet.rb +61 -76
  1029. data/test/other/relationships.rb +73 -65
  1030. data/test/other/report.rb +88 -187
  1031. data/test/other/transactions.rb +363 -885
  1032. data/test/puppet/defaults.rb +51 -54
  1033. data/test/puppet/errortest.rb +8 -8
  1034. data/test/puppet/tc_suidmanager.rb +106 -103
  1035. data/test/rails/rails.rb +8 -9
  1036. data/test/rails/railsparameter.rb +60 -54
  1037. data/test/ral/manager/attributes.rb +262 -260
  1038. data/test/ral/manager/instances.rb +77 -78
  1039. data/test/ral/manager/manager.rb +36 -36
  1040. data/test/ral/manager/provider.rb +56 -79
  1041. data/test/ral/manager/type.rb +308 -449
  1042. data/test/ral/providers/cron/crontab.rb +561 -545
  1043. data/test/ral/providers/group.rb +203 -212
  1044. data/test/ral/providers/host/parsed.rb +189 -180
  1045. data/test/ral/providers/mailalias/aliases.rb +40 -40
  1046. data/test/ral/providers/nameservice.rb +21 -21
  1047. data/test/ral/providers/package.rb +207 -214
  1048. data/test/ral/providers/package/aptitude.rb +75 -63
  1049. data/test/ral/providers/package/aptrpm.rb +84 -72
  1050. data/test/ral/providers/parsedfile.rb +510 -509
  1051. data/test/ral/providers/port/parsed.rb +5 -5
  1052. data/test/ral/providers/provider.rb +421 -421
  1053. data/test/ral/providers/service/base.rb +59 -53
  1054. data/test/ral/providers/sshkey/parsed.rb +86 -83
  1055. data/test/ral/providers/user.rb +471 -451
  1056. data/test/ral/providers/user/useradd.rb +168 -177
  1057. data/test/ral/type/cron.rb +406 -393
  1058. data/test/ral/type/exec.rb +721 -641
  1059. data/test/ral/type/file.rb +827 -896
  1060. data/test/ral/type/file/target.rb +295 -251
  1061. data/test/ral/type/fileignoresource.rb +232 -205
  1062. data/test/ral/type/filesources.rb +446 -485
  1063. data/test/ral/type/host.rb +124 -153
  1064. data/test/ral/type/mailalias.rb +28 -31
  1065. data/test/ral/type/port.rb +7 -7
  1066. data/test/ral/type/resources.rb +88 -93
  1067. data/test/ral/type/service.rb +19 -19
  1068. data/test/ral/type/sshkey.rb +120 -160
  1069. data/test/ral/type/user.rb +132 -414
  1070. data/test/ral/type/yumrepo.rb +95 -92
  1071. data/test/ral/type/zone.rb +316 -287
  1072. data/test/test +1 -1
  1073. data/test/util/classgen.rb +182 -167
  1074. data/test/util/execution.rb +18 -18
  1075. data/test/util/fileparsing.rb +580 -540
  1076. data/test/util/inifile.rb +117 -106
  1077. data/test/util/instance_loader.rb +29 -29
  1078. data/test/util/log.rb +202 -198
  1079. data/test/util/metrics.rb +51 -51
  1080. data/test/util/package.rb +11 -12
  1081. data/test/util/pidlock.rb +115 -115
  1082. data/test/util/settings.rb +613 -557
  1083. data/test/util/storage.rb +71 -88
  1084. data/test/util/subclass_loader.rb +69 -72
  1085. data/test/util/utiltest.rb +204 -203
  1086. metadata +493 -395
  1087. data/lib/puppet/agent/runner.rb +0 -65
  1088. data/lib/puppet/application/pi.rb +0 -214
  1089. data/lib/puppet/application/puppet.rb +0 -181
  1090. data/lib/puppet/application/puppetca.rb +0 -71
  1091. data/lib/puppet/application/puppetd.rb +0 -250
  1092. data/lib/puppet/application/puppetdoc.rb +0 -224
  1093. data/lib/puppet/application/puppetmasterd.rb +0 -168
  1094. data/lib/puppet/application/puppetqd.rb +0 -96
  1095. data/lib/puppet/application/puppetrun.rb +0 -210
  1096. data/lib/puppet/application/ralsh.rb +0 -152
  1097. data/lib/puppet/checksum.rb +0 -57
  1098. data/lib/puppet/indirector/checksum/file.rb +0 -33
  1099. data/lib/puppet/indirector/runner/rest.rb +0 -7
  1100. data/lib/puppet/network/client/dipper.rb +0 -85
  1101. data/lib/puppet/network/client/resource.rb +0 -38
  1102. data/lib/puppet/network/handler/resource.rb +0 -190
  1103. data/lib/puppet/parser/ast/definition.rb +0 -207
  1104. data/lib/puppet/parser/ast/hostclass.rb +0 -95
  1105. data/lib/puppet/parser/ast/node.rb +0 -42
  1106. data/lib/puppet/parser/interpreter.rb +0 -84
  1107. data/lib/puppet/parser/loaded_code.rb +0 -119
  1108. data/lib/puppet/parser/resource/reference.rb +0 -99
  1109. data/lib/puppet/resource/reference.rb +0 -90
  1110. data/lib/puppet/util/config_store.rb +0 -61
  1111. data/spec/integration/application/puppet.rb +0 -33
  1112. data/spec/integration/bin/puppetmasterd.rb +0 -122
  1113. data/spec/integration/checksum.rb +0 -48
  1114. data/spec/integration/configurer.rb +0 -18
  1115. data/spec/integration/defaults.rb +0 -230
  1116. data/spec/integration/file_serving/content.rb +0 -20
  1117. data/spec/integration/file_serving/fileset.rb +0 -14
  1118. data/spec/integration/file_serving/metadata.rb +0 -21
  1119. data/spec/integration/file_serving/terminus_helper.rb +0 -22
  1120. data/spec/integration/indirector/catalog/compiler.rb +0 -67
  1121. data/spec/integration/indirector/catalog/queue.rb +0 -61
  1122. data/spec/integration/indirector/certificate/rest.rb +0 -70
  1123. data/spec/integration/indirector/certificate_request/rest.rb +0 -88
  1124. data/spec/integration/indirector/certificate_revocation_list/rest.rb +0 -76
  1125. data/spec/integration/indirector/direct_file_server.rb +0 -73
  1126. data/spec/integration/indirector/file_content/file_server.rb +0 -94
  1127. data/spec/integration/indirector/file_metadata/file_server.rb +0 -18
  1128. data/spec/integration/indirector/node/ldap.rb +0 -15
  1129. data/spec/integration/indirector/report/rest.rb +0 -94
  1130. data/spec/integration/indirector/rest.rb +0 -523
  1131. data/spec/integration/network/client.rb +0 -19
  1132. data/spec/integration/network/formats.rb +0 -110
  1133. data/spec/integration/network/handler.rb +0 -25
  1134. data/spec/integration/network/server/mongrel.rb +0 -66
  1135. data/spec/integration/network/server/webrick.rb +0 -86
  1136. data/spec/integration/node.rb +0 -93
  1137. data/spec/integration/node/environment.rb +0 -58
  1138. data/spec/integration/node/facts.rb +0 -47
  1139. data/spec/integration/parser/compiler.rb +0 -29
  1140. data/spec/integration/parser/functions/require.rb +0 -86
  1141. data/spec/integration/provider/mailalias/aliases.rb +0 -25
  1142. data/spec/integration/provider/package.rb +0 -26
  1143. data/spec/integration/provider/service/init.rb +0 -32
  1144. data/spec/integration/reference/providers.rb +0 -17
  1145. data/spec/integration/reports.rb +0 -18
  1146. data/spec/integration/resource/catalog.rb +0 -61
  1147. data/spec/integration/ssl/certificate_authority.rb +0 -135
  1148. data/spec/integration/ssl/certificate_request.rb +0 -61
  1149. data/spec/integration/ssl/certificate_revocation_list.rb +0 -42
  1150. data/spec/integration/ssl/host.rb +0 -90
  1151. data/spec/integration/transaction.rb +0 -66
  1152. data/spec/integration/transaction/report.rb +0 -29
  1153. data/spec/integration/type.rb +0 -22
  1154. data/spec/integration/type/file.rb +0 -477
  1155. data/spec/integration/type/package.rb +0 -25
  1156. data/spec/integration/type/tidy.rb +0 -27
  1157. data/spec/integration/util/autoload.rb +0 -114
  1158. data/spec/integration/util/feature.rb +0 -54
  1159. data/spec/integration/util/file_locking.rb +0 -37
  1160. data/spec/integration/util/settings.rb +0 -27
  1161. data/spec/unit/agent.rb +0 -259
  1162. data/spec/unit/agent/locker.rb +0 -100
  1163. data/spec/unit/agent/runner.rb +0 -118
  1164. data/spec/unit/application.rb +0 -420
  1165. data/spec/unit/application/filebucket.rb +0 -220
  1166. data/spec/unit/application/pi.rb +0 -84
  1167. data/spec/unit/application/puppet.rb +0 -399
  1168. data/spec/unit/application/puppetca.rb +0 -142
  1169. data/spec/unit/application/puppetd.rb +0 -502
  1170. data/spec/unit/application/puppetdoc.rb +0 -360
  1171. data/spec/unit/application/puppetmasterd.rb +0 -457
  1172. data/spec/unit/application/puppetqd.rb +0 -186
  1173. data/spec/unit/application/puppetrun.rb +0 -289
  1174. data/spec/unit/application/ralsh.rb +0 -254
  1175. data/spec/unit/configurer.rb +0 -339
  1176. data/spec/unit/configurer/downloader.rb +0 -188
  1177. data/spec/unit/configurer/fact_handler.rb +0 -164
  1178. data/spec/unit/configurer/plugin_handler.rb +0 -112
  1179. data/spec/unit/daemon.rb +0 -287
  1180. data/spec/unit/file_collection.rb +0 -53
  1181. data/spec/unit/file_collection/lookup.rb +0 -46
  1182. data/spec/unit/file_serving/base.rb +0 -132
  1183. data/spec/unit/file_serving/configuration.rb +0 -249
  1184. data/spec/unit/file_serving/configuration/parser.rb +0 -181
  1185. data/spec/unit/file_serving/content.rb +0 -110
  1186. data/spec/unit/file_serving/fileset.rb +0 -347
  1187. data/spec/unit/file_serving/indirection_hooks.rb +0 -63
  1188. data/spec/unit/file_serving/metadata.rb +0 -286
  1189. data/spec/unit/file_serving/mount.rb +0 -32
  1190. data/spec/unit/file_serving/mount/file.rb +0 -196
  1191. data/spec/unit/file_serving/mount/modules.rb +0 -63
  1192. data/spec/unit/file_serving/mount/plugins.rb +0 -61
  1193. data/spec/unit/file_serving/terminus_helper.rb +0 -98
  1194. data/spec/unit/indirector.rb +0 -157
  1195. data/spec/unit/indirector/active_record.rb +0 -76
  1196. data/spec/unit/indirector/catalog/active_record.rb +0 -141
  1197. data/spec/unit/indirector/catalog/compiler.rb +0 -261
  1198. data/spec/unit/indirector/catalog/queue.rb +0 -20
  1199. data/spec/unit/indirector/catalog/rest.rb +0 -11
  1200. data/spec/unit/indirector/catalog/yaml.rb +0 -25
  1201. data/spec/unit/indirector/certificate/ca.rb +0 -28
  1202. data/spec/unit/indirector/certificate/file.rb +0 -28
  1203. data/spec/unit/indirector/certificate/rest.rb +0 -57
  1204. data/spec/unit/indirector/certificate_request/ca.rb +0 -19
  1205. data/spec/unit/indirector/certificate_request/file.rb +0 -19
  1206. data/spec/unit/indirector/certificate_request/rest.rb +0 -23
  1207. data/spec/unit/indirector/certificate_revocation_list/ca.rb +0 -21
  1208. data/spec/unit/indirector/certificate_revocation_list/file.rb +0 -20
  1209. data/spec/unit/indirector/certificate_revocation_list/rest.rb +0 -23
  1210. data/spec/unit/indirector/checksum/file.rb +0 -139
  1211. data/spec/unit/indirector/code.rb +0 -33
  1212. data/spec/unit/indirector/direct_file_server.rb +0 -84
  1213. data/spec/unit/indirector/envelope.rb +0 -47
  1214. data/spec/unit/indirector/exec.rb +0 -56
  1215. data/spec/unit/indirector/facts/active_record.rb +0 -104
  1216. data/spec/unit/indirector/facts/facter.rb +0 -142
  1217. data/spec/unit/indirector/facts/rest.rb +0 -11
  1218. data/spec/unit/indirector/facts/yaml.rb +0 -26
  1219. data/spec/unit/indirector/file.rb +0 -161
  1220. data/spec/unit/indirector/file_content/file.rb +0 -18
  1221. data/spec/unit/indirector/file_content/file_server.rb +0 -18
  1222. data/spec/unit/indirector/file_content/rest.rb +0 -11
  1223. data/spec/unit/indirector/file_metadata/file.rb +0 -52
  1224. data/spec/unit/indirector/file_metadata/file_server.rb +0 -18
  1225. data/spec/unit/indirector/file_metadata/rest.rb +0 -9
  1226. data/spec/unit/indirector/file_server.rb +0 -267
  1227. data/spec/unit/indirector/indirection.rb +0 -795
  1228. data/spec/unit/indirector/key/ca.rb +0 -28
  1229. data/spec/unit/indirector/key/file.rb +0 -104
  1230. data/spec/unit/indirector/ldap.rb +0 -143
  1231. data/spec/unit/indirector/memory.rb +0 -29
  1232. data/spec/unit/indirector/node/active_record.rb +0 -34
  1233. data/spec/unit/indirector/node/exec.rb +0 -69
  1234. data/spec/unit/indirector/node/ldap.rb +0 -458
  1235. data/spec/unit/indirector/node/memory.rb +0 -19
  1236. data/spec/unit/indirector/node/plain.rb +0 -19
  1237. data/spec/unit/indirector/node/rest.rb +0 -13
  1238. data/spec/unit/indirector/node/yaml.rb +0 -25
  1239. data/spec/unit/indirector/plain.rb +0 -29
  1240. data/spec/unit/indirector/queue.rb +0 -123
  1241. data/spec/unit/indirector/report/processor.rb +0 -81
  1242. data/spec/unit/indirector/report/rest.rb +0 -28
  1243. data/spec/unit/indirector/request.rb +0 -308
  1244. data/spec/unit/indirector/rest.rb +0 -403
  1245. data/spec/unit/indirector/runner/rest.rb +0 -11
  1246. data/spec/unit/indirector/ssl_file.rb +0 -280
  1247. data/spec/unit/indirector/terminus.rb +0 -245
  1248. data/spec/unit/indirector/yaml.rb +0 -145
  1249. data/spec/unit/module.rb +0 -247
  1250. data/spec/unit/network/authconfig.rb +0 -292
  1251. data/spec/unit/network/authstore.rb +0 -370
  1252. data/spec/unit/network/client.rb +0 -45
  1253. data/spec/unit/network/client/dipper.rb +0 -16
  1254. data/spec/unit/network/format.rb +0 -191
  1255. data/spec/unit/network/format_handler.rb +0 -327
  1256. data/spec/unit/network/formats.rb +0 -365
  1257. data/spec/unit/network/handler/fileserver.rb +0 -176
  1258. data/spec/unit/network/http.rb +0 -35
  1259. data/spec/unit/network/http/api/v1.rb +0 -122
  1260. data/spec/unit/network/http/handler.rb +0 -458
  1261. data/spec/unit/network/http/mongrel.rb +0 -131
  1262. data/spec/unit/network/http/mongrel/rest.rb +0 -232
  1263. data/spec/unit/network/http/rack.rb +0 -102
  1264. data/spec/unit/network/http/rack/rest.rb +0 -199
  1265. data/spec/unit/network/http/rack/xmlrpc.rb +0 -157
  1266. data/spec/unit/network/http/webrick.rb +0 -339
  1267. data/spec/unit/network/http/webrick/rest.rb +0 -157
  1268. data/spec/unit/network/http_pool.rb +0 -206
  1269. data/spec/unit/network/rest_authconfig.rb +0 -146
  1270. data/spec/unit/network/rest_authorization.rb +0 -43
  1271. data/spec/unit/network/rights.rb +0 -519
  1272. data/spec/unit/network/server.rb +0 -534
  1273. data/spec/unit/network/xmlrpc/client.rb +0 -171
  1274. data/spec/unit/node.rb +0 -200
  1275. data/spec/unit/node/environment.rb +0 -187
  1276. data/spec/unit/node/facts.rb +0 -97
  1277. data/spec/unit/other/checksum.rb +0 -92
  1278. data/spec/unit/other/selinux.rb +0 -85
  1279. data/spec/unit/other/transbucket.rb +0 -188
  1280. data/spec/unit/other/transobject.rb +0 -112
  1281. data/spec/unit/parameter.rb +0 -405
  1282. data/spec/unit/parser/ast.rb +0 -41
  1283. data/spec/unit/parser/ast/arithmetic_operator.rb +0 -73
  1284. data/spec/unit/parser/ast/astarray.rb +0 -72
  1285. data/spec/unit/parser/ast/boolean_operator.rb +0 -53
  1286. data/spec/unit/parser/ast/casestatement.rb +0 -135
  1287. data/spec/unit/parser/ast/collection.rb +0 -63
  1288. data/spec/unit/parser/ast/collexpr.rb +0 -115
  1289. data/spec/unit/parser/ast/comparison_operator.rb +0 -92
  1290. data/spec/unit/parser/ast/definition.rb +0 -213
  1291. data/spec/unit/parser/ast/function.rb +0 -83
  1292. data/spec/unit/parser/ast/hostclass.rb +0 -148
  1293. data/spec/unit/parser/ast/ifstatement.rb +0 -76
  1294. data/spec/unit/parser/ast/leaf.rb +0 -298
  1295. data/spec/unit/parser/ast/match_operator.rb +0 -50
  1296. data/spec/unit/parser/ast/minus.rb +0 -36
  1297. data/spec/unit/parser/ast/node.rb +0 -145
  1298. data/spec/unit/parser/ast/nop.rb +0 -20
  1299. data/spec/unit/parser/ast/not.rb +0 -30
  1300. data/spec/unit/parser/ast/resource.rb +0 -103
  1301. data/spec/unit/parser/ast/resource_override.rb +0 -51
  1302. data/spec/unit/parser/ast/resource_reference.rb +0 -69
  1303. data/spec/unit/parser/ast/selector.rb +0 -155
  1304. data/spec/unit/parser/ast/vardef.rb +0 -47
  1305. data/spec/unit/parser/collector.rb +0 -556
  1306. data/spec/unit/parser/compiler.rb +0 -604
  1307. data/spec/unit/parser/files.rb +0 -190
  1308. data/spec/unit/parser/functions.rb +0 -83
  1309. data/spec/unit/parser/functions/fqdn_rand.rb +0 -62
  1310. data/spec/unit/parser/functions/generate.rb +0 -41
  1311. data/spec/unit/parser/functions/inline_template.rb +0 -59
  1312. data/spec/unit/parser/functions/realize.rb +0 -51
  1313. data/spec/unit/parser/functions/regsubst.rb +0 -168
  1314. data/spec/unit/parser/functions/require.rb +0 -69
  1315. data/spec/unit/parser/functions/shellquote.rb +0 -92
  1316. data/spec/unit/parser/functions/split.rb +0 -51
  1317. data/spec/unit/parser/functions/sprintf.rb +0 -42
  1318. data/spec/unit/parser/functions/template.rb +0 -62
  1319. data/spec/unit/parser/functions/versioncmp.rb +0 -29
  1320. data/spec/unit/parser/interpreter.rb +0 -147
  1321. data/spec/unit/parser/lexer.rb +0 -731
  1322. data/spec/unit/parser/loaded_code.rb +0 -215
  1323. data/spec/unit/parser/parser.rb +0 -423
  1324. data/spec/unit/parser/resource.rb +0 -529
  1325. data/spec/unit/parser/resource/reference.rb +0 -111
  1326. data/spec/unit/parser/scope.rb +0 -387
  1327. data/spec/unit/parser/templatewrapper.rb +0 -134
  1328. data/spec/unit/property.rb +0 -305
  1329. data/spec/unit/property/keyvalue.rb +0 -168
  1330. data/spec/unit/property/list.rb +0 -166
  1331. data/spec/unit/property/ordered_list.rb +0 -64
  1332. data/spec/unit/provider.rb +0 -31
  1333. data/spec/unit/provider/augeas/augeas.rb +0 -413
  1334. data/spec/unit/provider/confine.rb +0 -78
  1335. data/spec/unit/provider/confine/exists.rb +0 -81
  1336. data/spec/unit/provider/confine/false.rb +0 -53
  1337. data/spec/unit/provider/confine/feature.rb +0 -60
  1338. data/spec/unit/provider/confine/true.rb +0 -53
  1339. data/spec/unit/provider/confine/variable.rb +0 -107
  1340. data/spec/unit/provider/confine_collection.rb +0 -134
  1341. data/spec/unit/provider/confiner.rb +0 -63
  1342. data/spec/unit/provider/group/groupadd.rb +0 -31
  1343. data/spec/unit/provider/group/ldap.rb +0 -105
  1344. data/spec/unit/provider/ldap.rb +0 -248
  1345. data/spec/unit/provider/macauthorization.rb +0 -147
  1346. data/spec/unit/provider/mcx/mcxcontent.rb +0 -175
  1347. data/spec/unit/provider/mount.rb +0 -130
  1348. data/spec/unit/provider/mount/parsed.rb +0 -194
  1349. data/spec/unit/provider/naginator.rb +0 -58
  1350. data/spec/unit/provider/package/apt.rb +0 -138
  1351. data/spec/unit/provider/package/dpkg.rb +0 -170
  1352. data/spec/unit/provider/package/gem.rb +0 -87
  1353. data/spec/unit/provider/package/hpux.rb +0 -52
  1354. data/spec/unit/provider/package/pkgdmg.rb +0 -73
  1355. data/spec/unit/provider/parsedfile.rb +0 -95
  1356. data/spec/unit/provider/selboolean.rb +0 -37
  1357. data/spec/unit/provider/selmodule.rb +0 -66
  1358. data/spec/unit/provider/service/daemontools.rb +0 -166
  1359. data/spec/unit/provider/service/debian.rb +0 -89
  1360. data/spec/unit/provider/service/init.rb +0 -121
  1361. data/spec/unit/provider/service/launchd.rb +0 -200
  1362. data/spec/unit/provider/service/redhat.rb +0 -96
  1363. data/spec/unit/provider/service/runit.rb +0 -140
  1364. data/spec/unit/provider/ssh_authorized_key/parsed.rb +0 -206
  1365. data/spec/unit/provider/sshkey/parsed.rb +0 -38
  1366. data/spec/unit/provider/user/hpux.rb +0 -25
  1367. data/spec/unit/provider/user/ldap.rb +0 -279
  1368. data/spec/unit/provider/user/user_role_add.rb +0 -249
  1369. data/spec/unit/provider/user/useradd.rb +0 -115
  1370. data/spec/unit/provider/zfs/solaris.rb +0 -99
  1371. data/spec/unit/provider/zone/solaris.rb +0 -42
  1372. data/spec/unit/provider/zpool/solaris.rb +0 -179
  1373. data/spec/unit/rails.rb +0 -133
  1374. data/spec/unit/rails/host.rb +0 -163
  1375. data/spec/unit/rails/param_value.rb +0 -49
  1376. data/spec/unit/rails/resource.rb +0 -107
  1377. data/spec/unit/relationship.rb +0 -236
  1378. data/spec/unit/reports.rb +0 -61
  1379. data/spec/unit/resource.rb +0 -495
  1380. data/spec/unit/resource/catalog.rb +0 -1053
  1381. data/spec/unit/resource/reference.rb +0 -111
  1382. data/spec/unit/simple_graph.rb +0 -551
  1383. data/spec/unit/ssl/certificate.rb +0 -124
  1384. data/spec/unit/ssl/certificate_authority.rb +0 -741
  1385. data/spec/unit/ssl/certificate_authority/interface.rb +0 -269
  1386. data/spec/unit/ssl/certificate_factory.rb +0 -107
  1387. data/spec/unit/ssl/certificate_request.rb +0 -193
  1388. data/spec/unit/ssl/certificate_revocation_list.rb +0 -168
  1389. data/spec/unit/ssl/host.rb +0 -704
  1390. data/spec/unit/ssl/inventory.rb +0 -180
  1391. data/spec/unit/ssl/key.rb +0 -198
  1392. data/spec/unit/transaction.rb +0 -146
  1393. data/spec/unit/transaction/change.rb +0 -187
  1394. data/spec/unit/transaction/event.rb +0 -25
  1395. data/spec/unit/transaction/report.rb +0 -40
  1396. data/spec/unit/type.rb +0 -426
  1397. data/spec/unit/type/augeas.rb +0 -106
  1398. data/spec/unit/type/component.rb +0 -63
  1399. data/spec/unit/type/computer.rb +0 -78
  1400. data/spec/unit/type/cron.rb +0 -33
  1401. data/spec/unit/type/exec.rb +0 -116
  1402. data/spec/unit/type/file.rb +0 -810
  1403. data/spec/unit/type/file/checksum.rb +0 -28
  1404. data/spec/unit/type/file/content.rb +0 -297
  1405. data/spec/unit/type/file/ensure.rb +0 -84
  1406. data/spec/unit/type/file/group.rb +0 -123
  1407. data/spec/unit/type/file/owner.rb +0 -143
  1408. data/spec/unit/type/file/selinux.rb +0 -84
  1409. data/spec/unit/type/file/source.rb +0 -264
  1410. data/spec/unit/type/filebucket.rb +0 -74
  1411. data/spec/unit/type/group.rb +0 -39
  1412. data/spec/unit/type/macauthorization.rb +0 -111
  1413. data/spec/unit/type/maillist.rb +0 -42
  1414. data/spec/unit/type/mcx.rb +0 -100
  1415. data/spec/unit/type/mount.rb +0 -211
  1416. data/spec/unit/type/nagios.rb +0 -63
  1417. data/spec/unit/type/noop_metaparam.rb +0 -37
  1418. data/spec/unit/type/package.rb +0 -236
  1419. data/spec/unit/type/resources.rb +0 -89
  1420. data/spec/unit/type/schedule.rb +0 -333
  1421. data/spec/unit/type/selboolean.rb +0 -45
  1422. data/spec/unit/type/selmodule.rb +0 -18
  1423. data/spec/unit/type/service.rb +0 -230
  1424. data/spec/unit/type/ssh_authorized_key.rb +0 -140
  1425. data/spec/unit/type/tidy.rb +0 -422
  1426. data/spec/unit/type/user.rb +0 -285
  1427. data/spec/unit/type/zfs.rb +0 -45
  1428. data/spec/unit/type/zone.rb +0 -20
  1429. data/spec/unit/type/zpool.rb +0 -110
  1430. data/spec/unit/util/autoload.rb +0 -133
  1431. data/spec/unit/util/autoload/file_cache.rb +0 -183
  1432. data/spec/unit/util/backups.rb +0 -159
  1433. data/spec/unit/util/cache_accumulator.rb +0 -69
  1434. data/spec/unit/util/cacher.rb +0 -185
  1435. data/spec/unit/util/checksums.rb +0 -113
  1436. data/spec/unit/util/constant_inflector.rb +0 -70
  1437. data/spec/unit/util/feature.rb +0 -72
  1438. data/spec/unit/util/file_locking.rb +0 -115
  1439. data/spec/unit/util/filetype.rb +0 -100
  1440. data/spec/unit/util/json.rb +0 -21
  1441. data/spec/unit/util/ldap/connection.rb +0 -169
  1442. data/spec/unit/util/ldap/generator.rb +0 -54
  1443. data/spec/unit/util/ldap/manager.rb +0 -654
  1444. data/spec/unit/util/loadedfile.rb +0 -65
  1445. data/spec/unit/util/log.rb +0 -202
  1446. data/spec/unit/util/metric.rb +0 -95
  1447. data/spec/unit/util/monkey_patches.rb +0 -103
  1448. data/spec/unit/util/nagios_maker.rb +0 -126
  1449. data/spec/unit/util/package.rb +0 -21
  1450. data/spec/unit/util/posix.rb +0 -256
  1451. data/spec/unit/util/queue.rb +0 -96
  1452. data/spec/unit/util/queue/stomp.rb +0 -140
  1453. data/spec/unit/util/reference_serializer.rb +0 -52
  1454. data/spec/unit/util/resource_template.rb +0 -58
  1455. data/spec/unit/util/selinux.rb +0 -280
  1456. data/spec/unit/util/settings.rb +0 -1058
  1457. data/spec/unit/util/settings/file_setting.rb +0 -248
  1458. data/spec/unit/util/storage.rb +0 -248
  1459. data/spec/unit/util/tagging.rb +0 -102
  1460. data/spec/unit/util/user_attr.rb +0 -47
  1461. data/spec/unit/util/warnings.rb +0 -39
  1462. data/spec/unit/util/zaml.rb +0 -38
  1463. data/test/language/ast/casestatement.rb +0 -103
  1464. data/test/language/ast/resource.rb +0 -58
  1465. data/test/language/ast/resource_reference.rb +0 -77
  1466. data/test/language/ast/selector.rb +0 -61
  1467. data/test/language/resource.rb +0 -172
  1468. data/test/lib/puppettest/support/collection.rb +0 -29
  1469. data/test/network/client/resource.rb +0 -52
  1470. data/test/network/handler/bucket.rb +0 -313
  1471. data/test/network/handler/resource.rb +0 -250
  1472. data/test/other/dsl.rb +0 -215
  1473. data/test/other/events.rb +0 -124
  1474. data/test/ral/type/group.rb +0 -170
@@ -9,827 +9,790 @@ require 'puppet/util/checksums'
9
9
  require 'puppet/network/client'
10
10
  require 'puppet/util/backups'
11
11
 
12
- module Puppet
13
- newtype(:file) do
14
- include Puppet::Util::MethodHelper
15
- include Puppet::Util::Checksums
16
- include Puppet::Util::Backups
17
- @doc = "Manages local files, including setting ownership and
18
- permissions, creation of both files and directories, and
19
- retrieving entire files from remote servers. As Puppet matures, it
20
- expected that the ``file`` resource will be used less and less to
21
- manage content, and instead native resources will be used to do so.
22
-
23
- If you find that you are often copying files in from a central
24
- location, rather than using native resources, please contact
25
- Puppet Labs and we can hopefully work with you to develop a
26
- native resource to support what you are doing."
27
-
28
- newparam(:path) do
29
- desc "The path to the file to manage. Must be fully qualified."
30
- isnamevar
31
-
32
- validate do |value|
33
- unless value =~ /^#{File::SEPARATOR}/
34
- fail Puppet::Error,"File paths must be fully qualified, not '#{value}'"
35
- end
36
- end
37
-
38
- # convert the current path in an index into the collection and the last
39
- # path name. The aim is to use less storage for all common paths in a hierarchy
40
- munge do |value|
41
- path, name = File.split(value)
42
- { :index => Puppet::FileCollection.collection.index(path), :name => name }
43
- end
44
-
45
- # and the reverse
46
- unmunge do |value|
47
- File.join( Puppet::FileCollection.collection.path(value[:index]), value[:name] )
48
- end
49
-
50
- to_canonicalize do |s|
51
- # Get rid of any duplicate slashes, and remove any trailing slashes unless
52
- # the title is just a slash, in which case leave it.
53
- s.gsub(/\/+/, "/").sub(/(.)\/$/,'\1')
54
- end
55
- end
56
-
57
- newparam(:backup) do
58
- desc "Whether files should be backed up before
59
- being replaced. The preferred method of backing files up is via
60
- a ``filebucket``, which stores files by their MD5 sums and allows
61
- easy retrieval without littering directories with backups. You
62
- can specify a local filebucket or a network-accessible
63
- server-based filebucket by setting ``backup => bucket-name``.
64
- Alternatively, if you specify any value that begins with a ``.``
65
- (e.g., ``.puppet-bak``), then Puppet will use copy the file in
66
- the same directory with that value as the extension of the
67
- backup. Setting ``backup => false`` disables all backups of the
68
- file in question.
69
-
70
- Puppet automatically creates a local filebucket named ``puppet`` and
71
- defaults to backing up there. To use a server-based filebucket,
72
- you must specify one in your configuration::
73
-
74
- filebucket { main:
75
- server => puppet
76
- }
77
-
78
- The ``puppetmasterd`` daemon creates a filebucket by default,
79
- so you can usually back up to your main server with this
80
- configuration. Once you've described the bucket in your
81
- configuration, you can use it in any file::
82
-
83
- file { \"/my/file\":
84
- source => \"/path/in/nfs/or/something\",
85
- backup => main
86
- }
87
-
88
- This will back the file up to the central server.
89
-
90
- At this point, the benefits of using a filebucket are that you do not
91
- have backup files lying around on each of your machines, a given
92
- version of a file is only backed up once, and you can restore
93
- any given file manually, no matter how old. Eventually,
94
- transactional support will be able to automatically restore
95
- filebucketed files.
96
- "
97
-
98
- defaultto "puppet"
99
-
100
- munge do |value|
101
- # I don't really know how this is happening.
102
- value = value.shift if value.is_a?(Array)
103
-
104
- case value
105
- when false, "false", :false
106
- false
107
- when true, "true", ".puppet-bak", :true
108
- ".puppet-bak"
109
- when String
110
- value
111
- else
112
- self.fail "Invalid backup type %s" % value.inspect
113
- end
114
- end
115
- end
116
-
117
- newparam(:recurse) do
118
- desc "Whether and how deeply to do recursive
119
- management."
120
-
121
- newvalues(:true, :false, :inf, :remote, /^[0-9]+$/)
122
-
123
- # Replace the validation so that we allow numbers in
124
- # addition to string representations of them.
125
- validate { |arg| }
126
- munge do |value|
127
- newval = super(value)
128
- case newval
129
- when :true, :inf; true
130
- when :false; false
131
- when :remote; :remote
132
- when Integer, Fixnum, Bignum
133
- self.warning "Setting recursion depth with the recurse parameter is now deprecated, please use recurselimit"
134
-
135
- # recurse == 0 means no recursion
136
- return false if value == 0
137
-
138
- resource[:recurselimit] = value
139
- true
140
- when /^\d+$/
141
- self.warning "Setting recursion depth with the recurse parameter is now deprecated, please use recurselimit"
142
- value = Integer(value)
143
-
144
- # recurse == 0 means no recursion
145
- return false if value == 0
146
-
147
- resource[:recurselimit] = value
148
- true
149
- else
150
- self.fail "Invalid recurse value #{value.inspect}"
151
- end
152
- end
153
- end
154
-
155
- newparam(:recurselimit) do
156
- desc "How deeply to do recursive management."
157
-
158
- newvalues(/^[0-9]+$/)
159
-
160
- munge do |value|
161
- newval = super(value)
162
- case newval
163
- when Integer, Fixnum, Bignum; value
164
- when /^\d+$/; Integer(value)
165
- else
166
- self.fail "Invalid recurselimit value #{value.inspect}"
167
- end
168
- end
169
- end
170
-
171
- newparam(:replace, :boolean => true) do
172
- desc "Whether or not to replace a file that is
173
- sourced but exists. This is useful for using file sources
174
- purely for initialization."
175
- newvalues(:true, :false)
176
- aliasvalue(:yes, :true)
177
- aliasvalue(:no, :false)
178
- defaultto :true
179
- end
180
-
181
- newparam(:force, :boolean => true) do
182
- desc "Force the file operation. Currently only used when replacing
183
- directories with links."
184
- newvalues(:true, :false)
185
- defaultto false
186
- end
187
-
188
- newparam(:ignore) do
189
- desc "A parameter which omits action on files matching
190
- specified patterns during recursion. Uses Ruby's builtin globbing
191
- engine, so shell metacharacters are fully supported, e.g. ``[a-z]*``.
192
- Matches that would descend into the directory structure are ignored,
193
- e.g., ``*/*``."
194
-
195
- validate do |value|
196
- unless value.is_a?(Array) or value.is_a?(String) or value == false
197
- self.devfail "Ignore must be a string or an Array"
198
- end
199
- end
200
- end
201
-
202
- newparam(:links) do
203
- desc "How to handle links during file actions. During file copying,
204
- ``follow`` will copy the target file instead of the link, ``manage``
205
- will copy the link itself, and ``ignore`` will just pass it by.
206
- When not copying, ``manage`` and ``ignore`` behave equivalently
207
- (because you cannot really ignore links entirely during local
208
- recursion), and ``follow`` will manage the file to which the
209
- link points."
210
-
211
- newvalues(:follow, :manage)
212
-
213
- defaultto :manage
214
- end
215
-
216
- newparam(:purge, :boolean => true) do
217
- desc "Whether unmanaged files should be purged. If you have a filebucket
218
- configured the purged files will be uploaded, but if you do not,
219
- this will destroy data. Only use this option for generated
220
- files unless you really know what you are doing. This option only
221
- makes sense when recursively managing directories.
222
-
223
- Note that when using ``purge`` with ``source``, Puppet will purge any files
224
- that are not on the remote system."
225
-
226
- defaultto :false
227
-
228
- newvalues(:true, :false)
229
- end
230
-
231
- newparam(:sourceselect) do
232
- desc "Whether to copy all valid sources, or just the first one. This parameter
233
- is only used in recursive copies; by default, the first valid source is the
234
- only one used as a recursive source, but if this parameter is set to ``all``,
235
- then all valid sources will have all of their contents copied to the local host,
236
- and for sources that have the same file, the source earlier in the list will
237
- be used."
238
-
239
- defaultto :first
240
-
241
- newvalues(:first, :all)
242
- end
243
-
244
- # Autorequire any parent directories.
245
- autorequire(:file) do
246
- basedir = File.dirname(self[:path])
247
- if basedir != self[:path]
248
- basedir
249
- else
250
- nil
251
- end
252
- end
253
-
254
- # Autorequire the owner and group of the file.
255
- {:user => :owner, :group => :group}.each do |type, property|
256
- autorequire(type) do
257
- if @parameters.include?(property)
258
- # The user/group property automatically converts to IDs
259
- next unless should = @parameters[property].shouldorig
260
- val = should[0]
261
- if val.is_a?(Integer) or val =~ /^\d+$/
262
- nil
263
- else
264
- val
265
- end
266
- end
267
- end
268
- end
269
-
270
- CREATORS = [:content, :source, :target]
271
-
272
- validate do
273
- count = 0
274
- CREATORS.each do |param|
275
- count += 1 if self.should(param)
276
- end
277
- if @parameters.include?(:source)
278
- count += 1
279
- end
280
- if count > 1
281
- self.fail "You cannot specify more than one of %s" % CREATORS.collect { |p| p.to_s}.join(", ")
282
- end
283
-
284
- if !self[:source] and self[:recurse] == :remote
285
- self.fail "You cannot specify a remote recursion without a source"
286
- end
287
-
288
- if !self[:recurse] and self[:recurselimit]
289
- self.warning "Possible error: recurselimit is set but not recurse, no recursion will happen"
290
- end
291
- end
292
-
293
- def self.[](path)
294
- return nil unless path
295
- super(path.gsub(/\/+/, '/').sub(/\/$/, ''))
296
- end
297
-
298
- # List files, but only one level deep.
299
- def self.instances(base = "/")
300
- unless FileTest.directory?(base)
301
- return []
302
- end
303
-
304
- files = []
305
- Dir.entries(base).reject { |e|
306
- e == "." or e == ".."
307
- }.each do |name|
308
- path = File.join(base, name)
309
- if obj = self[path]
310
- obj[:check] = :all
311
- files << obj
312
- else
313
- files << self.new(
314
- :name => path, :check => :all
315
- )
316
- end
317
- end
318
- files
319
- end
320
-
321
- @depthfirst = false
322
-
323
- # Determine the user to write files as.
324
- def asuser
325
- if self.should(:owner) and ! self.should(:owner).is_a?(Symbol)
326
- writeable = Puppet::Util::SUIDManager.asuser(self.should(:owner)) {
327
- FileTest.writable?(File.dirname(self[:path]))
328
- }
329
-
330
- # If the parent directory is writeable, then we execute
331
- # as the user in question. Otherwise we'll rely on
332
- # the 'owner' property to do things.
333
- if writeable
334
- asuser = self.should(:owner)
335
- end
336
- end
337
-
338
- return asuser
339
- end
340
-
341
- def bucket
342
- return @bucket if defined?(@bucket) and @bucket
343
-
344
- backup = self[:backup]
345
- return nil unless backup
346
- return nil if backup =~ /^\./
347
-
348
- unless catalog or backup == "puppet"
349
- fail "Can not find filebucket for backups without a catalog"
350
- end
351
-
352
- unless catalog and filebucket = catalog.resource(:filebucket, backup) or backup == "puppet"
353
- fail "Could not find filebucket %s specified in backup" % backup
354
- end
355
-
356
- return default_bucket unless filebucket
357
-
358
- @bucket = filebucket.bucket
359
-
360
- return @bucket
361
- end
362
-
363
- def default_bucket
364
- Puppet::Type.type(:filebucket).mkdefaultbucket.bucket
365
- end
366
-
367
- # Does the file currently exist? Just checks for whether
368
- # we have a stat
369
- def exist?
370
- stat ? true : false
371
- end
372
-
373
- # We have to do some extra finishing, to retrieve our bucket if
374
- # there is one.
375
- def finish
376
- # Look up our bucket, if there is one
377
- bucket()
378
- super
379
- end
380
-
381
- # Create any children via recursion or whatever.
382
- def eval_generate
383
- return [] unless self.recurse?
384
-
385
- recurse
386
- #recurse.reject do |resource|
387
- # catalog.resource(:file, resource[:path])
388
- #end.each do |child|
389
- # catalog.add_resource child
390
- # catalog.relationship_graph.add_edge self, child
391
- #end
392
- end
393
-
394
- def flush
395
- # We want to make sure we retrieve metadata anew on each transaction.
396
- @parameters.each do |name, param|
397
- param.flush if param.respond_to?(:flush)
398
- end
399
- @stat = nil
400
- end
401
-
402
- def initialize(hash)
403
- # Used for caching clients
404
- @clients = {}
405
-
406
- super
407
-
408
- @title = self.class.canonicalize_ref(@title)
409
- @stat = nil
410
- end
411
-
412
- # Configure discovered resources to be purged.
413
- def mark_children_for_purging(children)
414
- children.each do |name, child|
415
- next if child[:source]
416
- child[:ensure] = :absent
417
- end
418
- end
419
-
420
- # Create a new file or directory object as a child to the current
421
- # object.
422
- def newchild(path)
423
- full_path = File.join(self[:path], path)
424
-
425
- # Add some new values to our original arguments -- these are the ones
426
- # set at initialization. We specifically want to exclude any param
427
- # values set by the :source property or any default values.
428
- # LAK:NOTE This is kind of silly, because the whole point here is that
429
- # the values set at initialization should live as long as the resource
430
- # but values set by default or by :source should only live for the transaction
431
- # or so. Unfortunately, we don't have a straightforward way to manage
432
- # the different lifetimes of this data, so we kludge it like this.
433
- # The right-side hash wins in the merge.
434
- options = @original_parameters.merge(:path => full_path).reject { |param, value| value.nil? }
435
-
436
- # These should never be passed to our children.
437
- [:parent, :ensure, :recurse, :recurselimit, :target, :alias, :source].each do |param|
438
- options.delete(param) if options.include?(param)
439
- end
440
-
441
- return self.class.new(options)
442
- end
443
-
444
- # Files handle paths specially, because they just lengthen their
445
- # path names, rather than including the full parent's title each
446
- # time.
447
- def pathbuilder
448
- # We specifically need to call the method here, so it looks
449
- # up our parent in the catalog graph.
450
- if parent = parent()
451
- # We only need to behave specially when our parent is also
452
- # a file
453
- if parent.is_a?(self.class)
454
- # Remove the parent file name
455
- list = parent.pathbuilder
456
- list.pop # remove the parent's path info
457
- return list << self.ref
458
- else
459
- return super
460
- end
461
- else
462
- return [self.ref]
463
- end
464
- end
465
-
466
- # Should we be purging?
467
- def purge?
468
- @parameters.include?(:purge) and (self[:purge] == :true or self[:purge] == "true")
469
- end
470
-
471
- # Recursively generate a list of file resources, which will
472
- # be used to copy remote files, manage local files, and/or make links
473
- # to map to another directory.
474
- def recurse
475
- children = {}
476
- if self[:recurse] != :remote
477
- children = recurse_local
478
- end
479
-
480
- if self[:target]
481
- recurse_link(children)
482
- elsif self[:source]
483
- recurse_remote(children)
484
- end
485
-
486
- # If we're purging resources, then delete any resource that isn't on the
487
- # remote system.
488
- mark_children_for_purging(children) if self.purge?
489
-
490
- result = children.values.sort { |a, b| a[:path] <=> b[:path] }
491
- remove_less_specific_files(result)
492
- end
493
-
494
- # This is to fix bug #2296, where two files recurse over the same
495
- # set of files. It's a rare case, and when it does happen you're
496
- # not likely to have many actual conflicts, which is good, because
497
- # this is a pretty inefficient implementation.
498
- def remove_less_specific_files(files)
499
- mypath = self[:path].split(File::Separator)
500
- other_paths = catalog.vertices.
501
- select { |r| r.is_a?(self.class) and r[:path] != self[:path] }.
502
- collect { |r| r[:path].split(File::Separator) }.
503
- select { |p| p[0,mypath.length] == mypath }
504
-
505
- return files if other_paths.empty?
506
-
507
- files.reject { |file|
508
- path = file[:path].split(File::Separator)
509
- other_paths.any? { |p| path[0,p.length] == p }
510
- }
511
- end
512
-
513
- # A simple method for determining whether we should be recursing.
514
- def recurse?
515
- return false unless @parameters.include?(:recurse)
516
-
517
- val = @parameters[:recurse].value
518
-
519
- if val and (val == true or val == :remote)
520
- return true
521
- else
522
- return false
523
- end
524
- end
525
-
526
- # Recurse the target of the link.
527
- def recurse_link(children)
528
- perform_recursion(self[:target]).each do |meta|
529
- if meta.relative_path == "."
530
- self[:ensure] = :directory
531
- next
532
- end
533
-
534
- children[meta.relative_path] ||= newchild(meta.relative_path)
535
- if meta.ftype == "directory"
536
- children[meta.relative_path][:ensure] = :directory
537
- else
538
- children[meta.relative_path][:ensure] = :link
539
- children[meta.relative_path][:target] = meta.full_path
540
- end
541
- end
542
- children
543
- end
544
-
545
- # Recurse the file itself, returning a Metadata instance for every found file.
546
- def recurse_local
547
- result = perform_recursion(self[:path])
548
- return {} unless result
549
- result.inject({}) do |hash, meta|
550
- next hash if meta.relative_path == "."
551
-
552
- hash[meta.relative_path] = newchild(meta.relative_path)
553
- hash
554
- end
555
- end
556
-
557
- # Recurse against our remote file.
558
- def recurse_remote(children)
559
- sourceselect = self[:sourceselect]
560
-
561
- total = self[:source].collect do |source|
562
- next unless result = perform_recursion(source)
563
- return if top = result.find { |r| r.relative_path == "." } and top.ftype != "directory"
564
- result.each { |data| data.source = "%s/%s" % [source, data.relative_path] }
565
- break result if result and ! result.empty? and sourceselect == :first
566
- result
567
- end.flatten
568
-
569
- # This only happens if we have sourceselect == :all
570
- unless sourceselect == :first
571
- found = []
572
- total.reject! do |data|
573
- result = found.include?(data.relative_path)
574
- found << data.relative_path unless found.include?(data.relative_path)
575
- result
576
- end
577
- end
578
-
579
- total.each do |meta|
580
- if meta.relative_path == "."
581
- parameter(:source).metadata = meta
582
- next
583
- end
584
- children[meta.relative_path] ||= newchild(meta.relative_path)
585
- children[meta.relative_path][:source] = meta.source
586
- children[meta.relative_path][:checksum] = :md5 if meta.ftype == "file"
587
-
588
- children[meta.relative_path].parameter(:source).metadata = meta
589
- end
590
-
591
- children
592
- end
593
-
594
- def perform_recursion(path)
595
- params = {
596
- :links => self[:links],
597
- :recurse => (self[:recurse] == :remote ? true : self[:recurse]),
598
- :recurselimit => self[:recurselimit],
599
- :ignore => self[:ignore]
600
- }
601
- params[:checksum_type] = self[:checksum] if self[:checksum] == :none
602
- Puppet::FileServing::Metadata.search(path, params)
603
- end
604
-
605
- # Remove any existing data. This is only used when dealing with
606
- # links or directories.
607
- def remove_existing(should)
608
- return unless s = stat
609
-
610
- self.fail "Could not back up; will not replace" unless perform_backup
611
-
612
- unless should.to_s == "link"
613
- return if s.ftype.to_s == should.to_s
614
- end
615
-
616
- case s.ftype
617
- when "directory"
618
- if self[:force] == :true
619
- debug "Removing existing directory for replacement with %s" % should
620
- FileUtils.rmtree(self[:path])
621
- else
622
- notice "Not removing directory; use 'force' to override"
623
- end
624
- when "link", "file"
625
- debug "Removing existing %s for replacement with %s" %
626
- [s.ftype, should]
627
- File.unlink(self[:path])
628
- else
629
- self.fail "Could not back up files of type %s" % s.ftype
630
- end
631
- expire
632
- end
633
-
634
- # a wrapper method to make sure the file exists before doing anything
635
- def retrieve
636
- if source = parameter(:source)
637
- source.copy_source_values
638
- end
639
- super
640
- end
641
-
642
- # Set the checksum, from another property. There are multiple
643
- # properties that modify the contents of a file, and they need the
644
- # ability to make sure that the checksum value is in sync.
645
- def setchecksum(sum = nil)
646
- if @parameters.include? :checksum
647
- if sum
648
- @parameters[:checksum].checksum = sum
649
- else
650
- # If they didn't pass in a sum, then tell checksum to
651
- # figure it out.
652
- currentvalue = @parameters[:checksum].retrieve
653
- @parameters[:checksum].checksum = currentvalue
654
- end
655
- end
656
- end
657
-
658
- # Should this thing be a normal file? This is a relatively complex
659
- # way of determining whether we're trying to create a normal file,
660
- # and it's here so that the logic isn't visible in the content property.
661
- def should_be_file?
662
- return true if self[:ensure] == :file
663
-
664
- # I.e., it's set to something like "directory"
665
- return false if e = self[:ensure] and e != :present
666
-
667
- # The user doesn't really care, apparently
668
- if self[:ensure] == :present
669
- return true unless s = stat
670
- return true if s.ftype == "file"
671
- return false
672
- end
673
-
674
- # If we've gotten here, then :ensure isn't set
675
- return true if self[:content]
676
- return true if stat and stat.ftype == "file"
677
- return false
678
- end
679
-
680
- # Stat our file. Depending on the value of the 'links' attribute, we
681
- # use either 'stat' or 'lstat', and we expect the properties to use the
682
- # resulting stat object accordingly (mostly by testing the 'ftype'
683
- # value).
684
- cached_attr(:stat) do
685
- method = :stat
686
-
687
- # Files are the only types that support links
688
- if (self.class.name == :file and self[:links] != :follow) or self.class.name == :tidy
689
- method = :lstat
690
- end
691
- path = self[:path]
692
-
693
- begin
694
- File.send(method, self[:path])
695
- rescue Errno::ENOENT => error
696
- return nil
697
- rescue Errno::EACCES => error
698
- warning "Could not stat; permission denied"
699
- return nil
700
- end
701
- end
702
-
703
- # We have to hack this just a little bit, because otherwise we'll get
704
- # an error when the target and the contents are created as properties on
705
- # the far side.
706
- def to_trans(retrieve = true)
707
- obj = super
708
- if obj[:target] == :notlink
709
- obj.delete(:target)
710
- end
711
- obj
712
- end
713
-
714
- # Write out the file. Requires the content to be written,
715
- # the property name for logging, and the checksum for validation.
716
- def write(content, property, checksum = nil)
717
- if validate = validate_checksum?
718
- # Use the appropriate checksum type -- md5, md5lite, etc.
719
- sumtype = property(:checksum).checktype
720
- checksum ||= "{#{sumtype}}" + property(:checksum).send(sumtype, content)
721
- end
722
-
723
- remove_existing(:file)
724
-
725
- use_temporary_file = (content.length != 0)
726
- if use_temporary_file
727
- path = "#{self[:path]}.puppettmp_#{rand(10000)}"
728
- while File.exists?(path) or File.symlink?(path)
729
- path = "#{self[:path]}.puppettmp_#{rand(10000)}"
730
- end
731
- else
732
- path = self[:path]
733
- end
734
-
735
- mode = self.should(:mode) # might be nil
736
- umask = mode ? 000 : 022
737
-
738
- Puppet::Util.withumask(umask) do
739
- File.open(path, File::CREAT|File::WRONLY|File::TRUNC, mode) { |f| f.print content }
740
- end
741
-
742
- # And put our new file in place
743
- if use_temporary_file # This is only not true when our file is empty.
744
- begin
745
- fail_if_checksum_is_wrong(path, checksum) if validate
746
- File.rename(path, self[:path])
747
- rescue => detail
748
- fail "Could not rename temporary file %s to %s : %s" % [path, self[:path], detail]
749
- ensure
750
- # Make sure the created file gets removed
751
- File.unlink(path) if FileTest.exists?(path)
752
- end
753
- end
754
-
755
- # make sure all of the modes are actually correct
756
- property_fix
757
-
758
- # And then update our checksum, so the next run doesn't find it.
759
- self.setchecksum(checksum)
760
- end
761
-
762
- # Should we validate the checksum of the file we're writing?
763
- def validate_checksum?
764
- if sumparam = @parameters[:checksum]
765
- return sumparam.checktype.to_s !~ /time/
766
- else
767
- return false
768
- end
769
- end
770
-
771
- private
772
-
773
- # Make sure the file we wrote out is what we think it is.
774
- def fail_if_checksum_is_wrong(path, checksum)
775
- if checksum =~ /^\{(\w+)\}.+/
776
- sumtype = $1
777
- else
778
- # This shouldn't happen, but if it happens to, it's nicer
779
- # to just use a default sumtype than fail.
780
- sumtype = "md5"
781
- end
782
- newsum = property(:checksum).getsum(sumtype, path)
783
- return if newsum == checksum
784
-
785
- self.fail "File written to disk did not match checksum; discarding changes (%s vs %s)" % [checksum, newsum]
786
- end
787
-
788
- # Override the parent method, because we don't want to generate changes
789
- # when the file is missing and there is no 'ensure' state.
790
- def propertychanges(currentvalues)
791
- unless self.stat
792
- found = false
793
- ([:ensure] + CREATORS).each do |prop|
794
- if @parameters.include?(prop)
795
- found = true
796
- break
797
- end
798
- end
799
- unless found
800
- return []
801
- end
802
- end
803
- super
804
- end
805
-
806
- # There are some cases where all of the work does not get done on
807
- # file creation/modification, so we have to do some extra checking.
808
- def property_fix
809
- properties.each do |thing|
810
- next unless [:mode, :owner, :group, :seluser, :selrole, :seltype, :selrange].include?(thing.name)
811
-
812
- # Make sure we get a new stat objct
813
- expire
814
- currentvalue = thing.retrieve
815
- unless thing.insync?(currentvalue)
816
- thing.sync
817
- end
818
- end
819
- end
820
- end # Puppet::Type.type(:pfile)
821
-
822
- # We put all of the properties in separate files, because there are so many
823
- # of them. The order these are loaded is important, because it determines
824
- # the order they are in the property lit.
825
- require 'puppet/type/file/checksum'
826
- require 'puppet/type/file/content' # can create the file
827
- require 'puppet/type/file/source' # can create the file
828
- require 'puppet/type/file/target' # creates a different type of file
829
- require 'puppet/type/file/ensure' # can create the file
830
- require 'puppet/type/file/owner'
831
- require 'puppet/type/file/group'
832
- require 'puppet/type/file/mode'
833
- require 'puppet/type/file/type'
834
- require 'puppet/type/file/selcontext' # SELinux file context
12
+ Puppet::Type.newtype(:file) do
13
+ include Puppet::Util::MethodHelper
14
+ include Puppet::Util::Checksums
15
+ include Puppet::Util::Backups
16
+ @doc = "Manages local files, including setting ownership and
17
+ permissions, creation of both files and directories, and
18
+ retrieving entire files from remote servers. As Puppet matures, it
19
+ expected that the ``file`` resource will be used less and less to
20
+ manage content, and instead native resources will be used to do so.
21
+
22
+ If you find that you are often copying files in from a central
23
+ location, rather than using native resources, please contact
24
+ Puppet Labs and we can hopefully work with you to develop a
25
+ native resource to support what you are doing."
26
+
27
+ def self.title_patterns
28
+ [ [ /^(.*?)\/*\Z/m, [ [ :path, lambda{|x| x} ] ] ] ]
29
+ end
30
+
31
+ newparam(:path) do
32
+ desc "The path to the file to manage. Must be fully qualified."
33
+ isnamevar
34
+
35
+ validate do |value|
36
+ # accept various path syntaxes: lone slash, posix, win32, unc
37
+ unless (Puppet.features.posix? and (value =~ /^\/$/ or value =~ /^\/[^\/]/)) or (Puppet.features.microsoft_windows? and (value =~ /^.:\// or value =~ /^\/\/[^\/]+\/[^\/]+/))
38
+ fail Puppet::Error, "File paths must be fully qualified, not '#{value}'"
39
+ end
40
+ end
41
+
42
+ # convert the current path in an index into the collection and the last
43
+ # path name. The aim is to use less storage for all common paths in a hierarchy
44
+ munge do |value|
45
+ path, name = File.split(value.gsub(/\/+/,'/'))
46
+ { :index => Puppet::FileCollection.collection.index(path), :name => name }
47
+ end
48
+
49
+ # and the reverse
50
+ unmunge do |value|
51
+ basedir = Puppet::FileCollection.collection.path(value[:index])
52
+ # a lone slash as :name indicates a root dir on windows
53
+ if value[:name] == '/'
54
+ basedir
55
+ else
56
+ File.join( basedir, value[:name] )
57
+ end
58
+ end
59
+ end
60
+
61
+ newparam(:backup) do
62
+ desc "Whether files should be backed up before
63
+ being replaced. The preferred method of backing files up is via
64
+ a ``filebucket``, which stores files by their MD5 sums and allows
65
+ easy retrieval without littering directories with backups. You
66
+ can specify a local filebucket or a network-accessible
67
+ server-based filebucket by setting ``backup => bucket-name``.
68
+ Alternatively, if you specify any value that begins with a ``.``
69
+ (e.g., ``.puppet-bak``), then Puppet will use copy the file in
70
+ the same directory with that value as the extension of the
71
+ backup. Setting ``backup => false`` disables all backups of the
72
+ file in question.
73
+
74
+ Puppet automatically creates a local filebucket named ``puppet`` and
75
+ defaults to backing up there. To use a server-based filebucket,
76
+ you must specify one in your configuration::
77
+
78
+ filebucket { main:
79
+ server => puppet
80
+ }
81
+
82
+ The ``puppet master`` daemon creates a filebucket by default,
83
+ so you can usually back up to your main server with this
84
+ configuration. Once you've described the bucket in your
85
+ configuration, you can use it in any file::
86
+
87
+ file { \"/my/file\":
88
+ source => \"/path/in/nfs/or/something\",
89
+ backup => main
90
+ }
91
+
92
+ This will back the file up to the central server.
93
+
94
+ At this point, the benefits of using a filebucket are that you do not
95
+ have backup files lying around on each of your machines, a given
96
+ version of a file is only backed up once, and you can restore
97
+ any given file manually, no matter how old. Eventually,
98
+ transactional support will be able to automatically restore
99
+ filebucketed files.
100
+ "
101
+
102
+ defaultto "puppet"
103
+
104
+ munge do |value|
105
+ # I don't really know how this is happening.
106
+ value = value.shift if value.is_a?(Array)
107
+
108
+ case value
109
+ when false, "false", :false
110
+ false
111
+ when true, "true", ".puppet-bak", :true
112
+ ".puppet-bak"
113
+ when String
114
+ value
115
+ else
116
+ self.fail "Invalid backup type #{value.inspect}"
117
+ end
118
+ end
119
+ end
120
+
121
+ newparam(:recurse) do
122
+ desc "Whether and how deeply to do recursive
123
+ management."
124
+
125
+ newvalues(:true, :false, :inf, :remote, /^[0-9]+$/)
126
+
127
+ # Replace the validation so that we allow numbers in
128
+ # addition to string representations of them.
129
+ validate { |arg| }
130
+ munge do |value|
131
+ newval = super(value)
132
+ case newval
133
+ when :true, :inf; true
134
+ when :false; false
135
+ when :remote; :remote
136
+ when Integer, Fixnum, Bignum
137
+ self.warning "Setting recursion depth with the recurse parameter is now deprecated, please use recurselimit"
138
+
139
+ # recurse == 0 means no recursion
140
+ return false if value == 0
141
+
142
+ resource[:recurselimit] = value
143
+ true
144
+ when /^\d+$/
145
+ self.warning "Setting recursion depth with the recurse parameter is now deprecated, please use recurselimit"
146
+ value = Integer(value)
147
+
148
+ # recurse == 0 means no recursion
149
+ return false if value == 0
150
+
151
+ resource[:recurselimit] = value
152
+ true
153
+ else
154
+ self.fail "Invalid recurse value #{value.inspect}"
155
+ end
156
+ end
157
+ end
158
+
159
+ newparam(:recurselimit) do
160
+ desc "How deeply to do recursive management."
161
+
162
+ newvalues(/^[0-9]+$/)
163
+
164
+ munge do |value|
165
+ newval = super(value)
166
+ case newval
167
+ when Integer, Fixnum, Bignum; value
168
+ when /^\d+$/; Integer(value)
169
+ else
170
+ self.fail "Invalid recurselimit value #{value.inspect}"
171
+ end
172
+ end
173
+ end
174
+
175
+ newparam(:replace, :boolean => true) do
176
+ desc "Whether or not to replace a file that is
177
+ sourced but exists. This is useful for using file sources
178
+ purely for initialization."
179
+ newvalues(:true, :false)
180
+ aliasvalue(:yes, :true)
181
+ aliasvalue(:no, :false)
182
+ defaultto :true
183
+ end
184
+
185
+ newparam(:force, :boolean => true) do
186
+ desc "Force the file operation. Currently only used when replacing
187
+ directories with links."
188
+ newvalues(:true, :false)
189
+ defaultto false
190
+ end
191
+
192
+ newparam(:ignore) do
193
+ desc "A parameter which omits action on files matching
194
+ specified patterns during recursion. Uses Ruby's builtin globbing
195
+ engine, so shell metacharacters are fully supported, e.g. ``[a-z]*``.
196
+ Matches that would descend into the directory structure are ignored,
197
+ e.g., ``*/*``."
198
+
199
+ validate do |value|
200
+ unless value.is_a?(Array) or value.is_a?(String) or value == false
201
+ self.devfail "Ignore must be a string or an Array"
202
+ end
203
+ end
204
+ end
205
+
206
+ newparam(:links) do
207
+ desc "How to handle links during file actions. During file copying,
208
+ ``follow`` will copy the target file instead of the link, ``manage``
209
+ will copy the link itself, and ``ignore`` will just pass it by.
210
+ When not copying, ``manage`` and ``ignore`` behave equivalently
211
+ (because you cannot really ignore links entirely during local recursion), and ``follow`` will manage the file to which the
212
+ link points."
213
+
214
+ newvalues(:follow, :manage)
215
+
216
+ defaultto :manage
217
+ end
218
+
219
+ newparam(:purge, :boolean => true) do
220
+ desc "Whether unmanaged files should be purged. If you have a filebucket
221
+ configured the purged files will be uploaded, but if you do not,
222
+ this will destroy data. Only use this option for generated
223
+ files unless you really know what you are doing. This option only
224
+ makes sense when recursively managing directories.
225
+
226
+ Note that when using ``purge`` with ``source``, Puppet will purge any files
227
+ that are not on the remote system."
228
+
229
+ defaultto :false
230
+
231
+ newvalues(:true, :false)
232
+ end
233
+
234
+ newparam(:sourceselect) do
235
+ desc "Whether to copy all valid sources, or just the first one. This parameter
236
+ is only used in recursive copies; by default, the first valid source is the
237
+ only one used as a recursive source, but if this parameter is set to ``all``,
238
+ then all valid sources will have all of their contents copied to the local host,
239
+ and for sources that have the same file, the source earlier in the list will
240
+ be used."
241
+
242
+ defaultto :first
243
+
244
+ newvalues(:first, :all)
245
+ end
246
+
247
+ # Autorequire any parent directories.
248
+ autorequire(:file) do
249
+ basedir = File.dirname(self[:path])
250
+ if basedir != self[:path]
251
+ basedir
252
+ else
253
+ nil
254
+ end
255
+ end
256
+
257
+ # Autorequire the owner and group of the file.
258
+ {:user => :owner, :group => :group}.each do |type, property|
259
+ autorequire(type) do
260
+ if @parameters.include?(property)
261
+ # The user/group property automatically converts to IDs
262
+ next unless should = @parameters[property].shouldorig
263
+ val = should[0]
264
+ if val.is_a?(Integer) or val =~ /^\d+$/
265
+ nil
266
+ else
267
+ val
268
+ end
269
+ end
270
+ end
271
+ end
272
+
273
+ CREATORS = [:content, :source, :target]
274
+
275
+ validate do
276
+ count = 0
277
+ CREATORS.each do |param|
278
+ count += 1 if self.should(param)
279
+ end
280
+ count += 1 if @parameters.include?(:source)
281
+ self.fail "You cannot specify more than one of #{CREATORS.collect { |p| p.to_s}.join(", ")}" if count > 1
282
+
283
+ self.fail "You cannot specify a remote recursion without a source" if !self[:source] and self[:recurse] == :remote
284
+
285
+ self.warning "Possible error: recurselimit is set but not recurse, no recursion will happen" if !self[:recurse] and self[:recurselimit]
286
+ end
287
+
288
+ def self.[](path)
289
+ return nil unless path
290
+ super(path.gsub(/\/+/, '/').sub(/\/$/, ''))
291
+ end
292
+
293
+ # List files, but only one level deep.
294
+ def self.instances(base = "/")
295
+ return [] unless FileTest.directory?(base)
296
+
297
+ files = []
298
+ Dir.entries(base).reject { |e|
299
+ e == "." or e == ".."
300
+ }.each do |name|
301
+ path = File.join(base, name)
302
+ if obj = self[path]
303
+ obj[:audit] = :all
304
+ files << obj
305
+ else
306
+ files << self.new(
307
+ :name => path, :audit => :all
308
+ )
309
+ end
310
+ end
311
+ files
312
+ end
313
+
314
+ @depthfirst = false
315
+
316
+ # Determine the user to write files as.
317
+ def asuser
318
+ if self.should(:owner) and ! self.should(:owner).is_a?(Symbol)
319
+ writeable = Puppet::Util::SUIDManager.asuser(self.should(:owner)) {
320
+ FileTest.writable?(File.dirname(self[:path]))
321
+ }
322
+
323
+ # If the parent directory is writeable, then we execute
324
+ # as the user in question. Otherwise we'll rely on
325
+ # the 'owner' property to do things.
326
+ asuser = self.should(:owner) if writeable
327
+ end
328
+
329
+ asuser
330
+ end
331
+
332
+ def bucket
333
+ return @bucket if @bucket
334
+
335
+ backup = self[:backup]
336
+ return nil unless backup
337
+ return nil if backup =~ /^\./
338
+
339
+ unless catalog or backup == "puppet"
340
+ fail "Can not find filebucket for backups without a catalog"
341
+ end
342
+
343
+ unless catalog and filebucket = catalog.resource(:filebucket, backup) or backup == "puppet"
344
+ fail "Could not find filebucket #{backup} specified in backup"
345
+ end
346
+
347
+ return default_bucket unless filebucket
348
+
349
+ @bucket = filebucket.bucket
350
+
351
+ @bucket
352
+ end
353
+
354
+ def default_bucket
355
+ Puppet::Type.type(:filebucket).mkdefaultbucket.bucket
356
+ end
357
+
358
+ # Does the file currently exist? Just checks for whether
359
+ # we have a stat
360
+ def exist?
361
+ stat ? true : false
362
+ end
363
+
364
+ # We have to do some extra finishing, to retrieve our bucket if
365
+ # there is one.
366
+ def finish
367
+ # Look up our bucket, if there is one
368
+ bucket
369
+ super
370
+ end
371
+
372
+ # Create any children via recursion or whatever.
373
+ def eval_generate
374
+ return [] unless self.recurse?
375
+
376
+ recurse
377
+ #recurse.reject do |resource|
378
+ # catalog.resource(:file, resource[:path])
379
+ #end.each do |child|
380
+ # catalog.add_resource child
381
+ # catalog.relationship_graph.add_edge self, child
382
+ #end
383
+ end
384
+
385
+ def flush
386
+ # We want to make sure we retrieve metadata anew on each transaction.
387
+ @parameters.each do |name, param|
388
+ param.flush if param.respond_to?(:flush)
389
+ end
390
+ @stat = nil
391
+ end
392
+
393
+ def initialize(hash)
394
+ # Used for caching clients
395
+ @clients = {}
396
+
397
+ super
398
+
399
+ # If they've specified a source, we get our 'should' values
400
+ # from it.
401
+ unless self[:ensure]
402
+ if self[:target]
403
+ self[:ensure] = :symlink
404
+ elsif self[:content]
405
+ self[:ensure] = :file
406
+ end
407
+ end
408
+
409
+ @stat = nil
410
+ end
411
+
412
+ # Configure discovered resources to be purged.
413
+ def mark_children_for_purging(children)
414
+ children.each do |name, child|
415
+ next if child[:source]
416
+ child[:ensure] = :absent
417
+ end
418
+ end
419
+
420
+ # Create a new file or directory object as a child to the current
421
+ # object.
422
+ def newchild(path)
423
+ full_path = File.join(self[:path], path)
424
+
425
+ # Add some new values to our original arguments -- these are the ones
426
+ # set at initialization. We specifically want to exclude any param
427
+ # values set by the :source property or any default values.
428
+ # LAK:NOTE This is kind of silly, because the whole point here is that
429
+ # the values set at initialization should live as long as the resource
430
+ # but values set by default or by :source should only live for the transaction
431
+ # or so. Unfortunately, we don't have a straightforward way to manage
432
+ # the different lifetimes of this data, so we kludge it like this.
433
+ # The right-side hash wins in the merge.
434
+ options = @original_parameters.merge(:path => full_path).reject { |param, value| value.nil? }
435
+
436
+ # These should never be passed to our children.
437
+ [:parent, :ensure, :recurse, :recurselimit, :target, :alias, :source].each do |param|
438
+ options.delete(param) if options.include?(param)
439
+ end
440
+
441
+ self.class.new(options)
442
+ end
443
+
444
+ # Files handle paths specially, because they just lengthen their
445
+ # path names, rather than including the full parent's title each
446
+ # time.
447
+ def pathbuilder
448
+ # We specifically need to call the method here, so it looks
449
+ # up our parent in the catalog graph.
450
+ if parent = parent()
451
+ # We only need to behave specially when our parent is also
452
+ # a file
453
+ if parent.is_a?(self.class)
454
+ # Remove the parent file name
455
+ list = parent.pathbuilder
456
+ list.pop # remove the parent's path info
457
+ return list << self.ref
458
+ else
459
+ return super
460
+ end
461
+ else
462
+ return [self.ref]
463
+ end
464
+ end
465
+
466
+ # Should we be purging?
467
+ def purge?
468
+ @parameters.include?(:purge) and (self[:purge] == :true or self[:purge] == "true")
469
+ end
470
+
471
+ # Recursively generate a list of file resources, which will
472
+ # be used to copy remote files, manage local files, and/or make links
473
+ # to map to another directory.
474
+ def recurse
475
+ children = {}
476
+ children = recurse_local if self[:recurse] != :remote
477
+
478
+ if self[:target]
479
+ recurse_link(children)
480
+ elsif self[:source]
481
+ recurse_remote(children)
482
+ end
483
+
484
+ # If we're purging resources, then delete any resource that isn't on the
485
+ # remote system.
486
+ mark_children_for_purging(children) if self.purge?
487
+
488
+ result = children.values.sort { |a, b| a[:path] <=> b[:path] }
489
+ remove_less_specific_files(result)
490
+ end
491
+
492
+ # This is to fix bug #2296, where two files recurse over the same
493
+ # set of files. It's a rare case, and when it does happen you're
494
+ # not likely to have many actual conflicts, which is good, because
495
+ # this is a pretty inefficient implementation.
496
+ def remove_less_specific_files(files)
497
+ mypath = self[:path].split(File::Separator)
498
+ other_paths = catalog.vertices.
499
+ select { |r| r.is_a?(self.class) and r[:path] != self[:path] }.
500
+ collect { |r| r[:path].split(File::Separator) }.
501
+ select { |p| p[0,mypath.length] == mypath }
502
+
503
+ return files if other_paths.empty?
504
+
505
+ files.reject { |file|
506
+ path = file[:path].split(File::Separator)
507
+ other_paths.any? { |p| path[0,p.length] == p }
508
+ }
509
+ end
510
+
511
+ # A simple method for determining whether we should be recursing.
512
+ def recurse?
513
+ return false unless @parameters.include?(:recurse)
514
+
515
+ val = @parameters[:recurse].value
516
+
517
+ !!(val and (val == true or val == :remote))
518
+ end
519
+
520
+ # Recurse the target of the link.
521
+ def recurse_link(children)
522
+ perform_recursion(self[:target]).each do |meta|
523
+ if meta.relative_path == "."
524
+ self[:ensure] = :directory
525
+ next
526
+ end
527
+
528
+ children[meta.relative_path] ||= newchild(meta.relative_path)
529
+ if meta.ftype == "directory"
530
+ children[meta.relative_path][:ensure] = :directory
531
+ else
532
+ children[meta.relative_path][:ensure] = :link
533
+ children[meta.relative_path][:target] = meta.full_path
534
+ end
535
+ end
536
+ children
537
+ end
538
+
539
+ # Recurse the file itself, returning a Metadata instance for every found file.
540
+ def recurse_local
541
+ result = perform_recursion(self[:path])
542
+ return {} unless result
543
+ result.inject({}) do |hash, meta|
544
+ next hash if meta.relative_path == "."
545
+
546
+ hash[meta.relative_path] = newchild(meta.relative_path)
547
+ hash
548
+ end
549
+ end
550
+
551
+ # Recurse against our remote file.
552
+ def recurse_remote(children)
553
+ sourceselect = self[:sourceselect]
554
+
555
+ total = self[:source].collect do |source|
556
+ next unless result = perform_recursion(source)
557
+ return if top = result.find { |r| r.relative_path == "." } and top.ftype != "directory"
558
+ result.each { |data| data.source = "#{source}/#{data.relative_path}" }
559
+ break result if result and ! result.empty? and sourceselect == :first
560
+ result
561
+ end.flatten
562
+
563
+ # This only happens if we have sourceselect == :all
564
+ unless sourceselect == :first
565
+ found = []
566
+ total.reject! do |data|
567
+ result = found.include?(data.relative_path)
568
+ found << data.relative_path unless found.include?(data.relative_path)
569
+ result
570
+ end
571
+ end
572
+
573
+ total.each do |meta|
574
+ if meta.relative_path == "."
575
+ parameter(:source).metadata = meta
576
+ next
577
+ end
578
+ children[meta.relative_path] ||= newchild(meta.relative_path)
579
+ children[meta.relative_path][:source] = meta.source
580
+ children[meta.relative_path][:checksum] = :md5 if meta.ftype == "file"
581
+
582
+ children[meta.relative_path].parameter(:source).metadata = meta
583
+ end
584
+
585
+ children
586
+ end
587
+
588
+ def perform_recursion(path)
589
+
590
+ Puppet::FileServing::Metadata.search(
591
+
592
+ path,
593
+ :links => self[:links],
594
+ :recurse => (self[:recurse] == :remote ? true : self[:recurse]),
595
+
596
+ :recurselimit => self[:recurselimit],
597
+ :ignore => self[:ignore],
598
+ :checksum_type => (self[:source] || self[:content]) ? self[:checksum] : :none
599
+ )
600
+ end
601
+
602
+ # Remove any existing data. This is only used when dealing with
603
+ # links or directories.
604
+ def remove_existing(should)
605
+ return unless s = stat
606
+
607
+ self.fail "Could not back up; will not replace" unless perform_backup
608
+
609
+ unless should.to_s == "link"
610
+ return if s.ftype.to_s == should.to_s
611
+ end
612
+
613
+ case s.ftype
614
+ when "directory"
615
+ if self[:force] == :true
616
+ debug "Removing existing directory for replacement with #{should}"
617
+ FileUtils.rmtree(self[:path])
618
+ else
619
+ notice "Not removing directory; use 'force' to override"
620
+ end
621
+ when "link", "file"
622
+ debug "Removing existing #{s.ftype} for replacement with #{should}"
623
+ File.unlink(self[:path])
624
+ else
625
+ self.fail "Could not back up files of type #{s.ftype}"
626
+ end
627
+ expire
628
+ end
629
+
630
+ def retrieve
631
+ if source = parameter(:source)
632
+ source.copy_source_values
633
+ end
634
+ super
635
+ end
636
+
637
+ # Set the checksum, from another property. There are multiple
638
+ # properties that modify the contents of a file, and they need the
639
+ # ability to make sure that the checksum value is in sync.
640
+ def setchecksum(sum = nil)
641
+ if @parameters.include? :checksum
642
+ if sum
643
+ @parameters[:checksum].checksum = sum
644
+ else
645
+ # If they didn't pass in a sum, then tell checksum to
646
+ # figure it out.
647
+ currentvalue = @parameters[:checksum].retrieve
648
+ @parameters[:checksum].checksum = currentvalue
649
+ end
650
+ end
651
+ end
652
+
653
+ # Should this thing be a normal file? This is a relatively complex
654
+ # way of determining whether we're trying to create a normal file,
655
+ # and it's here so that the logic isn't visible in the content property.
656
+ def should_be_file?
657
+ return true if self[:ensure] == :file
658
+
659
+ # I.e., it's set to something like "directory"
660
+ return false if e = self[:ensure] and e != :present
661
+
662
+ # The user doesn't really care, apparently
663
+ if self[:ensure] == :present
664
+ return true unless s = stat
665
+ return(s.ftype == "file" ? true : false)
666
+ end
667
+
668
+ # If we've gotten here, then :ensure isn't set
669
+ return true if self[:content]
670
+ return true if stat and stat.ftype == "file"
671
+ false
672
+ end
673
+
674
+ # Stat our file. Depending on the value of the 'links' attribute, we
675
+ # use either 'stat' or 'lstat', and we expect the properties to use the
676
+ # resulting stat object accordingly (mostly by testing the 'ftype'
677
+ # value).
678
+ cached_attr(:stat) do
679
+ method = :stat
680
+
681
+ # Files are the only types that support links
682
+ if (self.class.name == :file and self[:links] != :follow) or self.class.name == :tidy
683
+ method = :lstat
684
+ end
685
+ path = self[:path]
686
+
687
+ begin
688
+ File.send(method, self[:path])
689
+ rescue Errno::ENOENT => error
690
+ return nil
691
+ rescue Errno::EACCES => error
692
+ warning "Could not stat; permission denied"
693
+ return nil
694
+ end
695
+ end
696
+
697
+ # We have to hack this just a little bit, because otherwise we'll get
698
+ # an error when the target and the contents are created as properties on
699
+ # the far side.
700
+ def to_trans(retrieve = true)
701
+ obj = super
702
+ obj.delete(:target) if obj[:target] == :notlink
703
+ obj
704
+ end
705
+
706
+ # Write out the file. Requires the property name for logging.
707
+ # Write will be done by the content property, along with checksum computation
708
+ def write(property)
709
+ remove_existing(:file)
710
+
711
+ use_temporary_file = write_temporary_file?
712
+ if use_temporary_file
713
+ path = "#{self[:path]}.puppettmp_#{rand(10000)}"
714
+ path = "#{self[:path]}.puppettmp_#{rand(10000)}" while File.exists?(path) or File.symlink?(path)
715
+ else
716
+ path = self[:path]
717
+ end
718
+
719
+ mode = self.should(:mode) # might be nil
720
+ umask = mode ? 000 : 022
721
+
722
+ content_checksum = Puppet::Util.withumask(umask) { File.open(path, 'w', mode) { |f| write_content(f) } }
723
+
724
+ # And put our new file in place
725
+ if use_temporary_file # This is only not true when our file is empty.
726
+ begin
727
+ fail_if_checksum_is_wrong(path, content_checksum) if validate_checksum?
728
+ File.rename(path, self[:path])
729
+ rescue => detail
730
+ fail "Could not rename temporary file #{path} to #{self[:path]}: #{detail}"
731
+ ensure
732
+ # Make sure the created file gets removed
733
+ File.unlink(path) if FileTest.exists?(path)
734
+ end
735
+ end
736
+
737
+ # make sure all of the modes are actually correct
738
+ property_fix
739
+
740
+ end
741
+
742
+ private
743
+
744
+ # Should we validate the checksum of the file we're writing?
745
+ def validate_checksum?
746
+ self[:checksum] !~ /time/
747
+ end
748
+
749
+ # Make sure the file we wrote out is what we think it is.
750
+ def fail_if_checksum_is_wrong(path, content_checksum)
751
+ newsum = parameter(:checksum).sum_file(path)
752
+ return if [:absent, nil, content_checksum].include?(newsum)
753
+
754
+ self.fail "File written to disk did not match checksum; discarding changes (#{content_checksum} vs #{newsum})"
755
+ end
756
+
757
+ # write the current content. Note that if there is no content property
758
+ # simply opening the file with 'w' as done in write is enough to truncate
759
+ # or write an empty length file.
760
+ def write_content(file)
761
+ (content = property(:content)) && content.write(file)
762
+ end
763
+
764
+ private
765
+
766
+ def write_temporary_file?
767
+ # unfortunately we don't know the source file size before fetching it
768
+ # so let's assume the file won't be empty
769
+ (c = property(:content) and c.length) || (s = @parameters[:source] and 1)
770
+ end
771
+
772
+ # There are some cases where all of the work does not get done on
773
+ # file creation/modification, so we have to do some extra checking.
774
+ def property_fix
775
+ properties.each do |thing|
776
+ next unless [:mode, :owner, :group, :seluser, :selrole, :seltype, :selrange].include?(thing.name)
777
+
778
+ # Make sure we get a new stat objct
779
+ expire
780
+ currentvalue = thing.retrieve
781
+ thing.sync unless thing.insync?(currentvalue)
782
+ end
783
+ end
835
784
  end
785
+
786
+ # We put all of the properties in separate files, because there are so many
787
+ # of them. The order these are loaded is important, because it determines
788
+ # the order they are in the property lit.
789
+ require 'puppet/type/file/checksum'
790
+ require 'puppet/type/file/content' # can create the file
791
+ require 'puppet/type/file/source' # can create the file
792
+ require 'puppet/type/file/target' # creates a different type of file
793
+ require 'puppet/type/file/ensure' # can create the file
794
+ require 'puppet/type/file/owner'
795
+ require 'puppet/type/file/group'
796
+ require 'puppet/type/file/mode'
797
+ require 'puppet/type/file/type'
798
+ require 'puppet/type/file/selcontext' # SELinux file context