puppet 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. checksums.yaml +7 -0
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +6 -6
  4. data/LICENSE +1 -1
  5. data/README.md +8 -9
  6. data/conf/auth.conf +2 -2
  7. data/ext/README.environment +1 -1
  8. data/ext/build_defaults.yaml +1 -1
  9. data/ext/debian/README.source +1 -1
  10. data/ext/debian/control +1 -1
  11. data/ext/debian/copyright +4 -4
  12. data/ext/debian/puppetmaster.README.debian +11 -9
  13. data/ext/emacs/puppet-mode.el +1 -1
  14. data/ext/envpuppet +2 -2
  15. data/ext/ips/puppetagent.xml +1 -1
  16. data/ext/ips/puppetmaster.xml +1 -1
  17. data/ext/project_data.yaml +8 -0
  18. data/ext/puppet-test +3 -3
  19. data/ext/rack/example-passenger-vhost.conf +1 -1
  20. data/ext/redhat/puppet.spec.erb +2 -2
  21. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  22. data/ext/solaris/pkginfo +1 -1
  23. data/ext/solaris/smf/puppet.xml +1 -1
  24. data/ext/suse/puppet.spec +2 -2
  25. data/ext/upload_facts.rb +1 -1
  26. data/ext/windows/puppet_interactive.bat +6 -0
  27. data/ext/windows/puppet_shell.bat +9 -0
  28. data/ext/windows/run_puppet_interactive.bat +9 -0
  29. data/ext/yaml_nodes.rb +1 -1
  30. data/install.rb +30 -20
  31. data/lib/hiera/scope.rb +1 -1
  32. data/lib/puppet/agent.rb +1 -1
  33. data/lib/puppet/application/agent.rb +4 -2
  34. data/lib/puppet/application/apply.rb +7 -4
  35. data/lib/puppet/application/cert.rb +1 -1
  36. data/lib/puppet/application/device.rb +1 -1
  37. data/lib/puppet/application/filebucket.rb +1 -1
  38. data/lib/puppet/application/inspect.rb +1 -1
  39. data/lib/puppet/application/lookup.rb +45 -47
  40. data/lib/puppet/application/master.rb +2 -2
  41. data/lib/puppet/application/resource.rb +1 -1
  42. data/lib/puppet/configurer.rb +100 -22
  43. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  44. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  45. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  46. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  47. data/lib/puppet/data_providers/lookup_adapter.rb +73 -26
  48. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  49. data/lib/puppet/defaults.rb +69 -22
  50. data/lib/puppet/environments.rb +3 -1
  51. data/lib/puppet/face/config.rb +1 -1
  52. data/lib/puppet/face/epp.rb +1 -1
  53. data/lib/puppet/face/help/man.erb +1 -1
  54. data/lib/puppet/face/module/install.rb +6 -6
  55. data/lib/puppet/face/parser.rb +12 -9
  56. data/lib/puppet/face/status.rb +2 -1
  57. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  58. data/lib/puppet/feature/telnet.rb +9 -0
  59. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  60. data/lib/puppet/file_serving/metadata.rb +18 -2
  61. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  62. data/lib/puppet/file_system/file_impl.rb +2 -2
  63. data/lib/puppet/file_system/memory_impl.rb +1 -1
  64. data/lib/puppet/file_system/uniquefile.rb +1 -1
  65. data/lib/puppet/file_system.rb +2 -2
  66. data/lib/puppet/forge/repository.rb +1 -31
  67. data/lib/puppet/forge.rb +1 -1
  68. data/lib/puppet/functions/assert_type.rb +9 -9
  69. data/lib/puppet/functions/each.rb +5 -13
  70. data/lib/puppet/functions/filter.rb +5 -14
  71. data/lib/puppet/functions/lookup.rb +126 -150
  72. data/lib/puppet/functions/map.rb +6 -14
  73. data/lib/puppet/functions/match.rb +1 -0
  74. data/lib/puppet/functions/reduce.rb +5 -13
  75. data/lib/puppet/functions/reverse_each.rb +82 -0
  76. data/lib/puppet/functions/scanf.rb +15 -18
  77. data/lib/puppet/functions/slice.rb +22 -36
  78. data/lib/puppet/functions/split.rb +2 -2
  79. data/lib/puppet/functions/step.rb +88 -0
  80. data/lib/puppet/functions/type.rb +70 -0
  81. data/lib/puppet/functions.rb +45 -6
  82. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  83. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  84. data/lib/puppet/indirector/facts/facter.rb +2 -13
  85. data/lib/puppet/indirector/file_content/http.rb +15 -0
  86. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  87. data/lib/puppet/indirector/generic_http.rb +16 -0
  88. data/lib/puppet/indirector/hiera.rb +3 -1
  89. data/lib/puppet/indirector/indirection.rb +6 -2
  90. data/lib/puppet/indirector/json.rb +2 -2
  91. data/lib/puppet/indirector/node/exec.rb +1 -1
  92. data/lib/puppet/indirector/node/ldap.rb +1 -1
  93. data/lib/puppet/indirector/rest.rb +2 -1
  94. data/lib/puppet/info_service/class_information_service.rb +13 -12
  95. data/lib/puppet/loaders.rb +1 -0
  96. data/lib/puppet/module.rb +6 -2
  97. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  98. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  99. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  100. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  101. data/lib/puppet/network/http/pool.rb +9 -0
  102. data/lib/puppet/node/environment.rb +11 -2
  103. data/lib/puppet/node.rb +11 -2
  104. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  105. data/lib/puppet/parser/compiler.rb +4 -11
  106. data/lib/puppet/parser/environment_compiler.rb +0 -1
  107. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  108. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  109. data/lib/puppet/parser/functions/lookup.rb +128 -149
  110. data/lib/puppet/parser/functions/map.rb +1 -1
  111. data/lib/puppet/parser/functions/match.rb +1 -0
  112. data/lib/puppet/parser/functions/scanf.rb +15 -26
  113. data/lib/puppet/parser/functions/slice.rb +17 -24
  114. data/lib/puppet/parser/functions/split.rb +1 -1
  115. data/lib/puppet/parser/functions.rb +28 -16
  116. data/lib/puppet/parser/resource.rb +19 -17
  117. data/lib/puppet/parser/scope.rb +176 -5
  118. data/lib/puppet/plugins/data_providers/data_provider.rb +56 -14
  119. data/lib/puppet/pops/adaptable.rb +4 -1
  120. data/lib/puppet/pops/adapters.rb +80 -12
  121. data/lib/puppet/pops/binder/binder.rb +21 -17
  122. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  123. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  124. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  125. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  126. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  127. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  128. data/lib/puppet/pops/binder/injector.rb +53 -48
  129. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  130. data/lib/puppet/pops/binder/producers.rb +67 -62
  131. data/lib/puppet/pops/evaluator/access_operator.rb +98 -96
  132. data/lib/puppet/pops/evaluator/closure.rb +122 -106
  133. data/lib/puppet/pops/evaluator/collector_transformer.rb +34 -14
  134. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  135. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  136. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  137. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  138. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  139. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  140. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  141. data/lib/puppet/pops/evaluator/runtime3_support.rb +47 -42
  142. data/lib/puppet/pops/functions/function.rb +6 -2
  143. data/lib/puppet/pops/issue_reporter.rb +6 -4
  144. data/lib/puppet/pops/issues.rb +50 -11
  145. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  146. data/lib/puppet/pops/loader/loader.rb +1 -1
  147. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  148. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  149. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +18 -13
  150. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  151. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  152. data/lib/puppet/pops/loaders.rb +51 -9
  153. data/lib/puppet/pops/lookup/explainer.rb +73 -3
  154. data/lib/puppet/pops/lookup/invocation.rb +21 -19
  155. data/lib/puppet/pops/lookup.rb +17 -12
  156. data/lib/puppet/pops/merge_strategy.rb +16 -19
  157. data/lib/puppet/pops/model/factory.rb +179 -157
  158. data/lib/puppet/pops/model/model.rb +17 -8
  159. data/lib/puppet/pops/model/model_label_provider.rb +14 -7
  160. data/lib/puppet/pops/model/model_meta.rb +17 -0
  161. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  162. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  163. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  164. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  165. data/lib/puppet/pops/parser/evaluating_parser.rb +17 -13
  166. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  167. data/lib/puppet/pops/parser/lexer2.rb +428 -403
  168. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  169. data/lib/puppet/pops/parser/locator.rb +21 -0
  170. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  171. data/lib/puppet/pops/parser/slurp_support.rb +16 -8
  172. data/lib/puppet/pops/types/class_loader.rb +23 -19
  173. data/lib/puppet/pops/types/enumeration.rb +9 -26
  174. data/lib/puppet/pops/types/iterable.rb +308 -0
  175. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  176. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  177. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  178. data/lib/puppet/pops/types/type_calculator.rb +140 -387
  179. data/lib/puppet/pops/types/type_factory.rb +91 -57
  180. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  181. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  182. data/lib/puppet/pops/types/type_parser.rb +159 -112
  183. data/lib/puppet/pops/types/types.rb +2057 -1253
  184. data/lib/puppet/pops/utils.rb +11 -10
  185. data/lib/puppet/pops/validation/checker4_0.rb +115 -63
  186. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  187. data/lib/puppet/pops/validation.rb +11 -9
  188. data/lib/puppet/pops.rb +0 -8
  189. data/lib/puppet/provider/aixobject.rb +1 -1
  190. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  191. data/lib/puppet/provider/cron/crontab.rb +1 -1
  192. data/lib/puppet/provider/exec/windows.rb +1 -1
  193. data/lib/puppet/provider/group/windows_adsi.rb +2 -2
  194. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  195. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  196. data/lib/puppet/provider/package/appdmg.rb +3 -2
  197. data/lib/puppet/provider/package/dnf.rb +1 -1
  198. data/lib/puppet/provider/package/pip.rb +16 -9
  199. data/lib/puppet/provider/package/pip3.rb +1 -1
  200. data/lib/puppet/provider/package/pkg.rb +1 -1
  201. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  202. data/lib/puppet/provider/package/pkgng.rb +13 -4
  203. data/lib/puppet/provider/package/rpm.rb +0 -1
  204. data/lib/puppet/provider/package/windows.rb +1 -1
  205. data/lib/puppet/provider/package/yum.rb +2 -2
  206. data/lib/puppet/provider/package/zypper.rb +19 -0
  207. data/lib/puppet/provider/service/debian.rb +7 -20
  208. data/lib/puppet/provider/service/init.rb +7 -0
  209. data/lib/puppet/provider/service/launchd.rb +6 -12
  210. data/lib/puppet/provider/service/systemd.rb +9 -2
  211. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +1 -1
  213. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  214. data/lib/puppet/provider/user/windows_adsi.rb +2 -2
  215. data/lib/puppet/provider/yumrepo/inifile.rb +6 -3
  216. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  217. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  218. data/lib/puppet/reference/configuration.rb +1 -1
  219. data/lib/puppet/reference/providers.rb +1 -1
  220. data/lib/puppet/resource/capability_finder.rb +20 -13
  221. data/lib/puppet/resource/catalog.rb +60 -3
  222. data/lib/puppet/resource/status.rb +11 -2
  223. data/lib/puppet/resource/type.rb +33 -42
  224. data/lib/puppet/resource.rb +15 -12
  225. data/lib/puppet/settings/config_file.rb +1 -1
  226. data/lib/puppet/settings/environment_conf.rb +13 -5
  227. data/lib/puppet/settings.rb +1 -1
  228. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  229. data/lib/puppet/ssl/certificate_request.rb +4 -4
  230. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  231. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  232. data/lib/puppet/test/test_helper.rb +16 -4
  233. data/lib/puppet/transaction/additional_resource_generator.rb +23 -5
  234. data/lib/puppet/transaction/report.rb +31 -1
  235. data/lib/puppet/transaction/resource_harness.rb +0 -25
  236. data/lib/puppet/transaction.rb +15 -2
  237. data/lib/puppet/type/augeas.rb +1 -1
  238. data/lib/puppet/type/cron.rb +12 -12
  239. data/lib/puppet/type/file/checksum_value.rb +53 -0
  240. data/lib/puppet/type/file/content.rb +26 -111
  241. data/lib/puppet/type/file/data_sync.rb +84 -0
  242. data/lib/puppet/type/file/ensure.rb +17 -14
  243. data/lib/puppet/type/file/selcontext.rb +1 -1
  244. data/lib/puppet/type/file/source.rb +103 -18
  245. data/lib/puppet/type/file.rb +91 -39
  246. data/lib/puppet/type/filebucket.rb +1 -1
  247. data/lib/puppet/type/group.rb +6 -2
  248. data/lib/puppet/type/interface.rb +8 -3
  249. data/lib/puppet/type/macauthorization.rb +1 -1
  250. data/lib/puppet/type/package.rb +6 -0
  251. data/lib/puppet/type/schedule.rb +1 -1
  252. data/lib/puppet/type/stage.rb +1 -1
  253. data/lib/puppet/type/user.rb +19 -17
  254. data/lib/puppet/type/yumrepo.rb +20 -0
  255. data/lib/puppet/type.rb +11 -11
  256. data/lib/puppet/util/autoload.rb +16 -11
  257. data/lib/puppet/util/checksums.rb +74 -31
  258. data/lib/puppet/util/execution.rb +1 -1
  259. data/lib/puppet/util/http_proxy.rb +72 -0
  260. data/lib/puppet/util/log.rb +2 -0
  261. data/lib/puppet/util/logging.rb +43 -1
  262. data/lib/puppet/util/monkey_patches.rb +2 -2
  263. data/lib/puppet/util/multi_match.rb +51 -0
  264. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  265. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  266. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  267. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  268. data/lib/puppet/util/plist.rb +130 -0
  269. data/lib/puppet/util/resource_template.rb +1 -1
  270. data/lib/puppet/util/run_mode.rb +2 -2
  271. data/lib/puppet/util/skip_tags.rb +9 -0
  272. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  273. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  274. data/lib/puppet/util/windows/adsi.rb +65 -28
  275. data/lib/puppet/util/windows/api_types.rb +24 -18
  276. data/lib/puppet/util/windows/com.rb +3 -3
  277. data/lib/puppet/util/windows/error.rb +1 -1
  278. data/lib/puppet/util/windows/file.rb +8 -8
  279. data/lib/puppet/util/windows/principal.rb +190 -0
  280. data/lib/puppet/util/windows/process.rb +78 -11
  281. data/lib/puppet/util/windows/registry.rb +22 -16
  282. data/lib/puppet/util/windows/root_certs.rb +5 -5
  283. data/lib/puppet/util/windows/security.rb +33 -35
  284. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  285. data/lib/puppet/util/windows/sid.rb +84 -15
  286. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  287. data/lib/puppet/util/windows/user.rb +10 -10
  288. data/lib/puppet/util/windows.rb +4 -0
  289. data/lib/puppet/util.rb +109 -22
  290. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  291. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  292. data/lib/puppet/vendor/pathspec/README.md +1 -1
  293. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  294. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  295. data/lib/puppet/version.rb +1 -1
  296. data/lib/puppet.rb +17 -0
  297. data/lib/semver.rb +17 -1
  298. data/man/man5/puppet.conf.5 +12 -12
  299. data/man/man8/extlookup2hiera.8 +1 -1
  300. data/man/man8/puppet-agent.8 +2 -2
  301. data/man/man8/puppet-apply.8 +2 -2
  302. data/man/man8/puppet-ca.8 +2 -2
  303. data/man/man8/puppet-catalog.8 +2 -2
  304. data/man/man8/puppet-cert.8 +2 -2
  305. data/man/man8/puppet-certificate.8 +2 -2
  306. data/man/man8/puppet-certificate_request.8 +2 -2
  307. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  308. data/man/man8/puppet-config.8 +3 -3
  309. data/man/man8/puppet-describe.8 +1 -1
  310. data/man/man8/puppet-device.8 +1 -1
  311. data/man/man8/puppet-doc.8 +1 -1
  312. data/man/man8/puppet-epp.8 +2 -2
  313. data/man/man8/puppet-facts.8 +2 -2
  314. data/man/man8/puppet-file.8 +2 -2
  315. data/man/man8/puppet-filebucket.8 +2 -2
  316. data/man/man8/puppet-help.8 +2 -2
  317. data/man/man8/puppet-inspect.8 +2 -2
  318. data/man/man8/puppet-key.8 +2 -2
  319. data/man/man8/puppet-man.8 +2 -2
  320. data/man/man8/puppet-master.8 +2 -2
  321. data/man/man8/puppet-module.8 +9 -9
  322. data/man/man8/puppet-node.8 +2 -2
  323. data/man/man8/puppet-parser.8 +2 -2
  324. data/man/man8/puppet-plugin.8 +2 -2
  325. data/man/man8/puppet-report.8 +2 -2
  326. data/man/man8/puppet-resource.8 +2 -2
  327. data/man/man8/puppet-resource_type.8 +2 -2
  328. data/man/man8/puppet-status.8 +3 -3
  329. data/man/man8/puppet.8 +1 -1
  330. data/spec/fixtures/module.tar.gz +0 -0
  331. data/spec/fixtures/unit/application/environments/production/data/common.yaml +4 -0
  332. data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
  333. data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
  334. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/data.pp +10 -0
  335. data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
  336. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
  337. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
  338. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
  339. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
  340. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
  341. data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
  342. data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
  343. data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
  344. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
  345. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
  346. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
  347. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
  348. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
  349. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
  350. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
  351. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
  352. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  353. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  354. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  355. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  356. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  357. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  358. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  359. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  360. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  361. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  362. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  363. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  364. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
  365. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
  366. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
  367. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  368. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
  369. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
  370. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
  371. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
  372. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
  373. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
  374. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
  375. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
  376. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +81 -0
  377. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
  378. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  379. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  380. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  381. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  382. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
  383. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
  384. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  385. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
  386. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  387. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
  388. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
  389. data/spec/integration/defaults_spec.rb +14 -2
  390. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  391. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  392. data/spec/integration/node/environment_spec.rb +13 -0
  393. data/spec/integration/parser/collection_spec.rb +8 -0
  394. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  395. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  396. data/spec/integration/parser/undef_param_spec.rb +8 -0
  397. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  398. data/spec/integration/test/test_helper_spec.rb +28 -0
  399. data/spec/integration/transaction/report_spec.rb +16 -0
  400. data/spec/integration/transaction_spec.rb +11 -0
  401. data/spec/integration/type/file_spec.rb +194 -4
  402. data/spec/integration/type/package_spec.rb +5 -1
  403. data/spec/integration/type/tidy_spec.rb +21 -9
  404. data/spec/integration/util/execution_spec.rb +22 -0
  405. data/spec/integration/util/windows/principal_spec.rb +201 -0
  406. data/spec/integration/util/windows/process_spec.rb +31 -0
  407. data/spec/{unit → integration}/util/windows/registry_spec.rb +91 -1
  408. data/spec/integration/util/windows/security_spec.rb +8 -8
  409. data/spec/integration/util/windows/user_spec.rb +1 -1
  410. data/spec/integration/util_spec.rb +49 -27
  411. data/spec/lib/puppet_spec/compiler.rb +17 -0
  412. data/spec/lib/puppet_spec/files.rb +2 -2
  413. data/spec/lib/puppet_spec/pops.rb +13 -0
  414. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  415. data/spec/shared_contexts/types_setup.rb +96 -0
  416. data/spec/unit/agent_spec.rb +1 -0
  417. data/spec/unit/application/agent_spec.rb +10 -0
  418. data/spec/unit/application/apply_spec.rb +9 -0
  419. data/spec/unit/application/lookup_spec.rb +138 -28
  420. data/spec/unit/configurer/downloader_spec.rb +5 -5
  421. data/spec/unit/configurer_spec.rb +271 -39
  422. data/spec/unit/data_providers/hiera_data_provider_spec.rb +182 -5
  423. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  424. data/spec/unit/defaults_spec.rb +15 -0
  425. data/spec/unit/environments_spec.rb +24 -4
  426. data/spec/unit/face/epp_face_spec.rb +2 -2
  427. data/spec/unit/face/parser_spec.rb +43 -2
  428. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  429. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  430. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  431. data/spec/unit/file_system_spec.rb +26 -0
  432. data/spec/unit/functions/assert_type_spec.rb +36 -2
  433. data/spec/unit/functions/defined_spec.rb +2 -2
  434. data/spec/unit/functions/epp_spec.rb +17 -9
  435. data/spec/unit/functions/inline_epp_spec.rb +4 -4
  436. data/spec/unit/functions/lookup_spec.rb +88 -16
  437. data/spec/unit/functions/regsubst_spec.rb +1 -1
  438. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  439. data/spec/unit/functions/step_spec.rb +113 -0
  440. data/spec/unit/functions/type_spec.rb +35 -0
  441. data/spec/unit/functions4_spec.rb +62 -6
  442. data/spec/unit/hiera/scope_spec.rb +5 -2
  443. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  444. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  445. data/spec/unit/indirector/indirection_spec.rb +1 -1
  446. data/spec/unit/indirector/json_spec.rb +1 -1
  447. data/spec/unit/info_service_spec.rb +94 -32
  448. data/spec/unit/module_spec.rb +14 -0
  449. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  450. data/spec/unit/network/authstore_spec.rb +1 -1
  451. data/spec/unit/network/http/connection_spec.rb +1 -0
  452. data/spec/unit/network/http/pool_spec.rb +30 -0
  453. data/spec/unit/node_spec.rb +8 -0
  454. data/spec/unit/parser/compiler_spec.rb +16 -18
  455. data/spec/unit/parser/scope_spec.rb +28 -11
  456. data/spec/unit/pops/evaluator/access_ops_spec.rb +7 -7
  457. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  458. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -2
  459. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  460. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  461. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  462. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  463. data/spec/unit/pops/loaders/loaders_spec.rb +127 -2
  464. data/spec/unit/pops/parser/lexer2_spec.rb +118 -3
  465. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  466. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  467. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  468. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  469. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  470. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  471. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  472. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  473. data/spec/unit/pops/types/type_calculator_spec.rb +275 -390
  474. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  475. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  476. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  477. data/spec/unit/pops/types/types_spec.rb +241 -0
  478. data/spec/unit/pops/validator/validator_spec.rb +159 -15
  479. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  480. data/spec/unit/provider/group/windows_adsi_spec.rb +8 -8
  481. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  482. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  483. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  484. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  485. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  486. data/spec/unit/provider/package/pip_spec.rb +88 -47
  487. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  488. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  489. data/spec/unit/provider/package/rpm_spec.rb +2 -25
  490. data/spec/unit/provider/package/yum_spec.rb +12 -1
  491. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  492. data/spec/unit/provider/service/debian_spec.rb +6 -24
  493. data/spec/unit/provider/service/init_spec.rb +11 -1
  494. data/spec/unit/provider/service/launchd_spec.rb +18 -25
  495. data/spec/unit/provider/service/systemd_spec.rb +25 -12
  496. data/spec/unit/provider/service/upstart_spec.rb +57 -0
  497. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  498. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  499. data/spec/unit/provider/user/windows_adsi_spec.rb +5 -5
  500. data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
  501. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  502. data/spec/unit/resource/catalog_spec.rb +33 -1
  503. data/spec/unit/resource/type_spec.rb +149 -7
  504. data/spec/unit/resource_spec.rb +99 -50
  505. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  506. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  507. data/spec/unit/transaction/report_spec.rb +27 -0
  508. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  509. data/spec/unit/transaction_spec.rb +5 -0
  510. data/spec/unit/type/file/checksum_spec.rb +6 -0
  511. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  512. data/spec/unit/type/file/content_spec.rb +12 -193
  513. data/spec/unit/type/file/source_spec.rb +211 -119
  514. data/spec/unit/type/file_spec.rb +133 -34
  515. data/spec/unit/type/interface_spec.rb +32 -0
  516. data/spec/unit/type/macauthorization_spec.rb +4 -1
  517. data/spec/unit/type/yumrepo_spec.rb +2 -2
  518. data/spec/unit/util/filetype_spec.rb +1 -1
  519. data/spec/unit/util/http_proxy_spec.rb +2 -2
  520. data/spec/unit/util/log/destinations_spec.rb +0 -2
  521. data/spec/unit/util/logging_spec.rb +69 -0
  522. data/spec/unit/util/multi_match_spec.rb +39 -0
  523. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  524. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  525. data/spec/unit/util/plist_spec.rb +110 -0
  526. data/spec/unit/util/resource_template_spec.rb +2 -2
  527. data/spec/unit/util/run_mode_spec.rb +27 -3
  528. data/spec/unit/util/windows/adsi_spec.rb +46 -38
  529. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  530. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  531. data/spec/unit/util/windows/sid_spec.rb +48 -11
  532. data/spec/unit/util_spec.rb +123 -13
  533. data/tasks/cfpropertylist.rake +15 -0
  534. metadata +3342 -3195
  535. data/lib/puppet/vendor/load_plist.rb +0 -1
  536. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  537. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  538. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  539. data/lib/puppet/vendor/plist/README +0 -36
  540. data/lib/puppet/vendor/plist/Rakefile +0 -144
  541. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  542. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  543. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  544. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  545. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  546. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  547. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  548. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  549. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  550. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  551. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  552. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  553. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  554. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  555. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  556. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  557. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  558. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
  559. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
  560. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
@@ -1,5 +1,5 @@
1
1
  require 'facter'
2
- require 'plist'
2
+ require 'puppet/util/plist' if Puppet.features.cfpropertylist?
3
3
  require 'puppet'
4
4
  require 'tempfile'
5
5
 
@@ -12,6 +12,7 @@ Puppet::Type.type(:macauthorization).provide :macauthorization, :parent => Puppe
12
12
  commands :security => "/usr/bin/security"
13
13
 
14
14
  confine :operatingsystem => :darwin
15
+ confine :feature => :cfpropertylist
15
16
 
16
17
  defaultfor :operatingsystem => :darwin
17
18
 
@@ -50,7 +51,7 @@ Puppet::Type.type(:macauthorization).provide :macauthorization, :parent => Puppe
50
51
  end
51
52
 
52
53
  def populate_rules_rights
53
- auth_plist = Plist::parse_xml(AuthDB)
54
+ auth_plist = Puppet::Util::Plist.parse_plist(AuthDB)
54
55
  raise Puppet::Error.new("Cannot parse: #{AuthDB}") if not auth_plist
55
56
  self.rights = auth_plist["rights"].dup
56
57
  self.rules = auth_plist["rules"].dup
@@ -124,12 +125,12 @@ Puppet::Type.type(:macauthorization).provide :macauthorization, :parent => Puppe
124
125
  end
125
126
 
126
127
  def destroy_rule
127
- authdb = Plist::parse_xml(AuthDB)
128
+ authdb = Puppet::Util::Plist.parse_plist(AuthDB)
128
129
  authdb_rules = authdb["rules"].dup
129
130
  if authdb_rules[resource[:name]]
130
131
  begin
131
132
  authdb["rules"].delete(resource[:name])
132
- Plist::Emit.save_plist(authdb, AuthDB)
133
+ Puppet::Util::Plist.write_plist_file(authdb, AuthDB)
133
134
  rescue Errno::EACCES => e
134
135
  raise Puppet::Error.new("Error saving #{AuthDB}: #{e}", e)
135
136
  end
@@ -144,7 +145,7 @@ Puppet::Type.type(:macauthorization).provide :macauthorization, :parent => Puppe
144
145
  cmds = []
145
146
  cmds << :security << "authorizationdb" << "read" << resource[:name]
146
147
  output = execute(cmds, :failonfail => false, :combine => false)
147
- current_values = Plist::parse_xml(output)
148
+ current_values = Puppet::Util::Plist.parse_plist(output)
148
149
  current_values ||= {}
149
150
  specified_values = convert_plist_to_native_attributes(@property_hash)
150
151
 
@@ -155,7 +156,7 @@ Puppet::Type.type(:macauthorization).provide :macauthorization, :parent => Puppe
155
156
  end
156
157
 
157
158
  def flush_rule
158
- authdb = Plist::parse_xml(AuthDB)
159
+ authdb = Puppet::Util::Plist.parse_plist(AuthDB)
159
160
  authdb_rules = authdb["rules"].dup
160
161
  current_values = {}
161
162
  current_values = authdb_rules[resource[:name]] if authdb_rules[resource[:name]]
@@ -171,7 +172,7 @@ Puppet::Type.type(:macauthorization).provide :macauthorization, :parent => Puppe
171
172
  values = convert_plist_to_native_attributes(values)
172
173
  tmp = Tempfile.new('puppet_macauthorization')
173
174
  begin
174
- Plist::Emit.save_plist(values, tmp.path)
175
+ Puppet::Util::Plist.write_plist_file(values, tmp.path)
175
176
  cmds = []
176
177
  cmds << :security << "authorizationdb" << "write" << name
177
178
  execute(cmds, :failonfail => false, :combine => false, :stdinfile => tmp.path.to_s)
@@ -189,11 +190,11 @@ Puppet::Type.type(:macauthorization).provide :macauthorization, :parent => Puppe
189
190
  # support modifying rules at all so we have to twiddle the whole
190
191
  # plist... :( See Apple Bug #6386000
191
192
  values = convert_plist_to_native_attributes(values)
192
- authdb = Plist::parse_xml(AuthDB)
193
+ authdb = Puppet::Util::Plist.parse_plist(AuthDB)
193
194
  authdb["rules"][name] = values
194
195
 
195
196
  begin
196
- Plist::Emit.save_plist(authdb, AuthDB)
197
+ Puppet::Util::Plist.write_plist_file(authdb, AuthDB)
197
198
  rescue
198
199
  raise Puppet::Error.new("Error writing to: #{AuthDB}")
199
200
  end
@@ -1,6 +1,6 @@
1
1
  require 'puppet'
2
2
  require 'puppet/provider/nameservice'
3
- require 'plist'
3
+ require 'puppet/util/plist' if Puppet.features.cfpropertylist?
4
4
  require 'fileutils'
5
5
 
6
6
  class Puppet::Provider::NameService::DirectoryService < Puppet::Provider::NameService
@@ -18,8 +18,8 @@ class Puppet::Provider::NameService::DirectoryService < Puppet::Provider::NameSe
18
18
  commands :dscl => "/usr/bin/dscl"
19
19
  commands :dseditgroup => "/usr/sbin/dseditgroup"
20
20
  commands :sw_vers => "/usr/bin/sw_vers"
21
- commands :plutil => '/usr/bin/plutil'
22
21
  confine :operatingsystem => :darwin
22
+ confine :feature => :cfpropertylist
23
23
  defaultfor :operatingsystem => :darwin
24
24
 
25
25
 
@@ -97,7 +97,7 @@ class Puppet::Provider::NameService::DirectoryService < Puppet::Provider::NameSe
97
97
  end
98
98
 
99
99
  def self.parse_dscl_plist_data(dscl_output)
100
- Plist.parse_xml(dscl_output)
100
+ Puppet::Util::Plist.parse_plist(dscl_output)
101
101
  end
102
102
 
103
103
  def self.generate_attribute_hash(input_hash, *type_properties)
@@ -160,7 +160,7 @@ class Puppet::Provider::NameService::DirectoryService < Puppet::Provider::NameSe
160
160
  def self.get_exec_preamble(ds_action, resource_name = nil)
161
161
  # JJM 2007-07-24
162
162
  # DSCL commands are often repetitive and contain the same positional
163
- # arguments over and over. See http://developer.apple.com/documentation/Porting/Conceptual/PortingUnix/additionalfeatures/chapter_10_section_9.html
163
+ # arguments over and over. See https://developer.apple.com/documentation/Porting/Conceptual/PortingUnix/additionalfeatures/chapter_10_section_9.html
164
164
  # for an example of what I mean.
165
165
  # This method spits out proper DSCL commands for us.
166
166
  # We EXPECT name to be @resource[:name] when called from an instance object.
@@ -192,92 +192,77 @@ class Puppet::Provider::NameService::DirectoryService < Puppet::Provider::NameSe
192
192
  Please check your password and try again.")
193
193
  end
194
194
 
195
- if Puppet::FileSystem.exist?("#{users_plist_dir}/#{resource_name}.plist")
195
+ plist_file = "#{users_plist_dir}/#{resource_name}.plist"
196
+ if Puppet::FileSystem.exist?(plist_file)
196
197
  # If a plist already exists in /var/db/dslocal/nodes/Default/users, then
197
198
  # we will need to extract the binary plist from the 'ShadowHashData'
198
199
  # key, log the new password into the resultant plist's 'SALTED-SHA512'
199
200
  # key, and then save the entire structure back.
200
- users_plist = Plist::parse_xml(plutil( '-convert', 'xml1', '-o', '/dev/stdout', \
201
- "#{users_plist_dir}/#{resource_name}.plist"))
201
+ users_plist = Puppet::Util::Plist.read_plist_file(plist_file)
202
202
 
203
- # users_plist['ShadowHashData'][0].string is actually a binary plist
203
+ # users_plist['ShadowHashData'][0] is actually a binary plist
204
204
  # that's nested INSIDE the user's plist (which itself is a binary
205
205
  # plist). If we encounter a user plist that DOESN'T have a
206
206
  # ShadowHashData field, create one.
207
207
  if users_plist['ShadowHashData']
208
- password_hash_plist = users_plist['ShadowHashData'][0].string
209
- converted_hash_plist = convert_binary_to_xml(password_hash_plist)
208
+ password_hash_plist = users_plist['ShadowHashData'][0]
209
+ converted_hash_plist = convert_binary_to_hash(password_hash_plist)
210
210
  else
211
- users_plist['ShadowHashData'] = [StringIO.new]
212
- converted_hash_plist = {'SALTED-SHA512' => StringIO.new}
211
+ users_plist['ShadowHashData'] = ''
212
+ converted_hash_plist = {'SALTED-SHA512' => ''}
213
213
  end
214
214
 
215
- # converted_hash_plist['SALTED-SHA512'].string expects a Base64 encoded
215
+ # converted_hash_plist['SALTED-SHA512'] expects a Base64 encoded
216
216
  # string. The password_hash provided as a resource attribute is a
217
217
  # hex value. We need to convert the provided hex value to a Base64
218
218
  # encoded string to nest it in the converted hash plist.
219
- converted_hash_plist['SALTED-SHA512'].string = \
219
+ converted_hash_plist['SALTED-SHA512'] = \
220
220
  password_hash.unpack('a2'*(password_hash.size/2)).collect { |i| i.hex.chr }.join
221
221
 
222
222
  # Finally, we can convert the nested plist back to binary, embed it
223
223
  # into the user's plist, and convert the resultant plist back to
224
224
  # a binary plist.
225
- changed_plist = convert_xml_to_binary(converted_hash_plist)
226
- users_plist['ShadowHashData'][0].string = changed_plist
227
- Plist::Emit.save_plist(users_plist, "#{users_plist_dir}/#{resource_name}.plist")
228
- plutil('-convert', 'binary1', "#{users_plist_dir}/#{resource_name}.plist")
225
+ changed_plist = convert_hash_to_binary(converted_hash_plist)
226
+ users_plist['ShadowHashData'][0] = changed_plist
227
+ Puppet::Util::Plist.write_plist_file(users_plist, plist_file, :binary)
229
228
  end
230
229
  end
231
230
 
232
231
  def self.get_password(guid, username)
233
- if Puppet::FileSystem.exist?("#{users_plist_dir}/#{username}.plist")
232
+ plist_file = "#{users_plist_dir}/#{username}.plist"
233
+ if Puppet::FileSystem.exist?(plist_file)
234
234
  # If a plist exists in /var/db/dslocal/nodes/Default/users, we will
235
235
  # extract the binary plist from the 'ShadowHashData' key, decode the
236
236
  # salted-SHA512 password hash, and then return it.
237
- users_plist = Plist::parse_xml(plutil('-convert', 'xml1', '-o', '/dev/stdout', "#{users_plist_dir}/#{username}.plist"))
237
+ users_plist = Puppet::Util::Plist.read_plist_file(plist_file)
238
+
238
239
  if users_plist['ShadowHashData']
239
- # users_plist['ShadowHashData'][0].string is actually a binary plist
240
+ # users_plist['ShadowHashData'][0] is actually a binary plist
240
241
  # that's nested INSIDE the user's plist (which itself is a binary
241
242
  # plist).
242
- password_hash_plist = users_plist['ShadowHashData'][0].string
243
- converted_hash_plist = convert_binary_to_xml(password_hash_plist)
243
+ password_hash_plist = users_plist['ShadowHashData'][0]
244
+ converted_hash_plist = convert_binary_to_hash(password_hash_plist)
244
245
 
245
- # converted_hash_plist['SALTED-SHA512'].string is a Base64 encoded
246
+ # converted_hash_plist['SALTED-SHA512'] is a Base64 encoded
246
247
  # string. The password_hash provided as a resource attribute is a
247
248
  # hex value. We need to convert the Base64 encoded string to a
248
249
  # hex value and provide it back to Puppet.
249
- password_hash = converted_hash_plist['SALTED-SHA512'].string.unpack("H*")[0]
250
+ password_hash = converted_hash_plist['SALTED-SHA512'].unpack("H*")[0]
250
251
  password_hash
251
252
  end
252
253
  end
253
254
  end
254
255
 
255
- # This method will accept a hash that has been returned from Plist::parse_xml
256
- # and convert it to a binary plist (string value).
257
- def self.convert_xml_to_binary(plist_data)
258
- Puppet.debug('Converting XML plist to binary')
259
- Puppet.debug('Executing: \'plutil -convert binary1 -o - -\'')
260
- IO.popen('plutil -convert binary1 -o - -', 'r+') do |io|
261
- io.write plist_data.to_plist
262
- io.close_write
263
- @converted_plist = io.read
264
- end
265
- @converted_plist
256
+ # This method will accept a hash and convert it to a binary plist (string value).
257
+ def self.convert_hash_to_binary(plist_data)
258
+ Puppet.debug('Converting plist hash to binary')
259
+ Puppet::Util::Plist.dump_plist(plist_data, :binary)
266
260
  end
267
261
 
268
- # This method will accept a binary plist (as a string) and convert it to a
269
- # hash via Plist::parse_xml.
270
- def self.convert_binary_to_xml(plist_data)
271
- Puppet.debug('Converting binary plist to XML')
272
- Puppet.debug('Executing: \'plutil -convert xml1 -o - -\'')
273
- IO.popen('plutil -convert xml1 -o - -', 'r+') do |io|
274
- io.write plist_data
275
- io.close_write
276
- @converted_plist = io.read
277
- end
278
- Puppet.debug('Converting XML values to a hash.')
279
- @plist_hash = Plist::parse_xml(@converted_plist)
280
- @plist_hash
262
+ # This method will accept a binary plist (as a string) and convert it to a hash.
263
+ def self.convert_binary_to_hash(plist_data)
264
+ Puppet.debug('Converting binary plist to hash')
265
+ Puppet::Util::Plist.parse_plist(plist_data)
281
266
  end
282
267
 
283
268
  # Unlike most other *nixes, OS X doesn't provide built in functionality
@@ -333,7 +318,7 @@ class Puppet::Provider::NameService::DirectoryService < Puppet::Provider::NameSe
333
318
  exec_arg_vector << ns_to_ds_attribute_map[:guid]
334
319
  begin
335
320
  guid_output = execute(exec_arg_vector)
336
- guid_plist = Plist.parse_xml(guid_output)
321
+ guid_plist = Puppet::Util::Plist.parse_plist(guid_output)
337
322
  # Although GeneratedUID like all DirectoryService values can be multi-valued
338
323
  # according to the schema, in practice user accounts cannot have multiple UUIDs
339
324
  # otherwise Bad Things Happen, so we just deal with the first value.
@@ -13,10 +13,12 @@
13
13
  # in /var/db/.puppet_appdmg_installed_<name>
14
14
 
15
15
  require 'puppet/provider/package'
16
+ require 'puppet/util/plist' if Puppet.features.cfpropertylist?
16
17
  Puppet::Type.type(:package).provide(:appdmg, :parent => Puppet::Provider::Package) do
17
18
  desc "Package management which copies application bundles to a target."
18
19
 
19
20
  confine :operatingsystem => :darwin
21
+ confine :feature => :cfpropertylist
20
22
 
21
23
  commands :hdiutil => "/usr/bin/hdiutil"
22
24
  commands :curl => "/usr/bin/curl"
@@ -50,7 +52,6 @@ Puppet::Type.type(:package).provide(:appdmg, :parent => Puppet::Provider::Packag
50
52
 
51
53
  def self.installpkgdmg(source, name)
52
54
  require 'open-uri'
53
- require 'plist'
54
55
  cached_source = source
55
56
  tmpdir = Dir.mktmpdir
56
57
  begin
@@ -67,7 +68,7 @@ Puppet::Type.type(:package).provide(:appdmg, :parent => Puppet::Provider::Packag
67
68
 
68
69
  open(cached_source) do |dmg|
69
70
  xml_str = hdiutil "mount", "-plist", "-nobrowse", "-readonly", "-mountrandom", "/tmp", dmg.path
70
- ptable = Plist::parse_xml xml_str
71
+ ptable = Puppet::Util::Plist::parse_plist(xml_str)
71
72
  # JJM Filter out all mount-paths into a single array, discard the rest.
72
73
  mounts = ptable['system-entities'].collect { |entity|
73
74
  entity['mount-point']
@@ -28,7 +28,7 @@ Puppet::Type.type(:package).provide :dnf, :parent => :yum do
28
28
  end
29
29
  end
30
30
 
31
- defaultfor :operatingsystem => :fedora, :operatingsystemmajrelease => '22'
31
+ defaultfor :operatingsystem => :fedora, :operatingsystemmajrelease => ['22', '23']
32
32
 
33
33
  # The value to pass to DNF as its error output level.
34
34
  # DNF differs from Yum slightly with regards to error outputting.
@@ -3,6 +3,7 @@
3
3
 
4
4
  require 'puppet/provider/package'
5
5
  require 'xmlrpc/client'
6
+ require 'puppet/util/http_proxy'
6
7
 
7
8
  Puppet::Type.type(:package).provide :pip,
8
9
  :parent => ::Puppet::Provider::Package do
@@ -29,7 +30,8 @@ Puppet::Type.type(:package).provide :pip,
29
30
  # that's managed by `pip` or an empty array if `pip` is not available.
30
31
  def self.instances
31
32
  packages = []
32
- pip_cmd = which(cmd) or return []
33
+ pip_cmd = cmd.map { |c| which(c) }.find { |c| c != nil }
34
+ return [] unless pip_cmd
33
35
  execpipe "#{pip_cmd} freeze" do |process|
34
36
  process.collect do |line|
35
37
  next unless options = parse(line)
@@ -40,11 +42,7 @@ Puppet::Type.type(:package).provide :pip,
40
42
  end
41
43
 
42
44
  def self.cmd
43
- if Facter.value(:osfamily) == "RedHat" and Facter.value(:operatingsystemmajrelease).to_i < 7
44
- "pip-python"
45
- else
46
- "pip"
47
- end
45
+ ["pip", "pip-python"]
48
46
  end
49
47
 
50
48
  # Return structured information about a particular package or `nil` if
@@ -60,7 +58,16 @@ Puppet::Type.type(:package).provide :pip,
60
58
  # cache of PyPI's package list so this operation will always have to
61
59
  # ask the web service.
62
60
  def latest
63
- client = XMLRPC::Client.new2("http://pypi.python.org/pypi")
61
+ http_proxy_host = Puppet::Util::HttpProxy.http_proxy_host
62
+ http_proxy_port = Puppet::Util::HttpProxy.http_proxy_port
63
+ if http_proxy_host && http_proxy_port
64
+ proxy = "#{http_proxy_host}:#{http_proxy_port}"
65
+ else
66
+ # nil is acceptable
67
+ proxy = http_proxy_host
68
+ end
69
+
70
+ client = XMLRPC::Client.new2("http://pypi.python.org/pypi", proxy)
64
71
  client.http_header_extra = {"Content-Type" => "text/xml"}
65
72
  client.timeout = 10
66
73
  result = client.call("package_releases", @resource[:name])
@@ -113,11 +120,11 @@ Puppet::Type.type(:package).provide :pip,
113
120
  def lazy_pip(*args)
114
121
  pip *args
115
122
  rescue NoMethodError => e
116
- if pathname = which(self.class.cmd)
123
+ if pathname = self.class.cmd.map { |c| which(c) }.find { |c| c != nil }
117
124
  self.class.commands :pip => pathname
118
125
  pip *args
119
126
  else
120
- raise e, "Could not locate the #{self.class.cmd} command.", e.backtrace
127
+ raise e, "Could not locate command #{self.class.cmd.join(' and ')}.", e.backtrace
121
128
  end
122
129
  end
123
130
 
@@ -13,6 +13,6 @@ Puppet::Type.type(:package).provide :pip3,
13
13
  or an array where each element is either a string or a hash."
14
14
 
15
15
  def self.cmd
16
- "pip3"
16
+ ["pip3"]
17
17
  end
18
18
  end
@@ -2,7 +2,7 @@ require 'puppet/provider/package'
2
2
 
3
3
  Puppet::Type.type(:package).provide :pkg, :parent => Puppet::Provider::Package do
4
4
  desc "OpenSolaris image packaging system. See pkg(5) for more information"
5
- # http://docs.oracle.com/cd/E19963-01/html/820-6572/managepkgs.html
5
+ # https://docs.oracle.com/cd/E19963-01/html/820-6572/managepkgs.html
6
6
  # A few notes before we start :
7
7
  # Opensolaris pkg has two slightly different formats (as of now.)
8
8
  # The first one is what is distributed with the Solaris 11 Express 11/10 dvd
@@ -9,7 +9,7 @@
9
9
  # in /var/db/.puppet_pkgdmg_installed_<name>
10
10
 
11
11
  require 'puppet/provider/package'
12
- require 'plist'
12
+ require 'puppet/util/plist' if Puppet.features.cfpropertylist?
13
13
  require 'puppet/util/http_proxy'
14
14
 
15
15
  Puppet::Type.type(:package).provide :pkgdmg, :parent => Puppet::Provider::Package do
@@ -36,6 +36,7 @@ Puppet::Type.type(:package).provide :pkgdmg, :parent => Puppet::Provider::Packag
36
36
  package, you must create a new DMG with a different filename."
37
37
 
38
38
  confine :operatingsystem => :darwin
39
+ confine :feature => :cfpropertylist
39
40
  defaultfor :operatingsystem => :darwin
40
41
  commands :installer => "/usr/sbin/installer"
41
42
  commands :hdiutil => "/usr/bin/hdiutil"
@@ -102,7 +103,7 @@ Puppet::Type.type(:package).provide :pkgdmg, :parent => Puppet::Provider::Packag
102
103
  # If you fix this to use open-uri again, you must update the docs above. -NF
103
104
  File.open(cached_source) do |dmg|
104
105
  xml_str = hdiutil "mount", "-plist", "-nobrowse", "-readonly", "-noidme", "-mountrandom", "/tmp", dmg.path
105
- hdiutil_info = Plist::parse_xml(xml_str)
106
+ hdiutil_info = Puppet::Util::Plist.parse_plist(xml_str)
106
107
  raise Puppet::Error.new("No disk entities returned by mount at #{dmg.path}") unless hdiutil_info.has_key?("system-entities")
107
108
  mounts = hdiutil_info["system-entities"].collect { |entity|
108
109
  entity["mount-point"]
@@ -20,8 +20,8 @@ Puppet::Type.type(:package).provide :pkgng, :parent => Puppet::Provider::Package
20
20
  pkg(['version', '-voRL='])
21
21
  end
22
22
 
23
- def self.get_latest_version(origin)
24
- if latest_version = self.get_version_list.lines.find { |l| l =~ /^#{origin} / }
23
+ def self.get_latest_version(origin, version_list)
24
+ if latest_version = version_list.lines.find { |l| l =~ /^#{origin} / }
25
25
  latest_version = latest_version.split(' ').last.split(')').first
26
26
  return latest_version
27
27
  end
@@ -32,6 +32,7 @@ Puppet::Type.type(:package).provide :pkgng, :parent => Puppet::Provider::Package
32
32
  packages = []
33
33
  begin
34
34
  info = self.get_query
35
+ version_list = self.get_version_list
35
36
 
36
37
  unless info
37
38
  return packages
@@ -40,7 +41,7 @@ Puppet::Type.type(:package).provide :pkgng, :parent => Puppet::Provider::Package
40
41
  info.lines.each do |line|
41
42
 
42
43
  name, version, origin = line.chomp.split(" ", 3)
43
- latest_version = get_latest_version(origin) || version
44
+ latest_version = get_latest_version(origin, version_list) || version
44
45
 
45
46
  pkg = {
46
47
  :ensure => version,
@@ -84,7 +85,15 @@ Puppet::Type.type(:package).provide :pkgng, :parent => Puppet::Provider::Package
84
85
  when true, false, Symbol
85
86
  installname = resource[:name]
86
87
  else
87
- installname = resource[:name] + '-' + resource[:ensure]
88
+ # If resource[:name] is actually an origin (e.g. 'www/curl' instead of
89
+ # just 'curl'), drop the category prefix. pkgng doesn't support version
90
+ # pinning with the origin syntax (pkg install curl-1.2.3 is valid, but
91
+ # pkg install www/curl-1.2.3 is not).
92
+ if resource[:name] =~ /\//
93
+ installname = resource[:name].split('/')[1] + '-' + resource[:ensure]
94
+ else
95
+ installname = resource[:name] + '-' + resource[:ensure]
96
+ end
88
97
  end
89
98
 
90
99
  if not source # install using default repo logic
@@ -281,7 +281,6 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
281
281
  self::NEVRA_FIELDS.zip(match.captures) { |f, v| hash[f] = v }
282
282
  hash[:provider] = self.name
283
283
  hash[:ensure] = "#{hash[:version]}-#{hash[:release]}"
284
- hash[:ensure].prepend("#{hash[:epoch]}:") if hash[:epoch] != '0'
285
284
  else
286
285
  Puppet.debug("Failed to match rpm line #{line}")
287
286
  end
@@ -75,7 +75,7 @@ Puppet::Type.type(:package).provide(:windows, :parent => Puppet::Provider::Packa
75
75
  check_result(output.exitstatus)
76
76
  end
77
77
 
78
- # http://msdn.microsoft.com/en-us/library/windows/desktop/aa368542(v=vs.85).aspx
78
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa368542(v=vs.85).aspx
79
79
  self::ERROR_SUCCESS = 0
80
80
  self::ERROR_SUCCESS_REBOOT_INITIATED = 1641
81
81
  self::ERROR_SUCCESS_REBOOT_REQUIRED = 3010
@@ -80,7 +80,7 @@ Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do
80
80
  elsif output.exitstatus == 0
81
81
  self.debug "#{command(:cmd)} check-update exited with 0; no package updates available."
82
82
  else
83
- self.warn "Could not check for updates, '#{command(:cmd)} check-update' exited with #{output.exitstatus}"
83
+ self.warning "Could not check for updates, '#{command(:cmd)} check-update' exited with #{output.exitstatus}"
84
84
  end
85
85
  updates
86
86
  end
@@ -91,7 +91,7 @@ Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do
91
91
 
92
92
  updates = Hash.new { |h, k| h[k] = [] }
93
93
  body.split.each_slice(3) do |tuple|
94
- break if tuple[0] =~ /^(Obsoleting|Security:)/
94
+ break if tuple[0] =~ /^(Obsoleting|Security:|Update)/
95
95
  hash = update_to_hash(*tuple[0..1])
96
96
  # Create entries for both the package name without a version and a
97
97
  # version since yum considers those as mostly interchangeable.
@@ -123,4 +123,23 @@ Puppet::Type.type(:package).provide :zypper, :parent => :rpm do
123
123
  # zypper install can be used for update, too
124
124
  self.install
125
125
  end
126
+
127
+ def uninstall
128
+ #extract version numbers and convert to integers
129
+ major, minor, patch = zypper_version.scan(/\d+/).map{ |x| x.to_i }
130
+
131
+ if major < 1
132
+ super
133
+ else
134
+ options = [:remove, '--no-confirm']
135
+ if major == 1 && minor < 6
136
+ options << '--force-resolution'
137
+ end
138
+
139
+ options << @resource[:name]
140
+
141
+ zypper *options
142
+ end
143
+
144
+ end
126
145
  end
@@ -12,9 +12,10 @@ Puppet::Type.type(:service).provide :debian, :parent => :init do
12
12
 
13
13
  commands :update_rc => "/usr/sbin/update-rc.d"
14
14
  # note this isn't being used as a command until
15
- # http://projects.reductivelabs.com/issues/2538
15
+ # https://projects.puppetlabs.com/issues/2538
16
16
  # is resolved.
17
17
  commands :invoke_rc => "/usr/sbin/invoke-rc.d"
18
+ commands :service => "/usr/sbin/service"
18
19
 
19
20
  defaultfor :operatingsystem => :cumuluslinux
20
21
  defaultfor :operatingsystem => :debian, :operatingsystemmajrelease => ['5','6','7']
@@ -31,7 +32,7 @@ Puppet::Type.type(:service).provide :debian, :parent => :init do
31
32
 
32
33
  def enabled?
33
34
  # TODO: Replace system call when Puppet::Util::Execution.execute gives us a way
34
- # to determine exit status. http://projects.reductivelabs.com/issues/2538
35
+ # to determine exit status. https://projects.puppetlabs.com/issues/2538
35
36
  system("/usr/sbin/invoke-rc.d", "--quiet", "--query", @resource[:name], "start")
36
37
 
37
38
  # 104 is the exit status when you query start an enabled service.
@@ -65,23 +66,9 @@ Puppet::Type.type(:service).provide :debian, :parent => :init do
65
66
  end
66
67
 
67
68
  def statuscmd
68
- os = Facter.value(:operatingsystem).downcase
69
-
70
- if os == 'debian'
71
- majversion = Facter.value(:operatingsystemmajrelease).to_i
72
- else
73
- majversion = Facter.value(:operatingsystemmajrelease).split('.')[0].to_i
74
- end
75
-
76
-
77
- if ((os == 'debian' && majversion >= 8) || (os == 'ubuntu' && majversion >= 15))
78
- # SysVInit scripts will always return '0' for status when the service is masked,
79
- # even if the service is actually stopped. Use the SysVInit-Systemd compatibility
80
- # layer to determine the actual status. This is only necessary when the SysVInit
81
- # version of a service is queried. I.e, 'ntp' instead of 'ntp.service'.
82
- (@resource[:hasstatus] == :true) && ["systemctl", "is-active", @resource[:name]]
83
- else
84
- super
85
- end
69
+ # /usr/sbin/service provides an abstraction layer which is able to query services
70
+ # independent of the init system used.
71
+ # See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=775795
72
+ (@resource[:hasstatus] == :true) && [command(:service), @resource[:name], "status"]
86
73
  end
87
74
  end
@@ -49,6 +49,13 @@ Puppet::Type.type(:service).provide :init, :parent => :base do
49
49
  excludes += %w{wait-for-state portmap-wait}
50
50
  # these excludes were found with grep -r -L start /etc/init.d
51
51
  excludes += %w{rcS module-init-tools}
52
+ # Prevent puppet failing on unsafe scripts from Yocto Linux
53
+ if Facter.value(:osfamily) == "cisco-wrlinux"
54
+ excludes += %w{banner.sh bootmisc.sh checkroot.sh devpts.sh dmesg.sh
55
+ hostname.sh mountall.sh mountnfs.sh populate-volatile.sh
56
+ rmnologin.sh save-rtc.sh sendsigs sysfs.sh umountfs
57
+ umountnfs.sh}
58
+ end
52
59
  # Prevent puppet failing to get status of the new service introduced
53
60
  # by the fix for this (bug https://bugs.launchpad.net/ubuntu/+source/lightdm/+bug/982889)
54
61
  # due to puppet's inability to deal with upstart services with instances.
@@ -1,4 +1,4 @@
1
- require 'plist'
1
+ require 'puppet/util/plist' if Puppet.features.cfpropertylist?
2
2
  Puppet::Type.type(:service).provide :launchd, :parent => :base do
3
3
  desc <<-'EOT'
4
4
  This provider manages jobs with `launchd`, which is the default service
@@ -6,7 +6,7 @@ Puppet::Type.type(:service).provide :launchd, :parent => :base do
6
6
 
7
7
  For `launchd` documentation, see:
8
8
 
9
- * <http://developer.apple.com/macosx/launchd.html>
9
+ * <https://developer.apple.com/macosx/launchd.html>
10
10
  * <http://launchd.macosforge.org/>
11
11
 
12
12
  This provider reads plists out of the following directories:
@@ -42,10 +42,10 @@ Puppet::Type.type(:service).provide :launchd, :parent => :base do
42
42
  include Puppet::Util::Warnings
43
43
 
44
44
  commands :launchctl => "/bin/launchctl"
45
- commands :plutil => "/usr/bin/plutil"
46
45
 
47
46
  defaultfor :operatingsystem => :darwin
48
47
  confine :operatingsystem => :darwin
48
+ confine :feature => :cfpropertylist
49
49
 
50
50
  has_feature :enableable
51
51
  has_feature :refreshable
@@ -193,13 +193,7 @@ Puppet::Type.type(:service).provide :launchd, :parent => :base do
193
193
  # Read a plist, whether its format is XML or in Apple's "binary1"
194
194
  # format.
195
195
  def self.read_plist(path)
196
- begin
197
- Plist::parse_xml(plutil('-convert', 'xml1', '-o', '/dev/stdout', path))
198
- rescue Puppet::ExecutionFailure => detail
199
- Puppet.warning("Cannot read file #{path}; Puppet is skipping it. \n" +
200
- "Details: #{detail}")
201
- return nil
202
- end
196
+ Puppet::Util::Plist.read_plist_file(path)
203
197
  end
204
198
 
205
199
  # Clean out the @property_hash variable containing the cached list of services
@@ -322,7 +316,7 @@ Puppet::Type.type(:service).provide :launchd, :parent => :base do
322
316
  else
323
317
  overrides[resource[:name]] = false
324
318
  end
325
- Plist::Emit.save_plist(overrides, self.class.launchd_overrides)
319
+ Puppet::Util::Plist.write_plist_file(overrides, self.class.launchd_overrides)
326
320
  end
327
321
 
328
322
  def disable
@@ -332,6 +326,6 @@ Puppet::Type.type(:service).provide :launchd, :parent => :base do
332
326
  else
333
327
  overrides[resource[:name]] = true
334
328
  end
335
- Plist::Emit.save_plist(overrides, self.class.launchd_overrides)
329
+ Puppet::Util::Plist.write_plist_file(overrides, self.class.launchd_overrides)
336
330
  end
337
331
  end
@@ -5,14 +5,21 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
5
5
 
6
6
  commands :systemctl => "systemctl"
7
7
 
8
- confine :exists => "/run/systemd/system"
8
+ if Facter.value(:osfamily).downcase == 'debian'
9
+ # With multiple init systems on Debian, it is possible to have
10
+ # pieces of systemd around (e.g. systemctl) but not really be
11
+ # using systemd. We do not do this on other platforms as it can
12
+ # cause issues when running in a chroot without /run mounted
13
+ # (PUP-5577)
14
+ confine :exists => "/run/systemd/system"
15
+ end
9
16
 
10
17
  defaultfor :osfamily => [:archlinux]
11
18
  defaultfor :osfamily => :redhat, :operatingsystemmajrelease => "7"
12
19
  defaultfor :osfamily => :redhat, :operatingsystem => :fedora
13
20
  defaultfor :osfamily => :suse
14
21
  defaultfor :operatingsystem => :debian, :operatingsystemmajrelease => "8"
15
- defaultfor :operatingsystem => :ubuntu, :operatingsystemmajrelease => "15.04"
22
+ defaultfor :operatingsystem => :ubuntu, :operatingsystemmajrelease => ["15.04","15.10","16.04"]
16
23
 
17
24
  def self.instances
18
25
  i = []