%global ruby_ver 3.2 %global ruby_vendorlib %{_datadir}/ruby%{ruby_ver}/vendor_ruby %global puppet_version 8.10.0 # Bundled gem versions %global concurrent_ruby_ver 1.3.4 %global deep_merge_ver 1.2.2 %global fast_gettext_ver 3.1.0 %global getoptlong_ver 0.2.1 %global locale_ver 2.1.4 %global multi_json_ver 1.15.0 %global puppet_resource_api_ver 1.9.0 %global scanf_ver 1.0.0 %global semantic_puppet_ver 1.1.0 %global prime_ver 0.1.2 Name: puppet Version: %{puppet_version} Release: 1%{?dist} Summary: Configuration management tool License: Apache-2.0 URL: https://github.com/puppetlabs/puppet Source0: https://github.com/puppetlabs/puppet/archive/%{puppet_version}/puppet-%{puppet_version}.tar.gz Source10: https://rubygems.org/downloads/concurrent-ruby-%{concurrent_ruby_ver}.gem Source11: https://rubygems.org/downloads/deep_merge-%{deep_merge_ver}.gem Source12: https://rubygems.org/downloads/fast_gettext-%{fast_gettext_ver}.gem Source13: https://rubygems.org/downloads/getoptlong-%{getoptlong_ver}.gem Source14: https://rubygems.org/downloads/locale-%{locale_ver}.gem Source15: https://rubygems.org/downloads/multi_json-%{multi_json_ver}.gem Source16: https://rubygems.org/downloads/puppet-resource_api-%{puppet_resource_api_ver}.gem Source17: https://rubygems.org/downloads/scanf-%{scanf_ver}.gem Source18: https://rubygems.org/downloads/semantic_puppet-%{semantic_puppet_ver}.gem Source19: https://rubygems.org/downloads/prime-%{prime_ver}.gem BuildArch: noarch BuildRequires: ruby%{ruby_ver} BuildRequires: ruby%{ruby_ver}-rubygems BuildRequires: systemd-rpm-macros Requires: ruby%{ruby_ver} Requires: facter >= 4.3.0 Provides: bundled(rubygem-concurrent-ruby) = %{concurrent_ruby_ver} Provides: bundled(rubygem-deep_merge) = %{deep_merge_ver} Provides: bundled(rubygem-fast_gettext) = %{fast_gettext_ver} Provides: bundled(rubygem-getoptlong) = %{getoptlong_ver} Provides: bundled(rubygem-locale) = %{locale_ver} Provides: bundled(rubygem-multi_json) = %{multi_json_ver} Provides: bundled(rubygem-puppet-resource_api) = %{puppet_resource_api_ver} Provides: bundled(rubygem-scanf) = %{scanf_ver} Provides: bundled(rubygem-semantic_puppet) = %{semantic_puppet_ver} Provides: bundled(rubygem-prime) = %{prime_ver} %description Puppet lets you centrally manage every important aspect of your system using a cross-platform specification language that manages all the separate elements normally aggregated in different files, like users, cron jobs, and hosts, along with obviously discrete elements like packages, services, and files. %prep %setup -q -n puppet-%{puppet_version} # Unpack vendored gems mkdir -p vendor/gems for src in %{SOURCE10} %{SOURCE11} %{SOURCE12} %{SOURCE13} %{SOURCE14} \ %{SOURCE15} %{SOURCE16} %{SOURCE17} %{SOURCE18} %{SOURCE19}; do gemname=$(basename "$src" .gem) mkdir -p "vendor/gems/$gemname" cd "vendor/gems/$gemname" tar xf "$src" tar xzf data.tar.gz rm -f data.tar.gz metadata.gz checksums.yaml.gz cd %{_builddir}/puppet-%{puppet_version} done %build # Pure Ruby, nothing to compile %install # Install puppet library install -d %{buildroot}%{ruby_vendorlib} cp -a lib/* %{buildroot}%{ruby_vendorlib}/ # Install vendored gems for gemdir in vendor/gems/*/lib; do cp -a "$gemdir"/* %{buildroot}%{ruby_vendorlib}/ done # concurrent-ruby has a nested lib structure: lib/concurrent-ruby/concurrent.rb # Move its contents up to the vendorlib so require 'concurrent' works if [ -d %{buildroot}%{ruby_vendorlib}/concurrent-ruby ]; then cp -a %{buildroot}%{ruby_vendorlib}/concurrent-ruby/* %{buildroot}%{ruby_vendorlib}/ rm -rf %{buildroot}%{ruby_vendorlib}/concurrent-ruby fi # Install puppet binary install -d %{buildroot}%{_bindir} install -m 0755 bin/puppet %{buildroot}%{_bindir}/puppet # Fix shebang sed -i '1s|^#!/usr/bin/env ruby|#!/usr/bin/ruby%{ruby_ver}|' %{buildroot}%{_bindir}/puppet # Install config directory and sample configs install -d %{buildroot}%{_sysconfdir}/puppetlabs/puppet install -d %{buildroot}%{_sysconfdir}/puppetlabs/code install -d %{buildroot}%{_sysconfdir}/puppetlabs/code/environments/production/manifests install -d %{buildroot}%{_sysconfdir}/puppetlabs/code/modules install -m 0644 conf/puppet.conf %{buildroot}%{_sysconfdir}/puppetlabs/puppet/ install -m 0644 conf/hiera.yaml %{buildroot}%{_sysconfdir}/puppetlabs/puppet/ install -m 0644 conf/fileserver.conf %{buildroot}%{_sysconfdir}/puppetlabs/puppet/ install -m 0644 conf/environment.conf %{buildroot}%{_sysconfdir}/puppetlabs/code/environments/production/ # Install state/cache directories install -d %{buildroot}%{_localstatedir}/lib/puppet install -d %{buildroot}%{_localstatedir}/log/puppetlabs/puppet install -d %{buildroot}%{_localstatedir}/cache/puppet # Install systemd unit for puppet agent install -d %{buildroot}%{_unitdir} cat > %{buildroot}%{_unitdir}/puppet.service << 'EOF' [Unit] Description=Puppet agent Wants=network-online.target After=network-online.target [Service] Type=simple ExecStart=/usr/bin/puppet agent --no-daemonize Restart=on-failure RestartSec=30 [Install] WantedBy=multi-user.target EOF # Install locales if present if [ -d locales ]; then install -d %{buildroot}%{_datadir}/puppet/locales cp -a locales/* %{buildroot}%{_datadir}/puppet/locales/ fi %pre getent group puppet >/dev/null || groupadd -r puppet getent passwd puppet >/dev/null || \ useradd -r -g puppet -d %{_localstatedir}/lib/puppet -s /sbin/nologin \ -c "Puppet configuration management daemon" puppet exit 0 %post %systemd_post puppet.service %preun %systemd_preun puppet.service %postun %systemd_postun_with_restart puppet.service %files %license LICENSE %doc README.md %{_bindir}/puppet %{_unitdir}/puppet.service # Config %dir %{_sysconfdir}/puppetlabs %dir %{_sysconfdir}/puppetlabs/puppet %dir %{_sysconfdir}/puppetlabs/code %dir %{_sysconfdir}/puppetlabs/code/environments %dir %{_sysconfdir}/puppetlabs/code/environments/production %dir %{_sysconfdir}/puppetlabs/code/environments/production/manifests %dir %{_sysconfdir}/puppetlabs/code/modules %config(noreplace) %{_sysconfdir}/puppetlabs/puppet/puppet.conf %config(noreplace) %{_sysconfdir}/puppetlabs/puppet/hiera.yaml %config(noreplace) %{_sysconfdir}/puppetlabs/puppet/fileserver.conf %config(noreplace) %{_sysconfdir}/puppetlabs/code/environments/production/environment.conf # Puppet libs (includes puppet-resource_api merged into puppet/ namespace) %{ruby_vendorlib}/puppet.rb %{ruby_vendorlib}/puppet/ %{ruby_vendorlib}/hiera/ %{ruby_vendorlib}/hiera_puppet.rb %{ruby_vendorlib}/puppet_pal.rb %{ruby_vendorlib}/puppet_x.rb # Vendored gems %{ruby_vendorlib}/concurrent.rb %{ruby_vendorlib}/concurrent-ruby.rb %{ruby_vendorlib}/concurrent/ %{ruby_vendorlib}/deep_merge.rb %{ruby_vendorlib}/deep_merge/ %{ruby_vendorlib}/fast_gettext.rb %{ruby_vendorlib}/fast_gettext/ %{ruby_vendorlib}/getoptlong.rb %{ruby_vendorlib}/locale.rb %{ruby_vendorlib}/locale/ %{ruby_vendorlib}/multi_json.rb %{ruby_vendorlib}/multi_json/ %{ruby_vendorlib}/scanf.rb %{ruby_vendorlib}/semantic_puppet.rb %{ruby_vendorlib}/semantic_puppet/ %{ruby_vendorlib}/prime.rb # Data directories %attr(0750,puppet,puppet) %dir %{_localstatedir}/lib/puppet %attr(0750,puppet,puppet) %dir %{_localstatedir}/log/puppetlabs %attr(0750,puppet,puppet) %dir %{_localstatedir}/log/puppetlabs/puppet %dir %{_localstatedir}/cache/puppet # Locales %{_datadir}/puppet/ %changelog * Tue Jul 01 2026 yhw - 8.10.0-1 - Initial package for AL2023 COPR - Bundle all runtime gem dependencies