puppet 5.5.16-x86-mingw32 → 5.5.21-x86-mingw32

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 (359) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +10 -10
  3. data/Gemfile +2 -3
  4. data/Gemfile.lock +57 -52
  5. data/ext/build_defaults.yaml +1 -0
  6. data/ext/cert_inspector +3 -3
  7. data/ext/project_data.yaml +2 -2
  8. data/ext/puppet-test +2 -2
  9. data/ext/regexp_nodes/regexp_nodes.rb +4 -4
  10. data/ext/windows/service/daemon.rb +54 -8
  11. data/install.rb +6 -24
  12. data/lib/puppet.rb +5 -2
  13. data/lib/puppet/agent.rb +5 -13
  14. data/lib/puppet/application.rb +1 -1
  15. data/lib/puppet/application/agent.rb +15 -1
  16. data/lib/puppet/application/apply.rb +2 -2
  17. data/lib/puppet/application/describe.rb +3 -9
  18. data/lib/puppet/application/device.rb +4 -4
  19. data/lib/puppet/application/doc.rb +1 -1
  20. data/lib/puppet/application/filebucket.rb +13 -0
  21. data/lib/puppet/application/lookup.rb +1 -1
  22. data/lib/puppet/application/resource.rb +4 -4
  23. data/lib/puppet/application/script.rb +2 -2
  24. data/lib/puppet/configurer.rb +86 -28
  25. data/lib/puppet/configurer/downloader.rb +2 -6
  26. data/lib/puppet/daemon.rb +1 -1
  27. data/lib/puppet/defaults.rb +82 -38
  28. data/lib/puppet/error.rb +9 -1
  29. data/lib/puppet/external/nagios/base.rb +1 -1
  30. data/lib/puppet/face/ca.rb +1 -1
  31. data/lib/puppet/face/config.rb +10 -48
  32. data/lib/puppet/face/facts.rb +1 -1
  33. data/lib/puppet/face/module/list.rb +5 -5
  34. data/lib/puppet/face/module/search.rb +1 -1
  35. data/lib/puppet/face/module/uninstall.rb +1 -1
  36. data/lib/puppet/face/module/upgrade.rb +1 -1
  37. data/lib/puppet/face/plugin.rb +9 -2
  38. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  39. data/lib/puppet/file_system.rb +0 -8
  40. data/lib/puppet/file_system/memory_file.rb +1 -1
  41. data/lib/puppet/file_system/posix.rb +3 -2
  42. data/lib/puppet/file_system/uniquefile.rb +4 -0
  43. data/lib/puppet/forge.rb +3 -3
  44. data/lib/puppet/functions/epp.rb +4 -4
  45. data/lib/puppet/functions/inline_epp.rb +5 -5
  46. data/lib/puppet/functions/reduce.rb +2 -4
  47. data/lib/puppet/gettext/module_translations.rb +1 -1
  48. data/lib/puppet/graph/rb_tree_map.rb +2 -2
  49. data/lib/puppet/graph/simple_graph.rb +6 -5
  50. data/lib/puppet/indirector/catalog/compiler.rb +8 -0
  51. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  52. data/lib/puppet/indirector/hiera.rb +2 -0
  53. data/lib/puppet/indirector/resource/ral.rb +1 -3
  54. data/lib/puppet/indirector/resource/validator.rb +1 -1
  55. data/lib/puppet/interface.rb +2 -1
  56. data/lib/puppet/loaders.rb +0 -1
  57. data/lib/puppet/metatype/manager.rb +1 -1
  58. data/lib/puppet/module.rb +1 -1
  59. data/lib/puppet/module_tool/applications/builder.rb +1 -1
  60. data/lib/puppet/module_tool/applications/installer.rb +1 -1
  61. data/lib/puppet/module_tool/applications/uninstaller.rb +3 -3
  62. data/lib/puppet/module_tool/metadata.rb +1 -1
  63. data/lib/puppet/module_tool/shared_behaviors.rb +4 -4
  64. data/lib/puppet/module_tool/tar/mini.rb +12 -2
  65. data/lib/puppet/network/http/api/indirected_routes.rb +13 -12
  66. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  67. data/lib/puppet/network/http/connection.rb +14 -12
  68. data/lib/puppet/network/http/factory.rb +1 -11
  69. data/lib/puppet/network/http/pool.rb +7 -1
  70. data/lib/puppet/network/http/rack/rest.rb +2 -2
  71. data/lib/puppet/network/http/site.rb +1 -1
  72. data/lib/puppet/network/resolver.rb +2 -2
  73. data/lib/puppet/node/environment.rb +4 -2
  74. data/lib/puppet/parameter.rb +8 -0
  75. data/lib/puppet/parser/ast.rb +1 -1
  76. data/lib/puppet/parser/ast/resourceparam.rb +1 -1
  77. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  78. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  79. data/lib/puppet/parser/environment_compiler.rb +3 -0
  80. data/lib/puppet/parser/functions.rb +1 -1
  81. data/lib/puppet/parser/functions/epp.rb +3 -3
  82. data/lib/puppet/parser/functions/inline_epp.rb +5 -5
  83. data/lib/puppet/parser/resource.rb +3 -2
  84. data/lib/puppet/parser/resource/param.rb +6 -0
  85. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  86. data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +1 -1
  87. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +1 -1
  88. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  89. data/lib/puppet/pops/evaluator/external_syntax_support.rb +3 -2
  90. data/lib/puppet/pops/evaluator/runtime3_support.rb +4 -4
  91. data/lib/puppet/pops/issues.rb +5 -0
  92. data/lib/puppet/pops/loaders.rb +1 -1
  93. data/lib/puppet/pops/lookup/hiera_config.rb +1 -0
  94. data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
  95. data/lib/puppet/pops/merge_strategy.rb +22 -18
  96. data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
  97. data/lib/puppet/pops/parser/interpolation_support.rb +4 -4
  98. data/lib/puppet/pops/parser/locator.rb +1 -1
  99. data/lib/puppet/pops/parser/pn_parser.rb +17 -16
  100. data/lib/puppet/pops/puppet_stack.rb +51 -48
  101. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  102. data/lib/puppet/pops/types/p_sensitive_type.rb +1 -1
  103. data/lib/puppet/pops/types/string_converter.rb +10 -10
  104. data/lib/puppet/pops/types/type_calculator.rb +24 -0
  105. data/lib/puppet/pops/types/types.rb +3 -3
  106. data/lib/puppet/pops/validation/checker4_0.rb +10 -0
  107. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  108. data/lib/puppet/property.rb +1 -1
  109. data/lib/puppet/property/ensure.rb +1 -1
  110. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  111. data/lib/puppet/provider/cron/crontab.rb +1 -1
  112. data/lib/puppet/provider/exec.rb +6 -2
  113. data/lib/puppet/provider/file/posix.rb +5 -0
  114. data/lib/puppet/provider/group/groupadd.rb +19 -19
  115. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  116. data/lib/puppet/provider/mailalias/aliases.rb +1 -1
  117. data/lib/puppet/provider/mount.rb +1 -1
  118. data/lib/puppet/provider/mount/parsed.rb +8 -8
  119. data/lib/puppet/provider/nameservice.rb +10 -3
  120. data/lib/puppet/provider/nameservice/directoryservice.rb +1 -1
  121. data/lib/puppet/provider/nameservice/pw.rb +2 -2
  122. data/lib/puppet/provider/package/aix.rb +17 -2
  123. data/lib/puppet/provider/package/apt.rb +14 -3
  124. data/lib/puppet/provider/package/dnf.rb +1 -1
  125. data/lib/puppet/provider/package/dnfmodule.rb +141 -0
  126. data/lib/puppet/provider/package/dpkg.rb +16 -18
  127. data/lib/puppet/provider/package/fink.rb +20 -3
  128. data/lib/puppet/provider/package/openbsd.rb +14 -2
  129. data/lib/puppet/provider/package/pip.rb +37 -10
  130. data/lib/puppet/provider/package/pkg.rb +18 -5
  131. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  132. data/lib/puppet/provider/package/pkgng.rb +16 -4
  133. data/lib/puppet/provider/package/portage.rb +4 -4
  134. data/lib/puppet/provider/package/rpm.rb +57 -19
  135. data/lib/puppet/provider/package/windows/package.rb +1 -1
  136. data/lib/puppet/provider/package/yum.rb +35 -24
  137. data/lib/puppet/provider/package/zypper.rb +1 -0
  138. data/lib/puppet/provider/package_targetable.rb +5 -4
  139. data/lib/puppet/provider/parsedfile.rb +1 -1
  140. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +3 -3
  141. data/lib/puppet/provider/selmodule/semodule.rb +43 -26
  142. data/lib/puppet/provider/service/daemontools.rb +9 -9
  143. data/lib/puppet/provider/service/launchd.rb +20 -5
  144. data/lib/puppet/provider/service/openbsd.rb +1 -1
  145. data/lib/puppet/provider/service/rcng.rb +2 -2
  146. data/lib/puppet/provider/service/runit.rb +2 -8
  147. data/lib/puppet/provider/service/systemd.rb +35 -22
  148. data/lib/puppet/provider/service/windows.rb +8 -0
  149. data/lib/puppet/provider/user/directoryservice.rb +31 -6
  150. data/lib/puppet/provider/user/hpux.rb +1 -1
  151. data/lib/puppet/provider/user/pw.rb +12 -3
  152. data/lib/puppet/provider/user/user_role_add.rb +5 -1
  153. data/lib/puppet/provider/user/useradd.rb +62 -27
  154. data/lib/puppet/provider/user/windows_adsi.rb +4 -5
  155. data/lib/puppet/provider/yumrepo/inifile.rb +2 -2
  156. data/lib/puppet/reference/indirection.rb +2 -2
  157. data/lib/puppet/reference/metaparameter.rb +1 -3
  158. data/lib/puppet/reference/providers.rb +1 -1
  159. data/lib/puppet/reference/type.rb +3 -9
  160. data/lib/puppet/reports.rb +1 -1
  161. data/lib/puppet/resource.rb +18 -1
  162. data/lib/puppet/resource/catalog.rb +1 -1
  163. data/lib/puppet/resource/type.rb +8 -0
  164. data/lib/puppet/settings.rb +43 -3
  165. data/lib/puppet/settings/environment_conf.rb +1 -0
  166. data/lib/puppet/ssl/certificate.rb +2 -1
  167. data/lib/puppet/ssl/certificate_authority.rb +6 -5
  168. data/lib/puppet/ssl/certificate_authority/interface.rb +1 -1
  169. data/lib/puppet/ssl/certificate_factory.rb +2 -2
  170. data/lib/puppet/ssl/host.rb +3 -3
  171. data/lib/puppet/ssl/oids.rb +1 -1
  172. data/lib/puppet/test/test_helper.rb +15 -10
  173. data/lib/puppet/transaction/report.rb +1 -1
  174. data/lib/puppet/transaction/resource_harness.rb +1 -1
  175. data/lib/puppet/type.rb +15 -4
  176. data/lib/puppet/type/cron.rb +1 -1
  177. data/lib/puppet/type/exec.rb +21 -9
  178. data/lib/puppet/type/file.rb +14 -2
  179. data/lib/puppet/type/file/data_sync.rb +5 -1
  180. data/lib/puppet/type/group.rb +4 -2
  181. data/lib/puppet/type/interface.rb +1 -1
  182. data/lib/puppet/type/notify.rb +3 -2
  183. data/lib/puppet/type/package.rb +107 -8
  184. data/lib/puppet/type/schedule.rb +1 -1
  185. data/lib/puppet/type/selboolean.rb +17 -3
  186. data/lib/puppet/type/service.rb +9 -10
  187. data/lib/puppet/type/user.rb +6 -24
  188. data/lib/puppet/type/yumrepo.rb +3 -7
  189. data/lib/puppet/util.rb +47 -25
  190. data/lib/puppet/util/command_line/trollop.rb +1 -1
  191. data/lib/puppet/util/execution.rb +4 -3
  192. data/lib/puppet/util/http_proxy.rb +24 -16
  193. data/lib/puppet/util/instance_loader.rb +1 -1
  194. data/lib/puppet/util/log.rb +1 -1
  195. data/lib/puppet/util/log/destinations.rb +3 -12
  196. data/lib/puppet/util/logging.rb +30 -18
  197. data/lib/puppet/util/metric.rb +2 -2
  198. data/lib/puppet/util/monkey_patches.rb +1 -1
  199. data/lib/puppet/util/nagios_maker.rb +2 -2
  200. data/lib/puppet/util/network_device/cisco/device.rb +1 -1
  201. data/lib/puppet/util/network_device/cisco/interface.rb +2 -2
  202. data/lib/puppet/util/network_device/transport/ssh.rb +1 -1
  203. data/lib/puppet/util/pidlock.rb +12 -6
  204. data/lib/puppet/util/plist.rb +6 -0
  205. data/lib/puppet/util/provider_features.rb +2 -4
  206. data/lib/puppet/util/rdoc.rb +1 -1
  207. data/lib/puppet/util/reference.rb +1 -1
  208. data/lib/puppet/util/resource_template.rb +1 -1
  209. data/lib/puppet/util/selinux.rb +8 -2
  210. data/lib/puppet/util/windows/adsi.rb +60 -30
  211. data/lib/puppet/util/windows/api_types.rb +45 -32
  212. data/lib/puppet/util/windows/eventlog.rb +1 -6
  213. data/lib/puppet/util/windows/principal.rb +8 -6
  214. data/lib/puppet/util/windows/process.rb +16 -15
  215. data/lib/puppet/util/windows/registry.rb +17 -15
  216. data/lib/puppet/util/windows/security.rb +3 -0
  217. data/lib/puppet/util/windows/service.rb +149 -4
  218. data/lib/puppet/util/windows/sid.rb +4 -3
  219. data/lib/puppet/vendor.rb +1 -1
  220. data/lib/puppet/version.rb +1 -1
  221. data/lib/puppet_pal.rb +2 -2
  222. data/locales/puppet.pot +479 -443
  223. data/man/man5/puppet.conf.5 +38 -8
  224. data/man/man8/puppet-agent.8 +2 -2
  225. data/man/man8/puppet-apply.8 +1 -1
  226. data/man/man8/puppet-ca.8 +1 -1
  227. data/man/man8/puppet-catalog.8 +1 -1
  228. data/man/man8/puppet-cert.8 +1 -1
  229. data/man/man8/puppet-certificate.8 +1 -1
  230. data/man/man8/puppet-certificate_request.8 +1 -1
  231. data/man/man8/puppet-certificate_revocation_list.8 +1 -1
  232. data/man/man8/puppet-config.8 +1 -1
  233. data/man/man8/puppet-describe.8 +1 -1
  234. data/man/man8/puppet-device.8 +1 -1
  235. data/man/man8/puppet-doc.8 +1 -1
  236. data/man/man8/puppet-epp.8 +1 -1
  237. data/man/man8/puppet-facts.8 +1 -1
  238. data/man/man8/puppet-filebucket.8 +16 -1
  239. data/man/man8/puppet-generate.8 +1 -1
  240. data/man/man8/puppet-help.8 +1 -1
  241. data/man/man8/puppet-key.8 +1 -1
  242. data/man/man8/puppet-lookup.8 +1 -1
  243. data/man/man8/puppet-man.8 +1 -1
  244. data/man/man8/puppet-master.8 +1 -1
  245. data/man/man8/puppet-module.8 +1 -1
  246. data/man/man8/puppet-node.8 +1 -1
  247. data/man/man8/puppet-parser.8 +1 -1
  248. data/man/man8/puppet-plugin.8 +1 -1
  249. data/man/man8/puppet-report.8 +1 -1
  250. data/man/man8/puppet-resource.8 +1 -1
  251. data/man/man8/puppet-script.8 +1 -1
  252. data/man/man8/puppet-status.8 +1 -1
  253. data/man/man8/puppet.8 +2 -2
  254. data/spec/fixtures/integration/provider/mailalias/aliases/test1 +1 -0
  255. data/spec/fixtures/unit/provider/package/dnfmodule/dnf-module-list.txt +19 -0
  256. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  257. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  258. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  259. data/spec/integration/configurer_spec.rb +52 -0
  260. data/spec/integration/defaults_spec.rb +1 -2
  261. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  262. data/spec/integration/parser/compiler_spec.rb +11 -0
  263. data/spec/integration/provider/service/systemd_spec.rb +8 -5
  264. data/spec/integration/type/file_spec.rb +28 -0
  265. data/spec/integration/type/notify_spec.rb +46 -0
  266. data/spec/integration/util/execution_spec.rb +27 -0
  267. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  268. data/spec/integration/util/windows/registry_spec.rb +7 -7
  269. data/spec/unit/agent_spec.rb +34 -26
  270. data/spec/unit/application/agent_spec.rb +18 -0
  271. data/spec/unit/application/apply_spec.rb +2 -12
  272. data/spec/unit/application/device_spec.rb +1 -1
  273. data/spec/unit/configurer/fact_handler_spec.rb +0 -4
  274. data/spec/unit/configurer_spec.rb +377 -397
  275. data/spec/unit/daemon_spec.rb +0 -1
  276. data/spec/unit/face/facts_spec.rb +9 -0
  277. data/spec/unit/face/plugin_spec.rb +8 -0
  278. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  279. data/spec/unit/forge/forge_spec.rb +1 -3
  280. data/spec/unit/forge/repository_spec.rb +1 -3
  281. data/spec/unit/indirector/catalog/compiler_spec.rb +45 -26
  282. data/spec/unit/indirector/resource/ral_spec.rb +4 -4
  283. data/spec/unit/module_tool/tar/mini_spec.rb +1 -1
  284. data/spec/unit/network/http/api/indirected_routes_spec.rb +28 -11
  285. data/spec/unit/network/http/connection_spec.rb +43 -1
  286. data/spec/unit/network/http/factory_spec.rb +27 -5
  287. data/spec/unit/network/http/pool_spec.rb +32 -0
  288. data/spec/unit/node_spec.rb +7 -4
  289. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  290. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
  291. data/spec/unit/pops/validator/validator_spec.rb +7 -0
  292. data/spec/unit/provider/exec_spec.rb +209 -0
  293. data/spec/unit/provider/group/groupadd_spec.rb +30 -1
  294. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  295. data/spec/unit/provider/package/aix_spec.rb +29 -0
  296. data/spec/unit/provider/package/apt_spec.rb +13 -2
  297. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  298. data/spec/unit/provider/package/aptrpm_spec.rb +1 -1
  299. data/spec/unit/provider/package/dnf_spec.rb +7 -0
  300. data/spec/unit/provider/package/dnfmodule_spec.rb +247 -0
  301. data/spec/unit/provider/package/dpkg_spec.rb +35 -7
  302. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  303. data/spec/unit/provider/package/pip_spec.rb +93 -22
  304. data/spec/unit/provider/package/pkg_spec.rb +13 -1
  305. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  306. data/spec/unit/provider/package/pkgng_spec.rb +36 -0
  307. data/spec/unit/provider/package/portage_spec.rb +4 -4
  308. data/spec/unit/provider/package/rpm_spec.rb +150 -16
  309. data/spec/unit/provider/package/yum_spec.rb +66 -0
  310. data/spec/unit/provider/package/zypper_spec.rb +13 -0
  311. data/spec/unit/provider/package_targetable_spec.rb +60 -0
  312. data/spec/unit/provider/selmodule_spec.rb +118 -47
  313. data/spec/unit/provider/service/daemontools_spec.rb +24 -0
  314. data/spec/unit/provider/service/launchd_spec.rb +28 -0
  315. data/spec/unit/provider/service/runit_spec.rb +24 -0
  316. data/spec/unit/provider/service/systemd_spec.rb +109 -36
  317. data/spec/unit/provider/service/windows_spec.rb +20 -0
  318. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  319. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  320. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  321. data/spec/unit/provider/user/pw_spec.rb +37 -0
  322. data/spec/unit/provider/user/useradd_spec.rb +122 -15
  323. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  324. data/spec/unit/puppet_pal_2pec.rb +3 -0
  325. data/spec/unit/resource_spec.rb +26 -1
  326. data/spec/unit/ssl/certificate_authority_spec.rb +2 -3
  327. data/spec/unit/ssl/certificate_spec.rb +7 -0
  328. data/spec/unit/test/test_helper_spec.rb +17 -0
  329. data/spec/unit/transaction_spec.rb +18 -0
  330. data/spec/unit/type/exec_spec.rb +15 -12
  331. data/spec/unit/type/file/content_spec.rb +9 -3
  332. data/spec/unit/type/file/source_spec.rb +4 -4
  333. data/spec/unit/type/file_spec.rb +9 -4
  334. data/spec/unit/type/package_spec.rb +8 -0
  335. data/spec/unit/type/schedule_spec.rb +3 -1
  336. data/spec/unit/type/selboolean_spec.rb +4 -6
  337. data/spec/unit/type/service_spec.rb +25 -8
  338. data/spec/unit/type/user_spec.rb +32 -26
  339. data/spec/unit/type/yumrepo_spec.rb +30 -0
  340. data/spec/unit/type_spec.rb +40 -0
  341. data/spec/unit/util/execution_spec.rb +16 -0
  342. data/spec/unit/util/http_proxy_spec.rb +121 -1
  343. data/spec/unit/util/log/destinations_spec.rb +2 -26
  344. data/spec/unit/util/log_spec.rb +0 -112
  345. data/spec/unit/util/logging_spec.rb +200 -0
  346. data/spec/unit/util/pidlock_spec.rb +67 -40
  347. data/spec/unit/util/plist_spec.rb +20 -0
  348. data/spec/unit/util/windows/adsi_spec.rb +55 -4
  349. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  350. data/spec/unit/util/windows/service_spec.rb +9 -0
  351. data/spec/unit/util/windows/sid_spec.rb +2 -2
  352. data/tasks/manpages.rake +1 -0
  353. metadata +18 -13
  354. data/ext/windows/eventlog/Rakefile +0 -32
  355. data/ext/windows/eventlog/puppetres.dll +0 -0
  356. data/ext/windows/eventlog/puppetres.mc +0 -18
  357. data/lib/puppet/pops/loader/null_loader.rb +0 -60
  358. data/locales/ja/puppet.po +0 -12114
  359. data/spec/integration/test/test_helper_spec.rb +0 -31
@@ -6,78 +6,149 @@
6
6
  require 'spec_helper'
7
7
  require 'stringio'
8
8
 
9
- provider_class = Puppet::Type.type(:selmodule).provider(:semodule)
9
+ describe Puppet::Type.type(:selmodule).provider(:semodule) do
10
+ let(:resource) { instance_double('resource', name: name) }
11
+ let(:provider) { described_class.new(resource) }
10
12
 
11
- describe provider_class do
12
13
  before :each do
13
- @resource = double("resource", :name => "foo")
14
- allow(@resource).to receive(:[]).and_return("foo")
15
- @provider = provider_class.new(@resource)
14
+ allow(resource).to receive(:[]).and_return name
16
15
  end
17
16
 
18
- describe "exists? method" do
19
- it "should find a module if it is already loaded" do
20
- expect(@provider).to receive(:command).with(:semodule).and_return("/usr/sbin/semodule")
21
- expect(@provider).to receive(:execpipe).with("/usr/sbin/semodule --list").and_yield(StringIO.new("bar\t1.2.3\nfoo\t4.4.4\nbang\t1.0.0\n"))
22
- expect(@provider.exists?).to eq(:true)
17
+ def loaded_modules
18
+ {
19
+ 'bar' => '1.2.3',
20
+ 'foo' => '4.4.4',
21
+ 'bang' => '1.0.0',
22
+ }
23
+ end
24
+
25
+ def semodule_list_output
26
+ loaded_modules.map{|k,v| "#{k}\t#{v}"}.join("\n")
27
+ end
28
+
29
+ describe 'selmodules_loaded' do
30
+ let(:name) { 'foo' }
31
+
32
+ it 'should return raise an exception when running selmodule raises an exception' do
33
+ provider.class.loaded_modules = nil # Reset loaded_modules before test
34
+ allow(provider.class).to receive(:command).with(:semodule).and_return '/usr/sbin/semodule'
35
+ allow(provider.class).to receive(:execpipe).with('/usr/sbin/semodule --list')
36
+ .and_yield(StringIO.new("this is\nan error")).and_raise(Puppet::ExecutionFailure, 'it failed')
37
+ expect { provider.selmodules_loaded }
38
+ .to raise_error(Puppet::Error, /Could not list policy modules: ".*" failed with "this is an error"/)
39
+ end
40
+
41
+ it 'should return empty hash if no modules are loaded' do
42
+ provider.class.loaded_modules = nil # Reset loaded_modules before test
43
+ allow(provider.class).to receive(:command).with(:semodule).and_return '/usr/sbin/semodule'
44
+ allow(provider.class).to receive(:execpipe).with('/usr/sbin/semodule --list').and_yield StringIO.new('')
45
+ expect(provider.selmodules_loaded).to eq(Hash.new())
46
+ end
47
+
48
+ it 'should return hash of loaded modules' do
49
+ provider.class.loaded_modules = nil # Reset loaded_modules before test
50
+ allow(provider.class).to receive(:command).with(:semodule).and_return '/usr/sbin/semodule'
51
+ allow(provider.class).to receive(:execpipe).with('/usr/sbin/semodule --list').and_yield StringIO.new(semodule_list_output)
52
+ expect(provider.selmodules_loaded).to eq(loaded_modules)
53
+ end
54
+
55
+ it 'should return cached hash of loaded modules' do
56
+ allow(provider.class).to receive(:loaded_modules).and_return loaded_modules
57
+ allow(provider.class).to receive(:command).with(:semodule).and_return '/usr/sbin/semodule'
58
+ allow(provider.class).to receive(:execpipe).with('/usr/sbin/semodule --list').and_yield StringIO.new("test\t1.0.0")
59
+ expect(provider.selmodules_loaded).to eq(loaded_modules)
23
60
  end
24
61
 
25
- it "should return nil if not loaded" do
26
- expect(@provider).to receive(:command).with(:semodule).and_return("/usr/sbin/semodule")
27
- expect(@provider).to receive(:execpipe).with("/usr/sbin/semodule --list").and_yield(StringIO.new("bar\t1.2.3\nbang\t1.0.0\n"))
28
- expect(@provider.exists?).to be_nil
62
+ it 'should return cached hash of loaded modules and not raise an exception' do
63
+ allow(provider.class).to receive(:loaded_modules).and_return loaded_modules
64
+ allow(provider.class).to receive(:command).with(:semodule).and_return '/usr/sbin/semodule'
65
+ allow(provider.class).to receive(:execpipe).with('/usr/sbin/semodule --list')
66
+ .and_yield(StringIO.new('this should not be called')).and_raise(Puppet::ExecutionFailure, 'it failed')
67
+ expect(provider.selmodules_loaded).to eq(loaded_modules)
29
68
  end
69
+ end
70
+
71
+ describe 'exists? method' do
72
+ context 'with name foo' do
73
+ let(:name) { 'foo' }
74
+
75
+ it 'should return false if no modules are loaded' do
76
+ allow(provider).to receive(:selmodules_loaded).and_return Hash.new()
77
+ expect(provider.exists?).to eq(false)
78
+ end
79
+
80
+ it 'should find a module if it is already loaded' do
81
+ allow(provider).to receive(:selmodules_loaded).and_return loaded_modules
82
+ expect(provider.exists?).to eq(true)
83
+ end
84
+ end
85
+
86
+ context 'with name foobar' do
87
+ let(:name) { 'foobar' }
30
88
 
31
- it "should return nil if module with same suffix is loaded" do
32
- expect(@provider).to receive(:command).with(:semodule).and_return("/usr/sbin/semodule")
33
- expect(@provider).to receive(:execpipe).with("/usr/sbin/semodule --list").and_yield(StringIO.new("bar\t1.2.3\nmyfoo\t1.0.0\n"))
34
- expect(@provider.exists?).to be_nil
89
+ it 'should return false if not loaded' do
90
+ allow(provider).to receive(:selmodules_loaded).and_return loaded_modules
91
+ expect(provider.exists?).to eq(false)
92
+ end
35
93
  end
36
94
 
37
- it "should return nil if no modules are loaded" do
38
- expect(@provider).to receive(:command).with(:semodule).and_return("/usr/sbin/semodule")
39
- expect(@provider).to receive(:execpipe).with("/usr/sbin/semodule --list").and_yield(StringIO.new(""))
40
- expect(@provider.exists?).to be_nil
95
+ context 'with name myfoo' do
96
+ let(:name) { 'myfoo' }
97
+
98
+ it 'should return false if module with same suffix is loaded' do
99
+ allow(provider).to receive(:selmodules_loaded).and_return loaded_modules
100
+ expect(provider.exists?).to eq(false)
101
+ end
41
102
  end
42
103
  end
43
104
 
44
- describe "selmodversion_file" do
45
- it "should return 1.5.0 for the example policy file" do
46
- expect(@provider).to receive(:selmod_name_to_filename).and_return("#{File.dirname(__FILE__)}/selmodule-example.pp")
47
- expect(@provider.selmodversion_file).to eq("1.5.0")
105
+ describe 'selmodversion_file' do
106
+ let(:name) { 'foo' }
107
+
108
+ it 'should return 1.5.0 for the example policy file' do
109
+ allow(provider).to receive(:selmod_name_to_filename).and_return "#{File.dirname(__FILE__)}/selmodule-example.pp"
110
+ expect(provider.selmodversion_file).to eq('1.5.0')
48
111
  end
49
112
  end
50
113
 
51
- describe "syncversion" do
52
- it "should return :true if loaded and file modules are in sync" do
53
- expect(@provider).to receive(:selmodversion_loaded).and_return("1.5.0")
54
- expect(@provider).to receive(:selmodversion_file).and_return("1.5.0")
55
- expect(@provider.syncversion).to eq(:true)
114
+ describe 'syncversion' do
115
+ let(:name) { 'foo' }
116
+
117
+ it 'should return :true if loaded and file modules are in sync' do
118
+ allow(provider).to receive(:selmodversion_loaded).and_return '1.5.0'
119
+ allow(provider).to receive(:selmodversion_file).and_return '1.5.0'
120
+ expect(provider.syncversion).to eq(:true)
56
121
  end
57
122
 
58
- it "should return :false if loaded and file modules are not in sync" do
59
- expect(@provider).to receive(:selmodversion_loaded).and_return("1.4.0")
60
- expect(@provider).to receive(:selmodversion_file).and_return("1.5.0")
61
- expect(@provider.syncversion).to eq(:false)
123
+ it 'should return :false if loaded and file modules are not in sync' do
124
+ allow(provider).to receive(:selmodversion_loaded).and_return '1.4.0'
125
+ allow(provider).to receive(:selmodversion_file).and_return '1.5.0'
126
+ expect(provider.syncversion).to eq(:false)
62
127
  end
63
128
 
64
- it "should return before checking file version if no loaded policy" do
65
- expect(@provider).to receive(:selmodversion_loaded).and_return(nil)
66
- expect(@provider.syncversion).to eq(:false)
129
+ it 'should return before checking file version if no loaded policy' do
130
+ allow(provider).to receive(:selmodversion_loaded).and_return nil
131
+ expect(provider.syncversion).to eq(:false)
67
132
  end
68
133
  end
69
134
 
70
- describe "selmodversion_loaded" do
71
- it "should return the version of a loaded module" do
72
- expect(@provider).to receive(:command).with(:semodule).and_return("/usr/sbin/semodule")
73
- expect(@provider).to receive(:execpipe).with("/usr/sbin/semodule --list").and_yield(StringIO.new("bar\t1.2.3\nfoo\t4.4.4\nbang\t1.0.0\n"))
74
- expect(@provider.selmodversion_loaded).to eq("4.4.4")
135
+ describe 'selmodversion_loaded' do
136
+ context 'with name foo' do
137
+ let(:name) { 'foo' }
138
+
139
+ it 'should return the version of a loaded module' do
140
+ allow(provider).to receive(:selmodules_loaded).and_return loaded_modules
141
+ expect(provider.selmodversion_loaded).to eq('4.4.4')
142
+ end
75
143
  end
76
144
 
77
- it 'should return raise an exception when running selmodule raises an exception' do
78
- expect(@provider).to receive(:command).with(:semodule).and_return("/usr/sbin/semodule")
79
- expect(@provider).to receive(:execpipe).with("/usr/sbin/semodule --list").and_yield("this is\nan error").and_raise(Puppet::ExecutionFailure, 'it failed')
80
- expect {@provider.selmodversion_loaded}.to raise_error(Puppet::ExecutionFailure, /Could not list policy modules: ".*" failed with "this is an error"/)
145
+ context 'with name foobar' do
146
+ let(:name) { 'foobar' }
147
+
148
+ it 'should return nil if module is not loaded' do
149
+ allow(provider).to receive(:selmodules_loaded).and_return loaded_modules
150
+ expect(provider.selmodversion_loaded).to be_nil
151
+ end
81
152
  end
82
153
  end
83
154
  end
@@ -160,4 +160,28 @@ describe Puppet::Type.type(:service).provider(:daemontools) do
160
160
  expect(@provider.status).to eq(:stopped)
161
161
  end
162
162
  end
163
+
164
+ context '.instances' do
165
+ before do
166
+ allow(described_class).to receive(:defpath).and_return(path)
167
+ end
168
+
169
+ context 'when defpath is nil' do
170
+ let(:path) { nil }
171
+
172
+ it 'returns info message' do
173
+ expect(Puppet).to receive(:info).with(/daemontools is unsuitable because service directory is nil/)
174
+ described_class.instances
175
+ end
176
+ end
177
+
178
+ context 'when defpath does not exist' do
179
+ let(:path) { '/inexistent_path' }
180
+
181
+ it 'returns notice about missing path' do
182
+ expect(Puppet).to receive(:notice).with(/Service path #{path} does not exist/)
183
+ described_class.instances
184
+ end
185
+ end
186
+ end
163
187
  end
@@ -125,6 +125,8 @@ describe Puppet::Type.type(:service).provider(:launchd) do
125
125
  end
126
126
 
127
127
  describe "when starting the service" do
128
+ let(:services) { "12345 0 #{joblabel}" }
129
+
128
130
  it "should call any explicit 'start' command" do
129
131
  resource[:start] = "/bin/false"
130
132
  expect(subject).to receive(:texecute).with(:start, ["/bin/false"], true)
@@ -132,6 +134,7 @@ describe Puppet::Type.type(:service).provider(:launchd) do
132
134
  end
133
135
 
134
136
  it "should look for the relevant plist once" do
137
+ allow(provider).to receive(:launchctl).with(:list).and_return(services)
135
138
  expect(subject).to receive(:plist_from_label).and_return([joblabel, {}]).once
136
139
  expect(subject).to receive(:enabled?).and_return(:true)
137
140
  expect(subject).to receive(:execute).with([:launchctl, :load, "-w", joblabel])
@@ -139,6 +142,7 @@ describe Puppet::Type.type(:service).provider(:launchd) do
139
142
  end
140
143
 
141
144
  it "should execute 'launchctl load' once without writing to the plist if the job is enabled" do
145
+ allow(provider).to receive(:launchctl).with(:list).and_return(services)
142
146
  expect(subject).to receive(:plist_from_label).and_return([joblabel, {}])
143
147
  expect(subject).to receive(:enabled?).and_return(:true)
144
148
  expect(subject).to receive(:execute).with([:launchctl, :load, "-w", joblabel]).once
@@ -242,6 +246,30 @@ describe Puppet::Type.type(:service).provider(:launchd) do
242
246
  end
243
247
  end
244
248
 
249
+ describe "when a service is unavailable" do
250
+ let(:map) { {"some.random.job" => "/path/to/job.plist"} }
251
+
252
+ before :each do
253
+ allow(provider).to receive(:make_label_to_path_map).and_return(map)
254
+ end
255
+
256
+ it "should fail when searching for the unavailable service" do
257
+ expect { provider.jobsearch("NOSUCH") }.to raise_error(Puppet::Error)
258
+ end
259
+
260
+ it "should return false when enabling the service" do
261
+ expect(subject.enabled?).to eq(:false)
262
+ end
263
+
264
+ it "should fail when starting the service" do
265
+ expect { subject.start }.to raise_error(Puppet::Error)
266
+ end
267
+
268
+ it "should fail when starting the service" do
269
+ expect { subject.stop }.to raise_error(Puppet::Error)
270
+ end
271
+ end
272
+
245
273
  [[10, "10.6"], [13, "10.9"]].each do |kernel, version|
246
274
  describe "when enabling the service on OS X #{version}" do
247
275
  it "should write to the global launchd overrides file once" do
@@ -134,4 +134,28 @@ describe Puppet::Type.type(:service).provider(:runit) do
134
134
  expect(@provider.status).to eq(:stopped)
135
135
  end
136
136
  end
137
+
138
+ context '.instances' do
139
+ before do
140
+ allow(described_class).to receive(:defpath).and_return(path)
141
+ end
142
+
143
+ context 'when defpath is nil' do
144
+ let(:path) { nil }
145
+
146
+ it 'returns info message' do
147
+ expect(Puppet).to receive(:info).with(/runit is unsuitable because service directory is nil/)
148
+ described_class.instances
149
+ end
150
+ end
151
+
152
+ context 'when defpath does not exist' do
153
+ let(:path) { '/inexistent_path' }
154
+
155
+ it 'returns notice about missing path' do
156
+ expect(Puppet).to receive(:notice).with(/Service path #{path} does not exist/)
157
+ described_class.instances
158
+ end
159
+ end
160
+ end
137
161
  end
@@ -151,9 +151,19 @@ describe Puppet::Type.type(:service).provider(:systemd) do
151
151
  autovt@.service
152
152
  avahi-daemon.service
153
153
  blk-availability.service
154
+ apparmor.service
155
+ umountnfs.service
156
+ urandom.service
157
+ brandbot.service
154
158
  })
155
159
  end
156
- end
160
+
161
+ it "should print a debug message when a service with the state `bad` is found" do
162
+ expect(described_class).to receive(:systemctl).with('list-unit-files', '--type', 'service', '--full', '--all', '--no-pager').and_return(File.read(my_fixture('list_unit_files_services')))
163
+ expect(Puppet).to receive(:debug).with("apparmor.service marked as bad by `systemctl`. It is recommended to be further checked.")
164
+ described_class.instances
165
+ end
166
+ end
157
167
 
158
168
  describe "#start" do
159
169
  it "should use the supplied start command if specified" do
@@ -164,15 +174,15 @@ describe Puppet::Type.type(:service).provider(:systemd) do
164
174
 
165
175
  it "should start the service with systemctl start otherwise" do
166
176
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
167
- expect(provider).to receive(:systemctl).with(:unmask, 'sshd.service')
168
- expect(provider).to receive(:execute).with(['/bin/systemctl','start','sshd.service'], {:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
177
+ expect(provider).to receive(:systemctl).with(:unmask, '--', 'sshd.service')
178
+ expect(provider).to receive(:execute).with(['/bin/systemctl','start', '--', 'sshd.service'], {:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
169
179
  provider.start
170
180
  end
171
181
 
172
182
  it "should show journald logs on failure" do
173
183
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
174
- expect(provider).to receive(:systemctl).with(:unmask, 'sshd.service')
175
- expect(provider).to receive(:execute).with(['/bin/systemctl','start','sshd.service'],{:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
184
+ expect(provider).to receive(:systemctl).with(:unmask, '--', 'sshd.service')
185
+ expect(provider).to receive(:execute).with(['/bin/systemctl','start', '--', 'sshd.service'],{:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
176
186
  .and_raise(Puppet::ExecutionFailure, "Failed to start sshd.service: Unit sshd.service failed to load: Invalid argument. See system logs and 'systemctl status sshd.service' for details.")
177
187
  journalctl_logs = <<-EOS
178
188
  -- Logs begin at Tue 2016-06-14 11:59:21 UTC, end at Tue 2016-06-14 21:45:02 UTC. --
@@ -194,13 +204,13 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a
194
204
 
195
205
  it "should stop the service with systemctl stop otherwise" do
196
206
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
197
- expect(provider).to receive(:execute).with(['/bin/systemctl','stop','sshd.service'], :failonfail => true, :override_locale => false, :squelch => false, :combine => true)
207
+ expect(provider).to receive(:execute).with(['/bin/systemctl','stop', '--', 'sshd.service'], :failonfail => true, :override_locale => false, :squelch => false, :combine => true)
198
208
  provider.stop
199
209
  end
200
210
 
201
211
  it "should show journald logs on failure" do
202
212
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
203
- expect(provider).to receive(:execute).with(['/bin/systemctl','stop','sshd.service'],{:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
213
+ expect(provider).to receive(:execute).with(['/bin/systemctl','stop', '--', 'sshd.service'],{:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
204
214
  .and_raise(Puppet::ExecutionFailure, "Failed to stop sshd.service: Unit sshd.service failed to load: Invalid argument. See system logs and 'systemctl status sshd.service' for details.")
205
215
  journalctl_logs = <<-EOS
206
216
  -- Logs begin at Tue 2016-06-14 11:59:21 UTC, end at Tue 2016-06-14 21:45:02 UTC. --
@@ -216,52 +226,54 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a
216
226
  describe "#enabled?" do
217
227
  it "should return :true if the service is enabled" do
218
228
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
219
- expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).and_return("enabled\n")
220
- allow($CHILD_STATUS).to receive(:exitstatus).and_return(0)
229
+ expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).
230
+ and_return(Puppet::Util::Execution::ProcessOutput.new("enabled\n", 0))
221
231
  expect(provider.enabled?).to eq(:true)
222
232
  end
223
233
 
224
234
  it "should return :true if the service is static" do
225
235
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
226
- expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).and_return("static\n")
227
- allow($CHILD_STATUS).to receive(:exitstatus).and_return(0)
236
+ expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled','--', 'sshd.service'], :failonfail => false).
237
+ and_return(Puppet::Util::Execution::ProcessOutput.new("static\n", 0))
228
238
  expect(provider.enabled?).to eq(:true)
229
239
  end
230
240
 
231
241
  it "should return :false if the service is disabled" do
232
242
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
233
- expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).and_return("disabled\n")
234
- allow($CHILD_STATUS).to receive(:exitstatus).and_return(1)
243
+ expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).
244
+ and_return(Puppet::Util::Execution::ProcessOutput.new("disabled\n", 1))
235
245
  expect(provider.enabled?).to eq(:false)
236
246
  end
237
247
 
238
248
  it "should return :false if the service is indirect" do
239
249
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
240
- expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).and_return("indirect\n")
241
- allow($CHILD_STATUS).to receive(:exitstatus).and_return(0)
250
+ expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).
251
+ and_return(Puppet::Util::Execution::ProcessOutput.new("indirect\n", 0))
242
252
  expect(provider.enabled?).to eq(:false)
243
253
  end
244
254
 
245
- it "should return :false if the service is masked and the resource is attempting to be disabled" do
246
- provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service', :enable => false))
247
- expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).and_return("masked\n")
248
- allow($CHILD_STATUS).to receive(:exitstatus).and_return(1)
249
- expect(provider.enabled?).to eq(:false)
250
- end
255
+ context "when masked" do
256
+ it "should return :false if the resource is attempting to be disabled" do
257
+ provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service', :enable => false))
258
+ expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).
259
+ and_return(Puppet::Util::Execution::ProcessOutput.new("masked\n", 1))
260
+ expect(provider.enabled?).to eq(:false)
261
+ end
251
262
 
252
- it "should return :mask if the service is masked and the resource is attempting to be masked" do
253
- provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service', :enable => 'mask'))
254
- expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).and_return("masked\n")
255
- allow($CHILD_STATUS).to receive(:exitstatus).and_return(1)
256
- expect(provider.enabled?).to eq(:mask)
263
+ it "should return :mask if the resource is attempting to be masked" do
264
+ provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service', :enable => 'mask'))
265
+ expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).
266
+ and_return(Puppet::Util::Execution::ProcessOutput.new("masked\n", 1))
267
+ expect(provider.enabled?).to eq(:mask)
268
+ end
257
269
  end
258
270
  end
259
271
 
260
272
  describe "#enable" do
261
273
  it "should run systemctl enable to enable a service" do
262
274
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
263
- expect(provider).to receive(:systemctl).with(:unmask, 'sshd.service')
264
- expect(provider).to receive(:systemctl).with(:enable, 'sshd.service')
275
+ expect(provider).to receive(:systemctl).with(:unmask, '--', 'sshd.service')
276
+ expect(provider).to receive(:systemctl).with(:enable, '--', 'sshd.service')
265
277
  provider.enable
266
278
  end
267
279
  end
@@ -269,7 +281,7 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a
269
281
  describe "#disable" do
270
282
  it "should run systemctl disable to disable a service" do
271
283
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
272
- expect(provider).to receive(:systemctl).with(:disable, 'sshd.service')
284
+ expect(provider).to receive(:systemctl).with(:disable, '--', 'sshd.service')
273
285
  provider.disable
274
286
  end
275
287
  end
@@ -280,8 +292,8 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a
280
292
  # :disable is the only call in the provider that uses a symbol instead of
281
293
  # a string.
282
294
  # This should be made consistent in the future and all tests updated.
283
- expect(provider).to receive(:systemctl).with(:disable, 'sshd.service')
284
- expect(provider).to receive(:systemctl).with(:mask, 'sshd.service')
295
+ expect(provider).to receive(:systemctl).with(:disable, '--', 'sshd.service')
296
+ expect(provider).to receive(:systemctl).with(:mask, '--', 'sshd.service')
285
297
  provider.mask
286
298
  end
287
299
  end
@@ -291,7 +303,7 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a
291
303
  describe "#status" do
292
304
  it "should return running if if the command returns 0" do
293
305
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
294
- expect(provider).to receive(:execute).with(['/bin/systemctl','is-active','sshd.service'], :failonfail => false, :override_locale => false, :squelch => false, :combine => true).and_return("active\n")
306
+ expect(provider).to receive(:execute).with(['/bin/systemctl','is-active','--','sshd.service'], :failonfail => false, :override_locale => false, :squelch => false, :combine => true).and_return("active\n")
295
307
  allow($CHILD_STATUS).to receive(:exitstatus).and_return(0)
296
308
  expect(provider.status).to eq(:running)
297
309
  end
@@ -299,7 +311,7 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a
299
311
  [-10,-1,3,10].each { |ec|
300
312
  it "should return stopped if the command returns something non-0" do
301
313
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
302
- expect(provider).to receive(:execute).with(['/bin/systemctl','is-active','sshd.service'], :failonfail => false, :override_locale => false, :squelch => false, :combine => true).and_return("inactive\n")
314
+ expect(provider).to receive(:execute).with(['/bin/systemctl','is-active','--','sshd.service'], :failonfail => false, :override_locale => false, :squelch => false, :combine => true).and_return("inactive\n")
303
315
  allow($CHILD_STATUS).to receive(:exitstatus).and_return(ec)
304
316
  expect(provider.status).to eq(:stopped)
305
317
  end
@@ -317,20 +329,20 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a
317
329
  describe "#restart" do
318
330
  it "should use the supplied restart command if specified" do
319
331
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd', :restart => '/bin/foo'))
320
- expect(provider).not_to receive(:execute).with(['/bin/systemctl','restart','sshd.service'], :failonfail => true, :override_locale => false, :squelch => false, :combine => true)
332
+ expect(provider).not_to receive(:execute).with(['/bin/systemctl','restart','--','sshd.service'], :failonfail => true, :override_locale => false, :squelch => false, :combine => true)
321
333
  expect(provider).to receive(:execute).with(['/bin/foo'], :failonfail => true, :override_locale => false, :squelch => false, :combine => true)
322
334
  provider.restart
323
335
  end
324
336
 
325
337
  it "should restart the service with systemctl restart" do
326
338
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
327
- expect(provider).to receive(:execute).with(['/bin/systemctl','restart','sshd.service'], :failonfail => true, :override_locale => false, :squelch => false, :combine => true)
339
+ expect(provider).to receive(:execute).with(['/bin/systemctl','restart','--','sshd.service'], :failonfail => true, :override_locale => false, :squelch => false, :combine => true)
328
340
  provider.restart
329
341
  end
330
342
 
331
343
  it "should show journald logs on failure" do
332
344
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
333
- expect(provider).to receive(:execute).with(['/bin/systemctl','restart','sshd.service'],{:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
345
+ expect(provider).to receive(:execute).with(['/bin/systemctl','restart', '--', 'sshd.service'],{:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
334
346
  .and_raise(Puppet::ExecutionFailure, "Failed to restart sshd.service: Unit sshd.service failed to load: Invalid argument. See system logs and 'systemctl status sshd.service' for details.")
335
347
  journalctl_logs = <<-EOS
336
348
  -- Logs begin at Tue 2016-06-14 11:59:21 UTC, end at Tue 2016-06-14 21:45:02 UTC. --
@@ -372,6 +384,67 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a
372
384
  end
373
385
  end
374
386
 
387
+ describe "#insync_enabled?" do
388
+ let(:provider) do
389
+ described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service', :enable => false))
390
+ end
391
+
392
+ before do
393
+ allow(provider).to receive(:cached_enabled?).and_return({ output: service_state, exitcode: 0 })
394
+ end
395
+
396
+ context 'when service state is static' do
397
+ let(:service_state) { 'static' }
398
+
399
+ it 'is always enabled_insync even if current value is the same as expected' do
400
+ expect(provider).to be_enabled_insync(:false)
401
+ end
402
+
403
+ it 'is always enabled_insync even if current value is not the same as expected' do
404
+ expect(provider).to be_enabled_insync(:true)
405
+ end
406
+
407
+ it 'logs a debug messsage' do
408
+ expect(Puppet).to receive(:debug).with("Unable to enable or disable static service sshd.service")
409
+ provider.enabled_insync?(:true)
410
+ end
411
+ end
412
+
413
+ context 'when service state is indirect' do
414
+ let(:service_state) { 'indirect' }
415
+
416
+ it 'is always enabled_insync even if current value is the same as expected' do
417
+ expect(provider).to be_enabled_insync(:false)
418
+ end
419
+
420
+ it 'is always enabled_insync even if current value is not the same as expected' do
421
+ expect(provider).to be_enabled_insync(:true)
422
+ end
423
+
424
+ it 'logs a debug messsage' do
425
+ expect(Puppet).to receive(:debug).with("Service sshd.service is in 'indirect' state and cannot be enabled/disabled")
426
+ provider.enabled_insync?(:true)
427
+ end
428
+ end
429
+
430
+ context 'when service state is enabled' do
431
+ let(:service_state) { 'enabled' }
432
+
433
+ it 'is enabled_insync if current value is the same as expected' do
434
+ expect(provider).to be_enabled_insync(:false)
435
+ end
436
+
437
+ it 'is not enabled_insync if current value is not the same as expected' do
438
+ expect(provider).not_to be_enabled_insync(:true)
439
+ end
440
+
441
+ it 'logs no debug messsage' do
442
+ expect(Puppet).not_to receive(:debug)
443
+ provider.enabled_insync?(:true)
444
+ end
445
+ end
446
+ end
447
+
375
448
  describe "#get_start_link_count" do
376
449
  it "should strip the '.service' from the search if present in the resource name" do
377
450
  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))