mod 'puppetlabs/concat', '4.0.1'
mod 'puppetlabs-postgresql', '5.1.0'
+mod 'camptocamp-systemd', '2.1.0'
mod 'puppet/rabbitmq', '8.4.0'
mod 'nanliu/staging', '1.0.3'
--- /dev/null
+# Changelog
+
+All notable changes to this project will be documented in this file.
+Each new release typically also includes the latest modulesync defaults.
+These should not affect the functionality of the module.
+
+## [v2.1.0](https://github.com/camptocamp/puppet-systemd/tree/v2.1.0) (2018-08-31)
+
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/2.0.0...v2.1.0)
+
+**Implemented enhancements:**
+
+- Modify service limit type [\#81](https://github.com/camptocamp/puppet-systemd/pull/81) ([bastelfreak](https://github.com/bastelfreak))
+- Add parameter to select resolver [\#79](https://github.com/camptocamp/puppet-systemd/pull/79) ([amateo](https://github.com/amateo))
+
+**Fixed bugs:**
+
+- Handle ensuring service\_limits to be absent [\#80](https://github.com/camptocamp/puppet-systemd/pull/80) ([ekohl](https://github.com/ekohl))
+
+**Merged pull requests:**
+
+- do not access facts as top scope variable [\#85](https://github.com/camptocamp/puppet-systemd/pull/85) ([bastelfreak](https://github.com/bastelfreak))
+- Release 2.1.0 [\#84](https://github.com/camptocamp/puppet-systemd/pull/84) ([bastelfreak](https://github.com/bastelfreak))
+- allow puppetlabs/stdlib 5.x [\#83](https://github.com/camptocamp/puppet-systemd/pull/83) ([bastelfreak](https://github.com/bastelfreak))
+- Fix CHANGELOG.md duplicate footer [\#78](https://github.com/camptocamp/puppet-systemd/pull/78) ([alexjfisher](https://github.com/alexjfisher))
+
+## [2.0.0](https://github.com/camptocamp/puppet-systemd/tree/2.0.0) (2018-07-11)
+
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/1.1.1...2.0.0)
+
+**Breaking changes:**
+
+- move params to data-in-modules [\#67](https://github.com/camptocamp/puppet-systemd/pull/67) ([bastelfreak](https://github.com/bastelfreak))
+
+**Implemented enhancements:**
+
+- add ubuntu 18.04 support [\#72](https://github.com/camptocamp/puppet-systemd/pull/72) ([bastelfreak](https://github.com/bastelfreak))
+- bump facter to latest 2.x version [\#71](https://github.com/camptocamp/puppet-systemd/pull/71) ([bastelfreak](https://github.com/bastelfreak))
+- Add enable and active parameters to unit\_file [\#69](https://github.com/camptocamp/puppet-systemd/pull/69) ([jcharaoui](https://github.com/jcharaoui))
+- Add support for Resource Accounting via systemd [\#65](https://github.com/camptocamp/puppet-systemd/pull/65) ([bastelfreak](https://github.com/bastelfreak))
+- Allow resolved class to configure DNS settings [\#59](https://github.com/camptocamp/puppet-systemd/pull/59) ([hfm](https://github.com/hfm))
+- Replace iterator with stdlib function [\#58](https://github.com/camptocamp/puppet-systemd/pull/58) ([jfleury-at-ovh](https://github.com/jfleury-at-ovh))
+
+**Closed issues:**
+
+- Better test for systemd \(and other init systems\) [\#37](https://github.com/camptocamp/puppet-systemd/issues/37)
+
+**Merged pull requests:**
+
+- fix puppet-linter warnings in README.md [\#75](https://github.com/camptocamp/puppet-systemd/pull/75) ([bastelfreak](https://github.com/bastelfreak))
+- release 2.0.0 [\#70](https://github.com/camptocamp/puppet-systemd/pull/70) ([bastelfreak](https://github.com/bastelfreak))
+- Update the documentation of facts [\#68](https://github.com/camptocamp/puppet-systemd/pull/68) ([ekohl](https://github.com/ekohl))
+- purge legacy puppet-lint checks [\#66](https://github.com/camptocamp/puppet-systemd/pull/66) ([bastelfreak](https://github.com/bastelfreak))
+- Reuse the systemd::dropin\_file in service\_limits [\#61](https://github.com/camptocamp/puppet-systemd/pull/61) ([ekohl](https://github.com/ekohl))
+- cleanup README.md [\#60](https://github.com/camptocamp/puppet-systemd/pull/60) ([bastelfreak](https://github.com/bastelfreak))
+- implement github changelog generator [\#45](https://github.com/camptocamp/puppet-systemd/pull/45) ([bastelfreak](https://github.com/bastelfreak))
+
+## [1.1.1](https://github.com/camptocamp/puppet-systemd/tree/1.1.1) (2017-11-29)
+
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/1.1.0...1.1.1)
+
+**Fixed bugs:**
+
+- fact systemd\_internal\_services is empty [\#47](https://github.com/camptocamp/puppet-systemd/issues/47)
+- Use the correct type on $service\_limits [\#52](https://github.com/camptocamp/puppet-systemd/pull/52) ([ekohl](https://github.com/ekohl))
+- Fix issue \#47 [\#48](https://github.com/camptocamp/puppet-systemd/pull/48) ([axxelG](https://github.com/axxelG))
+
+**Closed issues:**
+
+- Not able to set limits via systemd class [\#49](https://github.com/camptocamp/puppet-systemd/issues/49)
+
+**Merged pull requests:**
+
+- Clean up test tooling [\#54](https://github.com/camptocamp/puppet-systemd/pull/54) ([ekohl](https://github.com/ekohl))
+- Correct parameter documentation [\#53](https://github.com/camptocamp/puppet-systemd/pull/53) ([ekohl](https://github.com/ekohl))
+- Use a space-separated in timesyncd.conf [\#50](https://github.com/camptocamp/puppet-systemd/pull/50) ([hfm](https://github.com/hfm))
+- Use the same systemd drop-in file for different units [\#46](https://github.com/camptocamp/puppet-systemd/pull/46) ([countsudoku](https://github.com/countsudoku))
+
+## [1.1.0](https://github.com/camptocamp/puppet-systemd/tree/1.1.0) (2017-10-24)
+
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/1.0.0...1.1.0)
+
+**Closed issues:**
+
+- Add explicit ordering to README.md [\#24](https://github.com/camptocamp/puppet-systemd/issues/24)
+- Manage drop-in files [\#15](https://github.com/camptocamp/puppet-systemd/issues/15)
+
+**Merged pull requests:**
+
+- Add systemd-timesyncd support [\#43](https://github.com/camptocamp/puppet-systemd/pull/43) ([bastelfreak](https://github.com/bastelfreak))
+- Reuse the service\_provider fact from stdlib [\#42](https://github.com/camptocamp/puppet-systemd/pull/42) ([ekohl](https://github.com/ekohl))
+- \(doc\) Adds examples of running the service created [\#29](https://github.com/camptocamp/puppet-systemd/pull/29) ([petems](https://github.com/petems))
+- Quote hash keys in example of service limits [\#20](https://github.com/camptocamp/puppet-systemd/pull/20) ([stbenjam](https://github.com/stbenjam))
+
+## [1.0.0](https://github.com/camptocamp/puppet-systemd/tree/1.0.0) (2017-09-04)
+
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.4.0...1.0.0)
+
+**Closed issues:**
+
+- PR\#18 broke service limits capacity [\#35](https://github.com/camptocamp/puppet-systemd/issues/35)
+- stdlib functions are used, but no stdlib requirement in metadata.json [\#28](https://github.com/camptocamp/puppet-systemd/issues/28)
+- investigate update to camptocamp/systemd module [\#21](https://github.com/camptocamp/puppet-systemd/issues/21)
+- Module should be updated to use the new Puppet 4 goodness [\#17](https://github.com/camptocamp/puppet-systemd/issues/17)
+
+**Merged pull requests:**
+
+- Add support for drop-in files [\#39](https://github.com/camptocamp/puppet-systemd/pull/39) ([countsudoku](https://github.com/countsudoku))
+- Adds control group limits to ServiceLimits [\#36](https://github.com/camptocamp/puppet-systemd/pull/36) ([trevor-vaughan](https://github.com/trevor-vaughan))
+- it's systemd not SystemD [\#33](https://github.com/camptocamp/puppet-systemd/pull/33) ([shibumi](https://github.com/shibumi))
+- General cleanup + add Puppet4 datatypes [\#32](https://github.com/camptocamp/puppet-systemd/pull/32) ([bastelfreak](https://github.com/bastelfreak))
+- add management for systemd-resolved [\#31](https://github.com/camptocamp/puppet-systemd/pull/31) ([bastelfreak](https://github.com/bastelfreak))
+- Add a network defined resource [\#30](https://github.com/camptocamp/puppet-systemd/pull/30) ([bastelfreak](https://github.com/bastelfreak))
+- Add seltype to systemd directory [\#27](https://github.com/camptocamp/puppet-systemd/pull/27) ([petems](https://github.com/petems))
+- Add MemoryLimit to limits template [\#23](https://github.com/camptocamp/puppet-systemd/pull/23) ([pkilambi](https://github.com/pkilambi))
+- Update to support Puppet 4 [\#18](https://github.com/camptocamp/puppet-systemd/pull/18) ([trevor-vaughan](https://github.com/trevor-vaughan))
+- Manage resource limits of services [\#13](https://github.com/camptocamp/puppet-systemd/pull/13) ([ruriky](https://github.com/ruriky))
+- Refactor systemd facts [\#12](https://github.com/camptocamp/puppet-systemd/pull/12) ([petems](https://github.com/petems))
+
+## [0.4.0](https://github.com/camptocamp/puppet-systemd/tree/0.4.0) (2016-08-18)
+
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.3.0...0.4.0)
+
+**Closed issues:**
+
+- No LICENSE file [\#11](https://github.com/camptocamp/puppet-systemd/issues/11)
+- Forge update [\#7](https://github.com/camptocamp/puppet-systemd/issues/7)
+
+**Merged pull requests:**
+
+- Add target param for the unit file [\#10](https://github.com/camptocamp/puppet-systemd/pull/10) ([tampakrap](https://github.com/tampakrap))
+- only use awk, instead of grep and awk [\#9](https://github.com/camptocamp/puppet-systemd/pull/9) ([igalic](https://github.com/igalic))
+
+## [0.3.0](https://forge.puppetlabs.com/camptocamp/systemd/0.3.0) (2016-05-16)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.2.2...0.3.0)
+
+**Implemented enhancements:**
+
+- Shortcut for creating unit files / tmpfiles [\#4](https://github.com/camptocamp/puppet-systemd/pull/4) ([felixb](https://github.com/felixb))
+- Add systemd facts [\#6](https://github.com/camptocamp/puppet-systemd/pull/6) ([roidelapluie](https://github.com/roidelapluie))
+
+
+## [0.2.2](https://forge.puppetlabs.com/camptocamp/systemd/0.2.2) (2015-08-25)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.2.1...0.2.2)
+
+**Implemented enhancements:**
+
+- Add 'systemd-tmpfiles-create' [\#1](https://github.com/camptocamp/puppet-systemd/pull/1) ([roidelapluie](https://github.com/roidelapluie))
+
+
+## [0.2.1](https://forge.puppetlabs.com/camptocamp/systemd/0.2.1) (2015-08-21)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.2.0...0.2.1)
+
+- Use docker for acceptance tests
+
+## [0.1.15](https://forge.puppetlabs.com/camptocamp/systemd/0.1.15) (2015-06-26)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.1.14...0.1.15)
+
+- Fix strict_variables activation with rspec-puppet 2.2
+
+## [0.1.14](https://forge.puppetlabs.com/camptocamp/systemd/0.1.14) (2015-05-28)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.1.13...0.1.14)
+
+- Add beaker_spec_helper to Gemfile
+
+## [0.1.13](https://forge.puppetlabs.com/camptocamp/systemd/0.1.13) (2015-05-26)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.1.12...0.1.13)
+
+- Use random application order in nodeset
+
+## [0.1.12](https://forge.puppetlabs.com/camptocamp/systemd/0.1.12) (2015-05-26)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.1.11...0.1.12)
+
+- Add utopic & vivid nodesets
+
+## [0.1.11](https://forge.puppetlabs.com/camptocamp/systemd/0.1.11) (2015-05-25)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.1.10...0.1.11)
+
+- Don't allow failure on Puppet 4
+
+## [0.1.10](https://forge.puppetlabs.com/camptocamp/systemd/0.1.10) (2015-05-13)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.1.9...0.1.10)
+
+- Add puppet-lint-file_source_rights-check gem
+
+## [0.1.9](https://forge.puppetlabs.com/camptocamp/systemd/0.1.9) (2015-05-12)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.1.8...0.1.9)
+
+- Don't pin beaker
+
+## [0.1.8](https://forge.puppetlabs.com/camptocamp/systemd/0.1.8) (2015-04-27)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.1.7...0.1.8)
+
+- Add nodeset ubuntu-12.04-x86_64-openstack
+
+## [0.1.7](https://forge.puppetlabs.com/camptocamp/systemd/0.1.7) (2015-04-03)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.1.6...0.1.7)
+
+- Confine rspec pinning to ruby 1.8
+
+
+\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)*
--- /dev/null
+source ENV['GEM_SOURCE'] || "https://rubygems.org"
+
+group :development, :unit_tests do
+ gem 'rake', :require => false
+ gem 'rspec', :require => false
+ gem 'rspec-puppet', :require => false
+ gem 'puppetlabs_spec_helper', :require => false
+ gem 'metadata-json-lint', :require => false
+ gem 'puppet-lint', :require => false
+ gem 'puppet-lint-unquoted_string-check', :require => false
+ gem 'puppet-lint-empty_string-check', :require => false
+ gem 'puppet-lint-spaceship_operator_without_tag-check', :require => false
+ gem 'puppet-lint-undef_in_function-check', :require => false
+ gem 'puppet-lint-leading_zero-check', :require => false
+ gem 'puppet-lint-trailing_comma-check', :require => false
+ gem 'puppet-lint-file_ensure-check', :require => false
+ gem 'puppet-lint-version_comparison-check', :require => false
+ gem 'puppet-lint-file_source_rights-check', :require => false
+ gem 'puppet-lint-alias-check', :require => false
+ gem 'rspec-puppet-facts', :require => false
+ gem 'ruby-augeas', :require => false
+ gem 'json_pure', '< 2.0.2', :require => false
+end
+
+group :system_tests do
+ gem 'beaker', '~>3.13', :require => false
+ gem 'beaker-rspec', '> 5', :require => false
+ gem 'beaker_spec_helper', :require => false
+ gem 'serverspec', :require => false
+ gem 'specinfra', :require => false
+end
+
+if facterversion = ENV['FACTER_GEM_VERSION']
+ gem 'facter', facterversion, :require => false
+else
+ gem 'facter', :require => false
+end
+
+if puppetversion = ENV['PUPPET_GEM_VERSION']
+ gem 'puppet', puppetversion, :require => false
+else
+ gem 'puppet', :require => false
+end
+
+group :release do
+ gem 'github_changelog_generator', :require => false, :git => 'https://github.com/github-changelog-generator/github-changelog-generator' if RUBY_VERSION >= '2.2.2'
+ gem 'puppet-blacksmith', :require => false
+ gem 'voxpupuli-release', :require => false, :git => 'https://github.com/voxpupuli/voxpupuli-release-gem'
+end
+
+# vim:ft=ruby
--- /dev/null
+## [0.3.0](https://forge.puppetlabs.com/camptocamp/systemd/0.3.0) (2016-05-16)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.2.2...0.3.0)
+
+**Implemented enhancements:**
+
+- Shortcut for creating unit files / tmpfiles [\#4](https://github.com/camptocamp/puppet-systemd/pull/4) ([felixb](https://github.com/felixb))
+- Add systemd facts [\#6](https://github.com/camptocamp/puppet-systemd/pull/6) ([roidelapluie](https://github.com/roidelapluie))
+
+
+## [0.2.2](https://forge.puppetlabs.com/camptocamp/systemd/0.2.2) (2015-08-25)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.2.1...0.2.2)
+
+**Implemented enhancements:**
+
+- Add 'systemd-tmpfiles-create' [\#1](https://github.com/camptocamp/puppet-systemd/pull/1) ([roidelapluie](https://github.com/roidelapluie))
+
+
+## [0.2.1](https://forge.puppetlabs.com/camptocamp/systemd/0.2.1) (2015-08-21)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.2.0...0.2.1)
+
+- Use docker for acceptance tests
+
+## [0.1.15](https://forge.puppetlabs.com/camptocamp/systemd/0.1.15) (2015-06-26)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.1.14...0.1.15)
+
+- Fix strict_variables activation with rspec-puppet 2.2
+
+## [0.1.14](https://forge.puppetlabs.com/camptocamp/systemd/0.1.14) (2015-05-28)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.1.13...0.1.14)
+
+- Add beaker_spec_helper to Gemfile
+
+## [0.1.13](https://forge.puppetlabs.com/camptocamp/systemd/0.1.13) (2015-05-26)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.1.12...0.1.13)
+
+- Use random application order in nodeset
+
+## [0.1.12](https://forge.puppetlabs.com/camptocamp/systemd/0.1.12) (2015-05-26)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.1.11...0.1.12)
+
+- Add utopic & vivid nodesets
+
+## [0.1.11](https://forge.puppetlabs.com/camptocamp/systemd/0.1.11) (2015-05-25)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.1.10...0.1.11)
+
+- Don't allow failure on Puppet 4
+
+## [0.1.10](https://forge.puppetlabs.com/camptocamp/systemd/0.1.10) (2015-05-13)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.1.9...0.1.10)
+
+- Add puppet-lint-file_source_rights-check gem
+
+## [0.1.9](https://forge.puppetlabs.com/camptocamp/systemd/0.1.9) (2015-05-12)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.1.8...0.1.9)
+
+- Don't pin beaker
+
+## [0.1.8](https://forge.puppetlabs.com/camptocamp/systemd/0.1.8) (2015-04-27)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.1.7...0.1.8)
+
+- Add nodeset ubuntu-12.04-x86_64-openstack
+
+## [0.1.7](https://forge.puppetlabs.com/camptocamp/systemd/0.1.7) (2015-04-03)
+[Full Changelog](https://github.com/camptocamp/puppet-systemd/compare/0.1.6...0.1.7)
+
+- Confine rspec pinning to ruby 1.8
--- /dev/null
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
--- /dev/null
+# Systemd
+
+[![Puppet Forge](http://img.shields.io/puppetforge/v/camptocamp/systemd.svg)](https://forge.puppetlabs.com/camptocamp/systemd)
+[![Build Status](https://travis-ci.org/camptocamp/puppet-systemd.png?branch=master)](https://travis-ci.org/camptocamp/puppet-systemd)
+
+## Overview
+
+This module declares exec resources to create global sync points for reloading systemd.
+
+**Version 2 and newer of the module don't work with Hiera 3! You need to migrate your existing Hiera setup to Hiera 5**
+
+## Usage and examples
+
+There are two ways to use this module.
+
+### unit files
+
+Let this module handle file creation and systemd reloading.
+
+```puppet
+systemd::unit_file { 'foo.service':
+ source => "puppet:///modules/${module_name}/foo.service",
+}
+~> service {'foo':
+ ensure => 'running',
+}
+```
+
+Or handle file creation yourself and trigger systemd.
+
+```puppet
+include systemd::systemctl::daemon_reload
+
+file { '/usr/lib/systemd/system/foo.service':
+ ensure => file,
+ owner => 'root',
+ group => 'root',
+ mode => '0644',
+ source => "puppet:///modules/${module_name}/foo.service",
+}
+~> Class['systemd::systemctl::daemon_reload']
+
+service {'foo':
+ ensure => 'running',
+ subscribe => File['/usr/lib/systemd/system/foo.service'],
+}
+```
+
+You can also use this module to more fully manage the new unit. This example deploys the unit, reloads systemd and then enables and starts it.
+
+```puppet
+systemd::unit_file { 'foo.service':
+ source => "puppet:///modules/${module_name}/foo.service",
+ enable => true,
+ active => true,
+}
+```
+
+### drop-in files
+
+Drop-in files are used to add or alter settings of a unit without modifying the
+unit itself. As for the unit files, the module can handle the file and
+directory creation and systemd reloading:
+
+```puppet
+systemd::dropin_file { 'foo.conf':
+ unit => 'foo.service',
+ source => "puppet:///modules/${module_name}/foo.conf",
+}
+~> service {'foo':
+ ensure => 'running',
+}
+```
+
+Or handle file and directory creation yourself and trigger systemd:
+
+```puppet
+include systemd::systemctl::daemon_reload
+
+file { '/etc/systemd/system/foo.service.d':
+ ensure => directory,
+ owner => 'root',
+ group => 'root',
+}
+
+file { '/etc/systemd/system/foo.service.d/foo.conf':
+ ensure => file,
+ owner => 'root',
+ group => 'root',
+ mode => '0644',
+ source => "puppet:///modules/${module_name}/foo.conf",
+}
+~> Class['systemd::systemctl::daemon_reload']
+
+service {'foo':
+ ensure => 'running',
+ subscribe => File['/etc/systemd/system/foo.service.d/foo.conf'],
+}
+```
+
+### tmpfiles
+
+Let this module handle file creation and systemd reloading
+
+```puppet
+systemd::tmpfile { 'foo.conf':
+ source => "puppet:///modules/${module_name}/foo.conf",
+}
+```
+
+Or handle file creation yourself and trigger systemd.
+
+```puppet
+include systemd::tmpfiles
+
+file { '/etc/tmpfiles.d/foo.conf':
+ ensure => file,
+ owner => 'root',
+ group => 'root',
+ mode => '0644',
+ source => "puppet:///modules/${module_name}/foo.conf",
+}
+~> Class['systemd::tmpfiles']
+```
+
+### service limits
+
+Manage soft and hard limits on various resources for executed processes.
+
+```puppet
+systemd::service_limits { 'foo.service':
+ limits => {
+ 'LimitNOFILE' => 8192,
+ 'LimitNPROC' => 16384,
+ }
+}
+```
+
+Or provide the configuration file yourself. Systemd reloading and restarting of the service are handled by the module.
+
+```puppet
+systemd::service_limits { 'foo.service':
+ source => "puppet:///modules/${module_name}/foo.conf",
+}
+```
+
+### network
+
+systemd-networkd is able to manage your network configuration. We provide a
+defined resource which can write the interface configurations. systemd-networkd
+needs to be restarted to apply the configs. The defined resource can do this
+for you:
+
+```puppet
+systemd::network{'eth0.network':
+ source => "puppet:///modules/${module_name}/eth0.network",
+ restart_service => true,
+}
+```
+
+### Services
+
+Systemd provides multiple services. Currently you can manage `systemd-resolved`,
+`systemd-timesyncd` and `systemd-networkd` via the main class:
+
+```puppet
+class{'systemd':
+ manage_resolved => true,
+ manage_networkd => true,
+ manage_timesyncd => true,
+}
+```
+
+$manage_networkd is required if you want to reload it for new
+`systemd::network` resources. Setting $manage_resolved will also manage your
+`/etc/resolv.conf`.
+
+When configuring `systemd::resolved` you could set `dns_stub_resolver` to false (default) to use a *standard* `/etc/resolved.conf`, or you could set it to `true` to use the local resolver provided by `systemd-resolved`.
+
+It is possible to configure the default ntp servers in /etc/systemd/timesyncd.conf:
+
+```puppet
+class{'systemd':
+ manage_timesyncd => true,
+ ntp_server => ['0.pool.ntp.org', '1.pool.ntp.org'],
+ fallback_ntp_server => ['2.pool.ntp.org', '3.pool.ntp.org'],
+}
+```
+
+This requires puppetlabs-inifile, which is only a soft dependency in this module (you need to explicitly install it). Both parameters accept a string or an array.
+
+### Resource Accounting
+
+Systemd has support for different accounting option. It can track
+CPU/Memory/Network stats per process. This is explained in depth at [systemd-system.conf](https://www.freedesktop.org/software/systemd/man/systemd-system.conf.html).
+This defaults to off (default on most operating systems). You can enable this
+with the `$manage_accounting` parameter. The module provides a default set of
+working accounting options per operating system, but you can still modify them
+with `$accounting`:
+
+```puppet
+class{'systemd':
+ manage_accounting => true,
+ accounting => {
+ 'DefaultCPUAccounting' => 'yes',
+ 'DefaultMemoryAccounting' => 'no',
+ }
+}
+```
--- /dev/null
+require 'puppetlabs_spec_helper/rake_tasks'
+require 'puppet-lint/tasks/puppet-lint'
+
+Rake::Task[:lint].clear
+PuppetLint::RakeTask.new :lint do |config|
+ config.ignore_paths = ["spec/**/*.pp", "pkg/**/*.pp", "vendor/**/*.pp"]
+ config.disable_checks = ['140chars']
+ config.fail_on_warnings = true
+end
+
+PuppetSyntax.exclude_paths = ["spec/fixtures/**/*.pp", "vendor/**/*"]
+
+# Publishing tasks
+unless RUBY_VERSION =~ /^1\./
+ require 'puppet_blacksmith'
+ require 'puppet_blacksmith/rake_tasks'
+end
+
+begin
+ require 'github_changelog_generator/task'
+ GitHubChangelogGenerator::RakeTask.new :changelog do |config|
+ version = (Blacksmith::Modulefile.new).version
+ config.future_release = "v#{version}" if version =~ /^\d+\.\d+.\d+$/
+ config.header = "# Changelog\n\nAll notable changes to this project will be documented in this file.\nEach new release typically also includes the latest modulesync defaults.\nThese should not affect the functionality of the module."
+ config.exclude_labels = %w{duplicate question invalid wontfix wont-fix modulesync skip-changelog}
+ config.user = 'camptocamp'
+ config.project = 'puppet-systemd'
+ end
+rescue LoadError
+end
--- /dev/null
+{
+ "CHANGELOG.md": "1b6c3b3fcf40b2101eef09115d45e98f",
+ "Gemfile": "63d22a26acea65c0d337e1677b06de7b",
+ "HISTORY.md": "058e58d38f4298469cc4b9650e89e023",
+ "LICENSE": "0e5ccf641e613489e66aa98271dbe798",
+ "README.md": "256953c827e54aa7284bcfba675d4f76",
+ "Rakefile": "b638dcdf3d4b865f9944e70050696169",
+ "data/Archlinux.yaml": "132d2a05bfbbeeb2e1768c5d5e5465a4",
+ "data/CentOS-7.yaml": "4cd858563b8d1f09bd41b63ee3aaca46",
+ "data/Debian-10.yaml": "132d2a05bfbbeeb2e1768c5d5e5465a4",
+ "data/Debian-8.yaml": "cda4a0c67b5c02694714a275a1558862",
+ "data/Debian-9.yaml": "cda4a0c67b5c02694714a275a1558862",
+ "data/RedHat-7.yaml": "4cd858563b8d1f09bd41b63ee3aaca46",
+ "data/Ubuntu-16.04.yaml": "4cd858563b8d1f09bd41b63ee3aaca46",
+ "data/Ubuntu-18.04.yaml": "132d2a05bfbbeeb2e1768c5d5e5465a4",
+ "data/common.yaml": "e7abdb8d7975b5bba8149f5219d3581d",
+ "hiera.yaml": "95af0fd82f551cb12fe923d67ee0fca7",
+ "lib/facter/systemd.rb": "097bfc197ee80791b7fc5ffbedc68fad",
+ "manifests/dropin_file.pp": "0c9331bb7eb38710fdff0adbc074270d",
+ "manifests/init.pp": "0661761117910d6b4c2f90487c424353",
+ "manifests/network.pp": "71e5a66c79c86ce5d6105946dccc82f9",
+ "manifests/networkd.pp": "2dd4681c21305be938d80a1cf7542d1b",
+ "manifests/resolved.pp": "7985eb5806782d5ec0d54c22c7221a2c",
+ "manifests/service_limits.pp": "1e9f75395c8db15af5c42add5986a113",
+ "manifests/system.pp": "87fd2802ee517be1bbc29a1ab7cab717",
+ "manifests/systemctl/daemon_reload.pp": "e7168a9f55ea3d8209cf3097631aae1e",
+ "manifests/timesyncd.pp": "b495e114d5d44edff2ea41ea180db0b5",
+ "manifests/tmpfile.pp": "50f7cad2c6cb6f5b2bc16004f4e0551b",
+ "manifests/tmpfiles.pp": "c19150a103c3b883434437cc3f6618d7",
+ "manifests/unit_file.pp": "222f6960266abdddeb5ef96610831627",
+ "metadata.json": "55ec7b886dce87aea3b5b8ad8c022f90",
+ "spec/acceptance/nodesets/centos-5-x86_64-docker.yml": "916223adf56a5eae28fc4dbc8d3d5d09",
+ "spec/acceptance/nodesets/centos-5.yml": "329c2ecf383375a296316540b17dead8",
+ "spec/acceptance/nodesets/centos-6-x86_64-docker.yml": "79ee475e5497307c173a1aba59e1a206",
+ "spec/acceptance/nodesets/centos-6-x86_64-openstack.yml": "5509e2ebb2bee49bec7905141d91535b",
+ "spec/acceptance/nodesets/centos-6-x86_64-vagrant.yml": "f973bde1c355b0af3ba5c08e02311580",
+ "spec/acceptance/nodesets/centos-6.yml": "f0e3e5327185edaab414af3371e86c98",
+ "spec/acceptance/nodesets/centos-7-x86_64-docker.yml": "1d4713c4b0788eaaed0a5767ba0268d4",
+ "spec/acceptance/nodesets/centos-7-x86_64-openstack.yml": "554374fca1889b858d90a81226578b82",
+ "spec/acceptance/nodesets/centos-7-x86_64-vagrant.yml": "82b8ada243c70d9a2d8c9a3a4385416c",
+ "spec/acceptance/nodesets/centos-7.yml": "64e996635943b77309efcf2a0c6d3c02",
+ "spec/acceptance/nodesets/debian-6-x86_64-docker.yml": "d6cb2154bf149715439b5bc64ef627bc",
+ "spec/acceptance/nodesets/debian-6-x86_64-openstack.yml": "83b0b0ecb7212b45179546ac6b6b83b7",
+ "spec/acceptance/nodesets/debian-6-x86_64-vagrant.yml": "d6356946a61858342d0be2b6b670eb55",
+ "spec/acceptance/nodesets/debian-6.yml": "4078ec869c78a6bb51a0bcfa350cc674",
+ "spec/acceptance/nodesets/debian-7-x86_64-docker.yml": "2d68216014870420714f306fb3aaa601",
+ "spec/acceptance/nodesets/debian-7-x86_64-openstack.yml": "47f0b02b2d6ea2134574f045e9a315af",
+ "spec/acceptance/nodesets/debian-7-x86_64-vagrant.yml": "2dacc8c1cce7bc4fa8e3b13267df9ecd",
+ "spec/acceptance/nodesets/debian-7.yml": "7ff246ef2e9a9f2b957eacc1d2274898",
+ "spec/acceptance/nodesets/debian-8-x86_64-docker.yml": "d7fb01335b3273723b8b418faef51538",
+ "spec/acceptance/nodesets/debian-8-x86_64-openstack.yml": "075a6d6389a6b6cbe3b11f7a6e160059",
+ "spec/acceptance/nodesets/debian-8-x86_64-vagrant.yml": "9c33b450b4aa17476acc86d839d79dd2",
+ "spec/acceptance/nodesets/debian-8.yml": "7cc01dfb4cf846bba1fff66a6cceab66",
+ "spec/acceptance/nodesets/ubuntu-10.04-x86_64-docker.yml": "11480a9d30e9c4daee140dd420176723",
+ "spec/acceptance/nodesets/ubuntu-12.04-x86_64-docker.yml": "46cc4eceef33f04818ce74855630e05b",
+ "spec/acceptance/nodesets/ubuntu-12.04-x86_64-openstack.yml": "d1619ba4430c1a61cd9407533ac91de2",
+ "spec/acceptance/nodesets/ubuntu-12.04.yml": "5e21f60e951be4936f6bca1031553808",
+ "spec/acceptance/nodesets/ubuntu-14.04-x86_64-docker.yml": "5390c092066afa65780816b162dfb4aa",
+ "spec/acceptance/nodesets/ubuntu-14.04-x86_64-openstack.yml": "535b98aa7c5d0df88817675af991d2b6",
+ "spec/acceptance/nodesets/ubuntu-14.04-x86_64-vagrant.yml": "8622e2d9cae7a0923b8510561f1daf5a",
+ "spec/acceptance/nodesets/ubuntu-14.04.yml": "7614de568fe061eed346e987e0f80bbd",
+ "spec/acceptance/nodesets/ubuntu-14.10-x86_64-docker.yml": "df4b8f4bd33f38e0053a806d739db819",
+ "spec/acceptance/nodesets/ubuntu-14.10-x86_64-openstack.yml": "cdfa94d70efdcbb4ae0e9caea474c4b1",
+ "spec/acceptance/nodesets/ubuntu-14.10.yml": "b3671a973bdc6386af78925d6471e951",
+ "spec/acceptance/nodesets/ubuntu-15.04-x86_64-docker.yml": "cefdea8d6ead29b5f492adb971019a81",
+ "spec/acceptance/nodesets/ubuntu-15.04-x86_64-openstack.yml": "60a9ce9983e881df4b83c2720dc014ed",
+ "spec/acceptance/nodesets/ubuntu-15.04.yml": "cea5658fe126394b01e94286e7854fd1",
+ "spec/acceptance/nodesets/ubuntu-15.10.yml": "6bc135e884164d541704dfb00ba09a3c",
+ "spec/acceptance/nodesets/ubuntu-16.04.yml": "17dc63e8b2a15a5285c6aca6d91b4aec",
+ "spec/classes/init_spec.rb": "67731efaaf6790f0696988a62f3e85a3",
+ "spec/classes/systemctl/daemon_reload_spec.rb": "cb9a0300c2318103d9bbf0e4b4f65aa1",
+ "spec/classes/tmpfiles_spec.rb": "0e5b6c4057f66fe169217c08f3814c38",
+ "spec/default_module_facts.yaml": "d0967d84ae8037c7ec7f1d52f14de7df",
+ "spec/defines/dropin_file_spec.rb": "d7fa0e4a9bfaba40965ed81880df1098",
+ "spec/defines/network_spec.rb": "b7a0ec46c10eb5b68b05ecda934f2422",
+ "spec/defines/service_limits_spec.rb": "758243b295ca9a92021576569c7f3dd3",
+ "spec/defines/tmpfile_spec.rb": "d1050916e84502cb022764435004d008",
+ "spec/defines/unit_file_spec.rb": "9ad980913d445255f846d2fae749f9f9",
+ "spec/spec.opts": "a600ded995d948e393fbe2320ba8e51c",
+ "spec/spec_helper.rb": "1524f103a4d70c412ed1794e50e614a5",
+ "spec/unit/facter/systemd_spec.rb": "60ddfbee71614dc0e822a44199baa283",
+ "spec/unit/facter/systemd_version_spec.rb": "14f915e98f11a610c8513c39dc0ddc55",
+ "templates/limits.erb": "8e18a431f012d940ac22e0a98da8f115",
+ "types/dropin.pp": "14af455c863528e9b1d546a757a756b2",
+ "types/servicelimits.pp": "c6750c64ee955b2cabc852473d3c67f2",
+ "types/unit.pp": "ab1246b0129a8f1728347585bafb149c"
+}
\ No newline at end of file
--- /dev/null
+---
+systemd::accounting:
+ DefaultCPUAccounting: 'yes'
+ DefaultIOAccounting: 'yes'
+ DefaultIPAccounting: 'yes'
+ DefaultBlockIOAccounting: 'yes'
+ DefaultMemoryAccounting: 'yes'
+ DefaultTasksAccounting: 'yes'
--- /dev/null
+---
+systemd::accounting:
+ DefaultCPUAccounting: 'yes'
+ DefaultBlockIOAccounting: 'yes'
+ DefaultMemoryAccounting: 'yes'
+ DefaultTasksAccounting: 'yes'
--- /dev/null
+---
+systemd::accounting:
+ DefaultCPUAccounting: 'yes'
+ DefaultIOAccounting: 'yes'
+ DefaultIPAccounting: 'yes'
+ DefaultBlockIOAccounting: 'yes'
+ DefaultMemoryAccounting: 'yes'
+ DefaultTasksAccounting: 'yes'
--- /dev/null
+---
+systemd::accounting:
+ DefaultCPUAccounting: 'yes'
+ DefaultBlockIOAccounting: 'yes'
+ DefaultMemoryAccounting: 'yes'
--- /dev/null
+---
+systemd::accounting:
+ DefaultCPUAccounting: 'yes'
+ DefaultBlockIOAccounting: 'yes'
+ DefaultMemoryAccounting: 'yes'
--- /dev/null
+---
+systemd::accounting:
+ DefaultCPUAccounting: 'yes'
+ DefaultBlockIOAccounting: 'yes'
+ DefaultMemoryAccounting: 'yes'
+ DefaultTasksAccounting: 'yes'
--- /dev/null
+---
+systemd::accounting:
+ DefaultCPUAccounting: 'yes'
+ DefaultBlockIOAccounting: 'yes'
+ DefaultMemoryAccounting: 'yes'
+ DefaultTasksAccounting: 'yes'
--- /dev/null
+---
+systemd::accounting:
+ DefaultCPUAccounting: 'yes'
+ DefaultIOAccounting: 'yes'
+ DefaultIPAccounting: 'yes'
+ DefaultBlockIOAccounting: 'yes'
+ DefaultMemoryAccounting: 'yes'
+ DefaultTasksAccounting: 'yes'
--- /dev/null
+---
+systemd::service_limits: {}
+systemd::manage_resolved: false
+systemd::resolved_ensure: 'running'
+systemd::dns: ~
+systemd::fallback_dns: ~
+systemd::domains: ~
+systemd::llmnr: ~
+systemd::multicast_dns: ~
+systemd::dnssec: ~
+systemd::cache: false
+systemd::dns_stub_listener: ~
+systemd::use_stub_resolver: false
+systemd::manage_networkd: false
+systemd::networkd_ensure: 'running'
+systemd::manage_timesyncd: false
+systemd::timesyncd_ensure: 'running'
+systemd::ntp_server: ~
+systemd::fallback_ntp_server: ~
+systemd::manage_accounting: false
+systemd::accounting: {}
--- /dev/null
+# Fact: systemd
+#
+# Purpose:
+# Determine whether systemd is the init system on the node
+#
+# Resolution:
+# Check if the service_provider fact is systemd
+#
+# Caveats:
+# If you override the service provider then it will return false, even if the
+# underlying system still is systemd.
+#
+
+# Fact: systemd_version
+#
+# Purpose:
+# Determine the version of systemd installed
+#
+# Resolution:
+# Check the output of systemctl --version
+#
+# Caveats:
+#
+
+# Fact: systemd_internal_services
+#
+# Purpose:
+# List all systemd internal real services + their state
+#
+# Resolution:
+# Check the output of systemctl --list-unit-files systemd-* and parse it into
+# a hash with the status
+#
+# Caveats:
+#
+Facter.add(:systemd) do
+ confine :kernel => :linux
+ setcode do
+ Facter.value(:service_provider) == 'systemd'
+ end
+end
+
+Facter.add(:systemd_version) do
+ confine :systemd => true
+ setcode do
+ Facter::Util::Resolution.exec("systemctl --version | awk '/systemd/{ print $2 }'")
+ end
+end
+
+Facter.add(:systemd_internal_services) do
+ confine :systemd => true
+ setcode do
+ command_output = Facter::Util::Resolution.exec(
+ 'systemctl list-unit-files --no-legend --no-pager "systemd-*" -t service --state=enabled,disabled,enabled-runtime,indirect'
+ )
+ lines = command_output.lines.lazy.map { |line| line.split(/\s+/) }
+ lines.each_with_object({}) do |(service, status, *), result|
+ result[service] = status
+ end
+ end
+end
--- /dev/null
+# Creates a drop-in file for a systemd unit
+#
+# @api public
+#
+# @see systemd.unit(5)
+#
+# @attr name [Pattern['^.+\.conf$']]
+# The target unit file to create
+#
+# * Must not contain ``/``
+#
+# @attr path
+# The main systemd configuration path
+#
+# @attr content
+# The full content of the unit file
+#
+# * Mutually exclusive with ``$source``
+#
+# @attr source
+# The ``File`` resource compatible ``source``
+#
+# * Mutually exclusive with ``$content``
+#
+# @attr target
+# If set, will force the file to be a symlink to the given target
+#
+# * Mutually exclusive with both ``$source`` and ``$content``
+#
+define systemd::dropin_file(
+ Systemd::Unit $unit,
+ Systemd::Dropin $filename = $name,
+ Enum['present', 'absent', 'file'] $ensure = 'present',
+ Stdlib::Absolutepath $path = '/etc/systemd/system',
+ Optional[String] $content = undef,
+ Optional[String] $source = undef,
+ Optional[Stdlib::Absolutepath] $target = undef,
+) {
+ include systemd
+
+ if $target {
+ $_ensure = 'link'
+ } else {
+ $_ensure = $ensure ? {
+ 'present' => 'file',
+ default => $ensure,
+ }
+ }
+
+ if $ensure != 'absent' {
+ ensure_resource('file', "${path}/${unit}.d", {
+ ensure => directory,
+ owner => 'root',
+ group => 'root',
+ })
+ }
+
+ file { "${path}/${unit}.d/${filename}":
+ ensure => $_ensure,
+ content => $content,
+ source => $source,
+ target => $target,
+ owner => 'root',
+ group => 'root',
+ mode => '0444',
+ notify => Class['systemd::systemctl::daemon_reload'],
+ }
+}
--- /dev/null
+# This module allows triggering systemd commands once for all modules
+#
+# @api public
+#
+# @param service_limits
+# May be passed a resource hash suitable for passing directly into the
+# ``create_resources()`` function as called on ``systemd::service_limits``
+#
+# @param manage_resolved
+# Manage the systemd resolver
+#
+# @param resolved_ensure
+# The state that the ``resolved`` service should be in
+#
+# @param dns
+# A space-separated list of IPv4 and IPv6 addresses to use as system DNS servers.
+# DNS requests are sent to one of the listed DNS servers in parallel to suitable
+# per-link DNS servers acquired from systemd-networkd.service(8) or set at runtime
+# by external applications. requires puppetlabs-inifile
+#
+# @param fallback_dns
+# A space-separated list of IPv4 and IPv6 addresses to use as the fallback DNS
+# servers. Any per-link DNS servers obtained from systemd-networkd take
+# precedence over this setting. requires puppetlabs-inifile
+#
+# @param domains
+# A space-separated list of domains host names or IP addresses to be used
+# systemd-resolved take precedence over this setting.
+#
+# @param llmnr
+# Takes a boolean argument or "resolve".
+#
+# @param multicast_dns
+# Takes a boolean argument or "resolve".
+#
+# @param dnssec
+# Takes a boolean argument or "allow-downgrade".
+#
+# @param cache
+# Takes a boolean argument.
+#
+# @param dns_stub_listener
+# Takes a boolean argument or one of "udp" and "tcp".
+#
+# @param use_stub_resolver
+# Takes a boolean argument. When "false" (default) it uses /var/run/systemd/resolve/resolv.conf
+# as /etc/resolv.conf. When "true", it uses /var/run/systemd/resolve/stub-resolv.conf
+# @param manage_networkd
+# Manage the systemd network daemon
+#
+# @param networkd_ensure
+# The state that the ``networkd`` service should be in
+#
+# @param manage_timesyncd
+# Manage the systemd tiemsyncd daemon
+#
+# @param timesyncd_ensure
+# The state that the ``timesyncd`` service should be in
+#
+# @param ntp_server
+# comma separated list of ntp servers, will be combined with interface specific
+# addresses from systemd-networkd. requires puppetlabs-inifile
+#
+# @param fallback_ntp_server
+# A space-separated list of NTP server host names or IP addresses to be used
+# as the fallback NTP servers. Any per-interface NTP servers obtained from
+# systemd-networkd take precedence over this setting. requires puppetlabs-inifile
+class systemd (
+ Hash[String,Hash[String, Any]] $service_limits,
+ Boolean $manage_resolved,
+ Enum['stopped','running'] $resolved_ensure,
+ Optional[Variant[Array[String],String]] $dns,
+ Optional[Variant[Array[String],String]] $fallback_dns,
+ Optional[Variant[Array[String],String]] $domains,
+ Optional[Variant[Boolean,Enum['resolve']]] $llmnr,
+ Optional[Variant[Boolean,Enum['resolve']]] $multicast_dns,
+ Optional[Variant[Boolean,Enum['allow-downgrade']]] $dnssec,
+ Boolean $cache,
+ Optional[Variant[Boolean,Enum['udp','tcp']]] $dns_stub_listener,
+ Boolean $use_stub_resolver,
+ Boolean $manage_networkd,
+ Enum['stopped','running'] $networkd_ensure,
+ Boolean $manage_timesyncd,
+ Enum['stopped','running'] $timesyncd_ensure,
+ Optional[Variant[Array,String]] $ntp_server,
+ Optional[Variant[Array,String]] $fallback_ntp_server,
+ Boolean $manage_accounting,
+ Hash[String,String] $accounting,
+){
+
+ contain systemd::systemctl::daemon_reload
+
+ create_resources('systemd::service_limits', $service_limits)
+
+ if $manage_resolved and $facts['systemd_internal_services'] and $facts['systemd_internal_services']['systemd-resolved.service'] {
+ contain systemd::resolved
+ }
+
+ if $manage_networkd and $facts['systemd_internal_services'] and $facts['systemd_internal_services']['systemd-networkd.service'] {
+ contain systemd::networkd
+ }
+
+ if $manage_timesyncd and $facts['systemd_internal_services'] and $facts['systemd_internal_services']['systemd-timesyncd.service'] {
+ contain systemd::timesyncd
+ }
+
+ if $manage_accounting {
+ contain systemd::system
+ }
+}
--- /dev/null
+# -- Define: systemd::network
+# Creates network config for systemd-networkd
+define systemd::network (
+ Enum['file', 'absent'] $ensure = file,
+ Stdlib::Absolutepath $path = '/etc/systemd/network',
+ Optional[String] $content = undef,
+ Optional[String] $source = undef,
+ Optional[Stdlib::Absolutepath] $target = undef,
+ Boolean $restart_service = true,
+){
+
+ include systemd
+
+ if $restart_service and $systemd::manage_networkd {
+ $notify = Service['systemd-networkd']
+ } else {
+ $notify = undef
+ }
+
+ file { "${path}/${name}":
+ ensure => $ensure,
+ content => $content,
+ source => $source,
+ target => $target,
+ owner => 'root',
+ group => 'root',
+ mode => '0444',
+ notify => $notify,
+ }
+}
--- /dev/null
+# **NOTE: THIS IS A [PRIVATE](https://github.com/puppetlabs/puppetlabs-stdlib#assert_private) CLASS**
+#
+# This class provides an abstract way to trigger systemd-networkd
+#
+# @param ensure
+# The state that the ``networkd`` service should be in
+#
+class systemd::networkd (
+ Enum['stopped','running'] $ensure = $systemd::networkd_ensure,
+){
+
+ assert_private()
+
+ $_enable_networkd = $ensure ? {
+ 'stopped' => false,
+ 'running' => true,
+ default => $ensure,
+ }
+
+ service{ 'systemd-networkd':
+ ensure => $ensure,
+ enable => $_enable_networkd,
+ }
+}
--- /dev/null
+# **NOTE: THIS IS A [PRIVATE](https://github.com/puppetlabs/puppetlabs-stdlib#assert_private) CLASS**
+#
+# This class provides an abstract way to trigger resolved.
+# Each parameters correspond to resolved.conf(5):
+# https://www.freedesktop.org/software/systemd/man/resolved.conf.html
+#
+# @param ensure
+# The state that the ``resolved`` service should be in
+#
+# @param dns
+# A space-separated list of IPv4 and IPv6 addresses to use as system DNS servers.
+# DNS requests are sent to one of the listed DNS servers in parallel to suitable
+# per-link DNS servers acquired from systemd-networkd.service(8) or set at runtime
+# by external applications. requires puppetlabs-inifile
+#
+# @param fallback_dns
+# A space-separated list of IPv4 and IPv6 addresses to use as the fallback DNS
+# servers. Any per-link DNS servers obtained from systemd-networkd take
+# precedence over this setting. requires puppetlabs-inifile
+#
+# @param domains
+# A space-separated list of domains host names or IP addresses to be used
+# systemd-resolved take precedence over this setting.
+#
+# @param llmnr
+# Takes a boolean argument or "resolve".
+#
+# @param multicast_dns
+# Takes a boolean argument or "resolve".
+#
+# @param dnssec
+# Takes a boolean argument or "allow-downgrade".
+#
+# @param cache
+# Takes a boolean argument.
+#
+# @param dns_stub_listener
+# Takes a boolean argument or one of "udp" and "tcp".
+#
+# @param use_stub_resolver
+# Takes a boolean argument. When "false" (default) it uses /var/run/systemd/resolve/resolv.conf
+# as /etc/resolv.conf. When "true", it uses /var/run/systemd/resolve/stub-resolv.conf
+#
+class systemd::resolved (
+ Enum['stopped','running'] $ensure = $systemd::resolved_ensure,
+ Optional[Variant[Array[String],String]] $dns = $systemd::dns,
+ Optional[Variant[Array[String],String]] $fallback_dns = $systemd::fallback_dns,
+ Optional[Variant[Array[String],String]] $domains = $systemd::domains,
+ Optional[Variant[Boolean,Enum['resolve']]] $llmnr = $systemd::llmnr,
+ Optional[Variant[Boolean,Enum['resolve']]] $multicast_dns = $systemd::multicast_dns,
+ Optional[Variant[Boolean,Enum['allow-downgrade']]] $dnssec = $systemd::dnssec,
+ Boolean $cache = $systemd::cache,
+ Optional[Variant[Boolean,Enum['udp', 'tcp']]] $dns_stub_listener = $systemd::dns_stub_listener,
+ Boolean $use_stub_resolver = $systemd::use_stub_resolver,
+){
+
+ assert_private()
+
+ $_enable_resolved = $ensure ? {
+ 'stopped' => false,
+ 'running' => true,
+ default => $ensure,
+ }
+
+ service { 'systemd-resolved':
+ ensure => $ensure,
+ enable => $_enable_resolved,
+ }
+
+ $_resolv_conf_target = $use_stub_resolver ? {
+ true => '/run/systemd/resolve/stub-resolv.conf',
+ default => '/run/systemd/resolve/resolv.conf',
+ }
+ file { '/etc/resolv.conf':
+ ensure => 'symlink',
+ target => $_resolv_conf_target,
+ require => Service['systemd-resolved'],
+ }
+
+ if $dns {
+ if $dns =~ String {
+ $_dns = $dns
+ } else {
+ $_dns = join($dns, ' ')
+ }
+ ini_setting{ 'dns':
+ ensure => 'present',
+ value => $_dns,
+ setting => 'DNS',
+ section => 'Resolve',
+ path => '/etc/systemd/resolved.conf',
+ notify => Service['systemd-resolved'],
+ }
+ }
+
+ if $fallback_dns {
+ if $fallback_dns =~ String {
+ $_fallback_dns = $fallback_dns
+ } else {
+ $_fallback_dns = join($fallback_dns, ' ')
+ }
+ ini_setting{ 'fallback_dns':
+ ensure => 'present',
+ value => $_fallback_dns,
+ setting => 'FallbackDNS',
+ section => 'Resolve',
+ path => '/etc/systemd/resolved.conf',
+ notify => Service['systemd-resolved'],
+ }
+ }
+
+ if $domains {
+ if $domains =~ String {
+ $_domains = $domains
+ } else {
+ $_domains = join($domains, ' ')
+ }
+ ini_setting{ 'domains':
+ ensure => 'present',
+ value => $_domains,
+ setting => 'Domains',
+ section => 'Resolve',
+ path => '/etc/systemd/resolved.conf',
+ notify => Service['systemd-resolved'],
+ }
+ }
+
+ $_llmnr = $llmnr ? {
+ true => 'yes',
+ false => 'no',
+ default => $llmnr,
+ }
+
+ if $_llmnr {
+ ini_setting{ 'llmnr':
+ ensure => 'present',
+ value => $_llmnr,
+ setting => 'LLMNR',
+ section => 'Resolve',
+ path => '/etc/systemd/resolved.conf',
+ notify => Service['systemd-resolved'],
+ }
+ }
+
+ $_multicast_dns = $multicast_dns ? {
+ true => 'yes',
+ false => 'no',
+ default => $multicast_dns,
+ }
+
+ if $_multicast_dns {
+ ini_setting{ 'multicast_dns':
+ ensure => 'present',
+ value => $_multicast_dns,
+ setting => 'MulticastDNS',
+ section => 'Resolve',
+ path => '/etc/systemd/resolved.conf',
+ notify => Service['systemd-resolved'],
+ }
+ }
+
+ $_dnssec = $dnssec ? {
+ true => 'yes',
+ false => 'no',
+ default => $dnssec,
+ }
+
+ if $_dnssec {
+ ini_setting{ 'dnssec':
+ ensure => 'present',
+ value => $_dnssec,
+ setting => 'DNSSEC',
+ section => 'Resolve',
+ path => '/etc/systemd/resolved.conf',
+ notify => Service['systemd-resolved'],
+ }
+ }
+
+ $_cache = $cache ? {
+ true => 'yes',
+ false => 'no',
+ }
+
+ if $cache {
+ ini_setting{ 'cache':
+ ensure => 'present',
+ value => $_cache,
+ setting => 'Cache',
+ section => 'Resolve',
+ path => '/etc/systemd/resolved.conf',
+ notify => Service['systemd-resolved'],
+ }
+ }
+
+ $_dns_stub_listener = $dns_stub_listener ? {
+ true => 'yes',
+ false => 'no',
+ default => $dns_stub_listener,
+ }
+
+ if $_dns_stub_listener {
+ ini_setting{ 'dns_stub_listener':
+ ensure => 'present',
+ value => $_dns_stub_listener,
+ setting => 'DNSStubListener',
+ section => 'Resolve',
+ path => '/etc/systemd/resolved.conf',
+ notify => Service['systemd-resolved'],
+ }
+ }
+
+}
--- /dev/null
+# Adds a set of custom limits to the service
+#
+# @api public
+#
+# @see systemd.exec(5)
+#
+# @attr name [Pattern['^.+\.(service|socket|mount|swap)$']]
+# The name of the service that you will be modifying
+#
+# @param $ensure
+# Whether to drop a file or remove it
+#
+# @param path
+# The path to the main systemd settings directory
+#
+# @param limits
+# A Hash of service limits matching the settings in ``systemd.exec(5)``
+#
+# * Mutually exclusive with ``$source``
+#
+# @param source
+# A ``File`` resource compatible ``source``
+#
+# * Mutually exclusive with ``$limits``
+#
+# @param restart_service
+# Restart the managed service after setting the limits
+#
+define systemd::service_limits(
+ Enum['present', 'absent', 'file'] $ensure = 'present',
+ Stdlib::Absolutepath $path = '/etc/systemd/system',
+ Optional[Systemd::ServiceLimits] $limits = undef,
+ Optional[String] $source = undef,
+ Boolean $restart_service = true
+) {
+
+ include systemd
+
+ if $name !~ Pattern['^.+\.(service|socket|mount|swap)$'] {
+ fail('$name must match Pattern["^.+\.(service|socket|mount|swap)$"]')
+ }
+
+ if $limits and !empty($limits) {
+ $_content = template("${module_name}/limits.erb")
+ }
+ else {
+ $_content = undef
+ }
+
+ if $ensure != 'absent' {
+ if ($limits and !empty($limits)) and $source {
+ fail('You may not supply both limits and source parameters to systemd::service_limits')
+ }
+ elsif ($limits == undef or empty($limits)) and ($source == undef) {
+ fail('You must supply either the limits or source parameter to systemd::service_limits')
+ }
+ }
+
+ systemd::dropin_file { "${name}-90-limits.conf":
+ ensure => $ensure,
+ unit => $name,
+ filename => '90-limits.conf',
+ path => $path,
+ content => $_content,
+ source => $source,
+ }
+
+ if $restart_service {
+ exec { "restart ${name} because limits":
+ command => "systemctl restart ${name}",
+ path => $::path,
+ refreshonly => true,
+ subscribe => File["${path}/${name}.d/90-limits.conf"],
+ require => Class['systemd::systemctl::daemon_reload'],
+ }
+ }
+}
--- /dev/null
+# **NOTE: THIS IS A [PRIVATE](https://github.com/puppetlabs/puppetlabs-stdlib#assert_private) CLASS**
+#
+# This class provides a solution to enable accounting
+#
+class systemd::system {
+
+ assert_private()
+
+ $systemd::accounting.each |$option, $value| {
+ ini_setting{$option:
+ ensure => 'present',
+ path => '/etc/systemd/system.conf',
+ section => 'Manager',
+ setting => $option,
+ value => $value,
+ notify => Class['systemd::systemctl::daemon_reload'],
+ }
+ }
+}
--- /dev/null
+# Reload the systemctl daemon
+#
+# @api public
+class systemd::systemctl::daemon_reload {
+ exec { 'systemctl-daemon-reload':
+ command => 'systemctl daemon-reload',
+ refreshonly => true,
+ path => $facts['path'],
+ }
+}
--- /dev/null
+# **NOTE: THIS IS A [PRIVATE](https://github.com/puppetlabs/puppetlabs-stdlib#assert_private) CLASS**
+#
+# This class provides an abstract way to trigger systemd-timesyncd
+#
+# @param ensure
+# The state that the ``networkd`` service should be in
+#
+# @param $ntp_server
+# A space-separated list of NTP servers, will be combined with interface specific
+# addresses from systemd-networkd. requires puppetlabs-inifile
+#
+# @param fallback_ntp_server
+# A space-separated list of NTP server host names or IP addresses to be used
+# as the fallback NTP servers. Any per-interface NTP servers obtained from
+# systemd-networkd take precedence over this setting. requires puppetlabs-inifile
+class systemd::timesyncd (
+ Enum['stopped','running'] $ensure = $systemd::timesyncd_ensure,
+ Optional[Variant[Array,String]] $ntp_server = $systemd::ntp_server,
+ Optional[Variant[Array,String]] $fallback_ntp_server = $systemd::fallback_ntp_server,
+){
+
+ assert_private()
+
+ $_enable_timesyncd = $ensure ? {
+ 'stopped' => false,
+ 'running' => true,
+ default => $ensure,
+ }
+
+ service{ 'systemd-timesyncd':
+ ensure => $ensure,
+ enable => $_enable_timesyncd,
+ }
+
+ if $ntp_server {
+ if $ntp_server =~ String {
+ $_ntp_server = $ntp_server
+ } else {
+ $_ntp_server = join($ntp_server, ' ')
+ }
+ ini_setting{'ntp_server':
+ ensure => 'present',
+ value => $_ntp_server,
+ setting => 'NTP',
+ section => 'Time',
+ path => '/etc/systemd/timesyncd.conf',
+ notify => Service['systemd-timesyncd'],
+ }
+ }
+
+ if $fallback_ntp_server {
+ if $fallback_ntp_server =~ String {
+ $_fallback_ntp_server = $fallback_ntp_server
+ } else {
+ $_fallback_ntp_server = join($fallback_ntp_server, ' ')
+ }
+ ini_setting{'fallback_ntp_server':
+ ensure => 'present',
+ value => $_fallback_ntp_server,
+ setting => 'FallbackNTP',
+ section => 'Time',
+ path => '/etc/systemd/timesyncd.conf',
+ notify => Service['systemd-timesyncd'],
+ }
+ }
+}
--- /dev/null
+# Creates a systemd tmpfile
+#
+# @api public
+#
+# @see systemd-tmpfiles(8)
+#
+# @attr name [String]
+# The name of the tmpfile to create
+#
+# * May not contain ``/``
+#
+# @param $ensure
+# Whether to drop a file or remove it
+#
+# @param path
+# The path to the main systemd tmpfiles directory
+#
+# @param content
+# The literal content to write to the file
+#
+# * Mutually exclusive with ``$source``
+#
+# @param source
+# A ``File`` resource compatible ``source``
+#
+# * Mutually exclusive with ``$limits``
+#
+define systemd::tmpfile(
+ Enum['present', 'absent', 'file'] $ensure = 'file',
+ Stdlib::Absolutepath $path = '/etc/tmpfiles.d',
+ Optional[String] $content = undef,
+ Optional[String] $source = undef,
+) {
+ include systemd::tmpfiles
+
+ if $name =~ Pattern['/'] {
+ fail('$name may not contain a forward slash "(/)"')
+ }
+
+ $_tmp_file_ensure = $ensure ? {
+ 'present' => 'file',
+ default => $ensure,
+ }
+
+ file { "${path}/${name}":
+ ensure => $_tmp_file_ensure,
+ content => $content,
+ source => $source,
+ owner => 'root',
+ group => 'root',
+ mode => '0444',
+ notify => Class['systemd::tmpfiles'],
+ }
+}
--- /dev/null
+# Update the systemd temp files
+#
+# @api public
+#
+# @see systemd-tmpfiles(8)
+#
+# @param operations
+# The operations to perform on the systemd tempfiles
+#
+# * All operations may be combined but you'll probably only ever want to
+# use ``create``
+#
+class systemd::tmpfiles (
+ Array[Enum['create','clean','remove']] $operations = ['create']
+) {
+
+ $_ops = join(prefix($operations, '--'), ' ')
+
+ exec { 'systemd-tmpfiles':
+ command => "systemd-tmpfiles ${_ops}",
+ refreshonly => true,
+ path => $::path,
+ }
+}
--- /dev/null
+# Creates a systemd unit file
+#
+# @api public
+#
+# @see systemd.unit(5)
+#
+# @attr name [Pattern['^.+\.(service|socket|device|mount|automount|swap|target|path|timer|slice|scope)$']]
+# The target unit file to create
+#
+# * Must not contain ``/``
+#
+# @attr path
+# The main systemd configuration path
+#
+# @attr content
+# The full content of the unit file
+#
+# * Mutually exclusive with ``$source``
+#
+# @attr source
+# The ``File`` resource compatible ``source``
+#
+# * Mutually exclusive with ``$content``
+#
+# @attr target
+# If set, will force the file to be a symlink to the given target
+#
+# * Mutually exclusive with both ``$source`` and ``$content``
+#
+# @attr enable
+# If set, will manage the unit enablement status.
+#
+# @attr active
+# If set, will manage the state of the unit.
+#
+define systemd::unit_file(
+ Enum['present', 'absent', 'file'] $ensure = 'present',
+ Stdlib::Absolutepath $path = '/etc/systemd/system',
+ Optional[String] $content = undef,
+ Optional[String] $source = undef,
+ Optional[Stdlib::Absolutepath] $target = undef,
+ Optional[Variant[Boolean, Enum['mask']]] $enable = undef,
+ Optional[Boolean] $active = undef,
+) {
+ include systemd
+
+ assert_type(Systemd::Unit, $name)
+
+ if $target {
+ $_ensure = 'link'
+ } else {
+ $_ensure = $ensure ? {
+ 'present' => 'file',
+ default => $ensure,
+ }
+ }
+
+ file { "${path}/${name}":
+ ensure => $_ensure,
+ content => $content,
+ source => $source,
+ target => $target,
+ owner => 'root',
+ group => 'root',
+ mode => '0444',
+ notify => Class['systemd::systemctl::daemon_reload'],
+ }
+
+ if $enable != undef or $active != undef {
+ service { $name:
+ ensure => $active,
+ enable => $enable,
+ provider => 'systemd',
+ subscribe => File["${path}/${name}"],
+ require => Class['systemd::systemctl::daemon_reload'],
+ }
+ }
+}
--- /dev/null
+{
+ "name": "camptocamp-systemd",
+ "version": "2.1.0",
+ "author": "camptocamp",
+ "summary": "Puppet Systemd module",
+ "license": "Apache-2.0",
+ "source": "https://github.com/camptocamp/puppet-systemd",
+ "project_page": "https://github.com/camptocamp/puppet-systemd",
+ "issues_url": "https://github.com/camptocamp/puppet-systemd/issues",
+ "dependencies": [
+ {
+ "name": "puppetlabs/stdlib",
+ "version_requirement": ">= 4.13.1 < 6.0.0"
+ }
+ ],
+ "data_provider": null,
+ "requirements": [
+ {
+ "name": "puppet",
+ "version_requirement": ">= 4.10.10 < 6.0.0"
+ }
+ ],
+ "operatingsystem_support": [
+ {
+ "operatingsystem": "Debian",
+ "operatingsystemrelease": [
+ "8",
+ "9",
+ "10"
+ ]
+ },
+ {
+ "operatingsystem": "Ubuntu",
+ "operatingsystemrelease": [
+ "16.04",
+ "18.04"
+ ]
+ },
+ {
+ "operatingsystem": "RedHat",
+ "operatingsystemrelease": [
+ "7"
+ ]
+ },
+ {
+ "operatingsystem": "CentOS",
+ "operatingsystemrelease": [
+ "7"
+ ]
+ },
+ {
+ "operatingsystem": "Archlinux"
+ }
+ ]
+}
--- /dev/null
+HOSTS:
+ centos-5-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: el-5-x86_64
+ hypervisor : docker
+ image: centos:5
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'yum install -y crontabs tar wget'
+CONFIG:
+ type: foss
+ log_level: debug
--- /dev/null
+HOSTS:
+ centos-5-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: el-5-x86_64
+ hypervisor : docker
+ image: tianon/centos:5.10
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'yum install -y crontabs tar wget which'
+ - 'sed -i -e "/mingetty/d" /etc/inittab'
+CONFIG:
+ type: aio
+ log_level: debug
--- /dev/null
+HOSTS:
+ centos-6-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: el-6-x86_64
+ hypervisor : docker
+ image: centos:6
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'yum install -y crontabs tar wget'
+CONFIG:
+ type: foss
+ log_level: debug
--- /dev/null
+HOSTS:
+ centos-6-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: el-6-x86_64
+ hypervisor : openstack
+ flavor: m1.small
+ image: centos-6-latest
+ user: root
+CONFIG:
+ type: foss
+ log_level: debug
+ openstack_network: default
--- /dev/null
+HOSTS:
+ centos-6-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: el-6-x86_64
+ hypervisor : vagrant
+ box : camptocamp/centos-6-x86_64
+CONFIG:
+ type: foss
+ log_level: debug
--- /dev/null
+HOSTS:
+ centos-6-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: el-6-x86_64
+ hypervisor : docker
+ image: centos:6
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'rm -rf /var/run/network/*'
+ - 'yum install -y crontabs tar wget'
+ - 'rm /etc/init/tty.conf'
+CONFIG:
+ type: aio
+ log_level: debug
--- /dev/null
+HOSTS:
+ centos-7-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: el-7-x86_64
+ hypervisor : docker
+ image: centos:7
+ docker_preserve_image: true
+ docker_cmd: '["/usr/sbin/init"]'
+ docker_image_commands:
+ - 'yum install -y crontabs tar wget'
+CONFIG:
+ type: foss
+ log_level: debug
--- /dev/null
+HOSTS:
+ centos-7-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: el-7-x86_64
+ hypervisor : openstack
+ flavor: m1.small
+ image: centos-7-latest
+ user: centos
+CONFIG:
+ type: foss
+ log_level: debug
+ openstack_network: default
--- /dev/null
+HOSTS:
+ centos-7-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: el-7-x86_64
+ hypervisor : vagrant
+ box : camptocamp/centos-7-x86_64
+CONFIG:
+ type: foss
+ log_level: debug
--- /dev/null
+HOSTS:
+ centos-7-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: el-7-x86_64
+ hypervisor : docker
+ image: centos:7
+ docker_preserve_image: true
+ docker_cmd: '["/usr/sbin/init"]'
+ docker_image_commands:
+ - 'yum install -y crontabs tar wget iproute'
+CONFIG:
+ type: aio
+ log_level: debug
--- /dev/null
+HOSTS:
+ debian-6-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: debian-6-amd64
+ hypervisor : docker
+ image: debian:6
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'apt-get install -y wget'
+CONFIG:
+ type: foss
+ log_level: debug
--- /dev/null
+HOSTS:
+ debian-6-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: debian-6-amd64
+ hypervisor : openstack
+ flavor: m1.small
+ image: debian-6-latest
+ user: debian
+CONFIG:
+ type: foss
+ log_level: debug
+ openstack_network: default
--- /dev/null
+HOSTS:
+ debian-6-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: debian-6-amd64
+ hypervisor : vagrant
+ box : puppetlabs/debian-6.0.10-64-nocm
+CONFIG:
+ type: foss
+ log_level: debug
--- /dev/null
+HOSTS:
+ debian-6-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: debian-6-amd64
+ hypervisor : docker
+ image: debian/eol:squeeze
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'apt-get install -y cron locales-all net-tools wget'
+CONFIG:
+ type: aio
+ log_level: debug
--- /dev/null
+HOSTS:
+ debian-7-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: debian-7-amd64
+ hypervisor : docker
+ image: debian:7
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'apt-get install -y cron wget'
+CONFIG:
+ type: foss
+ log_level: debug
--- /dev/null
+HOSTS:
+ debian-7-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: debian-7-amd64
+ hypervisor : openstack
+ flavor: m1.small
+ image: debian-7-latest
+ user: debian
+CONFIG:
+ type: foss
+ log_level: debug
+ openstack_network: default
--- /dev/null
+HOSTS:
+ debian-7-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: debian-7-amd64
+ hypervisor : vagrant
+ box : camptocamp/debian-7-amd64
+CONFIG:
+ type: foss
+ log_level: debug
--- /dev/null
+HOSTS:
+ debian-7-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: debian-7-amd64
+ hypervisor : docker
+ image: debian:7
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'apt-get install -y cron locales-all net-tools wget'
+CONFIG:
+ type: aio
+ log_level: debug
--- /dev/null
+HOSTS:
+ debian-8-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: debian-8-amd64
+ hypervisor : docker
+ image: debian:8
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'apt-get install -y cron wget'
+CONFIG:
+ type: foss
+ log_level: debug
--- /dev/null
+HOSTS:
+ debian-8-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: debian-8-amd64
+ hypervisor : openstack
+ flavor: m1.small
+ image: debian-8-latest
+ user: debian
+CONFIG:
+ type: foss
+ log_level: debug
+ openstack_network: default
--- /dev/null
+HOSTS:
+ debian-8-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: debian-8-amd64
+ hypervisor : vagrant
+ box : camptocamp/debian-8-amd64
+CONFIG:
+ type: foss
+ log_level: debug
--- /dev/null
+HOSTS:
+ debian-8-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: debian-8-amd64
+ hypervisor : docker
+ image: debian:8
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'apt-get install -y cron locales-all net-tools wget'
+ - 'rm -f /usr/sbin/policy-rc.d'
+CONFIG:
+ type: aio
+ log_level: debug
--- /dev/null
+HOSTS:
+ ubuntu-1004-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: ubuntu-10.04-amd64
+ hypervisor : docker
+ image: ubuntu:10.04
+ # This stops the image from being deleted on completion, speeding up the process.
+ docker_preserve_image: true
+CONFIG:
+ type: foss
+ log_level: debug
--- /dev/null
+HOSTS:
+ ubuntu-1204-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: ubuntu-12.04-amd64
+ hypervisor : docker
+ image: ubuntu:12.04
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'apt-get install -y wget'
+CONFIG:
+ type: foss
+ log_level: debug
--- /dev/null
+HOSTS:
+ ubuntu-1204-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: ubuntu-12.04-amd64
+ hypervisor : openstack
+ flavor: m1.small
+ image: ubuntu-1204-latest
+ user: ubuntu
+CONFIG:
+ type: foss
+ log_level: debug
+ openstack_network: default
--- /dev/null
+HOSTS:
+ ubuntu-1204-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: ubuntu-12.04-amd64
+ hypervisor : docker
+ image: ubuntu:12.04
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'apt-get install -y net-tools wget'
+ - 'locale-gen en_US.UTF-8'
+CONFIG:
+ type: aio
+ log_level: debug
--- /dev/null
+HOSTS:
+ ubuntu-1404-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: ubuntu-14.04-amd64
+ hypervisor : docker
+ image: ubuntu:14.04
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'apt-get install -y wget'
+CONFIG:
+ type: foss
+ log_level: debug
--- /dev/null
+HOSTS:
+ ubuntu-1404-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: ubuntu-14.04-amd64
+ hypervisor : openstack
+ flavor: m1.small
+ image: ubuntu-1404-latest
+ user: ubuntu
+CONFIG:
+ type: foss
+ log_level: debug
+ openstack_network: default
--- /dev/null
+HOSTS:
+ ubuntu-1404-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: ubuntu-14.04-amd64
+ hypervisor : vagrant
+ box : puppetlabs/ubuntu-14.04-64-nocm
+CONFIG:
+ type: foss
+ log_level: debug
--- /dev/null
+HOSTS:
+ ubuntu-1404-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: ubuntu-14.04-amd64
+ hypervisor : docker
+ image: ubuntu:14.04
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'rm /usr/sbin/policy-rc.d'
+ - 'rm /sbin/initctl; dpkg-divert --rename --remove /sbin/initctl'
+ - 'apt-get install -y net-tools wget'
+ - 'locale-gen en_US.UTF-8'
+CONFIG:
+ type: aio
+ log_level: debug
--- /dev/null
+HOSTS:
+ ubuntu-1410-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: ubuntu-14.10-amd64
+ hypervisor : docker
+ image: ubuntu:14.10
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'apt-get install -y wget'
+CONFIG:
+ type: foss
+ log_level: debug
--- /dev/null
+HOSTS:
+ ubuntu-1410-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: ubuntu-14.10-amd64
+ hypervisor : openstack
+ flavor: m1.small
+ image: ubuntu-1410-latest
+ user: ubuntu
+CONFIG:
+ type: foss
+ log_level: debug
+ openstack_network: default
--- /dev/null
+HOSTS:
+ ubuntu-1410-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: ubuntu-14.10-amd64
+ hypervisor : docker
+ image: ubuntu:14.10
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'rm /usr/sbin/policy-rc.d'
+ - 'rm /sbin/initctl; dpkg-divert --rename --remove /sbin/initctl'
+ - 'apt-get install -y net-tools wget'
+ - 'locale-gen en_US.UTF-8'
+CONFIG:
+ type: aio
+ log_level: debug
--- /dev/null
+HOSTS:
+ ubuntu-1504-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: ubuntu-15.04-amd64
+ hypervisor : docker
+ image: ubuntu:15.04
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'apt-get install -y wget'
+CONFIG:
+ type: foss
+ log_level: debug
--- /dev/null
+HOSTS:
+ ubuntu-1504-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: ubuntu-15.04-amd64
+ hypervisor : openstack
+ flavor: m1.small
+ image: ubuntu-1504-latest
+ user: ubuntu
+CONFIG:
+ type: foss
+ log_level: debug
+ openstack_network: default
--- /dev/null
+HOSTS:
+ ubuntu-1504-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: ubuntu-15.04-amd64
+ hypervisor : docker
+ image: ubuntu:15.04
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'apt-get install -y net-tools wget'
+ - 'locale-gen en_US.UTF-8'
+CONFIG:
+ type: aio
+ log_level: debug
--- /dev/null
+HOSTS:
+ ubuntu-1510-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: ubuntu-15.10-amd64
+ hypervisor : docker
+ image: ubuntu:15.10
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'apt-get install -y net-tools wget'
+ - 'locale-gen en_US.UTF-8'
+CONFIG:
+ type: aio
+ log_level: debug
--- /dev/null
+HOSTS:
+ ubuntu-1604-x64:
+ default_apply_opts:
+ order: random
+ strict_variables:
+ platform: ubuntu-16.04-amd64
+ hypervisor : docker
+ image: ubuntu:16.04
+ docker_preserve_image: true
+ docker_cmd: '["/sbin/init"]'
+ docker_image_commands:
+ - 'apt-get install -y net-tools wget'
+ - 'locale-gen en_US.UTF-8'
+CONFIG:
+ type: aio
+ log_level: debug
--- /dev/null
+require 'spec_helper'
+
+describe 'systemd' do
+ context 'supported operating systems' do
+ on_supported_os.each do |os, facts|
+ context "on #{os}" do
+ let(:facts) { facts }
+
+ it { is_expected.to compile.with_all_deps }
+ it { is_expected.to create_class('systemd') }
+ it { is_expected.to create_class('systemd::systemctl::daemon_reload') }
+ it { is_expected.to_not create_service('systemd-resolved') }
+ it { is_expected.to_not create_service('systemd-networkd') }
+ it { is_expected.to_not create_service('systemd-timesyncd') }
+
+ context 'when enabling resolved and networkd' do
+ let(:params) {{
+ :manage_resolved => true,
+ :manage_networkd => true
+ }}
+
+ it { is_expected.to create_service('systemd-resolved').with_ensure('running') }
+ it { is_expected.to create_service('systemd-resolved').with_enable(true) }
+ it { is_expected.to create_service('systemd-networkd').with_ensure('running') }
+ it { is_expected.to create_service('systemd-networkd').with_enable(true) }
+ end
+
+ context 'when enabling resolved with DNS values (string)' do
+ let(:params) {{
+ :manage_resolved => true,
+ :dns => '8.8.8.8 8.8.4.4',
+ :fallback_dns => '2001:4860:4860::8888 2001:4860:4860::8844',
+ }}
+
+ it { is_expected.to create_service('systemd-resolved').with_ensure('running') }
+ it { is_expected.to create_service('systemd-resolved').with_enable(true) }
+ it { is_expected.to contain_ini_setting('dns')}
+ it { is_expected.to contain_ini_setting('fallback_dns')}
+ it { is_expected.not_to contain_ini_setting('domains')}
+ it { is_expected.not_to contain_ini_setting('multicast_dns')}
+ it { is_expected.not_to contain_ini_setting('llmnr')}
+ it { is_expected.not_to contain_ini_setting('dnssec')}
+ it { is_expected.not_to contain_ini_setting('cache')}
+ it { is_expected.not_to contain_ini_setting('dns_stub_listener')}
+ end
+
+ context 'when enabling resolved with DNS values (array)' do
+ let(:params) {{
+ :manage_resolved => true,
+ :dns => %w(8.8.8.8 8.8.4.4),
+ :fallback_dns => %w(2001:4860:4860::8888 2001:4860:4860::8844),
+ }}
+
+ it { is_expected.to create_service('systemd-resolved').with_ensure('running') }
+ it { is_expected.to create_service('systemd-resolved').with_enable(true) }
+ it { is_expected.to contain_ini_setting('dns')}
+ it { is_expected.to contain_ini_setting('fallback_dns')}
+ it { is_expected.not_to contain_ini_setting('domains')}
+ it { is_expected.not_to contain_ini_setting('multicast_dns')}
+ it { is_expected.not_to contain_ini_setting('llmnr')}
+ it { is_expected.not_to contain_ini_setting('dnssec')}
+ it { is_expected.not_to contain_ini_setting('cache')}
+ it { is_expected.not_to contain_ini_setting('dns_stub_listener')}
+ end
+
+ context 'when enabling resolved with DNS values (full)' do
+ let(:params) {{
+ :manage_resolved => true,
+ :dns => %w(8.8.8.8 8.8.4.4),
+ :fallback_dns => %w(2001:4860:4860::8888 2001:4860:4860::8844),
+ :domains => %w(2001:4860:4860::8888 2001:4860:4860::8844),
+ :llmnr => true,
+ :multicast_dns => false,
+ :dnssec => false,
+ :cache => true,
+ :dns_stub_listener => 'udp',
+ }}
+
+ it { is_expected.to create_service('systemd-resolved').with_ensure('running') }
+ it { is_expected.to create_service('systemd-resolved').with_enable(true) }
+ it { is_expected.to contain_ini_setting('dns')}
+ it { is_expected.to contain_ini_setting('fallback_dns')}
+ it { is_expected.to contain_ini_setting('domains')}
+ it { is_expected.to contain_ini_setting('multicast_dns')}
+ it { is_expected.to contain_ini_setting('llmnr')}
+ it { is_expected.to contain_ini_setting('dnssec')}
+ it { is_expected.to contain_ini_setting('cache')}
+ it { is_expected.to contain_ini_setting('dns_stub_listener')}
+ end
+
+ context 'when enabling timesyncd' do
+ let(:params) {{
+ :manage_timesyncd => true
+ }}
+
+ it { is_expected.to create_service('systemd-timesyncd').with_ensure('running') }
+ it { is_expected.to create_service('systemd-timesyncd').with_enable(true) }
+ it { is_expected.not_to create_service('systemd-resolved').with_ensure('running') }
+ it { is_expected.not_to create_service('systemd-resolved').with_enable(true) }
+ it { is_expected.not_to create_service('systemd-networkd').with_ensure('running') }
+ it { is_expected.not_to create_service('systemd-networkd').with_enable(true) }
+ end
+
+ context 'when enabling timesyncd with NTP values (string)' do
+ let(:params) {{
+ :manage_timesyncd => true,
+ :ntp_server => '0.pool.ntp.org 1.pool.ntp.org',
+ :fallback_ntp_server => '2.pool.ntp.org 3.pool.ntp.org'
+ }}
+ it { is_expected.to compile.with_all_deps }
+ it { is_expected.to contain_ini_setting('ntp_server')}
+ it { is_expected.to contain_ini_setting('fallback_ntp_server')}
+ end
+
+ context 'when enabling timesyncd with NTP values (array)' do
+ let(:params) {{
+ :manage_timesyncd => true,
+ :ntp_server => %w(0.pool.ntp.org 1.pool.ntp.org),
+ :fallback_ntp_server => %w(2.pool.ntp.org 3.pool.ntp.org)
+ }}
+ it { is_expected.to compile.with_all_deps }
+ it { is_expected.to contain_ini_setting('ntp_server')}
+ it { is_expected.to contain_ini_setting('fallback_ntp_server')}
+ end
+
+ context 'when passing service limits' do
+ let(:params) {{
+ :service_limits => {'openstack-nova-compute.service' => {'limits' => {'LimitNOFILE' => 32768}}}
+ }}
+
+ it { is_expected.to compile.with_all_deps }
+ it { is_expected.to contain_systemd__service_limits('openstack-nova-compute.service').with_limits({'LimitNOFILE' => 32768}) }
+ end
+
+ context 'when managing Accounting options' do
+ let :params do
+ {
+ manage_accounting: true,
+ }
+ end
+
+ it { is_expected.to contain_class('systemd::system')}
+
+ case facts[:os]['family']
+ when 'Archlinux'
+ accounting = ['DefaultCPUAccounting', 'DefaultIOAccounting', 'DefaultIPAccounting', 'DefaultBlockIOAccounting', 'DefaultMemoryAccounting', 'DefaultTasksAccounting']
+ when 'Debian'
+ accounting = ['DefaultCPUAccounting', 'DefaultBlockIOAccounting', 'DefaultMemoryAccounting']
+ when 'RedHat'
+ accounting = ['DefaultCPUAccounting', 'DefaultBlockIOAccounting', 'DefaultMemoryAccounting', 'DefaultTasksAccounting']
+ end
+ accounting.each do |account|
+ it { is_expected.to contain_ini_setting(account)}
+ end
+ it { is_expected.to compile.with_all_deps }
+ end
+ end
+ end
+ end
+end
--- /dev/null
+require 'spec_helper'
+
+describe 'systemd::systemctl::daemon_reload' do
+ context 'supported operating systems' do
+ on_supported_os.each do |os, facts|
+ context "on #{os}" do
+ let(:facts) { facts }
+
+ it { is_expected.to compile.with_all_deps }
+ it { is_expected.to create_class('systemd::systemctl::daemon_reload') }
+ it { is_expected.to create_exec('systemctl-daemon-reload') }
+ end
+ end
+ end
+end
--- /dev/null
+require 'spec_helper'
+
+describe 'systemd::tmpfiles' do
+ context 'supported operating systems' do
+ on_supported_os.each do |os, facts|
+ context "on #{os}" do
+ let(:facts) { facts }
+
+ it { is_expected.to compile.with_all_deps }
+ it { is_expected.to create_class('systemd::tmpfiles') }
+ it { is_expected.to contain_exec('systemd-tmpfiles').with_command('systemd-tmpfiles --create') }
+ end
+ end
+ end
+end
--- /dev/null
+---
+systemd-fsck-root.service: enabled-runtime
+systemd-journal-gatewayd.service: indirect
+systemd-journal-remote.service: indirect
+systemd-journal-upload.service: disabled
+systemd-networkd-wait-online.service: enabled
+systemd-networkd.service: enabled
+systemd-nspawn@.service: disabled
+systemd-resolved.service: enabled
+systemd-timesyncd.service: disabled
--- /dev/null
+require 'spec_helper'
+
+describe 'systemd::dropin_file' do
+ context 'supported operating systems' do
+ on_supported_os.each do |os, facts|
+ context "on #{os}" do
+ let(:facts) { facts }
+
+ let(:title) { 'test.conf' }
+
+ let(:params) {{
+ :unit => 'test.service',
+ :content => 'random stuff'
+ }}
+
+ it { is_expected.to compile.with_all_deps }
+
+ it { is_expected.to create_file("/etc/systemd/system/#{params[:unit]}.d").with(
+ :ensure => 'directory',
+ ) }
+
+ it { is_expected.to create_file("/etc/systemd/system/#{params[:unit]}.d/#{title}").with(
+ :ensure => 'file',
+ :content => /#{params[:content]}/,
+ :mode => '0444'
+ ) }
+
+ it { is_expected.to create_file("/etc/systemd/system/#{params[:unit]}.d/#{title}").that_notifies('Class[systemd::systemctl::daemon_reload]') }
+
+ context 'with a bad unit type' do
+ let(:title) { 'test.badtype' }
+
+ it {
+ expect{
+ is_expected.to compile.with_all_deps
+ }.to raise_error(/expects a match for Systemd::Dropin/)
+ }
+ end
+
+ context 'with another drop-in file with the same filename (and content)' do
+ let(:default_params) {{
+ :filename => 'longer-timeout.conf',
+ :content => 'random stuff'
+ }}
+ # Create drop-in file longer-timeout.conf for unit httpd.service
+ let :pre_condition do
+ "systemd::dropin_file { 'httpd_longer-timeout':
+ filename => '#{default_params[:filename]}',
+ unit => 'httpd.service',
+ content => '#{default_params[:context]}',
+ }"
+ end
+ #
+ # Create drop-in file longer-timeout.conf for unit ftp.service
+ let (:title) {'ftp_longer-timeout'}
+ let :params do
+ default_params.merge({
+ :unit => 'ftp.service'
+ })
+ end
+
+ it { is_expected.to create_file("/etc/systemd/system/#{params[:unit]}.d/#{params[:filename]}").with(
+ :ensure => 'file',
+ :content => /#{params[:content]}/,
+ :mode => '0444'
+ ) }
+ end
+ end
+ end
+ end
+end
--- /dev/null
+require 'spec_helper'
+
+describe 'systemd::network' do
+ let :params do
+ {
+ restart_service: true
+ }
+ end
+
+ let(:title) { 'eth0.network' }
+
+ on_supported_os.each do |os, facts|
+ let :facts do
+ facts
+ end
+
+ context 'with all defaults' do
+ it { is_expected.to compile.with_all_deps }
+ end
+ end
+end
--- /dev/null
+require 'spec_helper'
+
+describe 'systemd::service_limits' do
+ context 'supported operating systems' do
+ on_supported_os.each do |os, facts|
+ context "on #{os}" do
+ let(:facts) { facts }
+
+ let(:title) { 'test.service' }
+
+ describe 'with limits and present' do
+ let(:params) {{
+ :limits => {
+ 'LimitCPU' => '10m',
+ 'LimitFSIZE' => 'infinity',
+ 'LimitDATA' => '10K',
+ 'LimitNOFILE' => '20:infinity',
+ 'LimitNICE' => '-10',
+ 'LimitRTPRIO' => 50,
+ 'IODeviceWeight' => [
+ {'/dev/weight' => 10},
+ {'/dev/weight2' => 20}
+ ],
+ 'IOReadBandwidthMax' => [
+ {'/bw/max' => '10K'}
+ ]
+ }
+ }}
+
+ it { is_expected.to compile.with_all_deps }
+ it { is_expected.to create_file("/etc/systemd/system/#{title}.d/90-limits.conf").with(
+ :ensure => 'file',
+ :content => /LimitCPU=10m/,
+ :mode => '0444'
+ ) }
+ it { is_expected.to create_file("/etc/systemd/system/#{title}.d/90-limits.conf").with(
+ :content => /LimitFSIZE=infinity/
+ ) }
+ it { is_expected.to create_file("/etc/systemd/system/#{title}.d/90-limits.conf").with(
+ :content => /LimitDATA=10K/
+ ) }
+ it { is_expected.to create_file("/etc/systemd/system/#{title}.d/90-limits.conf").with(
+ :content => /LimitNOFILE=20:infinity/
+ ) }
+ it { is_expected.to create_file("/etc/systemd/system/#{title}.d/90-limits.conf").with(
+ :content => /LimitNICE=-10/
+ ) }
+ it { is_expected.to create_file("/etc/systemd/system/#{title}.d/90-limits.conf").with(
+ :content => /LimitRTPRIO=50/
+ ) }
+ it { is_expected.to create_file("/etc/systemd/system/#{title}.d/90-limits.conf").with(
+ :content => %r(IODeviceWeight=/dev/weight 10)
+ ) }
+ it { is_expected.to create_file("/etc/systemd/system/#{title}.d/90-limits.conf").with(
+ :content => %r(IODeviceWeight=/dev/weight2 20)
+ ) }
+ it { is_expected.to create_file("/etc/systemd/system/#{title}.d/90-limits.conf").with(
+ :content => %r(IOReadBandwidthMax=/bw/max 10K)
+ ) }
+ it { is_expected.to create_exec("restart #{title} because limits").with(
+ :command => "systemctl restart #{title}",
+ :refreshonly => true
+ ) }
+ end
+
+ describe 'ensured absent' do
+ let(:params) {{
+ :ensure => 'absent',
+ }}
+
+ it { is_expected.to compile.with_all_deps }
+ it do
+ is_expected.to create_file("/etc/systemd/system/#{title}.d/90-limits.conf")
+ .with_ensure('absent')
+ .that_notifies("Exec[restart #{title} because limits]")
+ end
+ it do
+ is_expected.to create_exec("restart #{title} because limits")
+ .with_command("systemctl restart #{title}")
+ .with_refreshonly(true)
+ end
+ end
+ end
+ end
+ end
+end
--- /dev/null
+require 'spec_helper'
+
+describe 'systemd::tmpfile' do
+ context 'supported operating systems' do
+ on_supported_os.each do |os, facts|
+ context "on #{os}" do
+ let(:facts) { facts }
+
+ let(:title) { 'random_tmpfile' }
+
+ let(:params) {{
+ :content => 'random stuff'
+ }}
+
+ it { is_expected.to compile.with_all_deps }
+ it { is_expected.to create_file("/etc/tmpfiles.d/#{title}").with(
+ :ensure => 'file',
+ :content => /#{params[:content]}/,
+ :mode => '0444'
+ ) }
+ end
+ end
+ end
+end
--- /dev/null
+require 'spec_helper'
+
+describe 'systemd::unit_file' do
+ context 'supported operating systems' do
+ on_supported_os.each do |os, facts|
+ context "on #{os}" do
+ let(:facts) { facts }
+
+ let(:title) { 'test.service' }
+
+ let(:params) {{
+ :content => 'random stuff'
+ }}
+
+ it { is_expected.to compile.with_all_deps }
+
+ it { is_expected.to create_file("/etc/systemd/system/#{title}").with(
+ :ensure => 'file',
+ :content => /#{params[:content]}/,
+ :mode => '0444'
+ ) }
+
+ it { is_expected.to create_file("/etc/systemd/system/#{title}").that_notifies('Class[systemd::systemctl::daemon_reload]') }
+
+ context 'with a bad unit type' do
+ let(:title) { 'test.badtype' }
+
+ it {
+ expect{
+ is_expected.to compile.with_all_deps
+ }.to raise_error(/expects a match for Systemd::Unit/)
+ }
+ end
+
+ context 'with enable => true and active => true' do
+ let(:params) do
+ super().merge({
+ :enable => true,
+ :active => true
+ })
+ end
+
+ it { is_expected.to contain_service('test.service').with(
+ :ensure => true,
+ :enable => true,
+ :provider => 'systemd'
+ ) }
+
+ it { is_expected.to contain_service('test.service').that_subscribes_to("File[/etc/systemd/system/#{title}]") }
+ it { is_expected.to contain_service('test.service').that_requires('Class[systemd::systemctl::daemon_reload]') }
+ end
+ end
+ end
+ end
+end
--- /dev/null
+--format
+s
+--colour
+--loadby
+mtime
+--backtrace
--- /dev/null
+require 'puppetlabs_spec_helper/module_spec_helper'
+require 'rspec-puppet-facts'
+include RspecPuppetFacts
+
+
+add_custom_fact :systemd_internal_services, YAML.load(File.read(File.expand_path('../default_module_facts.yaml', __FILE__)))
+
+RSpec.configure do |c|
+ c.include PuppetlabsSpec::Files
+
+ # Useless backtrace noise
+ backtrace_exclusion_patterns = [
+ /spec_helper/,
+ /gems/
+ ]
+
+ if c.respond_to?(:backtrace_exclusion_patterns)
+ c.backtrace_exclusion_patterns = backtrace_exclusion_patterns
+ elsif c.respond_to?(:backtrace_clean_patterns)
+ c.backtrace_clean_patterns = backtrace_exclusion_patterns
+ end
+
+ c.before :each do
+ # Store any environment variables away to be restored later
+ @old_env = {}
+ ENV.each_key {|k| @old_env[k] = ENV[k]}
+
+ c.strict_variables = Gem::Version.new(Puppet.version) >= Gem::Version.new('3.5')
+ Puppet.features.stubs(:root?).returns(true)
+ end
+
+ c.after :each do
+ PuppetlabsSpec::Files.cleanup
+ end
+end
--- /dev/null
+require "spec_helper"
+
+describe Facter::Util::Fact do
+ before { Facter.clear }
+ after { Facter.clear }
+
+ describe 'systemd' do
+ context 'returns true when systemd present' do
+ before do
+ Facter.fact(:kernel).stubs(:value).returns(:linux)
+ Facter.add(:service_provider) { setcode { 'systemd' } }
+ end
+
+ it { expect(Facter.value(:service_provider)).to eq('systemd') }
+ it { expect(Facter.value(:systemd)).to be true }
+ end
+
+ context 'returns false when systemd not present' do
+ before do
+ Facter.fact(:kernel).stubs(:value).returns(:linux)
+ Facter.add(:service_provider) { setcode { 'redhat' } }
+ end
+
+ it { expect(Facter.value(:service_provider)).to eq('redhat') }
+ it { expect(Facter.value(:systemd)).to be false }
+ end
+
+ context 'returns nil when kernel is not linux' do
+ before do
+ Facter.fact(:kernel).stubs(:value).returns(:windows)
+ end
+
+ it { expect(Facter.value(:systemd)).to be_nil }
+ end
+ end
+end
--- /dev/null
+require "spec_helper"
+
+describe Facter::Util::Fact do
+ before {
+ Facter.clear
+ }
+
+ describe "systemd_version" do
+ context 'returns version when systemd fact present' do
+ before do
+ Facter.fact(:systemd).stubs(:value).returns(true)
+ end
+ let(:facts) { {:systemd => true} }
+ it do
+ Facter::Util::Resolution.expects(:exec).with("systemctl --version | awk '/systemd/{ print $2 }'").returns('229')
+ expect(Facter.value(:systemd_version)).to eq('229')
+ end
+ end
+ context 'returns nil when systemd fact not present' do
+ before do
+ Facter.fact(:systemd).stubs(:value).returns(false)
+ end
+ let(:facts) { {:systemd => false } }
+ it do
+ Facter::Util::Resolution.stubs(:exec)
+ Facter::Util::Resolution.expects(:exec).with("systemctl --version | awk '/systemd/{ print $2 }'").never
+ expect(Facter.value(:systemd_version)).to eq(nil)
+ end
+ end
+ end
+end
--- /dev/null
+# This file managed by Puppet - DO NOT EDIT
+[Service]
+<%
+ @limits.keys.sort.each do |k|
+
+ # Handles the Path and Option entries
+ if @limits[k].is_a?(Array)
+ output = @limits[k].map{|x|
+ x = %(#{k}=#{x.to_a.flatten.join(' ')})
+ }.join("\n")
+ else
+ output = %(#{k}=#{@limits[k]})
+ end
+-%>
+<%= output %>
+<% end -%>
--- /dev/null
+type Systemd::Dropin = Pattern['^.+\.conf$']
--- /dev/null
+# Matches Systemd Service Limit Struct
+type Systemd::ServiceLimits = Struct[
+ {
+ Optional['LimitCPU'] => Pattern['^\d+(s|m|h|d|w|M|y)?(:\d+(s|m|h|d|w|M|y)?)?$'],
+ Optional['LimitFSIZE'] => Pattern['^(infinity|((\d+(K|M|G|T|P|E)(:\d+(K|M|G|T|P|E))?)))$'],
+ Optional['LimitDATA'] => Pattern['^(infinity|((\d+(K|M|G|T|P|E)(:\d+(K|M|G|T|P|E))?)))$'],
+ Optional['LimitSTACK'] => Pattern['^(infinity|((\d+(K|M|G|T|P|E)(:\d+(K|M|G|T|P|E))?)))$'],
+ Optional['LimitCORE'] => Pattern['^(infinity|((\d+(K|M|G|T|P|E)(:\d+(K|M|G|T|P|E))?)))$'],
+ Optional['LimitRSS'] => Pattern['^(infinity|((\d+(K|M|G|T|P|E)(:\d+(K|M|G|T|P|E))?)))$'],
+ Optional['LimitNOFILE'] => Variant[Integer[-1],Pattern['^(infinity|\d+(:(infinity|\d+))?)$']],
+ Optional['LimitAS'] => Pattern['^(infinity|((\d+(K|M|G|T|P|E)(:\d+(K|M|G|T|P|E))?)))$'],
+ Optional['LimitNPROC'] => Integer[1],
+ Optional['LimitMEMLOCK'] => Pattern['^(infinity|((\d+(K|M|G|T|P|E)(:\d+(K|M|G|T|P|E))?)))$'],
+ Optional['LimitLOCKS'] => Integer[1],
+ Optional['LimitSIGPENDING'] => Integer[1],
+ Optional['LimitMSGQUEUE'] => Pattern['^(infinity|((\d+(K|M|G|T|P|E)(:\d+(K|M|G|T|P|E))?)))$'],
+ Optional['LimitNICE'] => Variant[Integer[0,40], Pattern['^(-\+([0-1]?[0-9]|20))|([0-3]?[0-9]|40)$']],
+ Optional['LimitRTPRIO'] => Integer[0],
+ Optional['LimitRTTIME'] => Pattern['^\d+(ms|s|m|h|d|w|M|y)?(:\d+(ms|s|m|h|d|w|M|y)?)?$'],
+ Optional['CPUAccounting'] => Boolean,
+ Optional['CPUShares'] => Integer[2,262144],
+ Optional['StartupCPUShares'] => Integer[2,262144],
+ Optional['CPUQuota'] => Pattern['^([1-9][0-9]?$|^100)%$'],
+ Optional['MemoryAccounting'] => Boolean,
+ Optional['MemoryLow'] => Pattern['^(\d+(K|M|G|T)?)$'],
+ Optional['MemoryHigh'] => Pattern['^(\d+(K|M|G|T)?)$'],
+ Optional['MemoryMax'] => Pattern['^(\d+(K|M|G|T)?)$'],
+ Optional['MemoryLimit'] => Pattern['^(\d+(K|M|G|T)?)$'],
+ Optional['TasksAccounting'] => Boolean,
+ Optional['TasksMax'] => Variant[Integer[1],Pattern['^(infinity|([1-9][0-9]?$|^100)%)$']],
+ Optional['IOAccounting'] => Boolean,
+ Optional['IOWeight'] => Integer[1,10000],
+ Optional['StartupIOWeight'] => Integer[1,10000],
+ Optional['IODeviceWeight'] => Array[Hash[Stdlib::Absolutepath, Integer[1,10000], 1, 1]],
+ Optional['IOReadBandwidthMax'] => Array[Hash[Stdlib::Absolutepath, Pattern['^(\d+(K|M|G|T)?)$'], 1, 1]],
+ Optional['IOWriteBandwidthMax'] => Array[Hash[Stdlib::Absolutepath, Pattern['^(\d+(K|M|G|T)?)$'], 1, 1]],
+ Optional['IOReadIOPSMax'] => Array[Hash[Stdlib::Absolutepath, Pattern['^(\d+(K|M|G|T)?)$'], 1, 1]],
+ Optional['IOWriteIOPSMax'] => Array[Hash[Stdlib::Absolutepath, Pattern['^(\d+(K|M|G|T)?)$'], 1, 1]],
+ Optional['DeviceAllow'] => String[1],
+ Optional['DevicePolicy'] => Enum['auto','closed','strict'],
+ Optional['Slice'] => String[1],
+ Optional['Delegate'] => Boolean
+ }
+]
--- /dev/null
+type Systemd::Unit = Pattern['^.+\.(service|socket|device|mount|automount|swap|target|path|timer|slice|scope)$']