puppet 3.1.1 → 3.2.0.rc1

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 (477) hide show
  1. data/CONTRIBUTING.md +2 -2
  2. data/Gemfile +32 -19
  3. data/README_DEVELOPER.md +332 -14
  4. data/Rakefile +9 -5
  5. data/ext/build_defaults.yaml +2 -3
  6. data/ext/debian/changelog.erb +6 -0
  7. data/ext/debian/control +6 -6
  8. data/ext/envpuppet +4 -4
  9. data/ext/project_data.yaml +1 -0
  10. data/ext/puppet-nm-dispatcher +13 -0
  11. data/ext/redhat/puppet.spec.erb +17 -0
  12. data/ext/suse/client.init +1 -1
  13. data/ext/systemd/puppetagent.service +2 -2
  14. data/ext/systemd/puppetmaster.service +2 -2
  15. data/lib/hiera/scope.rb +29 -11
  16. data/lib/hiera_puppet.rb +1 -3
  17. data/lib/puppet/agent.rb +3 -3
  18. data/lib/puppet/application.rb +2 -2
  19. data/lib/puppet/application/agent.rb +27 -12
  20. data/lib/puppet/application/apply.rb +11 -1
  21. data/lib/puppet/application/describe.rb +1 -1
  22. data/lib/puppet/application/doc.rb +13 -9
  23. data/lib/puppet/application/filebucket.rb +0 -1
  24. data/lib/puppet/application/kick.rb +1 -0
  25. data/lib/puppet/application/master.rb +16 -8
  26. data/lib/puppet/daemon.rb +19 -64
  27. data/lib/puppet/defaults.rb +61 -5
  28. data/lib/puppet/error.rb +15 -4
  29. data/lib/puppet/external/nagios/grammar.ry +1 -1
  30. data/lib/puppet/external/nagios/makefile +1 -1
  31. data/lib/puppet/external/nagios/parser.rb +185 -618
  32. data/lib/puppet/external/pson/pure/parser.rb +47 -1
  33. data/lib/puppet/face/certificate.rb +3 -3
  34. data/lib/puppet/face/module.rb +1 -1
  35. data/lib/puppet/face/module/changes.rb +3 -1
  36. data/lib/puppet/face/module/uninstall.rb +1 -1
  37. data/lib/puppet/face/node/clean.rb +5 -5
  38. data/lib/puppet/feature/base.rb +3 -1
  39. data/lib/puppet/feature/libuser.rb +8 -0
  40. data/lib/puppet/file_serving/fileset.rb +9 -1
  41. data/lib/puppet/forge.rb +28 -5
  42. data/lib/puppet/forge/errors.rb +34 -0
  43. data/lib/puppet/forge/repository.rb +1 -1
  44. data/lib/puppet/indirector.rb +4 -1
  45. data/lib/puppet/indirector/catalog/compiler.rb +37 -30
  46. data/lib/puppet/indirector/facts/inventory_active_record.rb +1 -0
  47. data/lib/puppet/indirector/indirection.rb +28 -15
  48. data/lib/puppet/indirector/rest.rb +18 -10
  49. data/lib/puppet/interface.rb +11 -4
  50. data/lib/puppet/interface/action.rb +1 -3
  51. data/lib/puppet/interface/action_builder.rb +0 -3
  52. data/lib/puppet/interface/action_manager.rb +0 -3
  53. data/lib/puppet/interface/face_collection.rb +0 -2
  54. data/lib/puppet/interface/option.rb +0 -2
  55. data/lib/puppet/interface/option_builder.rb +0 -2
  56. data/lib/puppet/interface/option_manager.rb +0 -2
  57. data/lib/puppet/metatype/manager.rb +1 -1
  58. data/lib/puppet/module_tool.rb +1 -0
  59. data/lib/puppet/module_tool/applications/application.rb +0 -3
  60. data/lib/puppet/module_tool/applications/builder.rb +8 -20
  61. data/lib/puppet/module_tool/applications/checksummer.rb +1 -1
  62. data/lib/puppet/module_tool/applications/installer.rb +1 -0
  63. data/lib/puppet/module_tool/applications/unpacker.rb +3 -11
  64. data/lib/puppet/module_tool/checksums.rb +1 -1
  65. data/lib/puppet/module_tool/errors/installer.rb +18 -1
  66. data/lib/puppet/module_tool/modulefile.rb +2 -2
  67. data/lib/puppet/module_tool/skeleton/templates/generator/Modulefile.erb +1 -1
  68. data/lib/puppet/module_tool/tar.rb +17 -0
  69. data/lib/puppet/module_tool/tar/gnu.rb +9 -0
  70. data/lib/puppet/module_tool/tar/mini.rb +39 -0
  71. data/lib/puppet/module_tool/tar/solaris.rb +5 -0
  72. data/lib/puppet/network/http.rb +1 -0
  73. data/lib/puppet/network/http/connection.rb +9 -23
  74. data/lib/puppet/network/http/handler.rb +38 -7
  75. data/lib/puppet/network/http/rack/rest.rb +14 -3
  76. data/lib/puppet/network/http/webrick.rb +3 -1
  77. data/lib/puppet/network/http/webrick/rest.rb +11 -2
  78. data/lib/puppet/node/environment.rb +3 -1
  79. data/lib/puppet/parameter.rb +32 -29
  80. data/lib/puppet/parameter/package_options.rb +1 -1
  81. data/lib/puppet/parameter/path.rb +1 -1
  82. data/lib/puppet/parameter/value.rb +1 -1
  83. data/lib/puppet/parameter/value_collection.rb +7 -3
  84. data/lib/puppet/parser/ast.rb +3 -1
  85. data/lib/puppet/parser/ast/arithmetic_operator.rb +56 -12
  86. data/lib/puppet/parser/ast/astarray.rb +1 -1
  87. data/lib/puppet/parser/ast/block_expression.rb +41 -0
  88. data/lib/puppet/parser/ast/function.rb +13 -2
  89. data/lib/puppet/parser/ast/lambda.rb +107 -0
  90. data/lib/puppet/parser/ast/leaf.rb +1 -2
  91. data/lib/puppet/parser/ast/method_call.rb +77 -0
  92. data/lib/puppet/parser/ast/vardef.rb +7 -0
  93. data/lib/puppet/parser/compiler.rb +27 -16
  94. data/lib/puppet/parser/e_parser_adapter.rb +120 -0
  95. data/lib/puppet/parser/files.rb +7 -6
  96. data/lib/puppet/parser/functions.rb +10 -8
  97. data/lib/puppet/parser/functions/collect.rb +43 -0
  98. data/lib/puppet/parser/functions/each.rb +96 -0
  99. data/lib/puppet/parser/functions/foreach.rb +96 -0
  100. data/lib/puppet/parser/functions/fqdn_rand.rb +2 -2
  101. data/lib/puppet/parser/functions/hiera.rb +20 -2
  102. data/lib/puppet/parser/functions/hiera_array.rb +21 -2
  103. data/lib/puppet/parser/functions/hiera_hash.rb +23 -2
  104. data/lib/puppet/parser/functions/hiera_include.rb +33 -2
  105. data/lib/puppet/parser/functions/inline_template.rb +4 -4
  106. data/lib/puppet/parser/functions/reduce.rb +74 -0
  107. data/lib/puppet/parser/functions/reject.rb +46 -0
  108. data/lib/puppet/parser/functions/select.rb +46 -0
  109. data/lib/puppet/parser/functions/slice.rb +96 -0
  110. data/lib/puppet/parser/functions/template.rb +2 -2
  111. data/lib/puppet/parser/grammar.ra +7 -4
  112. data/lib/puppet/parser/lexer.rb +10 -0
  113. data/lib/puppet/parser/methods.rb +69 -0
  114. data/lib/puppet/parser/parser.rb +855 -808
  115. data/lib/puppet/parser/parser_factory.rb +62 -0
  116. data/lib/puppet/parser/parser_support.rb +8 -2
  117. data/lib/puppet/parser/scope.rb +153 -47
  118. data/lib/puppet/parser/templatewrapper.rb +28 -21
  119. data/lib/puppet/parser/type_loader.rb +3 -1
  120. data/lib/puppet/pops.rb +40 -0
  121. data/lib/puppet/pops/adaptable.rb +190 -0
  122. data/lib/puppet/pops/adapters.rb +65 -0
  123. data/lib/puppet/pops/containment.rb +37 -0
  124. data/lib/puppet/pops/issues.rb +258 -0
  125. data/lib/puppet/pops/label_provider.rb +71 -0
  126. data/lib/puppet/pops/model/ast_transformer.rb +636 -0
  127. data/lib/puppet/pops/model/ast_tree_dumper.rb +378 -0
  128. data/lib/puppet/pops/model/factory.rb +804 -0
  129. data/lib/puppet/pops/model/model.rb +567 -0
  130. data/lib/puppet/pops/model/model_label_provider.rb +75 -0
  131. data/lib/puppet/pops/model/model_tree_dumper.rb +352 -0
  132. data/lib/puppet/pops/model/tree_dumper.rb +59 -0
  133. data/lib/puppet/pops/parser/egrammar.ra +723 -0
  134. data/lib/puppet/pops/parser/eparser.rb +2300 -0
  135. data/lib/puppet/pops/parser/grammar.ra +746 -0
  136. data/lib/puppet/pops/parser/lexer.rb +842 -0
  137. data/lib/puppet/pops/parser/makefile +13 -0
  138. data/lib/puppet/pops/parser/parser_support.rb +203 -0
  139. data/lib/puppet/pops/patterns.rb +35 -0
  140. data/lib/puppet/pops/utils.rb +104 -0
  141. data/lib/puppet/pops/validation.rb +297 -0
  142. data/lib/puppet/pops/validation/checker3_1.rb +551 -0
  143. data/lib/puppet/pops/validation/validator_factory_3_1.rb +41 -0
  144. data/lib/puppet/pops/visitable.rb +6 -0
  145. data/lib/puppet/pops/visitor.rb +50 -0
  146. data/lib/puppet/property.rb +37 -28
  147. data/lib/puppet/property/ensure.rb +2 -2
  148. data/lib/puppet/property/ordered_list.rb +1 -1
  149. data/lib/puppet/provider.rb +26 -30
  150. data/lib/puppet/provider/aixobject.rb +45 -44
  151. data/lib/puppet/provider/augeas/augeas.rb +0 -1
  152. data/lib/puppet/provider/confiner.rb +1 -1
  153. data/lib/puppet/provider/cron/crontab.rb +107 -67
  154. data/lib/puppet/provider/group/groupadd.rb +59 -3
  155. data/lib/puppet/provider/interface/cisco.rb +4 -4
  156. data/lib/puppet/provider/mount/parsed.rb +1 -1
  157. data/lib/puppet/provider/nameservice.rb +22 -6
  158. data/lib/puppet/provider/nameservice/pw.rb +1 -1
  159. data/lib/puppet/provider/package/aix.rb +28 -4
  160. data/lib/puppet/provider/package/gem.rb +0 -2
  161. data/lib/puppet/provider/package/macports.rb +1 -1
  162. data/lib/puppet/provider/package/nim.rb +249 -4
  163. data/lib/puppet/provider/package/opkg.rb +77 -0
  164. data/lib/puppet/provider/package/pacman.rb +2 -2
  165. data/lib/puppet/provider/package/rpm.rb +30 -16
  166. data/lib/puppet/provider/package/yum.rb +3 -3
  167. data/lib/puppet/provider/parsedfile.rb +80 -3
  168. data/lib/puppet/provider/selmodule/semodule.rb +2 -2
  169. data/lib/puppet/provider/service/debian.rb +0 -4
  170. data/lib/puppet/provider/service/freebsd.rb +2 -2
  171. data/lib/puppet/provider/service/gentoo.rb +0 -9
  172. data/lib/puppet/provider/service/init.rb +27 -2
  173. data/lib/puppet/provider/service/launchd.rb +1 -1
  174. data/lib/puppet/provider/service/openwrt.rb +36 -0
  175. data/lib/puppet/provider/service/redhat.rb +0 -9
  176. data/lib/puppet/provider/service/src.rb +38 -4
  177. data/lib/puppet/provider/service/systemd.rb +2 -2
  178. data/lib/puppet/provider/service/upstart.rb +1 -8
  179. data/lib/puppet/provider/user/aix.rb +4 -10
  180. data/lib/puppet/provider/user/pw.rb +6 -10
  181. data/lib/puppet/provider/user/useradd.rb +129 -31
  182. data/lib/puppet/provider/vlan/cisco.rb +4 -4
  183. data/lib/puppet/reference/function.rb +2 -2
  184. data/lib/puppet/reference/indirection.rb +46 -5
  185. data/lib/puppet/reference/metaparameter.rb +2 -2
  186. data/lib/puppet/reports.rb +5 -5
  187. data/lib/puppet/reports/rrdgraph.rb +4 -4
  188. data/lib/puppet/reports/tagmail.rb +1 -1
  189. data/lib/puppet/resource.rb +1 -1
  190. data/lib/puppet/resource/type.rb +13 -11
  191. data/lib/puppet/scheduler.rb +16 -0
  192. data/lib/puppet/scheduler/job.rb +53 -0
  193. data/lib/puppet/scheduler/scheduler.rb +45 -0
  194. data/lib/puppet/scheduler/splay_job.rb +32 -0
  195. data/lib/puppet/scheduler/timer.rb +13 -0
  196. data/lib/puppet/settings/base_setting.rb +1 -1
  197. data/lib/puppet/simple_graph.rb +4 -4
  198. data/lib/puppet/ssl/base.rb +12 -2
  199. data/lib/puppet/ssl/certificate.rb +4 -1
  200. data/lib/puppet/ssl/certificate_request.rb +4 -1
  201. data/lib/puppet/ssl/certificate_revocation_list.rb +4 -1
  202. data/lib/puppet/ssl/configuration.rb +32 -0
  203. data/lib/puppet/ssl/host.rb +18 -21
  204. data/lib/puppet/ssl/key.rb +4 -1
  205. data/lib/puppet/ssl/validator.rb +116 -0
  206. data/lib/puppet/transaction.rb +1 -1
  207. data/lib/puppet/transaction/event.rb +3 -10
  208. data/lib/puppet/transaction/event_manager.rb +8 -1
  209. data/lib/puppet/transaction/report.rb +17 -16
  210. data/lib/puppet/type.rb +77 -69
  211. data/lib/puppet/type/cron.rb +20 -8
  212. data/lib/puppet/type/exec.rb +9 -3
  213. data/lib/puppet/type/file.rb +95 -21
  214. data/lib/puppet/type/file/content.rb +1 -1
  215. data/lib/puppet/type/file/mode.rb +7 -1
  216. data/lib/puppet/type/file/source.rb +2 -2
  217. data/lib/puppet/type/group.rb +11 -0
  218. data/lib/puppet/type/scheduled_task.rb +5 -1
  219. data/lib/puppet/type/service.rb +1 -1
  220. data/lib/puppet/type/ssh_authorized_key.rb +2 -2
  221. data/lib/puppet/type/user.rb +24 -6
  222. data/lib/puppet/util.rb +12 -2
  223. data/lib/puppet/util/classgen.rb +4 -4
  224. data/lib/puppet/util/colors.rb +55 -0
  225. data/lib/puppet/util/command_line/trollop.rb +4 -4
  226. data/lib/puppet/util/errors.rb +39 -3
  227. data/lib/puppet/util/fileparsing.rb +5 -0
  228. data/lib/puppet/util/filetype.rb +11 -9
  229. data/lib/puppet/util/instrumentation/instrumentable.rb +2 -2
  230. data/lib/puppet/util/libuser.conf +15 -0
  231. data/lib/puppet/util/libuser.rb +12 -0
  232. data/lib/puppet/util/monkey_patches.rb +48 -0
  233. data/lib/puppet/util/network_device.rb +1 -1
  234. data/lib/puppet/util/network_device/base.rb +2 -2
  235. data/lib/puppet/util/network_device/cisco/device.rb +29 -19
  236. data/lib/puppet/util/network_device/config.rb +5 -2
  237. data/lib/puppet/util/network_device/ipcalc.rb +1 -1
  238. data/lib/puppet/util/network_device/transport/ssh.rb +4 -3
  239. data/lib/puppet/util/network_device/transport/telnet.rb +4 -2
  240. data/lib/puppet/util/plugins.rb +4 -4
  241. data/lib/puppet/util/posix.rb +1 -1
  242. data/lib/puppet/util/profiler.rb +28 -0
  243. data/lib/puppet/util/profiler/logging.rb +47 -0
  244. data/lib/puppet/util/profiler/none.rb +8 -0
  245. data/lib/puppet/util/profiler/object_counts.rb +17 -0
  246. data/lib/puppet/util/profiler/wall_clock.rb +34 -0
  247. data/lib/puppet/util/provider_features.rb +1 -1
  248. data/lib/puppet/util/rdoc/parser.rb +5 -5
  249. data/lib/puppet/util/ssl.rb +38 -0
  250. data/lib/puppet/util/subclass_loader.rb +1 -5
  251. data/lib/puppet/util/windows.rb +1 -0
  252. data/lib/puppet/util/windows/process.rb +3 -0
  253. data/lib/puppet/util/windows/root_certs.rb +86 -0
  254. data/lib/puppet/util/windows/security.rb +1 -0
  255. data/lib/puppet/version.rb +1 -1
  256. data/spec/fixtures/integration/provider/cron/crontab/create_normal_entry +19 -0
  257. data/spec/fixtures/integration/provider/cron/crontab/create_special_entry +18 -0
  258. data/spec/fixtures/integration/provider/cron/crontab/crontab_user1 +15 -0
  259. data/spec/fixtures/integration/provider/cron/crontab/crontab_user2 +4 -0
  260. data/spec/fixtures/integration/provider/cron/crontab/modify_entry +13 -0
  261. data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input1 +15 -0
  262. data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input2 +6 -0
  263. data/spec/fixtures/integration/provider/cron/crontab/remove_named_resource +12 -0
  264. data/spec/fixtures/integration/provider/cron/crontab/remove_unnamed_resource +14 -0
  265. data/spec/fixtures/unit/pops/parser/lexer/aliastest.pp +16 -0
  266. data/spec/fixtures/unit/pops/parser/lexer/append.pp +11 -0
  267. data/spec/fixtures/unit/pops/parser/lexer/argumentdefaults.pp +14 -0
  268. data/spec/fixtures/unit/pops/parser/lexer/arithmetic_expression.pp +8 -0
  269. data/spec/fixtures/unit/pops/parser/lexer/arraytrailingcomma.pp +3 -0
  270. data/spec/fixtures/unit/pops/parser/lexer/casestatement.pp +65 -0
  271. data/spec/fixtures/unit/pops/parser/lexer/classheirarchy.pp +15 -0
  272. data/spec/fixtures/unit/pops/parser/lexer/classincludes.pp +17 -0
  273. data/spec/fixtures/unit/pops/parser/lexer/classpathtest.pp +11 -0
  274. data/spec/fixtures/unit/pops/parser/lexer/collection.pp +10 -0
  275. data/spec/fixtures/unit/pops/parser/lexer/collection_override.pp +8 -0
  276. data/spec/fixtures/unit/pops/parser/lexer/collection_within_virtual_definitions.pp +20 -0
  277. data/spec/fixtures/unit/pops/parser/lexer/componentmetaparams.pp +11 -0
  278. data/spec/fixtures/unit/pops/parser/lexer/componentrequire.pp +8 -0
  279. data/spec/fixtures/unit/pops/parser/lexer/deepclassheirarchy.pp +23 -0
  280. data/spec/fixtures/unit/pops/parser/lexer/defineoverrides.pp +17 -0
  281. data/spec/fixtures/unit/pops/parser/lexer/emptyclass.pp +9 -0
  282. data/spec/fixtures/unit/pops/parser/lexer/emptyexec.pp +3 -0
  283. data/spec/fixtures/unit/pops/parser/lexer/emptyifelse.pp +9 -0
  284. data/spec/fixtures/unit/pops/parser/lexer/falsevalues.pp +3 -0
  285. data/spec/fixtures/unit/pops/parser/lexer/filecreate.pp +11 -0
  286. data/spec/fixtures/unit/pops/parser/lexer/fqdefinition.pp +5 -0
  287. data/spec/fixtures/unit/pops/parser/lexer/fqparents.pp +11 -0
  288. data/spec/fixtures/unit/pops/parser/lexer/funccomma.pp +5 -0
  289. data/spec/fixtures/unit/pops/parser/lexer/hash.pp +33 -0
  290. data/spec/fixtures/unit/pops/parser/lexer/ifexpression.pp +12 -0
  291. data/spec/fixtures/unit/pops/parser/lexer/implicititeration.pp +15 -0
  292. data/spec/fixtures/unit/pops/parser/lexer/multilinecomments.pp +10 -0
  293. data/spec/fixtures/unit/pops/parser/lexer/multipleclass.pp +9 -0
  294. data/spec/fixtures/unit/pops/parser/lexer/multipleinstances.pp +7 -0
  295. data/spec/fixtures/unit/pops/parser/lexer/multisubs.pp +13 -0
  296. data/spec/fixtures/unit/pops/parser/lexer/namevartest.pp +9 -0
  297. data/spec/fixtures/unit/pops/parser/lexer/scopetest.pp +13 -0
  298. data/spec/fixtures/unit/pops/parser/lexer/selectorvalues.pp +49 -0
  299. data/spec/fixtures/unit/pops/parser/lexer/simpledefaults.pp +5 -0
  300. data/spec/fixtures/unit/pops/parser/lexer/simpleselector.pp +38 -0
  301. data/spec/fixtures/unit/pops/parser/lexer/singleary.pp +19 -0
  302. data/spec/fixtures/unit/pops/parser/lexer/singlequote.pp +11 -0
  303. data/spec/fixtures/unit/pops/parser/lexer/singleselector.pp +22 -0
  304. data/spec/fixtures/unit/pops/parser/lexer/subclass_name_duplication.pp +11 -0
  305. data/spec/fixtures/unit/pops/parser/lexer/tag.pp +9 -0
  306. data/spec/fixtures/unit/pops/parser/lexer/tagged.pp +35 -0
  307. data/spec/fixtures/unit/pops/parser/lexer/virtualresources.pp +14 -0
  308. data/spec/fixtures/unit/provider/cron/crontab/single_line.yaml +4 -4
  309. data/spec/fixtures/unit/provider/cron/crontab/vixie_header.txt +3 -0
  310. data/spec/fixtures/unit/provider/cron/parsed/managed +6 -0
  311. data/spec/fixtures/unit/provider/cron/parsed/simple +9 -0
  312. data/spec/fixtures/unit/provider/parsedfile/simple.txt +4 -0
  313. data/spec/fixtures/unit/provider/service/systemd/list_units +18 -0
  314. data/spec/integration/parser/collector_spec.rb +1 -1
  315. data/spec/integration/parser/compiler_spec.rb +252 -227
  316. data/spec/integration/parser/parser_spec.rb +171 -53
  317. data/spec/integration/parser/scope_spec.rb +1 -1
  318. data/spec/integration/provider/cron/crontab_spec.rb +187 -0
  319. data/spec/integration/provider/service/systemd_spec.rb +20 -0
  320. data/spec/integration/type/file_spec.rb +21 -21
  321. data/spec/integration/type/package_spec.rb +1 -1
  322. data/spec/lib/puppet_spec/database.rb +2 -5
  323. data/spec/spec_helper.rb +6 -1
  324. data/spec/unit/application/apply_spec.rb +16 -1
  325. data/spec/unit/application/describe_spec.rb +1 -1
  326. data/spec/unit/application/doc_spec.rb +55 -32
  327. data/spec/unit/application/kick_spec.rb +8 -6
  328. data/spec/unit/application/master_spec.rb +4 -4
  329. data/spec/unit/daemon_spec.rb +1 -1
  330. data/spec/unit/forge/errors_spec.rb +40 -0
  331. data/spec/unit/forge/repository_spec.rb +11 -1
  332. data/spec/unit/forge_spec.rb +13 -3
  333. data/spec/unit/hiera/backend/puppet_backend_spec.rb +1 -0
  334. data/spec/unit/hiera/scope_spec.rb +48 -25
  335. data/spec/unit/indirector/catalog/active_record_spec.rb +6 -3
  336. data/spec/unit/indirector/catalog/compiler_spec.rb +3 -28
  337. data/spec/unit/indirector/catalog/static_compiler_spec.rb +1 -1
  338. data/spec/unit/indirector/facts/inventory_active_record_spec.rb +154 -150
  339. data/spec/unit/indirector/indirection_spec.rb +5 -0
  340. data/spec/unit/indirector/resource/active_record_spec.rb +5 -22
  341. data/spec/unit/indirector_spec.rb +7 -1
  342. data/spec/unit/interface/action_builder_spec.rb +1 -1
  343. data/spec/unit/interface/action_manager_spec.rb +0 -2
  344. data/spec/unit/interface/action_spec.rb +1 -1
  345. data/spec/unit/interface/documentation_spec.rb +0 -2
  346. data/spec/unit/interface/face_collection_spec.rb +1 -1
  347. data/spec/unit/interface/option_builder_spec.rb +1 -1
  348. data/spec/unit/interface/option_spec.rb +0 -1
  349. data/spec/unit/module_spec.rb +17 -19
  350. data/spec/unit/module_tool/application_spec.rb +1 -3
  351. data/spec/unit/module_tool/applications/builder_spec.rb +38 -0
  352. data/spec/unit/module_tool/applications/checksummer_spec.rb +134 -0
  353. data/spec/unit/module_tool/applications/installer_spec.rb +71 -91
  354. data/spec/unit/module_tool/applications/searcher_spec.rb +1 -3
  355. data/spec/unit/module_tool/applications/uninstaller_spec.rb +18 -26
  356. data/spec/unit/module_tool/applications/unpacker_spec.rb +19 -52
  357. data/spec/unit/module_tool/tar/gnu_spec.rb +19 -0
  358. data/spec/unit/module_tool/tar/mini_spec.rb +59 -0
  359. data/spec/unit/module_tool/tar/solaris_spec.rb +19 -0
  360. data/spec/unit/network/http/connection_spec.rb +17 -2
  361. data/spec/unit/network/http/handler_spec.rb +195 -167
  362. data/spec/unit/network/http/rack/rest_spec.rb +26 -4
  363. data/spec/unit/network/http/webrick/rest_spec.rb +28 -1
  364. data/spec/unit/network/http/webrick_spec.rb +12 -3
  365. data/spec/unit/node/environment_spec.rb +421 -404
  366. data/spec/unit/parser/ast/arithmetic_operator_spec.rb +98 -2
  367. data/spec/unit/parser/collector_spec.rb +4 -4
  368. data/spec/unit/parser/compiler_spec.rb +13 -13
  369. data/spec/unit/parser/eparser_adapter_spec.rb +407 -0
  370. data/spec/unit/parser/functions/extlookup_spec.rb +20 -17
  371. data/spec/unit/parser/functions/fqdn_rand_spec.rb +5 -0
  372. data/spec/unit/parser/functions/hiera_include_spec.rb +0 -2
  373. data/spec/unit/parser/functions/hiera_spec.rb +0 -2
  374. data/spec/unit/parser/functions_spec.rb +27 -15
  375. data/spec/unit/parser/methods/collect_spec.rb +110 -0
  376. data/spec/unit/parser/methods/each_spec.rb +91 -0
  377. data/spec/unit/parser/methods/foreach_spec.rb +91 -0
  378. data/spec/unit/parser/methods/reduce_spec.rb +67 -0
  379. data/spec/unit/parser/methods/reject_spec.rb +73 -0
  380. data/spec/unit/parser/methods/select_spec.rb +79 -0
  381. data/spec/unit/parser/methods/shared.rb +61 -0
  382. data/spec/unit/parser/methods/slice_spec.rb +97 -0
  383. data/spec/unit/parser/parser_spec.rb +2 -2
  384. data/spec/unit/parser/scope_spec.rb +39 -16
  385. data/spec/unit/parser/templatewrapper_spec.rb +6 -5
  386. data/spec/unit/parser/type_loader_spec.rb +191 -165
  387. data/spec/unit/pops/adaptable_spec.rb +143 -0
  388. data/spec/unit/pops/containment_spec.rb +25 -0
  389. data/spec/unit/pops/factory_rspec_helper.rb +77 -0
  390. data/spec/unit/pops/factory_spec.rb +329 -0
  391. data/spec/unit/pops/issues_spec.rb +26 -0
  392. data/spec/unit/pops/label_provider_spec.rb +42 -0
  393. data/spec/unit/pops/model/ast_transformer_spec.rb +65 -0
  394. data/spec/unit/pops/model/model_spec.rb +37 -0
  395. data/spec/unit/pops/parser/lexer_spec.rb +884 -0
  396. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +248 -0
  397. data/spec/unit/pops/parser/parse_calls_spec.rb +93 -0
  398. data/spec/unit/pops/parser/parse_conditionals_spec.rb +159 -0
  399. data/spec/unit/pops/parser/parse_containers_spec.rb +175 -0
  400. data/spec/unit/pops/parser/parse_resource_spec.rb +228 -0
  401. data/spec/unit/pops/parser/parser_rspec_helper.rb +11 -0
  402. data/spec/unit/pops/parser/parser_spec.rb +15 -0
  403. data/spec/unit/pops/parser/rgen_sanitycheck_spec.rb +16 -0
  404. data/spec/unit/pops/transformer/transform_basic_expressions_spec.rb +243 -0
  405. data/spec/unit/pops/transformer/transform_calls_spec.rb +80 -0
  406. data/spec/unit/pops/transformer/transform_conditionals_spec.rb +132 -0
  407. data/spec/unit/pops/transformer/transform_containers_spec.rb +182 -0
  408. data/spec/unit/pops/transformer/transform_resource_spec.rb +185 -0
  409. data/spec/unit/pops/transformer/transformer_rspec_helper.rb +27 -0
  410. data/spec/unit/pops/visitor_spec.rb +94 -0
  411. data/spec/unit/property_spec.rb +11 -0
  412. data/spec/unit/provider/augeas/augeas_spec.rb +3 -0
  413. data/spec/unit/provider/cron/crontab_spec.rb +97 -7
  414. data/spec/unit/provider/cron/parsed_spec.rb +325 -0
  415. data/spec/unit/provider/exec/posix_spec.rb +1 -1
  416. data/spec/unit/provider/group/groupadd_spec.rb +33 -3
  417. data/spec/unit/provider/group/pw_spec.rb +5 -5
  418. data/spec/unit/provider/nameservice_spec.rb +304 -0
  419. data/spec/unit/provider/package/aix_spec.rb +53 -11
  420. data/spec/unit/provider/package/aptrpm_spec.rb +6 -0
  421. data/spec/unit/provider/package/gem_spec.rb +6 -11
  422. data/spec/unit/provider/package/nim_spec.rb +216 -7
  423. data/spec/unit/provider/package/opkg_spec.rb +180 -0
  424. data/spec/unit/provider/package/rpm_spec.rb +149 -3
  425. data/spec/unit/provider/package/yum_spec.rb +6 -5
  426. data/spec/unit/provider/parsedfile_spec.rb +122 -28
  427. data/spec/unit/provider/service/freebsd_spec.rb +18 -0
  428. data/spec/unit/provider/service/init_spec.rb +108 -87
  429. data/spec/unit/provider/service/launchd_spec.rb +2 -2
  430. data/spec/unit/provider/service/openwrt_spec.rb +109 -0
  431. data/spec/unit/provider/service/src_spec.rb +117 -41
  432. data/spec/unit/provider/service/systemd_spec.rb +125 -17
  433. data/spec/unit/provider/service/upstart_spec.rb +1 -1
  434. data/spec/unit/provider/user/aix_spec.rb +42 -0
  435. data/spec/unit/provider/user/directoryservice_spec.rb +1 -0
  436. data/spec/unit/provider/user/pw_spec.rb +24 -12
  437. data/spec/unit/provider/user/user_role_add_spec.rb +1 -1
  438. data/spec/unit/provider/user/useradd_spec.rb +179 -15
  439. data/spec/unit/resource/type_spec.rb +3 -3
  440. data/spec/unit/scheduler/job_spec.rb +79 -0
  441. data/spec/unit/scheduler/scheduler_spec.rb +129 -0
  442. data/spec/unit/scheduler/splay_job_spec.rb +35 -0
  443. data/spec/unit/ssl/base_spec.rb +3 -9
  444. data/spec/unit/ssl/certificate_authority_spec.rb +1 -0
  445. data/spec/unit/ssl/certificate_request_spec.rb +3 -1
  446. data/spec/unit/ssl/certificate_spec.rb +3 -1
  447. data/spec/unit/ssl/configuration_spec.rb +74 -0
  448. data/spec/unit/ssl/host_spec.rb +28 -7
  449. data/spec/unit/ssl/validator_spec.rb +311 -0
  450. data/spec/unit/transaction/event_manager_spec.rb +49 -0
  451. data/spec/unit/transaction/event_spec.rb +20 -5
  452. data/spec/unit/transaction/report_spec.rb +8 -0
  453. data/spec/unit/type/cron_spec.rb +9 -0
  454. data/spec/unit/type/exec_spec.rb +11 -0
  455. data/spec/unit/type/file/content_spec.rb +20 -20
  456. data/spec/unit/type/file/mode_spec.rb +6 -0
  457. data/spec/unit/type/file/source_spec.rb +9 -7
  458. data/spec/unit/type/file_spec.rb +22 -3
  459. data/spec/unit/type/service_spec.rb +34 -21
  460. data/spec/unit/type_spec.rb +46 -1
  461. data/spec/unit/util/backups_spec.rb +2 -2
  462. data/spec/unit/util/execution_spec.rb +4 -1
  463. data/spec/unit/util/filetype_spec.rb +6 -0
  464. data/spec/unit/util/monkey_patches_spec.rb +18 -0
  465. data/spec/unit/util/network_device/cisco/device_spec.rb +37 -0
  466. data/spec/unit/util/network_device/config_spec.rb +14 -0
  467. data/spec/unit/util/network_device_spec.rb +3 -3
  468. data/spec/unit/util/profiler/logging_spec.rb +81 -0
  469. data/spec/unit/util/profiler/none_spec.rb +12 -0
  470. data/spec/unit/util/profiler/object_counts_spec.rb +14 -0
  471. data/spec/unit/util/profiler/wall_clock_spec.rb +13 -0
  472. data/spec/unit/util/pson_spec.rb +5 -0
  473. data/spec/unit/util/ssl_spec.rb +51 -0
  474. data/spec/unit/util/windows/root_certs_spec.rb +15 -0
  475. data/spec/unit/util_spec.rb +28 -0
  476. metadata +2593 -2307
  477. data/spec/unit/module_tool/applications/application_spec.rb +0 -19
@@ -10,11 +10,12 @@ Puppet::Type.newtype(:cron) do
10
10
  job is not part of the actual job, it is used by Puppet to store and
11
11
  retrieve it.
12
12
 
13
- If you specify a cron job that matches an existing job in every way
14
- except name, then the jobs will be considered equivalent and the
15
- new name will be permanently associated with that job. Once this
16
- association is made and synced to disk, you can then manage the job
17
- normally (e.g., change the schedule of the job).
13
+ If you specify a cron resource that duplicates the scheduling and command
14
+ used by an existing crontab entry, then Puppet will take no action and
15
+ defers to the existing crontab entry. If the duplicate cron resource
16
+ specifies `ensure => absent`, all existing duplicated crontab entries will
17
+ be removed. Specifying multiple duplicate cron resources with different
18
+ `ensure` states will result in undefined behavior.
18
19
 
19
20
  Example:
20
21
 
@@ -42,6 +43,13 @@ Puppet::Type.newtype(:cron) do
42
43
  hour => ['2-4'],
43
44
  minute => '*/10'
44
45
  }
46
+
47
+ An important note: _the Cron type will not reset parameters that are
48
+ removed from a manifest_. For example, removing a `minute => 10` parameter
49
+ will not reset the minute component of the associated cronjob to `*`.
50
+ These changes must be expressed by setting the parameter to
51
+ `minute => absent` because Puppet only manages parameters that are out of
52
+ sync with manifest entries.
45
53
  EOT
46
54
  ensurable
47
55
 
@@ -224,6 +232,12 @@ Puppet::Type.newtype(:cron) do
224
232
  nil
225
233
  end
226
234
  end
235
+
236
+ def munge(value)
237
+ value.sub!(/^\s+/, '')
238
+ value.sub!(/\s+$/, '')
239
+ value
240
+ end
227
241
  end
228
242
 
229
243
  newproperty(:special) do
@@ -364,7 +378,7 @@ Puppet::Type.newtype(:cron) do
364
378
  end
365
379
 
366
380
  newproperty(:target) do
367
- desc "The username that will own the cron entry. Defaults to
381
+ desc "The username that will own the cron entry. Defaults to
368
382
  the value of $USER for the shell that invoked Puppet, or root if $USER
369
383
  is empty."
370
384
 
@@ -417,5 +431,3 @@ Puppet::Type.newtype(:cron) do
417
431
  end
418
432
  end
419
433
 
420
-
421
-
@@ -137,6 +137,10 @@ module Puppet
137
137
  normal log level (usually `notice`), but if the command fails
138
138
  (meaning its return code does not match the specified code) then
139
139
  any output is logged at the `err` log level."
140
+
141
+ validate do |command|
142
+ raise ArgumentError, "Command must be a String, got value of class #{command.class}" unless command.is_a? String
143
+ end
140
144
  end
141
145
 
142
146
  newparam(:path) do
@@ -180,9 +184,11 @@ module Puppet
180
184
  end
181
185
 
182
186
  newparam(:logoutput) do
183
- desc "Whether to log output. Defaults to `on_failure`, which only logs
184
- the output when the command has a non-zero exit code. In addition to
185
- the values below, you may set this attribute to any legal log level."
187
+ desc "Whether to log command output in addition to logging the
188
+ exit code. Defaults to `on_failure`, which only logs the output
189
+ when the command has an exit code that does not match any value
190
+ specified by the `returns` attribute. In addition to the values
191
+ below, you may set this attribute to any legal log level."
186
192
 
187
193
  defaultto :on_failure
188
194
 
@@ -245,6 +245,18 @@ Puppet::Type.newtype(:file) do
245
245
  newvalues(:first, :all)
246
246
  end
247
247
 
248
+ newparam(:show_diff, :boolean => true) do
249
+ desc "Whether to display differences when the file changes, defaulting to
250
+ true. This parameter is useful for files that may contain passwords or
251
+ other secret data, which might otherwise be included in Puppet reports or
252
+ other insecure outputs. If the global ``show_diff` configuration parameter
253
+ is false, then no diffs will be shown even if this parameter is true."
254
+
255
+ defaultto :true
256
+
257
+ newvalues(:true, :false)
258
+ end
259
+
248
260
  # Autorequire the nearest ancestor directory found in the catalog.
249
261
  autorequire(:file) do
250
262
  req = []
@@ -471,6 +483,11 @@ Puppet::Type.newtype(:file) do
471
483
  @parameters.include?(:purge) and (self[:purge] == :true or self[:purge] == "true")
472
484
  end
473
485
 
486
+ # Should we be showing diffs?
487
+ def show_diff?
488
+ @parameters.include?(:show_diff) and (self[:show_diff] == :true or self[:show_diff] == "true")
489
+ end
490
+
474
491
  # Recursively generate a list of file resources, which will
475
492
  # be used to copy remote files, manage local files, and/or make links
476
493
  # to map to another directory.
@@ -597,34 +614,35 @@ Puppet::Type.newtype(:file) do
597
614
  )
598
615
  end
599
616
 
600
- # Remove any existing data. This is only used when dealing with
601
- # links or directories.
617
+ # Back up and remove the file or directory at `self[:path]`.
618
+ #
619
+ # @param [Symbol] should The file type replacing the current content.
620
+ # @return [Boolean] True if the file was removed, else False
621
+ # @raises [fail???] If the current file isn't one of %w{file link directory} and can't be removed.
602
622
  def remove_existing(should)
603
- return unless s = stat
623
+ wanted_type = should.to_s
624
+ current_type = read_current_type
625
+
626
+ if current_type.nil?
627
+ return false
628
+ end
604
629
 
605
- self.fail "Could not back up; will not replace" unless perform_backup
630
+ if can_backup?(current_type)
631
+ backup_existing
632
+ end
606
633
 
607
- unless should.to_s == "link"
608
- return if s.ftype.to_s == should.to_s
634
+ if wanted_type != "link" and current_type == wanted_type
635
+ return false
609
636
  end
610
637
 
611
- case s.ftype
638
+ case current_type
612
639
  when "directory"
613
- if self[:force] == :true
614
- debug "Removing existing directory for replacement with #{should}"
615
- FileUtils.rmtree(self[:path])
616
- else
617
- notice "Not removing directory; use 'force' to override"
618
- return
619
- end
640
+ return remove_directory(wanted_type)
620
641
  when "link", "file"
621
- debug "Removing existing #{s.ftype} for replacement with #{should}"
622
- ::File.unlink(self[:path])
642
+ return remove_file(current_type, wanted_type)
623
643
  else
624
- self.fail "Could not back up files of type #{s.ftype}"
644
+ self.fail "Could not back up files of type #{current_type}"
625
645
  end
626
- @stat = :needs_stat
627
- true
628
646
  end
629
647
 
630
648
  def retrieve
@@ -746,6 +764,64 @@ Puppet::Type.newtype(:file) do
746
764
 
747
765
  private
748
766
 
767
+ # @return [String] The type of the current file, cast to a string.
768
+ def read_current_type
769
+ stat_info = stat
770
+ if stat_info
771
+ stat_info.ftype.to_s
772
+ else
773
+ nil
774
+ end
775
+ end
776
+
777
+ # @return [Boolean] If the current file can be backed up and needs to be backed up.
778
+ def can_backup?(type)
779
+ if type == "directory" and self[:force] == :false
780
+ # (#18110) Directories cannot be removed without :force, so it doesn't
781
+ # make sense to back them up.
782
+ false
783
+ else
784
+ true
785
+ end
786
+ end
787
+
788
+ # @return [Boolean] True if the directory was removed
789
+ # @api private
790
+ def remove_directory(wanted_type)
791
+ if self[:force] == :true
792
+ debug "Removing existing directory for replacement with #{wanted_type}"
793
+ FileUtils.rmtree(self[:path])
794
+ stat_needed
795
+ true
796
+ else
797
+ notice "Not removing directory; use 'force' to override"
798
+ false
799
+ end
800
+ end
801
+
802
+ # @return [Boolean] if the file was removed (which is always true currently)
803
+ # @api private
804
+ def remove_file(current_type, wanted_type)
805
+ debug "Removing existing #{current_type} for replacement with #{wanted_type}"
806
+ ::File.unlink(self[:path])
807
+ stat_needed
808
+ true
809
+ end
810
+
811
+ def stat_needed
812
+ @stat = :needs_stat
813
+ end
814
+
815
+ # Back up the existing file at a given prior to it being removed
816
+ # @api private
817
+ # @raise [Puppet::Error] if the file backup failed
818
+ # @return [void]
819
+ def backup_existing
820
+ unless perform_backup
821
+ raise Puppet::Error, "Could not back up; will not replace"
822
+ end
823
+ end
824
+
749
825
  # Should we validate the checksum of the file we're writing?
750
826
  def validate_checksum?
751
827
  self[:checksum] !~ /time/
@@ -766,8 +842,6 @@ Puppet::Type.newtype(:file) do
766
842
  (content = property(:content)) && content.write(file)
767
843
  end
768
844
 
769
- private
770
-
771
845
  def write_temporary_file?
772
846
  # unfortunately we don't know the source file size before fetching it
773
847
  # so let's assume the file won't be empty
@@ -107,7 +107,7 @@ module Puppet
107
107
 
108
108
  result = super
109
109
 
110
- if ! result and Puppet[:show_diff]
110
+ if ! result and Puppet[:show_diff] and resource.show_diff?
111
111
  write_temporarily do |path|
112
112
  notice "\n" + diff(@resource[:path], path)
113
113
  end
@@ -144,7 +144,13 @@ module Puppet
144
144
  end
145
145
 
146
146
  def is_to_s(currentvalue)
147
- currentvalue.rjust(4, "0")
147
+ if currentvalue == :absent
148
+ # This can occur during audits---if a file is transitioning from
149
+ # present to absent the mode will have a value of `:absent`.
150
+ super
151
+ else
152
+ currentvalue.rjust(4, "0")
153
+ end
148
154
  end
149
155
  end
150
156
  end
@@ -101,7 +101,7 @@ module Puppet
101
101
  return @content if @content
102
102
  raise Puppet::DevError, "No source for content was stored with the metadata" unless metadata.source
103
103
 
104
- unless tmp = Puppet::FileServing::Content.indirection.find(metadata.source, :environment => resource.catalog.environment)
104
+ unless tmp = Puppet::FileServing::Content.indirection.find(metadata.source, :environment => resource.catalog.environment, :links => resource[:links])
105
105
  fail "Could not find any content at %s" % metadata.source
106
106
  end
107
107
  @content = tmp.content
@@ -154,7 +154,7 @@ module Puppet
154
154
  return nil unless value
155
155
  value.each do |source|
156
156
  begin
157
- if data = Puppet::FileServing::Metadata.indirection.find(source, :environment => resource.catalog.environment)
157
+ if data = Puppet::FileServing::Metadata.indirection.find(source, :environment => resource.catalog.environment, :links => resource[:links])
158
158
  @metadata = data
159
159
  @metadata.source = source
160
160
  break
@@ -21,6 +21,10 @@ module Puppet
21
21
  feature :system_groups,
22
22
  "The provider allows you to create system groups with lower GIDs."
23
23
 
24
+ feature :libuser,
25
+ "Allows local groups to be managed on systems that also use some other
26
+ remote NSS method of managing accounts."
27
+
24
28
  ensurable do
25
29
  desc "Create or remove the group."
26
30
 
@@ -146,6 +150,13 @@ module Puppet
146
150
  defaultto false
147
151
  end
148
152
 
153
+ newparam(:forcelocal, :boolean => true, :required_features => :libuser ) do
154
+ desc "Forces the mangement of local accounts when accounts are also
155
+ being managed by some other NSS"
156
+ newvalues(:true, :false)
157
+ defaultto false
158
+ end
159
+
149
160
  # This method has been exposed for puppet to manage users and groups of
150
161
  # files in its settings and should not be considered available outside of
151
162
  # puppet.
@@ -62,7 +62,11 @@ Puppet::Type.newtype(:scheduled_task) do
62
62
  completed successfully'. It is recommended that you either
63
63
  choose another user to run the scheduled task, or alter the
64
64
  security policy to allow v1 scheduled tasks to run as the
65
- 'SYSTEM' account. Defaults to 'SYSTEM'."
65
+ 'SYSTEM' account. Defaults to 'SYSTEM'.
66
+
67
+ Please also note that Puppet must be running as a privileged user
68
+ in order to manage `scheduled_task` resources. Running as an
69
+ unprivileged user will result in 'access denied' errors."
66
70
 
67
71
  defaultto :system
68
72
 
@@ -71,7 +71,7 @@ module Puppet
71
71
  provider.stop
72
72
  end
73
73
 
74
- newvalue(:running, :event => :service_started) do
74
+ newvalue(:running, :event => :service_started, :invalidate_refreshes => true) do
75
75
  provider.start
76
76
  end
77
77
 
@@ -27,8 +27,8 @@ module Puppet
27
27
  end
28
28
 
29
29
  newproperty(:key) do
30
- desc "The public key itself; generally a long string of hex characters. The key attribute
31
- may not contain whitespace: Omit key headers (e.g. 'ssh-rsa') and key identifiers
30
+ desc "The public key itself; generally a long string of hex characters. The key attribute
31
+ may not contain whitespace: Omit key headers (e.g. 'ssh-rsa') and key identifiers
32
32
  (e.g. 'joe@joescomputer.local') found in the public key file."
33
33
 
34
34
  validate do |value|
@@ -23,7 +23,7 @@ module Puppet
23
23
  "The provider supports duplicate users with the same UID."
24
24
 
25
25
  feature :manages_homedir,
26
- "The provider can create and remove home directories."
26
+ "The provider can create, remove, and update home directories."
27
27
 
28
28
  feature :manages_passwords,
29
29
  "The provider can modify user passwords, by accepting a password
@@ -49,6 +49,10 @@ module Puppet
49
49
  feature :manages_aix_lam,
50
50
  "The provider can manage AIX Loadable Authentication Module (LAM) system."
51
51
 
52
+ feature :libuser,
53
+ "Allows local users to be managed on systems that also use some other
54
+ remote NSS method of managing accounts."
55
+
52
56
  newproperty(:ensure, :parent => Puppet::Property::Ensure) do
53
57
  newvalue(:present, :event => :user_created) do
54
58
  provider.create
@@ -299,8 +303,10 @@ module Puppet
299
303
 
300
304
  newparam(:managehome, :boolean => true) do
301
305
  desc "Whether to manage the home directory when managing the user.
302
- This will create the home directory when `ensure => present`, and
303
- delete the home directory when `ensure => absent`. Defaults to `false`."
306
+ This will create the home directory when `ensure => present`,
307
+ delete the home directory when `ensure => absent`. Linux only:
308
+ this will update the user's home directory when the `home` property
309
+ changes. Defaults to `false`."
304
310
 
305
311
  newvalues(:true, :false)
306
312
 
@@ -315,11 +321,16 @@ module Puppet
315
321
 
316
322
  newproperty(:expiry, :required_features => :manages_expiry) do
317
323
  desc "The expiry date for this user. Must be provided in
318
- a zero-padded YYYY-MM-DD format --- e.g. 2010-02-19."
324
+ a zero-padded YYYY-MM-DD format --- e.g. 2010-02-19.
325
+ If you want to make sure the user account does never
326
+ expire, you can pass the special value `absent`."
327
+
328
+ newvalues :absent
329
+ newvalues /^\d{4}-\d{2}-\d{2}$/
319
330
 
320
331
  validate do |value|
321
- if value !~ /^\d{4}-\d{2}-\d{2}$/
322
- raise ArgumentError, "Expiry dates must be YYYY-MM-DD"
332
+ if value.intern != :absent and value !~ /^\d{4}-\d{2}-\d{2}$/
333
+ raise ArgumentError, "Expiry dates must be YYYY-MM-DD or the string \"absent\""
323
334
  end
324
335
  end
325
336
  end
@@ -549,5 +560,12 @@ module Puppet
549
560
  end
550
561
  end
551
562
  end
563
+
564
+ newparam(:forcelocal, :boolean => true, :required_features => :libuser ) do
565
+ desc "Forces the mangement of local accounts when accounts are also
566
+ being managed by some other NSS"
567
+ newvalues(:true, :false)
568
+ defaultto false
569
+ end
552
570
  end
553
571
  end
data/lib/puppet/util.rb CHANGED
@@ -481,7 +481,7 @@ module Util
481
481
  retry
482
482
  end
483
483
  else
484
- File.rename(tempfile.path, file)
484
+ File.rename(tempfile.path, file.to_s)
485
485
  end
486
486
 
487
487
  # Ideally, we would now fsync the directory as well, but Ruby doesn't
@@ -519,7 +519,17 @@ module Util
519
519
  end
520
520
  module_function :exit_on_fail
521
521
 
522
-
522
+ def deterministic_rand(seed,max)
523
+ if defined?(Random) == 'constant' && Random.class == Class
524
+ Random.new(seed).rand(max).to_s
525
+ else
526
+ srand(seed)
527
+ result = rand(max).to_s
528
+ srand()
529
+ result
530
+ end
531
+ end
532
+ module_function :deterministic_rand
523
533
 
524
534
 
525
535
  #######################################################################################################
@@ -34,7 +34,7 @@ module Puppet::Util::ClassGen
34
34
  genthing(name, Class, options, block)
35
35
  end
36
36
 
37
- # Creates a new module.
37
+ # Creates a new module.
38
38
  # @param name [String] the name of the generated module
39
39
  # @param optinos [Hash] hash with options
40
40
  # @option options [Array<Class>] :array if specified, the generated class is appended to this array
@@ -148,10 +148,10 @@ module Puppet::Util::ClassGen
148
148
  # @api private
149
149
  #
150
150
  def is_constant_defined?(const)
151
- if ::RUBY_VERSION =~ /1.9/
152
- const_defined?(const, false)
153
- else
151
+ if ::RUBY_VERSION =~ /^1.8/
154
152
  const_defined?(const)
153
+ else
154
+ const_defined?(const, false)
155
155
  end
156
156
  end
157
157