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
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Common code for AIX providers. This class implements basic structure for
3
- # AIX resources.
3
+ # AIX resources.
4
4
  # Author:: Hector Rivas Gandara <keymon@gmail.com>
5
5
  #
6
6
  class Puppet::Provider::AixObject < Puppet::Provider
@@ -31,9 +31,9 @@ class Puppet::Provider::AixObject < Puppet::Provider
31
31
  # It is a list of hashes
32
32
  # :aix_attr AIX command attribute name
33
33
  # :puppet_prop Puppet propertie name
34
- # :to Optional. Method name that adapts puppet property to aix command value.
34
+ # :to Optional. Method name that adapts puppet property to aix command value.
35
35
  # :from Optional. Method to adapt aix command line value to puppet property. Optional
36
- class << self
36
+ class << self
37
37
  attr_accessor :attribute_mapping
38
38
  end
39
39
 
@@ -49,7 +49,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
49
49
  }
50
50
  end
51
51
  @attribute_mapping_to
52
- end
52
+ end
53
53
 
54
54
  # Mapping from AIX attribute to Puppet property.
55
55
  def self.attribute_mapping_from
@@ -64,7 +64,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
64
64
  end
65
65
  @attribute_mapping_from
66
66
  end
67
-
67
+
68
68
  # This functions translates a key and value using the given mapping.
69
69
  # Mapping can be nil (no translation) or a hash with this format
70
70
  # {:key => new_key, :method => translate_method}
@@ -72,7 +72,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
72
72
  def translate_attr(key, value, mapping)
73
73
  return [key, value] unless mapping
74
74
  return nil unless mapping[key]
75
-
75
+
76
76
  if mapping[key][:method]
77
77
  new_value = method(mapping[key][:method]).call(value)
78
78
  else
@@ -80,7 +80,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
80
80
  end
81
81
  [mapping[key][:key], new_value]
82
82
  end
83
-
83
+
84
84
  # Loads an AIX attribute (key=value) and stores it in the given hash with
85
85
  # puppet semantics. It translates the pair using the given mapping.
86
86
  #
@@ -94,13 +94,13 @@ class Puppet::Provider::AixObject < Puppet::Provider
94
94
  true
95
95
  elsif mapping[key][:method].nil?
96
96
  objectinfo[mapping[key][:key]] = value
97
- elsif
97
+ elsif
98
98
  objectinfo[mapping[key][:key]] = method(mapping[key][:method]).call(value)
99
99
  end
100
-
100
+
101
101
  return objectinfo
102
102
  end
103
-
103
+
104
104
  # Gets the given command line argument for the given key and value,
105
105
  # using the given mapping to translate key and value.
106
106
  # All the objectinfo hash (@resource or @property_hash) is passed.
@@ -109,7 +109,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
109
109
  # and default behaviour is return the arguments as key=value pairs.
110
110
  # Subclasses must reimplement this if more complex operations/arguments
111
111
  # are needed
112
- #
112
+ #
113
113
  def get_arguments(key, value, mapping, objectinfo)
114
114
  if mapping.nil?
115
115
  new_key = key
@@ -121,7 +121,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
121
121
  elsif mapping[key][:method].nil?
122
122
  new_key = mapping[key][:key]
123
123
  new_value = value
124
- elsif
124
+ elsif
125
125
  new_key = mapping[key][:key]
126
126
  new_value = method(mapping[key][:method]).call(value)
127
127
  end
@@ -130,18 +130,18 @@ class Puppet::Provider::AixObject < Puppet::Provider
130
130
  new_value = Array(new_value).join(',')
131
131
 
132
132
  if new_key
133
- return [ "#{new_key}=#{new_value}" ]
133
+ return [ "#{new_key}=#{new_value}" ]
134
134
  else
135
135
  return []
136
136
  end
137
137
  end
138
-
138
+
139
139
  # Convert the provider properties (hash) to AIX command arguments
140
140
  # (list of strings)
141
141
  # This function will translate each value/key and generate the argument using
142
142
  # the get_arguments function.
143
143
  def hash2args(hash, mapping=self.class.attribute_mapping_to)
144
- return "" unless hash
144
+ return "" unless hash
145
145
  arg_list = []
146
146
  hash.each {|key, val|
147
147
  arg_list += self.get_arguments(key, val, mapping, hash)
@@ -151,8 +151,8 @@ class Puppet::Provider::AixObject < Puppet::Provider
151
151
 
152
152
  # Parse AIX command attributes from the output of an AIX command, that
153
153
  # which format is a list of space separated of key=value pairs:
154
- # "uid=100 groups=a,b,c".
155
- # It returns an hash.
154
+ # "uid=100 groups=a,b,c".
155
+ # It returns an hash.
156
156
  #
157
157
  # If a mapping is provided, the keys are translated as defined in the
158
158
  # mapping hash. And only values included in mapping will be added
@@ -163,7 +163,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
163
163
  attrs = []
164
164
  if !str or (attrs = str.split()).empty?
165
165
  return nil
166
- end
166
+ end
167
167
 
168
168
  attrs.each { |i|
169
169
  if i.include? "=" # Ignore if it does not include '='
@@ -174,7 +174,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
174
174
  continue
175
175
  end
176
176
  key = key_str.to_sym
177
-
177
+
178
178
  properties = self.load_attribute(key, val, mapping, properties)
179
179
  end
180
180
  }
@@ -195,16 +195,15 @@ class Puppet::Provider::AixObject < Puppet::Provider
195
195
  attrs = []
196
196
  if !str or (attrs = str.split(':')).empty?
197
197
  return nil
198
- end
198
+ end
199
199
 
200
200
  attrs.each { |val|
201
201
  key = key_list.shift.downcase.to_sym
202
202
  properties = self.load_attribute(key, val, mapping, properties)
203
203
  }
204
204
  properties.empty? ? nil : properties
205
-
206
205
  end
207
-
206
+
208
207
  # Default parsing function for AIX commands.
209
208
  # It will choose the method depending of the first line.
210
209
  # For the colon separated list it will:
@@ -213,7 +212,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
213
212
  def parse_command_output(output, mapping=self.class.attribute_mapping_from)
214
213
  lines = output.split("\n")
215
214
  # if it begins with #something:... is a colon separated list.
216
- if lines[0] =~ /^#.*:/
215
+ if lines[0] =~ /^#.*:/
217
216
  self.parse_colon_list(lines[1], lines[0][1..-1].split(':'), mapping)
218
217
  else
219
218
  self.parse_attr_list(lines[0], mapping)
@@ -233,7 +232,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
233
232
  @objectosinfo = self.parse_command_output(execute(self.lscmd), nil)
234
233
  rescue Puppet::ExecutionFailure => detail
235
234
  # Print error if needed. FIXME: Do not check the user here.
236
- Puppet.debug "aix.getinfo(): Could not find #{@resource.class.name} #{@resource.name}: #{detail}"
235
+ Puppet.debug "aix.getinfo(): Could not find #{@resource.class.name} #{@resource.name}: #{detail}"
237
236
  end
238
237
  end
239
238
  @objectinfo
@@ -252,17 +251,20 @@ class Puppet::Provider::AixObject < Puppet::Provider
252
251
  # List all elements of given type. It works for colon separated commands and
253
252
  # list commands.
254
253
  # It returns a list of names.
255
- def list_all
254
+ def self.list_all
256
255
  names = []
257
256
  begin
258
- output = execute(self.lsallcmd()).split('\n')
259
- (output.select{ |l| l != /^#/ }).each { |v|
260
- name = v.split(/[ :]/)
257
+ output = execute([self.command(:list), 'ALL'])
258
+
259
+ output = output.split("\n").select{ |line| line != /^#/ }
260
+
261
+ output.each do |line|
262
+ name = line.split(/[ :]/)[0]
261
263
  names << name if not name.empty?
262
- }
264
+ end
263
265
  rescue Puppet::ExecutionFailure => detail
264
266
  # Print error if needed
265
- Puppet.debug "aix.list_all(): Could not get all resources of type #{@resource.class.name}: #{detail}"
267
+ Puppet.debug "aix.list_all(): Could not get all resources of type #{@resource.class.name}: #{detail}"
266
268
  end
267
269
  names
268
270
  end
@@ -271,7 +273,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
271
273
  #-------------
272
274
  # Provider API
273
275
  # ------------
274
-
276
+
275
277
  # Clear out the cached values.
276
278
  def flush
277
279
  @property_hash.clear if @property_hash
@@ -283,12 +285,12 @@ class Puppet::Provider::AixObject < Puppet::Provider
283
285
  !!getinfo(true) # !! => converts to bool
284
286
  end
285
287
 
286
- # Return all existing instances
288
+ # Return all existing instances
287
289
  # The method for returning a list of provider instances. Note that it returns
288
290
  # providers, preferably with values already filled in, not resources.
289
291
  def self.instances
290
292
  objects=[]
291
- self.list_all().each { |entry|
293
+ self.list_all.each { |entry|
292
294
  objects << new(:name => entry, :ensure => :present)
293
295
  }
294
296
  objects
@@ -319,7 +321,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
319
321
  rescue Puppet::ExecutionFailure => detail
320
322
  raise Puppet::Error, "Could not create #{@resource.class.name} #{@resource.name}: #{detail}"
321
323
  end
322
- end
324
+ end
323
325
 
324
326
  # Delete this instance of the resource
325
327
  def delete
@@ -347,13 +349,13 @@ class Puppet::Provider::AixObject < Puppet::Provider
347
349
  define_method(prop.to_s + "=") { |*vals| set(prop, *vals) } unless public_method_defined?(prop.to_s + "=")
348
350
  end
349
351
  end
350
-
352
+
351
353
  # Define the needed getters and setters as soon as we know the resource type
352
354
  def self.resource_type=(resource_type)
353
355
  super
354
356
  mk_resource_methods
355
357
  end
356
-
358
+
357
359
  # Retrieve a specific value by name.
358
360
  def get(param)
359
361
  (hash = getinfo(false)) ? hash[param] : nil
@@ -362,15 +364,15 @@ class Puppet::Provider::AixObject < Puppet::Provider
362
364
  # Set a property.
363
365
  def set(param, value)
364
366
  @property_hash[param.intern] = value
365
-
367
+
366
368
  if getinfo().nil?
367
- # This is weird...
369
+ # This is weird...
368
370
  raise Puppet::Error, "Trying to update parameter '#{param}' to '#{value}' for a resource that does not exists #{@resource.class.name} #{@resource.name}: #{detail}"
369
371
  end
370
372
  if value == getinfo()[param.to_sym]
371
373
  return
372
374
  end
373
-
375
+
374
376
  #self.class.validate(param, value)
375
377
  if cmd = modifycmd({param =>value})
376
378
  begin
@@ -379,15 +381,14 @@ class Puppet::Provider::AixObject < Puppet::Provider
379
381
  raise Puppet::Error, "Could not set #{param} on #{@resource.class.name}[#{@resource.name}]: #{detail}"
380
382
  end
381
383
  end
382
-
383
- # Refresh de info.
384
+
385
+ # Refresh de info.
384
386
  hash = getinfo(true)
385
387
  end
386
-
388
+
387
389
  def initialize(resource)
388
390
  super
389
391
  @objectinfo = nil
390
392
  @objectosinfo = nil
391
- end
392
-
393
+ end
393
394
  end
@@ -171,7 +171,6 @@ Puppet::Type.type(:augeas).provide(:augeas) do
171
171
  aug.set("/augeas/load/Xfm/incl", resource[:incl])
172
172
  restricted = true
173
173
  elsif glob_avail and opt_ctx
174
- restricted = true
175
174
  # Optimize loading if the context is given, requires the glob function
176
175
  # from Augeas 0.8.2 or up
177
176
  ctx_path = resource[:context].sub(/^\/files(.*?)\/?$/, '\1/')
@@ -36,7 +36,7 @@ module Puppet::Provider::Confiner
36
36
  # Checks whether this implementation is suitable for the current platform (or returns a summary
37
37
  # of all confines if short == false).
38
38
  # @return [Boolean. Hash] Returns whether the confines are all valid (if short == true), or a hash of all confines
39
- # if short == false.
39
+ # if short == false.
40
40
  # @api public
41
41
  #
42
42
  def suitable?(short = true)
@@ -1,17 +1,6 @@
1
1
  require 'puppet/provider/parsedfile'
2
2
 
3
- tab = case Facter.value(:osfamily)
4
- when "Solaris"
5
- :suntab
6
- when "AIX"
7
- :aixtab
8
- else
9
- :crontab
10
- end
11
-
12
-
13
-
14
- Puppet::Type.type(:cron).provide(:crontab, :parent => Puppet::Provider::ParsedFile, :default_target => ENV["USER"] || "root", :filetype => tab) do
3
+ Puppet::Type.type(:cron).provide(:crontab, :parent => Puppet::Provider::ParsedFile, :default_target => ENV["USER"] || "root") do
15
4
  commands :crontab => "crontab"
16
5
 
17
6
  text_line :comment, :match => %r{^\s*#}, :post_parse => proc { |record|
@@ -22,58 +11,103 @@ Puppet::Type.type(:cron).provide(:crontab, :parent => Puppet::Provider::ParsedFi
22
11
 
23
12
  text_line :environment, :match => %r{^\s*\w+=}
24
13
 
25
- record_line :freebsd_special, :fields => %w{special command},
26
- :match => %r{^@(\w+)\s+(.+)$}, :pre_gen => proc { |record|
27
- record[:special] = "@" + record[:special]
28
- }
14
+ def self.filetype
15
+ tabname = case Facter.value(:osfamily)
16
+ when "Solaris"
17
+ :suntab
18
+ when "AIX"
19
+ :aixtab
20
+ else
21
+ :crontab
22
+ end
23
+
24
+ Puppet::Util::FileType.filetype(tabname)
25
+ end
29
26
 
30
- crontab = record_line :crontab, :fields => %w{minute hour monthday month weekday command},
31
- :match => %r{^\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(.+)$},
32
- :optional => %w{minute hour weekday month monthday}, :absent => "*"
27
+ self::TIME_FIELDS = [:minute, :hour, :monthday, :month, :weekday]
28
+
29
+ record_line :crontab,
30
+ :fields => %w{time command},
31
+ :match => %r{^\s*(@\w+|\S+\s+\S+\s+\S+\s+\S+\s+\S+)\s+(.+)$},
32
+ :absent => '*',
33
+ :block_eval => :instance do
33
34
 
34
- class << crontab
35
- def numeric_fields
36
- fields - [:command]
37
- end
38
- # Do some post-processing of the parsed record. Basically just
39
- # split the numeric fields on ','.
40
35
  def post_parse(record)
41
- numeric_fields.each do |field|
42
- if val = record[field] and val != :absent
43
- record[field] = record[field].split(",")
36
+ time = record.delete(:time)
37
+ if match = /@(\S+)/.match(time)
38
+ # is there another way to access the constant?
39
+ Puppet::Type::Cron::ProviderCrontab::TIME_FIELDS.each { |f| record[f] = :absent }
40
+ record[:special] = match.captures[0]
41
+ elsif match = /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/.match(time)
42
+ record[:special] = :absent
43
+ Puppet::Type::Cron::ProviderCrontab::TIME_FIELDS.zip(match.captures).each do |field,value|
44
+ if value == self.absent
45
+ record[field] = :absent
46
+ else
47
+ record[field] = value.split(",")
48
+ end
44
49
  end
50
+ else
51
+ raise Puppet::Error, "Line got parsed as a crontab entry but cannot be handled. Please file a bug with the contents of your crontab"
45
52
  end
53
+ record
46
54
  end
47
55
 
48
- # Join the fields back up based on ','.
49
56
  def pre_gen(record)
50
- numeric_fields.each do |field|
57
+ if record[:special] and record[:special] != :absent
58
+ record[:special] = "@#{record[:special]}"
59
+ end
60
+
61
+ Puppet::Type::Cron::ProviderCrontab::TIME_FIELDS.each do |field|
51
62
  if vals = record[field] and vals.is_a?(Array)
52
63
  record[field] = vals.join(",")
53
64
  end
54
65
  end
66
+ record
55
67
  end
56
68
 
57
-
58
- # Add name and environments as necessary.
59
69
  def to_line(record)
60
70
  str = ""
61
71
  str = "# Puppet Name: #{record[:name]}\n" if record[:name]
62
- if record[:environment] and record[:environment] != :absent and record[:environment] != [:absent]
63
- record[:environment].each do |env|
64
- str += env + "\n"
65
- end
72
+ if record[:environment] and record[:environment] != :absent
73
+ str += record[:environment].map {|line| "#{line}\n"}.join('')
66
74
  end
67
-
68
- if record[:special]
69
- str += "@#{record[:special]} #{record[:command]}"
75
+ if record[:special] and record[:special] != :absent
76
+ fields = [:special, :command]
70
77
  else
71
- str += join(record)
78
+ fields = Puppet::Type::Cron::ProviderCrontab::TIME_FIELDS + [:command]
72
79
  end
80
+ str += record.values_at(*fields).map do |field|
81
+ if field.nil? or field == :absent
82
+ self.absent
83
+ else
84
+ field
85
+ end
86
+ end.join(self.joiner)
73
87
  str
74
88
  end
75
89
  end
76
90
 
91
+ # Look up a resource with a given name whose user matches a record target
92
+ #
93
+ # @api private
94
+ #
95
+ # @note This overrides the ParsedFile method for finding resources by name,
96
+ # so that only records for a given user are matched to resources of the
97
+ # same user so that orphaned records in other crontabs don't get falsely
98
+ # matched (#2251)
99
+ #
100
+ # @param [Hash<Symbol, Object>] record
101
+ # @param [Array<Puppet::Resource>] resources
102
+ #
103
+ # @return [Puppet::Resource, nil] The resource if found, else nil
104
+ def self.resource_for_record(record, resources)
105
+ resource = super
106
+
107
+ if resource and record[:target] == resource[:user]
108
+ resource
109
+ end
110
+ end
77
111
 
78
112
  # Return the header placed at the top of each generated file, warning
79
113
  # users that modifying this file manually is probably a bad idea.
@@ -84,50 +118,52 @@ Puppet::Type.type(:cron).provide(:crontab, :parent => Puppet::Provider::ParsedFi
84
118
  # HEADER: not be deleted, as doing so could cause duplicate cron jobs.\n}
85
119
  end
86
120
 
121
+ # Regex for finding one vixie cron header.
122
+ def self.native_header_regex
123
+ /# DO NOT EDIT THIS FILE.*?Cron version.*?vixie.*?\n/m
124
+ end
125
+
126
+ # If a vixie cron header is found, it should be dropped, cron will insert
127
+ # a new one in any case, so we need to avoid duplicates.
128
+ def self.drop_native_header
129
+ true
130
+ end
131
+
87
132
  # See if we can match the record against an existing cron job.
88
133
  def self.match(record, resources)
134
+ # if the record is named, do not even bother (#19876)
135
+ return false if record[:name]
89
136
  resources.each do |name, resource|
90
137
  # Match the command first, since it's the most important one.
91
- next unless record[:target] == resource.value(:target)
138
+ next unless record[:target] == resource[:target]
92
139
  next unless record[:command] == resource.value(:command)
93
140
 
94
- # Then check the @special stuff
95
- if record[:special]
96
- next unless resource.value(:special) == record[:special]
97
- end
141
+ # Now check the time fields
142
+ compare_fields = self::TIME_FIELDS + [:special]
98
143
 
99
- # Then the normal fields.
100
144
  matched = true
101
- record_type(record[:record_type]).fields.each do |field|
102
- next if field == :command
103
- next if field == :special
104
- if record[field] and ! resource.value(field)
105
- #Puppet.info "Cron is missing %s: %s and %s" %
106
- # [field, record[field].inspect, resource.value(field).inspect]
145
+ compare_fields.each do |field|
146
+ # If the resource does not manage a property (say monthday) it should
147
+ # always match. If it is the other way around (e.g. resource defines
148
+ # a should value for :special but the record does not have it, we do
149
+ # not match
150
+ next unless resource[field]
151
+ unless record.include?(field)
107
152
  matched = false
108
153
  break
109
154
  end
110
155
 
111
- if ! record[field] and resource.value(field)
112
- #Puppet.info "Hash is missing %s: %s and %s" %
113
- # [field, resource.value(field).inspect, record[field].inspect]
114
- matched = false
115
- break
156
+ if record_value = record[field] and resource_value = resource.value(field)
157
+ # The record translates '*' into absent in the post_parse hook and
158
+ # the resource type does exactly the opposite (alias :absent to *)
159
+ next if resource_value == '*' and record_value == :absent
160
+ next if resource_value == record_value
116
161
  end
117
-
118
- # Yay differing definitions of absent.
119
- next if (record[field] == :absent and resource.value(field) == "*")
120
-
121
- # Everything should be in the form of arrays, not the normal text.
122
- next if (record[field] == resource.value(field))
123
- #Puppet.info "Did not match %s: %s vs %s" %
124
- # [field, resource.value(field).inspect, record[field].inspect]
125
- matched = false
162
+ matched =false
126
163
  break
127
164
  end
128
165
  return resource if matched
129
166
  end
130
-
131
167
  false
132
168
  end
133
169
 
@@ -189,6 +225,10 @@ Puppet::Type.type(:cron).provide(:crontab, :parent => Puppet::Provider::ParsedFi
189
225
  end
190
226
 
191
227
  def user=(user)
228
+ # we have to mark the target as modified first, to make sure that if
229
+ # we move a cronjob from userA to userB, userA's crontab will also
230
+ # be rewritten
231
+ mark_target_modified
192
232
  @property_hash[:user] = user
193
233
  @property_hash[:target] = user
194
234
  end