puppet-8.4.0/0000755005276200011600000000000014552052637012741 5ustar jenkinsjenkinspuppet-8.4.0/Rakefile0000644005276200011600000000522614552052437014411 0ustar jenkinsjenkins# Rakefile for Puppet -*- ruby -*- RAKE_ROOT = File.dirname(__FILE__) # We need access to the Puppet.version method $LOAD_PATH.unshift(File.expand_path("lib")) require 'puppet/version' $LOAD_PATH << File.join(RAKE_ROOT, 'tasks') begin require 'rubygems' require 'rubygems/package_task' rescue LoadError # Users of older versions of Rake (0.8.7 for example) will not necessarily # have rubygems installed, or the newer rubygems package_task for that # matter. require 'rake/packagetask' require 'rake/gempackagetask' end require 'rake' require 'open3' Dir['tasks/**/*.rake'].each { |t| load t } if Rake.application.top_level_tasks.grep(/^(pl:|package:)/).any? begin require 'packaging' Pkg::Util::RakeUtils.load_packaging_tasks rescue LoadError => e puts "Error loading packaging rake tasks: #{e}" end end namespace :package do task :bootstrap do puts 'Bootstrap is no longer needed, using packaging-as-a-gem' end task :implode do puts 'Implode is no longer needed, using packaging-as-a-gem' end end task :default do sh %{rake -T} end task :spec do ENV["LOG_SPEC_ORDER"] = "true" sh %{rspec #{ENV['TEST'] || ENV['TESTS'] || 'spec'}} end desc 'run static analysis with rubocop' task(:rubocop) do require 'rubocop' cli = RuboCop::CLI.new exit_code = cli.run(%w(--display-cop-names --format simple)) raise "RuboCop detected offenses" if exit_code != 0 end desc "verify that changed files are clean of Ruby warnings" task(:warnings) do # This rake task looks at all files modified in this branch. commit_range = 'HEAD^..HEAD' ruby_files_ok = true puts "Checking modified files #{commit_range}" %x{git diff --diff-filter=ACM --name-only #{commit_range}}.each_line do |modified_file| modified_file.chomp! # Skip racc generated file as it can have many warnings that cannot be manually fixed next if modified_file.end_with?("pops/parser/eparser.rb") next if modified_file.start_with?('spec/fixtures/', 'acceptance/fixtures/') || File.extname(modified_file) != '.rb' puts modified_file stdout, stderr, _ = Open3.capture3("ruby -wc \"#{modified_file}\"") unless stderr.empty? ruby_files_ok = false puts stderr end puts stdout end raise "One or more ruby files contain warnings." unless ruby_files_ok end if Rake.application.top_level_tasks.grep(/^gettext:/).any? begin spec = Gem::Specification.find_by_name 'gettext-setup' load "#{spec.gem_dir}/lib/tasks/gettext.rake" GettextSetup.initialize(File.absolute_path('locales', File.dirname(__FILE__))) rescue LoadError abort("Run `bundle install --with documentation` to install the `gettext-setup` gem.") end end puppet-8.4.0/Gemfile0000644005276200011600000000532714552052437014241 0ustar jenkinsjenkinssource ENV['GEM_SOURCE'] || "https://rubygems.org" gemspec def location_for(place, fake_version = nil) if place.is_a?(String) && place =~ /^((?:git[:@]|https:)[^#]*)#(.*)/ [fake_version, { git: $1, branch: $2, require: false }].compact elsif place.is_a?(String) && place =~ /^file:\/\/(.*)/ ['>= 0', { path: File.expand_path($1), require: false }] else [place, { require: false }] end end # Make sure these gem requirements are in sync with the gempspec and ext/project_data.yaml gem "facter", *location_for(ENV['FACTER_LOCATION'] || ["~> 4.3"]) gem "semantic_puppet", *location_for(ENV['SEMANTIC_PUPPET_LOCATION'] || ["~> 1.0"]) gem "puppet-resource_api", *location_for(ENV['RESOURCE_API_LOCATION'] || ["~> 1.5"]) group(:features) do gem 'diff-lcs', '~> 1.3', require: false gem "hiera", *location_for(ENV['HIERA_LOCATION']) if ENV.has_key?('HIERA_LOCATION') gem 'hiera-eyaml', *location_for(ENV['HIERA_EYAML_LOCATION']) gem 'hocon', '~> 1.0', require: false # requires native libshadow headers/libs #gem 'ruby-shadow', '~> 2.5', require: false, platforms: [:ruby] gem 'minitar', '~> 0.9', require: false gem 'msgpack', '~> 1.2', require: false gem 'rdoc', ['~> 6.0', '< 6.4.0'], require: false, platforms: [:ruby] # requires native augeas headers/libs # gem 'ruby-augeas', require: false, platforms: [:ruby] # requires native ldap headers/libs # gem 'ruby-ldap', '~> 0.9', require: false, platforms: [:ruby] gem 'puppetserver-ca', '~> 2.0', require: false end group(:test) do gem "ffi", '1.15.5', require: false gem "json-schema", "~> 2.0", require: false gem "rake", *location_for(ENV['RAKE_LOCATION'] || '~> 13.0') gem "rspec", "~> 3.1", require: false gem "rspec-expectations", ["~> 3.9", "!= 3.9.3"] gem "rspec-its", "~> 1.1", require: false gem 'vcr', '~> 6.1', require: false gem 'webmock', '~> 3.0', require: false gem 'webrick', '~> 1.7', require: false gem 'yard', require: false gem 'rubocop', '1.28.0', require: false, platforms: [:ruby] gem 'rubocop-i18n', '~> 3.0', require: false, platforms: [:ruby] end group(:development, optional: true) do gem 'memory_profiler', require: false, platforms: [:mri] gem 'pry', require: false, platforms: [:ruby] gem "racc", "1.5.2", require: false, platforms: [:ruby] if RUBY_PLATFORM != 'java' gem 'ruby-prof', '>= 0.16.0', require: false end end group(:packaging) do gem 'packaging', *location_for(ENV['PACKAGING_LOCATION'] || '~> 0.99') end group(:documentation, optional: true) do gem 'gettext-setup', '~> 1.0', require: false, platforms: [:ruby] gem 'ronn', '~> 0.7.3', require: false, platforms: [:ruby] end if File.exist? "#{__FILE__}.local" eval(File.read("#{__FILE__}.local"), binding) end # vim:filetype=ruby puppet-8.4.0/tasks/0000755005276200011600000000000014552052637014066 5ustar jenkinsjenkinspuppet-8.4.0/tasks/generate_cert_fixtures.rake0000644005276200011600000002043114552052437021470 0ustar jenkinsjenkins# Run this rake task to generate cert fixtures used in unit tests. This should # be run whenever new fixtures are required that derive from the existing ones # such as to add an extension to client certs, change expiration, etc. All # regenerated fixtures should be committed together. desc "Generate cert test fixtures" task(:gen_cert_fixtures) do $LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '../spec/lib')) require 'puppet/test_ca' def save(dir, name, x509) path = File.join(dir, name) puts "Generating #{path}" File.open(path, 'w') do |f| f.write(x509.to_text) text = if block_given? yield x509 else x509.to_pem end f.write(text) end end # This task generates a PKI consisting of a root CA, intermediate CA and # several leaf certs. A CRL is generated for each CA. The root CA CRL is # empty, while the intermediate CA CRL contains the revoked cert's serial # number. A textual representation of each X509 object is included in the # fixture as a comment. # # Certs # ===== # # ca.pem /CN=Test CA # | # intermediate.pem +- /CN=Test CA Subauthority # | | # signed.pem | +- /CN=signed # revoked.pem | +- /CN=revoked # tampered-cert.pem | +- /CN=signed (with different public key) # ec.pem | +- /CN=ec (with EC private key) # oid.pem | +- /CN=oid (with custom oid) # | # 127.0.0.1.pem +- /CN=127.0.0.1 (with dns alt names) # | # intermediate-agent.pem +- /CN=Test CA Agent Subauthority # | | # pluto.pem | +- /CN=pluto # | # bad-int-basic-constraints.pem +- /CN=Test CA Subauthority (bad isCA constraint) # # bad-basic-constraints.pem /CN=Test CA (bad isCA constraint) # # unknown-ca.pem /CN=Unknown CA # | # unknown-127.0.0.1.pem +- /CN=127.0.0.1 # # Keys # ==== # # The RSA private key for each leaf cert is also generated. In addition, # `encrypted-key.pem` contains the private key for the `signed` cert. # # Requests # ======== # # `request.pem` contains a valid CSR for /CN=pending, while `tampered_csr.pem` # is the same as `request.pem`, but it's public key has been replaced. # dir = File.join(RAKE_ROOT, 'spec/fixtures/ssl') # Create self-signed CA & key unknown_ca = Puppet::TestCa.new('Unknown CA') save(dir, 'unknown-ca.pem', unknown_ca.ca_cert) save(dir, 'unknown-ca-key.pem', unknown_ca.key) # Create an SSL cert for 127.0.0.1 signed = unknown_ca.create_cert('127.0.0.1', unknown_ca.ca_cert, unknown_ca.key, subject_alt_names: 'DNS:127.0.0.1,DNS:127.0.0.2') save(dir, 'unknown-127.0.0.1.pem', signed[:cert]) save(dir, 'unknown-127.0.0.1-key.pem', signed[:private_key]) # Create Test CA & CRL ca = Puppet::TestCa.new save(dir, 'ca.pem', ca.ca_cert) save(dir, 'crl.pem', ca.ca_crl) # Create Intermediate CA & CRL "Test CA Subauthority" issued by "Test CA" inter = ca.create_intermediate_cert('Test CA Subauthority', ca.ca_cert, ca.key) save(dir, 'intermediate.pem', inter[:cert]) inter_crl = ca.create_crl(inter[:cert], inter[:private_key]) # Create a leaf/entity key and cert for host "signed" and issued by "Test CA Subauthority" signed = ca.create_cert('signed', inter[:cert], inter[:private_key]) save(dir, 'signed.pem', signed[:cert]) save(dir, 'signed-key.pem', signed[:private_key]) # Create a cert for host "renewed" and issued by "Test CA Subauthority" renewed = ca.create_cert('renewed', inter[:cert], inter[:private_key], reuse_key: signed[:private_key]) save(dir, 'renewed.pem', renewed[:cert]) # Create an encrypted version of the above private key for host "signed" save(dir, 'encrypted-key.pem', signed[:private_key]) do |x509| # private key password was chosen at random x509.to_pem(OpenSSL::Cipher::AES.new(128, :CBC), '74695716c8b6') end # Create an SSL cert for 127.0.0.1 with dns_alt_names signed = ca.create_cert('127.0.0.1', ca.ca_cert, ca.key, subject_alt_names: 'DNS:127.0.0.1,DNS:127.0.0.2') save(dir, '127.0.0.1.pem', signed[:cert]) save(dir, '127.0.0.1-key.pem', signed[:private_key]) # Create an SSL cert with extensions containing custom oids extensions = [ ['1.3.6.1.4.1.34380.1.2.1.1', OpenSSL::ASN1::UTF8String.new('somevalue'), false], ] oid = ca.create_cert('oid', inter[:cert], inter[:private_key], extensions: extensions) save(dir, 'oid.pem', oid[:cert]) save(dir, 'oid-key.pem', oid[:private_key]) # Create a leaf/entity key and cert for host "revoked", issued by "Test CA Subauthority" # and revoke the cert revoked = ca.create_cert('revoked', inter[:cert], inter[:private_key]) ca.revoke(revoked[:cert], inter_crl, inter[:private_key]) save(dir, 'revoked.pem', revoked[:cert]) save(dir, 'revoked-key.pem', revoked[:private_key]) # Create an EC key and cert, issued by "Test CA Subauthority" ec = ca.create_cert('ec', inter[:cert], inter[:private_key], key_type: :ec) save(dir, 'ec.pem', ec[:cert]) save(dir, 'ec-key.pem', ec[:private_key]) # Create an encrypted version of the above private key for host "ec" save(dir, 'encrypted-ec-key.pem', ec[:private_key]) do |x509| # private key password was chosen at random x509.to_pem(OpenSSL::Cipher::AES.new(128, :CBC), '74695716c8b6') end # Update intermediate CRL now that we've revoked save(dir, 'intermediate-crl.pem', inter_crl) # Create a pending request (CSR) and private key for host "pending" request = ca.create_request('pending') save(dir, 'request.pem', request[:csr]) save(dir, 'request-key.pem', request[:private_key]) # Create an intermediate for agent certs inter_agent = ca.create_intermediate_cert('Test CA Agent Subauthority', ca.ca_cert, ca.key) save(dir, 'intermediate-agent.pem', inter_agent[:cert]) inter_agent_crl = ca.create_crl(inter_agent[:cert], inter_agent[:private_key]) save(dir, 'intermediate-agent-crl.pem', inter_agent_crl) # Create a leaf/entity key and cert for host "pluto" and issued by "Test CA Agent Subauthority" pluto = ca.create_cert('pluto', inter_agent[:cert], inter_agent[:private_key]) save(dir, 'pluto.pem', pluto[:cert]) save(dir, 'pluto-key.pem', pluto[:private_key]) # Create a new root CA cert, but change the "isCA" basic constraint. # It should not be trusted to act as a CA. badconstraints = ca.create_cacert('Test CA')[:cert] badconstraints.public_key = ca.ca_cert.public_key badconstraints.extensions = [] ca.ca_cert.extensions.each do |ext| if ext.oid == 'basicConstraints' ef = OpenSSL::X509::ExtensionFactory.new badconstraints.add_extension(ef.create_extension("basicConstraints","CA:FALSE", true)) else badconstraints.add_extension(ext) end end badconstraints.sign(ca.key, OpenSSL::Digest::SHA256.new) save(dir, 'bad-basic-constraints.pem', badconstraints) # Same as above, but create a new intermediate CA badintconstraints = inter[:cert].dup badintconstraints.public_key = inter[:cert].public_key badintconstraints.extensions = [] inter[:cert].extensions.each do |ext| if ext.oid == 'basicConstraints' ef = OpenSSL::X509::ExtensionFactory.new badintconstraints.add_extension(ef.create_extension("basicConstraints","CA:FALSE", true)) else badintconstraints.add_extension(ext) end end badintconstraints.sign(ca.key, OpenSSL::Digest::SHA256.new) save(dir, 'bad-int-basic-constraints.pem', badintconstraints) # Create a request, but replace its public key after it's signed tampered_csr = ca.create_request('signed')[:csr] tampered_csr.public_key = OpenSSL::PKey::RSA.new(2048).public_key save(dir, 'tampered-csr.pem', tampered_csr) # Create a cert issued from the real intermediate CA, but replace its # public key tampered_cert = ca.create_cert('signed', inter[:cert], inter[:private_key])[:cert] tampered_cert.public_key = OpenSSL::PKey::RSA.new(2048).public_key save(dir, 'tampered-cert.pem', tampered_cert) end puppet-8.4.0/tasks/manpages.rake0000644005276200011600000000454114552052437016527 0ustar jenkinsjenkinsdesc "Build Puppet manpages" task :gen_manpages do require 'puppet/face' require 'fileutils' Puppet.initialize_settings helpface = Puppet::Face[:help, '0.0.1'] bins = Dir.glob(%w{bin/*}) non_face_applications = helpface.legacy_applications faces = Puppet::Face.faces.map(&:to_s) apps = non_face_applications + faces ronn_args = '--manual="Puppet manual" --organization="Puppet, Inc." --roff' unless ENV['SOURCE_DATE_EPOCH'].nil? source_date = Time.at(ENV['SOURCE_DATE_EPOCH'].to_i).strftime('%Y-%m-%d') ronn_args += " --date=#{source_date}" end # Locate ronn begin require 'ronn' rescue LoadError abort("Run `bundle install --with documentation` to install the `ronn` gem.") end ronn = %x{which ronn}.chomp unless File.executable?(ronn) abort("Ronn does not appear to be installed") end %x{mkdir -p ./man/man5 ./man/man8} %x{RUBYLIB=./lib:$RUBYLIB bin/puppet doc --reference configuration > ./man/man5/puppetconf.5.ronn} %x{#{ronn} #{ronn_args} ./man/man5/puppetconf.5.ronn} FileUtils.mv("./man/man5/puppetconf.5", "./man/man5/puppet.conf.5") FileUtils.rm("./man/man5/puppetconf.5.ronn") # Create LEGACY binary man pages (i.e. delete me for 2.8.0) bins.each do |bin| b = bin.gsub( /^s?bin\//, "") %x{RUBYLIB=./lib:$RUBYLIB #{bin} --help > ./man/man8/#{b}.8.ronn} %x{#{ronn} #{ronn_args} ./man/man8/#{b}.8.ronn} FileUtils.rm("./man/man8/#{b}.8.ronn") end apps.each do |app| %x{RUBYLIB=./lib:$RUBYLIB bin/puppet help #{app} --ronn > ./man/man8/puppet-#{app}.8.ronn} %x{#{ronn} #{ronn_args} ./man/man8/puppet-#{app}.8.ronn} FileUtils.rm("./man/man8/puppet-#{app}.8.ronn") end # Delete orphaned manpages if binary was deleted Dir.glob(%w{./man/man8/puppet-*.8}) do |app| appname = app.match(/puppet-(.*)\.8/)[1] FileUtils.rm("./man/man8/puppet-#{appname}.8") unless apps.include?(appname) end # Vile hack: create puppet resource man page # Currently, the useless resource face wins against puppet resource in puppet # man. (And actually, it even gets removed from the list of legacy # applications.) So we overwrite it with the correct man page at the end. %x{RUBYLIB=./lib:$RUBYLIB bin/puppet resource --help > ./man/man8/puppet-resource.8.ronn} %x{#{ronn} #{ronn_args} ./man/man8/puppet-resource.8.ronn} FileUtils.rm("./man/man8/puppet-resource.8.ronn") end puppet-8.4.0/tasks/parallel.rake0000644005276200011600000002750114552052437016531 0ustar jenkinsjenkins# encoding: utf-8 require 'rubygems' require 'thread' begin require 'rspec' require 'rspec/core/formatters/helpers' require 'etc' rescue LoadError # Don't define the task if we don't have rspec present else module Parallel module RSpec # # Responsible for buffering the output of RSpec's progress formatter. # class ProgressFormatBuffer attr_reader :pending_lines attr_reader :failure_lines attr_reader :examples attr_reader :failures attr_reader :pending attr_reader :failed_example_lines attr_reader :state module OutputState HEADER = 1 PROGRESS = 2 SUMMARY = 3 PENDING = 4 FAILURES = 5 DURATION = 6 COUNTS = 7 FAILED_EXAMPLES = 8 end def initialize(io, color) @io = io @color = color @state = OutputState::HEADER @pending_lines = [] @failure_lines = [] @examples = 0 @failures = 0 @pending = 0 @failed_example_lines = [] end def color? @color end def read # Parse and ignore the one line header if @state == OutputState::HEADER begin @io.readline rescue EOFError return nil end @state = OutputState::PROGRESS return '' end # If the progress has been read, parse the summary if @state == OutputState::SUMMARY parse_summary return nil end # Read the progress output up to 128 bytes at a time # 128 is a small enough number to show some progress, but not too small that # we're constantly writing synchronized output data = @io.read(128) return nil unless data data = @remainder + data if @remainder # Check for the end of the progress line if (index = data.index "\n") @state = OutputState::SUMMARY @remainder = data[(index+1)..-1] data = data[0...index] # Check for partial ANSI escape codes in colorized output elsif @color && !data.end_with?("\e[0m") && (index = data.rindex("\e[", -6)) @remainder = data[index..-1] data = data[0...index] else @remainder = nil end data end private def parse_summary # If there is a remainder, concat it with the next line and handle each line unless @remainder.empty? lines = @remainder eof = false begin lines += @io.readline rescue EOFError eof = true end lines.each_line do |line| parse_summary_line line end return if eof end # Process the rest of the lines begin @io.each_line do |line| parse_summary_line line end rescue EOFError end end def parse_summary_line(line) line.chomp! return if line.empty? if line == 'Pending:' @status = OutputState::PENDING return elsif line == 'Failures:' @status = OutputState::FAILURES return elsif line == 'Failed examples:' @status = OutputState::FAILED_EXAMPLES return elsif (line.match /^Finished in ((\d+\.?\d*) minutes?)? ?(\d+\.?\d*) seconds?$/) @status = OutputState::DURATION return elsif (match = line.gsub(/\e\[\d+m/, '').match /^(\d+) examples?, (\d+) failures?(, (\d+) pending)?$/) @status = OutputState::COUNTS @examples = match[1].to_i @failures = match[2].to_i @pending = (match[4] || 0).to_i return end case @status when OutputState::PENDING @pending_lines << line when OutputState::FAILURES @failure_lines << line when OutputState::FAILED_EXAMPLES @failed_example_lines << line end end end # # Responsible for parallelizing spec testing. # Optional options list will be passed to rspec. # class Parallelizer # Number of processes to use attr_reader :process_count # Approximate size of each group of tests attr_reader :group_size # Options list for rspec attr_reader :options def initialize(process_count, group_size, color, options = []) @process_count = process_count @group_size = group_size @color = color @options = options end def color? @color end def run @start_time = Time.now groups = group_specs fail red('error: no specs were found') if groups.length == 0 begin run_specs(groups, options) ensure groups.each do |file| File.unlink(file) end end end private def group_specs # Spawn the rspec_grouper utility to perform the test grouping # We do this in a separate process to limit this processes' long-running footprint io = IO.popen("ruby util/rspec_grouper #{@group_size}") header = true spec_group_files = [] io.each_line do |line| line.chomp! header = false if line.empty? next if header || line.empty? spec_group_files << line end _, status = Process.waitpid2(io.pid) io.close fail red('error: no specs were found.') unless status.success? spec_group_files end def run_specs(groups, options) puts "Processing #{groups.length} spec group(s) with #{@process_count} worker(s)" interrupted = false success = true worker_threads = [] group_index = -1 pids = Array.new(@process_count) mutex = Mutex.new # Handle SIGINT by killing child processes original_handler = Signal.trap :SIGINT do break if interrupted interrupted = true # Can't synchronize in a trap context, so read dirty pids.each do |pid| begin Process.kill(:SIGKILL, pid) if pid rescue Errno::ESRCH end end puts yellow("\nshutting down...") end buffers = [] process_count.times do |thread_id| worker_threads << Thread.new do while !interrupted do # Get the spec file for this rspec run group = mutex.synchronize { if group_index < groups.length then groups[group_index += 1] else nil end } break unless group && !interrupted # Spawn the worker process with redirected output options_string = options ? options.join(' ') : '' io = IO.popen("ruby util/rspec_runner #{group} #{options_string}") pids[thread_id] = io.pid # TODO: make the buffer pluggable to handle other output formats like documentation buffer = ProgressFormatBuffer.new(io, @color) # Process the output while !interrupted output = buffer.read break unless output && !interrupted next if output.empty? mutex.synchronize { print output } end # Kill the process if we were interrupted, just to be sure if interrupted begin Process.kill(:SIGKILL, pids[thread_id]) rescue Errno::ESRCH end end # Reap the process result = Process.waitpid2(pids[thread_id])[1].success? io.close pids[thread_id] = nil mutex.synchronize do buffers << buffer success &= result end end end end # Join all worker threads worker_threads.each do |thread| thread.join end Signal.trap :SIGINT, original_handler fail yellow('execution was interrupted') if interrupted dump_summary buffers success end def colorize(text, color_code) if @color "#{color_code}#{text}\e[0m" else text end end def red(text) colorize(text, "\e[31m") end def green(text) colorize(text, "\e[32m") end def yellow(text) colorize(text, "\e[33m") end def dump_summary(buffers) puts # Print out the pending tests print_header = true buffers.each do |buffer| next if buffer.pending_lines.empty? if print_header puts "\nPending:" print_header = false end puts buffer.pending_lines end # Print out the failures print_header = true buffers.each do |buffer| next if buffer.failure_lines.empty? if print_header puts "\nFailures:" print_header = false end puts puts buffer.failure_lines end # Print out the run time puts "\nFinished in #{::RSpec::Core::Formatters::Helpers.format_duration(Time.now - @start_time)}" # Count all of the examples examples = 0 failures = 0 pending = 0 buffers.each do |buffer| examples += buffer.examples failures += buffer.failures pending += buffer.pending end if failures > 0 puts red(summary_count_line(examples, failures, pending)) elsif pending > 0 puts yellow(summary_count_line(examples, failures, pending)) else puts green(summary_count_line(examples, failures, pending)) end # Print out the failed examples print_header = true buffers.each do |buffer| next if buffer.failed_example_lines.empty? if print_header puts "\nFailed examples:" print_header = false end puts buffer.failed_example_lines end end def summary_count_line(examples, failures, pending) summary = ::RSpec::Core::Formatters::Helpers.pluralize(examples, "example") summary << ", " << ::RSpec::Core::Formatters::Helpers.pluralize(failures, "failure") summary << ", #{pending} pending" if pending > 0 summary end end end end namespace 'parallel' do def color_output? # Check with RSpec to see if color is enabled config = ::RSpec::Core::Configuration.new config.error_stream = $stderr config.output_stream = $stdout options = ::RSpec::Core::ConfigurationOptions.new [] options.configure config config.color end desc 'Runs specs in parallel. Extra args are passed to rspec.' task 'spec', [:process_count, :group_size] do |_, args| # Default group size in rspec examples DEFAULT_GROUP_SIZE = 1000 process_count = [(args[:process_count] || Etc.nprocessors).to_i, 1].max group_size = [(args[:group_size] || DEFAULT_GROUP_SIZE).to_i, 1].max abort unless Parallel::RSpec::Parallelizer.new(process_count, group_size, color_output?, args.extras).run end end end puppet-8.4.0/tasks/ci.rake0000644005276200011600000000127514552052437015330 0ustar jenkinsjenkinsrequire 'yaml' require 'time' namespace "ci" do desc "Tar up the acceptance/ directory so that package test runs have tests to run against." task :acceptance_artifacts => :tag_creator do Dir.chdir("acceptance") do rm_f "acceptance-artifacts.tar.gz" sh "tar -czv --exclude .bundle -f acceptance-artifacts.tar.gz *" end end task :tag_creator do Dir.chdir("acceptance") do File.open('creator.txt', 'w') do |fh| YAML.dump({ 'creator_id' => ENV['CREATOR'] || ENV['BUILD_URL'] || 'unknown', 'created_on' => Time.now.iso8601, 'commit' => (`git log -1 --oneline` rescue "unknown: #{$!}") }, fh) end end end end puppet-8.4.0/tasks/parser.rake0000644005276200011600000000131314552052437016222 0ustar jenkinsjenkinsdesc "Generate the 4.x 'future' parser" task :gen_eparser => :require_racc do %x{racc -olib/puppet/pops/parser/eparser.rb lib/puppet/pops/parser/egrammar.ra} end desc "Generate the 4.x 'future' parser with egrammar.output" task :gen_eparser_output => :require_racc do %x{racc -v -olib/puppet/pops/parser/eparser.rb lib/puppet/pops/parser/egrammar.ra} end desc "Generate the 4.x 'future' parser with debugging output" task :gen_eparser_debug => :require_racc do %x{racc -t -olib/puppet/pops/parser/eparser.rb lib/puppet/pops/parser/egrammar.ra} end task :require_racc do begin require 'racc' rescue LoadError abort("Run `bundle install --with development` to install the `racc` gem.") end end puppet-8.4.0/tasks/memwalk.rake0000644005276200011600000001347014552052437016372 0ustar jenkinsjenkins# Walks the memory dumped into heap.json, and produces a graph of the memory dumped in diff.json # If a single argument (a hex address to one object) is given, the graph is limited to this object and what references it # The heap dumps should be in the format produced by Ruby ObjectSpace in Ruby version 2.1.0 or later. # # The command produces a .dot file that can be rendered with graphwiz dot into SVG. If a memwalk is performed for all # objects in the diff.json, the output file name is memwalk.dot. If it is produced for a single address, the name of the # output file is memwalk-
.dot # # The dot file can be rendered with something like: dot -Tsvg -omemwalk.svg memwalk.dot # desc "Process a diff.json of object ids, and a heap.json of a Ruby 2.1.0 ObjectSpace dump and produce a graph" task :memwalk, [:id] do |t, args| puts "Memwalk" puts "Computing for #{args[:id] ? args[:id] : 'all'}" @single_id = args[:id] ? args[:id].to_i(16) : nil require 'json' #require 'debug' TYPE = "type".freeze ROOT = "root".freeze ROOT_UC = "ROOT".freeze ADDR = "address".freeze NODE = "NODE".freeze STRING = "STRING".freeze DATA = "DATA".freeze HASH = "HASH".freeze ARRAY = "ARRAY".freeze OBJECT = "OBJECT".freeze CLASS = "CLASS".freeze allocations = {} # An array of integer addresses of the objects to trace bindings for diff_index = {} puts "Reading data" begin puts "Reading diff" lines = 0; File.readlines("diff.json").each do | line | lines += 1 diff = JSON.parse(line) case diff[ TYPE ] when STRING, DATA, HASH, ARRAY # skip the strings else diff_index[ diff[ ADDR ].to_i(16) ] = diff end end puts "Read #{lines} number of diffs" rescue => e raise "ERROR READING DIFF at line #{lines} #{e.message[0, 200]}" end begin puts "Reading heap" lines = 0 allocation = nil File.readlines("heap.json").each do | line | lines += 1 allocation = JSON.parse(line) case allocation[ TYPE ] when ROOT_UC # Graph for single id must include roots, as it may be a root that holds on to the reference # a global variable, thread, etc. # if @single_id allocations[ allocation[ ROOT ] ] = allocation end when NODE # skip the NODE objects - they represent the loaded ruby code when STRING # skip all strings - they are everywhere else allocations[ allocation[ ADDR ].to_i(16) ] = allocation end end puts "Read #{lines} number of entries" rescue => e require 'debug' puts "ERROR READING HEAP #{e.message[0, 200]}" raise e end @heap = allocations puts "Building reference index" # References is an index from a referenced object to an array with addresses to the objects that references it @references = Hash.new { |h, k| h[k] = [] } REFERENCES = "references".freeze allocations.each do |k,v| refs = v[ REFERENCES ] if refs.is_a?(Array) refs.each {|addr| @references[ addr.to_i(16) ] << k } end end @printed = Set.new() def print_object(addr, entry) # only print each node once return unless @printed.add?(addr) begin if addr.is_a?(String) @output.write( "x#{node_name(addr)} [label=\"#{node_label(addr, entry)}\\n#{addr}\"];\n") else @output.write( "x#{node_name(addr)} [label=\"#{node_label(addr, entry)}\\n#{addr.to_s(16)}\"];\n") end rescue => e require 'debug' raise e end end def node_label(addr, entry) if entry[ TYPE ] == OBJECT class_ref = entry[ "class" ].to_i(16) @heap[ class_ref ][ "name" ] elsif entry[ TYPE ] == CLASS "CLASS #{entry[ "name"]}" else entry[TYPE] end end def node_name(addr) return addr if addr.is_a? String addr.to_s(16) end def print_edge(from_addr, to_addr) @output.write("x#{node_name(from_addr)}->x#{node_name(to_addr)};\n") end def closure_and_edges(diff) edges = Set.new() walked = Set.new() puts "Number of diffs referenced = #{diff.count {|k,_| @references[k].is_a?(Array) && @references[k].size() > 0 }}" diff.each {|k,_| walk(k, edges, walked) } edges.each {|e| print_edge(*e) } end def walk(addr, edges, walked) if !@heap[ addr ].nil? print_object(addr, @heap[addr]) @references [ addr ].each do |r| walk_to_object(addr, r, edges, walked) end end end def walk_to_object(to_addr, cursor, edges, walked) return unless walked # if walked to an object, or everything if a single_id is the target if @heap[ cursor ][ TYPE ] == OBJECT || (@single_id && @heap[ cursor ][ TYPE ] == ROOT_UC || @heap[ cursor ][ TYPE ] == CLASS ) # and the edge is unique if edges.add?( [ cursor, to_addr ] ) # then we may not have visited objects this objects is being referred from print_object(cursor, @heap[ cursor ]) # Do not follow what binds a class if @heap[ cursor ][ TYPE ] != CLASS @references[ cursor ].each do |r| walk_to_object(cursor, r, edges, walked.add?(r)) walked.delete(r) end end end else # continue search until Object @references[cursor].each do |r| walk_to_object(to_addr, r, edges, walked.add?(r)) end end end def single_closure_and_edges(the_target) edges = Set.new() walked = Set.new() walk(the_target, edges, walked) edges.each {|e| print_edge(*e) } end puts "creating graph" if @single_id @output = File.open("memwalk-#{@single_id.to_s(16)}.dot", "w") @output.write("digraph root {\n") single_closure_and_edges(@single_id) else @output = File.open("memwalk.dot", "w") @output.write("digraph root {\n") closure_and_edges(diff_index) end @output.write("}\n") @output.close puts "done" end puppet-8.4.0/tasks/generate_ast_model.rake0000644005276200011600000001025514552052437020554 0ustar jenkinsjenkinsbegin require 'puppet' rescue LoadError #nothing to see here else desc "Generate the Pcore model that represents the AST for the Puppet Language" task :gen_pcore_ast do Puppet::Pops.generate_ast end module Puppet::Pops def self.generate_ast Puppet.initialize_settings env = Puppet.lookup(:environments).get(Puppet[:environment]) loaders = Loaders.new(env) ast_pp = Pathname(__FILE__).parent.parent + 'lib/puppet/pops/model/ast.pp' Puppet.override(:current_environment => env, :loaders => loaders) do ast_factory = Parser::Parser.new.parse_file(ast_pp.expand_path.to_s) ast_model = Types::TypeParser.singleton.interpret( ast_factory.model.body, Loader::PredefinedLoader.new(loaders.find_loader(nil), 'TypeSet loader')) ruby = Types::RubyGenerator.new.module_definition_from_typeset(ast_model) # Replace ref() constructs to known Pcore types with directly initialized types. ref() cannot be used # since it requires a parser (chicken-and-egg problem) ruby.gsub!(/^module Parser\nmodule Locator\n.*\nend\nend\nmodule Model\n/m, "module Model\n") # Remove generated RubyMethod annotations. The ruby methods are there now, no need to also have # the annotations present. ruby.gsub!(/^\s+'annotations' => \{\n\s+ref\('RubyMethod'\) => \{\n.*\n\s+\}\n\s+\},\n/, '') ruby.gsub!(/ref\('([A-Za-z]+)'\)/, 'Types::P\1Type::DEFAULT') ruby.gsub!(/ref\('Optional\[([0-9A-Za-z_]+)\]'\)/, 'Types::POptionalType.new(Types::P\1Type::DEFAULT)') ruby.gsub!(/ref\('Array\[([0-9A-Za-z_]+)\]'\)/, 'Types::PArrayType.new(Types::P\1Type::DEFAULT)') ruby.gsub!(/ref\('Optional\[Array\[([0-9A-Za-z_]+)\]\]'\)/, 'Types::POptionalType.new(Types::PArrayType.new(Types::P\1Type::DEFAULT))') ruby.gsub!(/ref\('Enum(\[[^\]]+\])'\)/) do |match| params = $1 params.gsub!(/\\'/, '\'') "Types::PEnumType.new(#{params})" end # Replace ref() constructs with references to _pcore_type of the types in the module namespace ruby.gsub!(/ref\('Puppet::AST::Locator'\)/, 'Parser::Locator::Locator19._pcore_type') ruby.gsub!(/ref\('Puppet::AST::([0-9A-Za-z_]+)'\)/, '\1._pcore_type') ruby.gsub!(/ref\('Optional\[Puppet::AST::([0-9A-Za-z_]+)\]'\)/, 'Types::POptionalType.new(\1._pcore_type)') ruby.gsub!(/ref\('Array\[Puppet::AST::([0-9A-Za-z_]+)\]'\)/, 'Types::PArrayType.new(\1._pcore_type)') ruby.gsub!(/ref\('Array\[Puppet::AST::([0-9A-Za-z_]+), 1, default\]'\)/, 'Types::PArrayType.new(\1._pcore_type, Types::PCollectionType::NOT_EMPTY_SIZE)') # Remove the generated ref() method. It's not needed by this model ruby.gsub!(/ def self\.ref\(type_string\)\n.*\n end\n\n/, '') # Add Program#current method for backward compatibility ruby.gsub!(/(attr_reader :body\n attr_reader :definitions\n attr_reader :locator)/, "\\1\n\n def current\n self\n end") # Replace the generated registration with a registration that uses the static loader. This will # become part of the Puppet bootstrap code and there will be no other loader until we have a # parser. ruby.gsub!(/^Puppet::Pops::Pcore.register_implementations\((\[[^\]]+\])\)/, <<-RUBY) module Model @@pcore_ast_initialized = false def self.register_pcore_types return if @@pcore_ast_initialized @@pcore_ast_initialized = true all_types = \\1 # Create and register a TypeSet that corresponds to all types in the AST model types_map = {} all_types.each do |type| types_map[type._pcore_type.simple_name] = type._pcore_type end type_set = Types::PTypeSetType.new({ 'name' => 'Puppet::AST', 'pcore_version' => '1.0.0', 'types' => types_map }) loc = Puppet::Util.path_to_uri("\#{__FILE__}") Loaders.static_loader.set_entry(Loader::TypedName.new(:type, 'puppet::ast', Pcore::RUNTIME_NAME_AUTHORITY), type_set, URI("\#{loc}?line=1")) Loaders.register_static_implementations(all_types) end end RUBY ast_rb = Pathname(__FILE__).parent.parent + 'lib/puppet/pops/model/ast.rb' File.open(ast_rb.to_s, 'w') { |f| f.write(ruby) } end end end end puppet-8.4.0/tasks/yard.rake0000644005276200011600000000266114552052437015674 0ustar jenkinsjenkinsbegin require 'yard' namespace :doc do desc "Clean up generated documentation" task :clean do rm_rf "doc" end desc "Generate public documentation pages for the API" YARD::Rake::YardocTask.new(:api) do |t| t.files = ['lib/**/*.rb'] t.options = %w{ --protected --private --verbose --markup markdown --readme README.md --tag status --transitive-tag status --tag comment --hide-tag comment --tag dsl:"DSL" --no-transitive-tag api --template-path yardoc/templates --files README_DEVELOPER.md,CO*.md,api/**/*.md --api public --api private --hide-void-return } end desc "Generate documentation pages for all of the code" YARD::Rake::YardocTask.new(:all) do |t| t.files = ['lib/**/*.rb'] t.options = %w{ --verbose --markup markdown --readme README.md --tag status --transitive-tag status --tag comment --hide-tag comment --tag dsl:"DSL" --no-transitive-tag api --template-path yardoc/templates --files README_DEVELOPER.md,CO*.md,api/**/*.md --api public --api private --no-api --hide-void-return } end end rescue LoadError => e if verbose STDERR.puts "Document generation not available without yard. #{e.message}" end end puppet-8.4.0/tasks/cfpropertylist.rake0000644005276200011600000000143214552052437020021 0ustar jenkinsjenkinstask 'cfpropertylist' do if defined? Pkg::Config and Pkg::Config.project_root cfp_version = "2.3.5" libdir = File.join(Pkg::Config.project_root, "lib") source = "https://github.com/ckruse/CFPropertyList/archive/cfpropertylist-#{cfp_version}.tar.gz" target_dir = Pkg::Util::File.mktemp target = File.join(target_dir, "cfpropertylist") Pkg::Util::Net.fetch_uri(source, target) Pkg::Util::File.untar_into(target, target_dir, "--strip-components 1") mv(Dir.glob("#{File.join(target_dir, "lib")}/cfpropertylist*"), libdir) mv(Dir.glob("#{target_dir}/{LICENSE,README,THANKS}"), File.join(libdir, "cfpropertylist")) else warn "It looks like the packaging tasks have not been loaded. You'll need to `rake package:bootstrap` before using this task" end end puppet-8.4.0/tasks/benchmark.rake0000644005276200011600000001262314552052437016666 0ustar jenkinsjenkinsrequire 'benchmark' require 'tmpdir' require 'csv' require 'objspace' namespace :benchmark do def generate_scenario_tasks(location, name) desc File.read(File.join(location, 'description')) task name => "#{name}:run" # Load a BenchmarkerTask to handle config of the benchmark task_handler_file = File.expand_path(File.join(location, 'benchmarker_task.rb')) if File.exist?(task_handler_file) require task_handler_file run_args = BenchmarkerTask.run_args else run_args = [] end namespace name do task :setup do ENV['ITERATIONS'] ||= '10' ENV['SIZE'] ||= '100' ENV['TARGET'] ||= Dir.mktmpdir(name) ENV['TARGET'] = File.expand_path(ENV['TARGET']) mkdir_p(ENV['TARGET']) require File.expand_path(File.join(location, 'benchmarker.rb')) @benchmark = Benchmarker.new(ENV['TARGET'], ENV['SIZE'].to_i) end task :generate => :setup do @benchmark.generate @benchmark.setup end desc "Run the #{name} scenario." task :run, [*run_args] => :generate do |_, args| report = [] details = [] Benchmark.benchmark(Benchmark::CAPTION, 10, Benchmark::FORMAT, "> total:", "> avg:") do |b| times = [] ENV['ITERATIONS'].to_i.times do |i| start_time = Time.now.to_i times << b.report("Run #{i + 1}") do details << @benchmark.run(args) end report << [to_millis(start_time), to_millis(times.last.real), 200, true, name] end sum = times.inject(Benchmark::Tms.new, &:+) [sum, sum / times.length] end write_csv("#{name}.samples", %w{timestamp elapsed responsecode success name}, report) # report details, if any were produced if details[0].is_a?(Array) && details[0][0].is_a?(Benchmark::Tms) # assume all entries are Tms if the first is # turn each into a hash of label => tms (since labels are lost when doing arithmetic on Tms) hashed = details.reduce([]) do |memo, measures| memo << measures.reduce({}) {|memo2, measure| memo2[measure.label] = measure; memo2} memo end # sum across all hashes result = {} hashed_totals = hashed.reduce {|memo, h| memo.merge(h) {|k, old, new| old + new }} # average the totals hashed_totals.keys.each {|k| hashed_totals[k] /= details.length } min_width = 14 max_width = (hashed_totals.keys.map(&:length) << min_width).max puts "\n" puts sprintf("%2$*1$s %3$s", -max_width, 'Details (avg)', " user system total real") puts "-" * (46 + max_width) hashed_totals.sort.each {|k,v| puts sprintf("%2$*1$s %3$s", -max_width, k, v.format) } end end desc "Profile a single run of the #{name} scenario." task :profile, [:warm_up_runs, *run_args] => :generate do |_, args| warm_up_runs = (args[:warm_up_runs] || '0').to_i warm_up_runs.times do @benchmark.run(args) end require 'ruby-prof' result = RubyProf.profile do @benchmark.run(args) end printer = RubyProf::CallTreePrinter.new(result) printer.print(:profile => name, :path => ENV['TARGET']) path = File.join(ENV['TARGET'], "#{name}.callgrind.out.#{$$}") puts "Generated callgrind file: #{path}" end desc "Print a memory profile of the #{name} scenario." task :memory_profile, [*run_args] => :generate do |_, args| begin require 'memory_profiler' rescue LoadError abort("Run `bundle install --with development` to install the 'memory_profiler' gem.") end report = MemoryProfiler.report do @benchmark.run(args) end path = "mem_profile_#{$PID}" report.pretty_print(to_file: path) puts "Generated memory profile: #{File.absolute_path(path)}" end desc "Generate a heap dump with object allocation tracing of the #{name} scenario." task :heap_dump, [*run_args] => :generate do |_, args| ObjectSpace.trace_object_allocations_start if ENV['DISABLE_GC'] GC.disable end @benchmark.run(args) unless ENV['DISABLE_GC'] GC.start end path = "heap_#{$PID}.json" File.open(path, 'w') do |file| ObjectSpace.dump_all(output: file) end puts "Generated heap dump: #{File.absolute_path(path)}" end def to_millis(seconds) (seconds * 1000).round end def write_csv(file, header, data) CSV.open(file, 'w') do |csv| csv << header data.each do |line| csv << line end end end end end scenarios = [] Dir.glob('benchmarks/*') do |location| name = File.basename(location) scenarios << name generate_scenario_tasks(location, File.basename(location)) end namespace :all do desc "Profile all of the scenarios. (#{scenarios.join(', ')})" task :profile do scenarios.each do |name| sh "rake benchmark:#{name}:profile" end end desc "Run all of the scenarios. (#{scenarios.join(', ')})" task :run do scenarios.each do |name| sh "rake benchmark:#{name}:run" end end end end puppet-8.4.0/locales/0000755005276200011600000000000014552052637014363 5ustar jenkinsjenkinspuppet-8.4.0/locales/config.yaml0000644005276200011600000000235014552052437016512 0ustar jenkinsjenkins--- # This is the project-specific configuration file for setting up # fast_gettext for your project. gettext: # This is used for the name of the .pot and .po files; they will be # called .pot project_name: 'puppet' # This is used in comments in the .pot and .po files to indicate what # project the files belong to and should be a little more descriptive than # package_name: Puppet automation framework # The locale that the default messages in the .pot file are in default_locale: en # The address for sending bug reports. bugs_address: https://tickets.puppetlabs.com # The holder of the copyright. copyright_holder: Puppet, Inc. # Patterns for +Dir.glob+ used to find all files that might contain # translatable content, relative to the project root directory source_files: - 'lib/**/*.rb' # Patterns for +Dir.glob+ used to find all files contained in # `source_files` that should be ignored when searching for translatable # content, relative to the project root directory exclude_files: - 'lib/puppet/pops/types/type_formatter.rb' # The semantic_puppet gem is temporarily vendored (PUP-7114), and it # handles its own translation. - 'lib/puppet/vendor/**/*.rb' puppet-8.4.0/locales/en/0000755005276200011600000000000014552052637014765 5ustar jenkinsjenkinspuppet-8.4.0/locales/en/puppet.po0000644005276200011600000000127614552052437016646 0ustar jenkinsjenkins# English translations for Puppet automation framework package. # Copyright (C) 2017 Puppet, Inc. # This file is distributed under the same license as the Puppet automation framework package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: Puppet automation framework 5.3.3-51-gc11ddbe\n" "\n" "Report-Msgid-Bugs-To: https://tickets.puppetlabs.com\n" "POT-Creation-Date: 2017-11-17 12:09+0000\n" "PO-Revision-Date: 2017-11-17 12:09+0000\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" puppet-8.4.0/locales/puppet.pot0000644005276200011600000113050414552052437016426 0ustar jenkinsjenkins# SOME DESCRIPTIVE TITLE. # Copyright (C) 2023 Puppet, Inc. # This file is distributed under the same license as the Puppet automation framework package. # FIRST AUTHOR , 2023. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: Puppet automation framework 8.3.1-124-gc92197235b\n" "\n" "Report-Msgid-Bugs-To: https://tickets.puppetlabs.com\n" "POT-Creation-Date: 2023-12-05 22:36+0000\n" "PO-Revision-Date: 2023-12-05 22:36+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #. TRANSLATORS 'lookup' is a puppet function and should not be translated #: ../lib/hiera/puppet_function.rb:65 msgid "The function '%{class_name}' is deprecated in favor of using 'lookup'." msgstr "" #: ../lib/hiera/puppet_function.rb:66 msgid "See https://puppet.com/docs/puppet/%{minor_version}/deprecated_language.html" msgstr "" #: ../lib/hiera/scope.rb:47 ../lib/puppet/parser/scope.rb:535 ../lib/puppet/parser/scope.rb:539 msgid "Variable: %{name}" msgstr "" #: ../lib/hiera/scope.rb:48 ../lib/hiera/scope.rb:50 ../lib/puppet/parser/scope.rb:536 ../lib/puppet/parser/scope.rb:542 msgid "Undefined variable '%{name}'; %{reason}" msgstr "" #: ../lib/hiera_puppet.rb:15 msgid "Could not find data item %{key} in any Hiera data file and no default supplied" msgstr "" #: ../lib/hiera_puppet.rb:42 msgid "Please supply a parameter to perform a Hiera lookup" msgstr "" #: ../lib/hiera_puppet.rb:73 ../lib/puppet/indirector/hiera.rb:85 msgid "Config file %{hiera_config} not found, using Hiera defaults" msgstr "" #: ../lib/puppet.rb:131 msgid "Support for ruby version %{version} is deprecated and will be removed in a future release. See https://puppet.com/docs/puppet/latest/system_requirements.html for a list of supported ruby versions." msgstr "" #: ../lib/puppet.rb:217 msgid "The environmentpath setting cannot be empty or nil." msgstr "" #: ../lib/puppet/agent.rb:94 msgid "Run of %{client_class} already in progress; skipping (%{lockfile_path} exists)" msgstr "" #: ../lib/puppet/agent.rb:97 msgid "Exiting now because the maxwaitforlock timeout has been exceeded." msgstr "" #: ../lib/puppet/agent.rb:100 msgid "Another puppet instance is already running; --waitforlock flag used, waiting for running instance to finish." msgstr "" #: ../lib/puppet/agent.rb:101 ../lib/puppet/ssl/state_machine.rb:414 ../lib/puppet/ssl/state_machine.rb:445 msgid "Will try again in %{time} seconds." msgstr "" #: ../lib/puppet/agent.rb:106 msgid "Execution of %{client_class} did not complete within %{runtimeout} seconds and was terminated." msgstr "" #: ../lib/puppet/agent.rb:110 msgid "Could not run %{client_class}: %{detail}" msgstr "" #: ../lib/puppet/agent.rb:119 msgid "Shutdown/restart in progress (%{status}); skipping run" msgstr "" #: ../lib/puppet/agent.rb:137 msgid "puppet agent: applying configuration" msgstr "" #: ../lib/puppet/agent.rb:160 msgid "Could not create instance of %{client_class}: %{detail}" msgstr "" #: ../lib/puppet/agent.rb:175 msgid "" "Skipping run of %{client_class}; administratively disabled (Reason: '%{disable_message}');\n" "Use 'puppet agent --enable' to re-enable." msgstr "" #: ../lib/puppet/agent/disabler.rb:20 msgid "Enabling Puppet." msgstr "" #: ../lib/puppet/agent/disabler.rb:27 msgid "Disabling Puppet." msgstr "" #: ../lib/puppet/agent/locker.rb:27 msgid "Failed to acquire lock" msgstr "" #: ../lib/puppet/application.rb:232 msgid "Unable to find application '%{application_name}'. %{error}" msgstr "" #: ../lib/puppet/application.rb:253 msgid "Unable to load application class '%{class_name}' from file 'puppet/application/%{application_name}.rb'" msgstr "" #: ../lib/puppet/application.rb:306 msgid "Invalid environment mode '%{mode_name}'" msgstr "" #: ../lib/puppet/application.rb:406 msgid "Could not get application-specific default settings" msgstr "" #: ../lib/puppet/application.rb:412 msgid "Could not initialize" msgstr "" #: ../lib/puppet/application.rb:413 msgid "Could not parse application options" msgstr "" #: ../lib/puppet/application.rb:414 msgid "Could not prepare for execution" msgstr "" #: ../lib/puppet/application.rb:417 msgid "`puppet %{name}` is deprecated and will be removed in a future release." msgstr "" #: ../lib/puppet/application.rb:420 msgid "Could not configure routes from %{route_file}" msgstr "" #: ../lib/puppet/application.rb:421 msgid "Could not log runtime debug info" msgstr "" #: ../lib/puppet/application.rb:422 msgid "Could not run" msgstr "" #: ../lib/puppet/application.rb:431 msgid "No valid command or main" msgstr "" #: ../lib/puppet/application.rb:487 msgid "Could not set logdest to %{dest}." msgstr "" #: ../lib/puppet/application.rb:585 msgid "No help available for puppet %{app_name}" msgstr "" #: ../lib/puppet/application/agent.rb:25 ../lib/puppet/application/device.rb:25 msgid "Cancelling startup" msgstr "" #: ../lib/puppet/application/agent.rb:84 msgid "The puppet agent daemon" msgstr "" #: ../lib/puppet/application/agent.rb:423 msgid "Fingerprint asked but neither the certificate, nor the certificate request have been issued" msgstr "" #: ../lib/puppet/application/agent.rb:428 msgid "Failed to generate fingerprint: %{message}" msgstr "" #: ../lib/puppet/application/agent.rb:451 msgid "Starting Puppet client version %{version}" msgstr "" #: ../lib/puppet/application/agent.rb:467 msgid "The puppet agent command does not take parameters" msgstr "" #: ../lib/puppet/application/apply.rb:38 msgid "Apply Puppet manifests locally" msgstr "" #. TRANSLATORS "puppet apply" is a program command and should not be translated #. TRANSLATORS "puppet apply" is a program command and should not be translated #: ../lib/puppet/application/apply.rb:213 ../lib/puppet/application/apply.rb:341 msgid "For puppet apply" msgstr "" #: ../lib/puppet/application/apply.rb:221 msgid "%{file} is not readable" msgstr "" #: ../lib/puppet/application/apply.rb:307 ../lib/puppet/application/script.rb:242 msgid "Exiting" msgstr "" #: ../lib/puppet/application/apply.rb:351 msgid "Could not deserialize catalog from %{format}: %{detail}" msgstr "" #: ../lib/puppet/application/apply.rb:372 ../lib/puppet/application/script.rb:147 msgid "Could not find facts for %{node}" msgstr "" #: ../lib/puppet/application/apply.rb:384 ../lib/puppet/application/script.rb:155 msgid "Could not find node %{node}" msgstr "" #: ../lib/puppet/application/apply.rb:397 ../lib/puppet/application/script.rb:140 msgid "Could not find file %{manifest}" msgstr "" #: ../lib/puppet/application/apply.rb:398 msgid "Only one file can be applied per run. Skipping %{files}" msgstr "" #: ../lib/puppet/application/describe.rb:178 msgid "Display help about resource types" msgstr "" #: ../lib/puppet/application/device.rb:84 msgid "Manage remote network devices" msgstr "" #: ../lib/puppet/application/device.rb:233 msgid "resource command requires target" msgstr "" #: ../lib/puppet/application/device.rb:236 msgid "facts command requires target" msgstr "" #: ../lib/puppet/application/device.rb:239 msgid "missing argument: --target is required when using --apply" msgstr "" #: ../lib/puppet/application/device.rb:240 msgid "%{file} does not exist, cannot apply" msgstr "" #: ../lib/puppet/application/device.rb:258 msgid "Target device / certificate '%{target}' not found in %{config}" msgstr "" #: ../lib/puppet/application/device.rb:260 msgid "No device found in %{config}" msgstr "" #: ../lib/puppet/application/device.rb:317 msgid "retrieving resource: %{resource} from %{target} at %{scheme}%{url_host}%{port}%{url_path}" msgstr "" #: ../lib/puppet/application/device.rb:332 msgid "retrieving facts from %{target} at %{scheme}%{url_host}%{port}%{url_path}" msgstr "" #: ../lib/puppet/application/device.rb:355 msgid "starting applying configuration to %{target} at %{scheme}%{url_host}%{port}%{url_path}" msgstr "" #: ../lib/puppet/application/device.rb:391 ../lib/puppet/application/resource.rb:202 msgid "You must specify the type to display" msgstr "" #: ../lib/puppet/application/device.rb:392 ../lib/puppet/application/resource.rb:203 msgid "Could not find type %{type}" msgstr "" #: ../lib/puppet/application/doc.rb:29 msgid "Invalid output format %{arg}" msgstr "" #: ../lib/puppet/application/doc.rb:38 msgid "Invalid output mode %{arg}" msgstr "" #: ../lib/puppet/application/doc.rb:54 msgid "Generate Puppet references" msgstr "" #: ../lib/puppet/application/doc.rb:136 msgid "scanning: %{files}" msgstr "" #: ../lib/puppet/application/doc.rb:148 msgid "Could not generate documentation: %{detail}" msgstr "" #: ../lib/puppet/application/doc.rb:161 msgid "Could not find reference %{name}" msgstr "" #: ../lib/puppet/application/doc.rb:167 msgid "Could not generate reference %{name}: %{detail}" msgstr "" #: ../lib/puppet/application/face_base.rb:36 msgid "I don't know how to render '%{format}'" msgstr "" #: ../lib/puppet/application/face_base.rb:58 msgid "Cancelling Face" msgstr "" #: ../lib/puppet/application/face_base.rb:137 msgid "'%{face}' has no %{action} action. See `puppet help %{face}`." msgstr "" #: ../lib/puppet/application/face_base.rb:215 msgid "%{face} does not respond to action %{arg}" msgstr "" #: ../lib/puppet/application/face_base.rb:248 msgid "puppet %{face} %{action} takes %{arg_count} argument, but you gave %{given_count}" msgid_plural "puppet %{face} %{action} takes %{arg_count} arguments, but you gave %{given_count}" msgstr[0] "" msgstr[1] "" #: ../lib/puppet/application/face_base.rb:253 msgid "'puppet %{face}' is deprecated and will be removed in a future release" msgstr "" #: ../lib/puppet/application/face_base.rb:272 msgid "Try 'puppet help %{face} %{action}' for usage" msgstr "" #: ../lib/puppet/application/filebucket.rb:18 msgid "Store and retrieve files in a filebucket" msgstr "" #: ../lib/puppet/application/filebucket.rb:227 msgid "You must specify a file to back up" msgstr "" #: ../lib/puppet/application/filebucket.rb:231 msgid "%{file}: no such file" msgstr "" #: ../lib/puppet/application/filebucket.rb:235 msgid "%{file}: cannot read file" msgstr "" #: ../lib/puppet/application/filebucket.rb:257 ../lib/puppet/application/filebucket.rb:280 msgid "Need exactly two arguments: filebucket diff " msgstr "" #: ../lib/puppet/application/filebucket.rb:277 msgid "Comparing %{checksum_a} %{checksum_b} %{file_a} %{file_b}" msgstr "" #: ../lib/puppet/application/filebucket.rb:291 msgid "Cancelling" msgstr "" #: ../lib/puppet/application/lookup.rb:9 msgid "Run 'puppet lookup --help' for more details" msgstr "" #: ../lib/puppet/application/lookup.rb:103 msgid "Interactive Hiera lookup" msgstr "" #: ../lib/puppet/application/lookup.rb:280 msgid "" "The options %{deep_merge_opts} are only available with '--merge deep'\n" "%{run_help}" msgstr "" #: ../lib/puppet/application/lookup.rb:291 msgid "" "The --merge option only accepts %{strategies}, or %{last_strategy}\n" "%{run_help}" msgstr "" #: ../lib/puppet/application/lookup.rb:316 msgid "No keys were given to lookup." msgstr "" #: ../lib/puppet/application/lookup.rb:324 msgid "Unknown rendering format '%{format}'" msgstr "" #: ../lib/puppet/application/lookup.rb:365 msgid "Incorrectly formatted data in %{fact_file} given via the --facts flag (only accepts yaml and json files)" msgstr "" #: ../lib/puppet/application/lookup.rb:370 msgid "When overriding any of the %{trusted_facts_list} facts with %{fact_file} given via the --facts flag, they must all be overridden." msgstr "" #: ../lib/puppet/application/lookup.rb:397 msgid "CA is not available, the operation will continue without using trusted facts." msgstr "" #: ../lib/puppet/application/lookup.rb:428 msgid "No facts available for target node: %{node}" msgstr "" #: ../lib/puppet/application/resource.rb:35 msgid "The resource abstraction layer shell" msgstr "" #: ../lib/puppet/application/resource.rb:146 msgid "Editing with Yaml output is not supported" msgstr "" #: ../lib/puppet/application/resource.rb:210 msgid "Invalid parameter setting %{setting}" msgstr "" #: ../lib/puppet/application/resource.rb:242 msgid "Listing all file instances is not supported. Please specify a file or directory, e.g. puppet resource file /etc" msgstr "" #: ../lib/puppet/application/script.rb:21 msgid "Run a puppet manifests as a script without compiling a catalog" msgstr "" #: ../lib/puppet/application/script.rb:127 msgid "Bolt must be installed to use the script application" msgstr "" #: ../lib/puppet/application/script.rb:141 msgid "Only one file can be used per run. Skipping %{files}" msgstr "" #: ../lib/puppet/application/ssl.rb:10 msgid "Manage SSL keys and certificates for puppet SSL clients" msgstr "" #: ../lib/puppet/application/ssl.rb:112 msgid "An action must be specified." msgstr "" #: ../lib/puppet/application/ssl.rb:136 ../lib/puppet/application/ssl.rb:143 msgid "The certificate for '%{name}' has not yet been signed" msgstr "" #: ../lib/puppet/application/ssl.rb:166 msgid "Completed SSL initialization" msgstr "" #: ../lib/puppet/application/ssl.rb:170 msgid "Unknown action '%{action}'" msgstr "" #: ../lib/puppet/application/ssl.rb:191 msgid "Submitted certificate request for '%{name}' to %{url}" msgstr "" #: ../lib/puppet/application/ssl.rb:194 msgid "Could not submit certificate request for '%{name}' to %{url} due to a conflict on the server" msgstr "" #: ../lib/puppet/application/ssl.rb:196 ../lib/puppet/application/ssl.rb:199 msgid "Failed to submit certificate request: %{message}" msgstr "" #: ../lib/puppet/application/ssl.rb:211 msgid "Generated certificate request in '%{path}'" msgstr "" #: ../lib/puppet/application/ssl.rb:213 msgid "Failed to generate certificate request: %{message}" msgstr "" #: ../lib/puppet/application/ssl.rb:221 msgid "Downloading certificate '%{name}' from %{url}" msgstr "" #: ../lib/puppet/application/ssl.rb:225 msgid "Downloaded certificate '%{name}' with fingerprint %{fingerprint}" msgstr "" #: ../lib/puppet/application/ssl.rb:238 ../lib/puppet/application/ssl.rb:241 msgid "Failed to download certificate: %{message}" msgstr "" #: ../lib/puppet/application/ssl.rb:270 ../lib/puppet/application/ssl.rb:273 msgid "Failed to connect to the CA to determine if certificate %{certname} has been cleaned" msgstr "" #: ../lib/puppet/application/ssl.rb:300 msgid "Removed %{label} %{path}" msgstr "" #: ../lib/puppet/application/ssl.rb:317 ../lib/puppet/ssl/state_machine.rb:273 msgid "Creating a new EC SSL key for %{name} using curve %{curve}" msgstr "" #: ../lib/puppet/application/ssl.rb:320 msgid "Creating a new SSL key for %{name}" msgstr "" #: ../lib/puppet/configurer.rb:22 msgid "Puppet configuration client" msgstr "" #: ../lib/puppet/configurer.rb:45 msgid "Removing corrupt state file %{file}: %{detail}" msgstr "" #: ../lib/puppet/configurer.rb:50 msgid "Cannot remove %{file}: %{detail}" msgstr "" #: ../lib/puppet/configurer.rb:81 msgid "Using cached catalog from environment '%{environment}'" msgstr "" #: ../lib/puppet/configurer.rb:87 msgid "Not using cache on failed catalog" msgstr "" #: ../lib/puppet/configurer.rb:96 msgid "Not using cached catalog because its environment '%{catalog_env}' does not match '%{local_env}'" msgstr "" #: ../lib/puppet/configurer.rb:101 ../lib/puppet/configurer.rb:276 msgid "Using cached catalog from environment '%{catalog_env}'" msgstr "" #: ../lib/puppet/configurer.rb:134 msgid "The current total number of facts: %{size} exceeds the number of facts limit: %{max_size}" msgstr "" #: ../lib/puppet/configurer.rb:138 msgid "Fact %{name} with length: '%{length}' exceeds the length limit: %{limit}" msgstr "" #: ../lib/puppet/configurer.rb:142 msgid "The current number of top level facts: %{size} exceeds the top facts limit: %{max_size}" msgstr "" #: ../lib/puppet/configurer.rb:146 msgid "Fact value '%{value}' with the value length: '%{length}' exceeds the value length limit: %{max_length}" msgstr "" #: ../lib/puppet/configurer.rb:150 msgid "Payload with the current size of: '%{payload}' exceeds the payload size limit: %{max_size}" msgstr "" #: ../lib/puppet/configurer.rb:188 msgid "The size of the payload is %{payload}" msgstr "" #: ../lib/puppet/configurer.rb:218 msgid "The total number of facts registered is %{number_of_facts}" msgstr "" #: ../lib/puppet/configurer.rb:269 msgid "Could not retrieve catalog; skipping run" msgstr "" #: ../lib/puppet/configurer.rb:285 msgid "Applied catalog in %{seconds} seconds" msgstr "" #: ../lib/puppet/configurer.rb:319 msgid "Could not select a functional puppet server from server_list: '%{server_list}'" msgstr "" #. TRANSLATORS 'server_list' is the name of a setting and should not be translated #: ../lib/puppet/configurer.rb:333 msgid "Selected puppet server from the `server_list` setting: %{server}:%{port}" msgstr "" #: ../lib/puppet/configurer.rb:370 msgid "Local environment: '%{local_env}' doesn't match the environment of the cached catalog '%{catalog_env}', switching agent to '%{catalog_env}'." msgstr "" #: ../lib/puppet/configurer.rb:393 msgid "Environment not passed via CLI and no catalog was given, attempting to find out the last server-specified environment" msgstr "" #: ../lib/puppet/configurer.rb:397 msgid "Requesting environment from the server" msgstr "" #: ../lib/puppet/configurer.rb:407 msgid "Could not find a usable environment in the lastrunfile. Either the file does not exist, does not have the required keys, or the values of 'initial_environment' and 'converged_environment' are identical." msgstr "" #: ../lib/puppet/configurer.rb:411 msgid "Using environment '%{env}'" msgstr "" #: ../lib/puppet/configurer.rb:435 msgid "Not using catalog because its environment '%{catalog_env}' does not match agent specified environment '%{local_env}' and strict_environment_mode is set" msgstr "" #: ../lib/puppet/configurer.rb:446 msgid "Catalog environment didn't stabilize after %{tries} fetches, aborting run" msgstr "" #: ../lib/puppet/configurer.rb:448 msgid "Local environment: '%{local_env}' doesn't match server specified environment '%{catalog_env}', restarting agent run with environment '%{catalog_env}'" msgstr "" #: ../lib/puppet/configurer.rb:504 msgid "Failed to apply catalog: %{detail}" msgstr "" #: ../lib/puppet/configurer.rb:536 msgid "Environment '%{environment}' not found on server, aborting run." msgstr "" #: ../lib/puppet/configurer.rb:538 msgid "Environment '%{environment}' not found on server, skipping initial pluginsync." msgstr "" #: ../lib/puppet/configurer.rb:556 ../lib/puppet/http/resolver/server_list.rb:65 ../lib/puppet/http/resolver/server_list.rb:69 msgid "Puppet server %{host}:%{port} is unavailable: %{code} %{reason}" msgstr "" #. TRANSLATORS 'server_list' is the name of a setting and should not be translated #: ../lib/puppet/configurer.rb:560 ../lib/puppet/http/resolver/server_list.rb:74 ../lib/puppet/http/resolver/server_list.rb:77 msgid "Unable to connect to server from server_list setting: %{detail}" msgstr "" #: ../lib/puppet/configurer.rb:585 msgid "Successfully loaded last environment from the lastrunfile" msgstr "" #: ../lib/puppet/configurer.rb:589 msgid "Found last server-specified environment: %{environment}" msgstr "" #: ../lib/puppet/configurer.rb:592 msgid "Could not find last server-specified environment: %{detail}" msgstr "" #: ../lib/puppet/configurer.rb:612 msgid "Local environment: '%{local_env}' doesn't match server specified node environment '%{node_env}', switching agent to '%{node_env}'." msgstr "" #: ../lib/puppet/configurer.rb:620 msgid "Unable to fetch my node definition, but the agent run will continue:" msgstr "" #: ../lib/puppet/configurer.rb:639 ../lib/puppet/face/report.rb:48 msgid "Could not send report: %{detail}" msgstr "" #: ../lib/puppet/configurer.rb:648 msgid "Could not save last run local report: %{detail}" msgstr "" #: ../lib/puppet/configurer.rb:667 msgid "Uploading facts for %{node} to %{server}" msgstr "" #: ../lib/puppet/configurer.rb:675 msgid "Failed to submit facts: %{detail}" msgstr "" #: ../lib/puppet/configurer.rb:690 msgid "Could not run command from %{setting}: %{detail}" msgstr "" #: ../lib/puppet/configurer.rb:719 msgid "Could not retrieve catalog from cache: %{detail}" msgstr "" #: ../lib/puppet/configurer.rb:741 msgid "Could not retrieve catalog from remote server: %{detail}" msgstr "" #: ../lib/puppet/configurer/downloader.rb:10 msgid "Retrieving %{name}" msgstr "" #: ../lib/puppet/configurer/downloader.rb:22 msgid "Failed to retrieve %{name}: %{detail}" msgstr "" #: ../lib/puppet/configurer/downloader.rb:33 msgid "Could not retrieve %{name}: %{detail}" msgstr "" #: ../lib/puppet/configurer/fact_handler.rb:25 msgid "Could not retrieve local facts: %{detail}" msgstr "" #: ../lib/puppet/context.rb:78 msgid "Mark for '%{name}' already exists" msgstr "" #: ../lib/puppet/context.rb:93 msgid "Unknown mark '%{name}'" msgstr "" #: ../lib/puppet/context.rb:112 ../lib/puppet/context.rb:170 msgid "Unable to lookup '%{name}'" msgstr "" #: ../lib/puppet/context.rb:121 msgid "Attempted to pop, but already at root of the context stack." msgstr "" #: ../lib/puppet/context/trusted_information.rb:54 msgid "TrustedInformation expected a certificate, but none was given." msgstr "" #: ../lib/puppet/context/trusted_information.rb:105 ../lib/puppet/parser/scope.rb:841 msgid "Unsupported data type: '%{klass}'" msgstr "" #: ../lib/puppet/daemon.rb:27 msgid "Daemons must have an agent" msgstr "" #: ../lib/puppet/daemon.rb:82 msgid "Cannot reexec unless ARGV arguments are set" msgstr "" #: ../lib/puppet/datatypes.rb:134 msgid "Data Type Load Error for type '%{type_name}': %{message}" msgstr "" #: ../lib/puppet/datatypes.rb:157 msgid "a data type must have an interface" msgstr "" #: ../lib/puppet/datatypes.rb:196 msgid "a data type can only have one interface" msgstr "" #: ../lib/puppet/datatypes.rb:201 ../lib/puppet/datatypes.rb:206 msgid "a data type can only have one implementation" msgstr "" #: ../lib/puppet/defaults.rb:169 msgid "Cannot disable unrecognized warning types '%{invalid}'." msgstr "" #: ../lib/puppet/defaults.rb:170 msgid "Valid values are '%{values}'." msgstr "" #. TRANSLATORS 'data_binding_terminus' is a setting and should not be translated #: ../lib/puppet/defaults.rb:561 msgid "Setting 'data_binding_terminus' is deprecated." msgstr "" #. TRANSLATORS 'hiera' should not be translated #: ../lib/puppet/defaults.rb:563 msgid "Convert custom terminus to hiera 5 API." msgstr "" #. TRANSLATORS 'environment_data_provider' is a setting and should not be translated #: ../lib/puppet/defaults.rb:757 msgid "Setting 'environment_data_provider' is deprecated." msgstr "" #: ../lib/puppet/defaults.rb:848 msgid "Certificate names must be lower case" msgstr "" #: ../lib/puppet/defaults.rb:1107 ../lib/puppet/settings/enum_setting.rb:14 ../lib/puppet/settings/symbolic_enum_setting.rb:15 msgid "Invalid value '%{value}' for parameter %{name}. Allowed values are '%{allowed_values}'" msgstr "" #. TRANSLATORS 'pluginsync' is a setting and should not be translated #: ../lib/puppet/defaults.rb:2041 msgid "Setting 'pluginsync' is deprecated." msgstr "" #: ../lib/puppet/error.rb:78 msgid "Could not parse for environment %{environment}: %{message}" msgstr "" #: ../lib/puppet/error.rb:79 ../lib/puppet/parser/compiler.rb:41 msgid "%{message} on node %{node}" msgstr "" #: ../lib/puppet/face/catalog.rb:8 msgid "Compile, save, view, and convert catalogs." msgstr "" #: ../lib/puppet/face/catalog.rb:88 msgid "Compile a catalog." msgstr "" #: ../lib/puppet/face/catalog/select.rb:5 msgid "Retrieve a catalog and filter it for resources of a given type." msgstr "" #: ../lib/puppet/face/catalog/select.rb:6 msgid " " msgstr "" #: ../lib/puppet/face/catalog/select.rb:44 msgid "no matching resources found" msgstr "" #: ../lib/puppet/face/config.rb:8 ../lib/puppet/face/epp.rb:9 ../lib/puppet/face/facts.rb:7 ../lib/puppet/face/generate.rb:8 ../lib/puppet/face/help.rb:10 ../lib/puppet/face/module.rb:10 ../lib/puppet/face/node.rb:5 ../lib/puppet/face/parser.rb:7 ../lib/puppet/face/plugin.rb:7 ../lib/puppet/face/report.rb:6 ../lib/puppet/face/resource.rb:6 msgid "Apache 2 license; see COPYING" msgstr "" #: ../lib/puppet/face/config.rb:10 msgid "Interact with Puppet's settings." msgstr "" #: ../lib/puppet/face/config.rb:18 msgid "SECTION_NAME" msgstr "" #: ../lib/puppet/face/config.rb:20 msgid "The section of the configuration file to interact with." msgstr "" #: ../lib/puppet/face/config.rb:38 msgid "Examine Puppet's current settings." msgstr "" #: ../lib/puppet/face/config.rb:39 msgid "all | [ ...]" msgstr "" #: ../lib/puppet/face/config.rb:100 msgid "No section specified; defaulting to '%{section_name}'." msgstr "" #. TRANSLATORS '--section' is a command line option and should not be translated #: ../lib/puppet/face/config.rb:103 msgid "Set the config section by using the `--section` flag." msgstr "" #. TRANSLATORS `puppet config --section user print foo` is a command line example and should not be translated #: ../lib/puppet/face/config.rb:105 msgid "For example, `puppet config --section user print foo`." msgstr "" #: ../lib/puppet/face/config.rb:106 msgid "For more information, see https://puppet.com/docs/puppet/latest/configuration.html" msgstr "" #: ../lib/puppet/face/config.rb:113 msgid "Resolving settings from section '%{section_name}' in environment '%{environment_name}'" msgstr "" #: ../lib/puppet/face/config.rb:118 msgid "Set Puppet's settings." msgstr "" #: ../lib/puppet/face/config.rb:119 msgid "[setting_name] [setting_value]" msgstr "" #: ../lib/puppet/face/config.rb:187 msgid "Deleted setting from '%{section_name}': '%{setting_string}', and adding it to 'server' section" msgstr "" #: ../lib/puppet/face/config.rb:202 msgid "Delete a Puppet setting." msgstr "" #: ../lib/puppet/face/config.rb:203 msgid "" msgstr "" #: ../lib/puppet/face/config.rb:237 ../lib/puppet/face/config.rb:241 ../lib/puppet/face/config.rb:252 msgid "Deleted setting from '%{section_name}': '%{setting_string}'" msgstr "" #: ../lib/puppet/face/config.rb:255 msgid "No setting found in configuration file for section '%{section_name}' setting name '%{name}'" msgstr "" #. TRANSLATORS the 'puppet.conf' is a specific file and should not be translated #: ../lib/puppet/face/config.rb:263 msgid "The puppet.conf file does not exist %{puppet_conf}" msgstr "" #: ../lib/puppet/face/epp.rb:11 msgid "Interact directly with the EPP template parser/renderer." msgstr "" #: ../lib/puppet/face/epp.rb:14 msgid "Validate the syntax of one or more EPP templates." msgstr "" #: ../lib/puppet/face/epp.rb:15 msgid "[