puppet 6.17.0-x64-mingw32 → 6.18.0-x64-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile.lock +6 -5
- data/lib/puppet/application/apply.rb +18 -20
- data/lib/puppet/application/lookup.rb +16 -4
- data/lib/puppet/configurer/downloader.rb +31 -10
- data/lib/puppet/confine.rb +1 -1
- data/lib/puppet/confine/any.rb +1 -1
- data/lib/puppet/defaults.rb +21 -3
- data/lib/puppet/feature/base.rb +1 -1
- data/lib/puppet/file_serving/mount/locales.rb +1 -2
- data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
- data/lib/puppet/file_serving/mount/plugins.rb +1 -2
- data/lib/puppet/file_system/file_impl.rb +3 -3
- data/lib/puppet/functions/lstrip.rb +4 -4
- data/lib/puppet/functions/reverse_each.rb +1 -1
- data/lib/puppet/functions/rstrip.rb +4 -4
- data/lib/puppet/functions/step.rb +1 -1
- data/lib/puppet/functions/strip.rb +4 -4
- data/lib/puppet/gettext/config.rb +5 -5
- data/lib/puppet/gettext/module_translations.rb +4 -4
- data/lib/puppet/indirector/exec.rb +1 -1
- data/lib/puppet/indirector/facts/facter.rb +3 -3
- data/lib/puppet/indirector/file_metadata/http.rb +1 -0
- data/lib/puppet/indirector/hiera.rb +4 -0
- data/lib/puppet/indirector/indirection.rb +1 -1
- data/lib/puppet/indirector/report/processor.rb +2 -2
- data/lib/puppet/module.rb +1 -2
- data/lib/puppet/network/format_support.rb +2 -2
- data/lib/puppet/network/http/route.rb +2 -2
- data/lib/puppet/node/environment.rb +12 -5
- data/lib/puppet/pal/pal_impl.rb +27 -3
- data/lib/puppet/parameter.rb +1 -1
- data/lib/puppet/parser/functions.rb +21 -17
- data/lib/puppet/parser/functions/create_resources.rb +11 -7
- data/lib/puppet/parser/type_loader.rb +2 -2
- data/lib/puppet/pops/adaptable.rb +7 -13
- data/lib/puppet/pops/adapters.rb +8 -4
- data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
- data/lib/puppet/pops/loaders.rb +18 -11
- data/lib/puppet/pops/lookup/context.rb +1 -1
- data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
- data/lib/puppet/pops/types/iterable.rb +34 -8
- data/lib/puppet/pops/validation/checker4_0.rb +19 -15
- data/lib/puppet/provider/file/windows.rb +1 -1
- data/lib/puppet/provider/package/apt.rb +34 -0
- data/lib/puppet/provider/package/gem.rb +4 -2
- data/lib/puppet/provider/package/puppet_gem.rb +5 -0
- data/lib/puppet/provider/package/zypper.rb +3 -0
- data/lib/puppet/provider/user/aix.rb +1 -1
- data/lib/puppet/provider/user/user_role_add.rb +1 -1
- data/lib/puppet/provider/user/windows_adsi.rb +18 -1
- data/lib/puppet/settings.rb +1 -1
- data/lib/puppet/ssl/validator/default_validator.rb +1 -1
- data/lib/puppet/test/test_helper.rb +10 -3
- data/lib/puppet/transaction.rb +2 -2
- data/lib/puppet/transaction/persistence.rb +1 -1
- data/lib/puppet/transaction/report.rb +1 -1
- data/lib/puppet/trusted_external.rb +2 -2
- data/lib/puppet/type.rb +4 -3
- data/lib/puppet/type/file.rb +2 -2
- data/lib/puppet/type/file/source.rb +27 -7
- data/lib/puppet/type/notify.rb +2 -2
- data/lib/puppet/type/service.rb +4 -0
- data/lib/puppet/type/user.rb +18 -3
- data/lib/puppet/util.rb +26 -12
- data/lib/puppet/util/autoload.rb +9 -7
- data/lib/puppet/util/character_encoding.rb +9 -5
- data/lib/puppet/util/execution.rb +2 -2
- data/lib/puppet/util/windows.rb +1 -0
- data/lib/puppet/util/windows/api_types.rb +15 -1
- data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
- data/lib/puppet/util/windows/security.rb +4 -4
- data/lib/puppet/util/windows/user.rb +219 -0
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +78 -69
- data/man/man5/puppet.conf.5 +22 -3
- data/man/man8/puppet-agent.8 +1 -1
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +1 -1
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +1 -1
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +1 -1
- data/man/man8/puppet-filebucket.8 +1 -1
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +1 -1
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +2 -2
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +1 -1
- data/man/man8/puppet-node.8 +1 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +1 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +1 -1
- data/man/man8/puppet-ssl.8 +1 -1
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
- data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
- data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
- data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
- data/spec/integration/application/agent_spec.rb +29 -37
- data/spec/integration/application/apply_spec.rb +149 -149
- data/spec/integration/application/config_spec.rb +74 -0
- data/spec/integration/application/doc_spec.rb +16 -6
- data/spec/integration/application/filebucket_spec.rb +65 -16
- data/spec/integration/application/help_spec.rb +42 -0
- data/spec/integration/application/lookup_spec.rb +13 -0
- data/spec/integration/application/module_spec.rb +68 -0
- data/spec/integration/application/plugin_spec.rb +50 -0
- data/spec/integration/data_binding_spec.rb +82 -0
- data/spec/integration/directory_environments_spec.rb +17 -17
- data/spec/integration/indirector/facts/facter_spec.rb +8 -6
- data/spec/integration/node/environment_spec.rb +1 -1
- data/spec/integration/util/execution_spec.rb +22 -0
- data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
- data/spec/integration/util/windows/process_spec.rb +26 -32
- data/spec/integration/util/windows/user_spec.rb +7 -0
- data/spec/integration/util_spec.rb +7 -33
- data/spec/lib/puppet_spec/matchers.rb +0 -80
- data/spec/lib/puppet_spec/puppetserver.rb +8 -0
- data/spec/unit/application/agent_spec.rb +3 -4
- data/spec/unit/application/face_base_spec.rb +6 -4
- data/spec/unit/application/facts_spec.rb +39 -10
- data/spec/unit/application/man_spec.rb +52 -0
- data/spec/unit/application/resource_spec.rb +3 -1
- data/spec/unit/application/ssl_spec.rb +15 -2
- data/spec/unit/configurer/downloader_spec.rb +10 -0
- data/spec/unit/configurer_spec.rb +47 -31
- data/spec/unit/confine_spec.rb +2 -1
- data/spec/unit/face/config_spec.rb +3 -1
- data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
- data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
- data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
- data/spec/unit/file_system/uniquefile_spec.rb +18 -0
- data/spec/unit/http/client_spec.rb +0 -1
- data/spec/unit/http/resolver_spec.rb +0 -1
- data/spec/unit/http/service/ca_spec.rb +0 -1
- data/spec/unit/http/service/compiler_spec.rb +0 -1
- data/spec/unit/http/service/file_server_spec.rb +0 -1
- data/spec/unit/http/service/report_spec.rb +0 -1
- data/spec/unit/http/service_spec.rb +0 -1
- data/spec/unit/http/session_spec.rb +0 -1
- data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
- data/spec/unit/network/format_support_spec.rb +3 -2
- data/spec/unit/node/environment_spec.rb +18 -1
- data/spec/unit/pops/loaders/loaders_spec.rb +70 -0
- data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
- data/spec/unit/provider/package/apt_spec.rb +77 -0
- data/spec/unit/provider/package/aptitude_spec.rb +1 -0
- data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
- data/spec/unit/provider/package/zypper_spec.rb +14 -0
- data/spec/unit/provider/service/init_spec.rb +41 -0
- data/spec/unit/provider/service/systemd_spec.rb +1 -6
- data/spec/unit/provider/service/windows_spec.rb +28 -0
- data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
- data/spec/unit/puppet_pal_2pec.rb +40 -0
- data/spec/unit/reports/store_spec.rb +17 -13
- data/spec/unit/transaction/persistence_spec.rb +15 -0
- data/spec/unit/type/service_spec.rb +35 -2
- data/spec/unit/type/user_spec.rb +31 -2
- data/spec/unit/util/character_encoding_spec.rb +4 -4
- data/spec/unit/util/command_line_spec.rb +11 -6
- metadata +21 -44
- data/spec/integration/faces/config_spec.rb +0 -91
- data/spec/integration/faces/documentation_spec.rb +0 -57
- data/spec/integration/file_bucket/file_spec.rb +0 -50
- data/spec/integration/file_serving/content_spec.rb +0 -7
- data/spec/integration/file_serving/fileset_spec.rb +0 -12
- data/spec/integration/file_serving/metadata_spec.rb +0 -8
- data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
- data/spec/integration/file_system/uniquefile_spec.rb +0 -26
- data/spec/integration/module_tool/forge_spec.rb +0 -51
- data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
- data/spec/integration/provider/service/init_spec.rb +0 -48
- data/spec/integration/provider/service/systemd_spec.rb +0 -25
- data/spec/integration/provider/service/windows_spec.rb +0 -50
- data/spec/integration/reference/providers_spec.rb +0 -21
- data/spec/integration/reports_spec.rb +0 -13
- data/spec/integration/ssl/certificate_request_spec.rb +0 -44
- data/spec/integration/ssl/host_spec.rb +0 -72
- data/spec/integration/ssl/key_spec.rb +0 -99
- data/spec/shared_behaviours/file_serving_model.rb +0 -51
- data/spec/unit/face/man_spec.rb +0 -25
- data/spec/unit/man_spec.rb +0 -31
    
        data/lib/puppet/pops/adapters.rb
    CHANGED
    
    | @@ -99,6 +99,13 @@ module Adapters | |
| 99 99 |  | 
| 100 100 | 
             
                class PathsAndNameCacheAdapter < Puppet::Pops::Adaptable::Adapter
         | 
| 101 101 | 
             
                  attr_accessor :cache, :paths
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                  def self.create_adapter(env)
         | 
| 104 | 
            +
                    adapter = super(env)
         | 
| 105 | 
            +
                    adapter.paths = env.modulepath.map { |p| Pathname.new(p) }
         | 
| 106 | 
            +
                    adapter.cache = {}
         | 
| 107 | 
            +
                    adapter
         | 
| 108 | 
            +
                  end
         | 
| 102 109 | 
             
                end
         | 
| 103 110 |  | 
| 104 111 | 
             
                # Attempts to find the module that `instance` originates from by looking at it's {SourcePosAdapter} and
         | 
| @@ -117,10 +124,7 @@ module Adapters | |
| 117 124 | 
             
                def self.loader_name_by_source(environment, instance, file)
         | 
| 118 125 | 
             
                  file = instance.file if file.nil?
         | 
| 119 126 | 
             
                  return nil if file.nil? || EMPTY_STRING == file
         | 
| 120 | 
            -
                  pn_adapter = PathsAndNameCacheAdapter.adapt(environment) | 
| 121 | 
            -
                    a.paths ||= environment.modulepath.map { |p| Pathname.new(p) }
         | 
| 122 | 
            -
                    a.cache ||= {}
         | 
| 123 | 
            -
                  end
         | 
| 127 | 
            +
                  pn_adapter = PathsAndNameCacheAdapter.adapt(environment)
         | 
| 124 128 | 
             
                  dir = File.dirname(file)
         | 
| 125 129 | 
             
                  pn_adapter.cache.fetch(dir) do |key|
         | 
| 126 130 | 
             
                    mod = find_module_for_dir(environment, pn_adapter.paths, dir)
         | 
| @@ -7,10 +7,12 @@ module Loader | |
| 7 7 | 
             
            #
         | 
| 8 8 | 
             
            # @api private
         | 
| 9 9 | 
             
            class Runtime3TypeLoader < BaseLoader
         | 
| 10 | 
            -
               | 
| 10 | 
            +
              attr_reader :resource_3x_loader
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              def initialize(parent_loader, loaders, environment, resource_3x_loader)
         | 
| 11 13 | 
             
                super(parent_loader, environment.name)
         | 
| 12 14 | 
             
                @environment = environment
         | 
| 13 | 
            -
                @resource_3x_loader =  | 
| 15 | 
            +
                @resource_3x_loader = resource_3x_loader
         | 
| 14 16 | 
             
              end
         | 
| 15 17 |  | 
| 16 18 | 
             
              def discover(type, error_collector = nil, name_authority = Pcore::RUNTIME_NAME_AUTHORITY, &block)
         | 
    
        data/lib/puppet/pops/loaders.rb
    CHANGED
    
    | @@ -18,18 +18,18 @@ class Loaders | |
| 18 18 | 
             
              attr_reader :private_environment_loader
         | 
| 19 19 | 
             
              attr_reader :environment
         | 
| 20 20 |  | 
| 21 | 
            -
              def self.new(environment, for_agent = false)
         | 
| 21 | 
            +
              def self.new(environment, for_agent = false, load_from_pcore = true)
         | 
| 22 22 | 
             
                environment.lock.synchronize do
         | 
| 23 23 | 
             
                  obj = environment.loaders
         | 
| 24 24 | 
             
                  if obj.nil?
         | 
| 25 25 | 
             
                    obj = self.allocate
         | 
| 26 | 
            -
                    obj.send(:initialize, environment, for_agent)
         | 
| 26 | 
            +
                    obj.send(:initialize, environment, for_agent, load_from_pcore)
         | 
| 27 27 | 
             
                  end
         | 
| 28 28 | 
             
                  obj
         | 
| 29 29 | 
             
                end
         | 
| 30 30 | 
             
              end
         | 
| 31 31 |  | 
| 32 | 
            -
              def initialize(environment, for_agent)
         | 
| 32 | 
            +
              def initialize(environment, for_agent, load_from_pcore = true)
         | 
| 33 33 | 
             
                # Protect against environment havoc
         | 
| 34 34 | 
             
                raise ArgumentError.new(_("Attempt to redefine already initialized loaders for environment")) unless environment.loaders.nil?
         | 
| 35 35 | 
             
                environment.loaders = self
         | 
| @@ -51,12 +51,13 @@ class Loaders | |
| 51 51 | 
             
                #    TODO: loaders need to work when also running in an agent doing catalog application. There is no
         | 
| 52 52 | 
             
                #    concept of environment the same way as when running as a master (except when doing apply).
         | 
| 53 53 | 
             
                #    The creation mechanisms should probably differ between the two.
         | 
| 54 | 
            -
                @private_environment_loader = | 
| 55 | 
            -
                   | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
                   | 
| 59 | 
            -
             | 
| 54 | 
            +
                @private_environment_loader =
         | 
| 55 | 
            +
                  if for_agent
         | 
| 56 | 
            +
                    @puppet_cache_loader = create_puppet_cache_loader
         | 
| 57 | 
            +
                    create_environment_loader(environment, @puppet_cache_loader, load_from_pcore)
         | 
| 58 | 
            +
                  else
         | 
| 59 | 
            +
                    create_environment_loader(environment, @puppet_system_loader, load_from_pcore)
         | 
| 60 | 
            +
                  end
         | 
| 60 61 |  | 
| 61 62 | 
             
                Pcore.init_env(@private_environment_loader)
         | 
| 62 63 |  | 
| @@ -362,7 +363,7 @@ class Loaders | |
| 362 363 | 
             
                Loader::ModuleLoaders.cached_loader_from(puppet_system_loader, self)
         | 
| 363 364 | 
             
              end
         | 
| 364 365 |  | 
| 365 | 
            -
              def create_environment_loader(environment, parent_loader)
         | 
| 366 | 
            +
              def create_environment_loader(environment, parent_loader, load_from_pcore = true)
         | 
| 366 367 | 
             
                # This defines where to start parsing/evaluating - the "initial import" (to use 3x terminology)
         | 
| 367 368 | 
             
                # Is either a reference to a single .pp file, or a directory of manifests. If the environment becomes
         | 
| 368 369 | 
             
                # a module and can hold functions, types etc. then these are available across all other modules without
         | 
| @@ -387,7 +388,13 @@ class Loaders | |
| 387 388 | 
             
                else
         | 
| 388 389 | 
             
                  # Create the 3.x resource type loader
         | 
| 389 390 | 
             
                  static_loader.runtime_3_init
         | 
| 390 | 
            -
                   | 
| 391 | 
            +
                  # Create pcore resource type loader, if applicable
         | 
| 392 | 
            +
                  pcore_resource_type_loader = if load_from_pcore && env_path
         | 
| 393 | 
            +
                                                 Loader::ModuleLoaders.pcore_resource_type_loader_from(parent_loader, self, env_path)
         | 
| 394 | 
            +
                                               else
         | 
| 395 | 
            +
                                                 nil
         | 
| 396 | 
            +
                                               end
         | 
| 397 | 
            +
                  @runtime3_type_loader = add_loader_by_name(Loader::Runtime3TypeLoader.new(parent_loader, self, environment, pcore_resource_type_loader))
         | 
| 391 398 |  | 
| 392 399 | 
             
                  if env_path.nil?
         | 
| 393 400 | 
             
                    # Not a real directory environment, cannot work as a module TODO: Drop when legacy env are dropped?
         | 
| @@ -47,7 +47,7 @@ class EnvironmentContext < Adaptable::Adapter | |
| 47 47 | 
             
                file_data = @file_data_cache[path]
         | 
| 48 48 | 
             
                stat = Puppet::FileSystem.stat(path)
         | 
| 49 49 | 
             
                unless file_data && file_data.valid?(stat)
         | 
| 50 | 
            -
                  Puppet.debug | 
| 50 | 
            +
                  Puppet.debug { "File at '#{path}' was changed, reloading" } if file_data
         | 
| 51 51 | 
             
                  content = Puppet::FileSystem.read(path, :encoding => 'utf-8')
         | 
| 52 52 | 
             
                  file_data = FileData.new(path, stat.ino, stat.mtime, stat.size, block_given? ? yield(content) : content)
         | 
| 53 53 | 
             
                  @file_data_cache[path] = file_data
         | 
| @@ -46,6 +46,7 @@ class HieraConfig | |
| 46 46 | 
             
              KEY_DATADIR = 'datadir'.freeze
         | 
| 47 47 | 
             
              KEY_DEFAULT_HIERARCHY = 'default_hierarchy'.freeze
         | 
| 48 48 | 
             
              KEY_HIERARCHY = 'hierarchy'.freeze
         | 
| 49 | 
            +
              KEY_PLAN_HIERARCHY = 'plan_hierarchy'.freeze
         | 
| 49 50 | 
             
              KEY_LOGGER = 'logger'.freeze
         | 
| 50 51 | 
             
              KEY_OPTIONS = 'options'.freeze
         | 
| 51 52 | 
             
              KEY_PATH = 'path'.freeze
         | 
| @@ -580,6 +581,7 @@ class HieraConfigV5 < HieraConfig | |
| 580 581 | 
             
                      tf.optional(KEY_OPTIONS) => tf.hash_kv(option_name_t, tf.data),
         | 
| 581 582 | 
             
                    }),
         | 
| 582 583 | 
             
                  tf.optional(KEY_HIERARCHY) => hierarchy_t,
         | 
| 584 | 
            +
                  tf.optional(KEY_PLAN_HIERARCHY) => hierarchy_t,
         | 
| 583 585 | 
             
                  tf.optional(KEY_DEFAULT_HIERARCHY) => hierarchy_t
         | 
| 584 586 | 
             
                })
         | 
| 585 587 | 
             
              end
         | 
| @@ -600,7 +602,15 @@ class HieraConfigV5 < HieraConfig | |
| 600 602 | 
             
                  return data_providers
         | 
| 601 603 | 
             
                end
         | 
| 602 604 |  | 
| 603 | 
            -
                 | 
| 605 | 
            +
                compiler = Puppet.lookup(:pal_compiler) { nil }
         | 
| 606 | 
            +
                config_key = if compiler.is_a?(Puppet::Pal::ScriptCompiler) && !@config[KEY_PLAN_HIERARCHY].nil?
         | 
| 607 | 
            +
                      KEY_PLAN_HIERARCHY
         | 
| 608 | 
            +
                    elsif use_default_hierarchy
         | 
| 609 | 
            +
                      KEY_DEFAULT_HIERARCHY
         | 
| 610 | 
            +
                    else
         | 
| 611 | 
            +
                      KEY_HIERARCHY
         | 
| 612 | 
            +
                    end
         | 
| 613 | 
            +
                @config[config_key].each do |he|
         | 
| 604 614 | 
             
                  name = he[KEY_NAME]
         | 
| 605 615 | 
             
                  if data_providers.include?(name)
         | 
| 606 616 | 
             
                    first_line = find_line_matching(/\s+name:\s+['"]?#{name}(?:[^\w]|$)/)
         | 
| @@ -691,6 +701,9 @@ class HieraConfigV5 < HieraConfig | |
| 691 701 | 
             
                defaults = config[KEY_DEFAULTS]
         | 
| 692 702 | 
             
                validate_defaults(defaults) unless defaults.nil?
         | 
| 693 703 | 
             
                config[KEY_HIERARCHY].each { |he| validate_hierarchy(he, defaults, owner) }
         | 
| 704 | 
            +
                if config.include?(KEY_PLAN_HIERARCHY)
         | 
| 705 | 
            +
                  config[KEY_PLAN_HIERARCHY].each { |he| validate_hierarchy(he, defaults, owner) }
         | 
| 706 | 
            +
                end
         | 
| 694 707 |  | 
| 695 708 | 
             
                if config.include?(KEY_DEFAULT_HIERARCHY)
         | 
| 696 709 | 
             
                  unless owner.is_a?(ModuleDataProvider)
         | 
| @@ -23,13 +23,16 @@ module Puppet::Pops::Types | |
| 23 23 | 
             
                #
         | 
| 24 24 | 
             
                # An `ArgumentError` is raised for all other objects.
         | 
| 25 25 | 
             
                #
         | 
| 26 | 
            -
                # @param  | 
| 26 | 
            +
                # @param my_caller [Object] The calling object to reference in errors
         | 
| 27 | 
            +
                # @param obj [Object] The object to produce an `Iterable` for
         | 
| 28 | 
            +
                # @param infer_elements [Boolean] Whether or not to recursively infer all elements of obj. Optional
         | 
| 29 | 
            +
                #
         | 
| 27 30 | 
             
                # @return [Iterable,nil] The produced `Iterable`
         | 
| 28 31 | 
             
                # @raise [ArgumentError] In case an `Iterable` cannot be produced
         | 
| 29 32 | 
             
                # @api public
         | 
| 30 | 
            -
                def self.asserted_iterable( | 
| 31 | 
            -
                  iter = self.on(obj)
         | 
| 32 | 
            -
                  raise ArgumentError, "#{ | 
| 33 | 
            +
                def self.asserted_iterable(my_caller, obj, infer_elements = false)
         | 
| 34 | 
            +
                  iter = self.on(obj, nil, infer_elements)
         | 
| 35 | 
            +
                  raise ArgumentError, "#{my_caller.class}(): wrong argument type (#{obj.class}; is not Iterable." if iter.nil?
         | 
| 33 36 | 
             
                  iter
         | 
| 34 37 | 
             
                end
         | 
| 35 38 |  | 
| @@ -48,11 +51,14 @@ module Puppet::Pops::Types | |
| 48 51 | 
             
                # The value `nil` is returned for all other objects.
         | 
| 49 52 | 
             
                #
         | 
| 50 53 | 
             
                # @param o [Object] The object to produce an `Iterable` for
         | 
| 51 | 
            -
                # @param element_type [PAnyType] the element type for the iterator. Optional | 
| 54 | 
            +
                # @param element_type [PAnyType] the element type for the iterator. Optional
         | 
| 55 | 
            +
                # @param infer_elements [Boolean] if element_type is nil, whether or not to recursively
         | 
| 56 | 
            +
                #   infer types for the entire collection. Optional
         | 
| 57 | 
            +
                #
         | 
| 52 58 | 
             
                # @return [Iterable,nil] The produced `Iterable` or `nil` if it couldn't be produced
         | 
| 53 59 | 
             
                #
         | 
| 54 60 | 
             
                # @api public
         | 
| 55 | 
            -
                def self.on(o, element_type = nil)
         | 
| 61 | 
            +
                def self.on(o, element_type = nil, infer_elements = true)
         | 
| 56 62 | 
             
                  case o
         | 
| 57 63 | 
             
                  when IteratorProducer
         | 
| 58 64 | 
             
                    o.iterator
         | 
| @@ -64,7 +70,7 @@ module Puppet::Pops::Types | |
| 64 70 | 
             
                    if o.empty?
         | 
| 65 71 | 
             
                      Iterator.new(PUnitType::DEFAULT, o.each)
         | 
| 66 72 | 
             
                    else
         | 
| 67 | 
            -
                      if element_type.nil?
         | 
| 73 | 
            +
                      if element_type.nil? && infer_elements
         | 
| 68 74 | 
             
                        tc = TypeCalculator.singleton
         | 
| 69 75 | 
             
                        element_type = PVariantType.maybe_create(o.map {|e| tc.infer_set(e) })
         | 
| 70 76 | 
             
                      end
         | 
| @@ -75,7 +81,7 @@ module Puppet::Pops::Types | |
| 75 81 | 
             
                    if o.empty?
         | 
| 76 82 | 
             
                      HashIterator.new(PHashType::DEFAULT_KEY_PAIR_TUPLE, o.each)
         | 
| 77 83 | 
             
                    else
         | 
| 78 | 
            -
                      if element_type.nil?
         | 
| 84 | 
            +
                      if element_type.nil? && infer_elements
         | 
| 79 85 | 
             
                        tc = TypeCalculator.singleton
         | 
| 80 86 | 
             
                        element_type = PTupleType.new([
         | 
| 81 87 | 
             
                          PVariantType.maybe_create(o.keys.map {|e| tc.infer_set(e) }),
         | 
| @@ -202,6 +208,26 @@ module Puppet::Pops::Types | |
| 202 208 | 
             
                  @enumeration.send(name, *arguments, &block)
         | 
| 203 209 | 
             
                end
         | 
| 204 210 |  | 
| 211 | 
            +
                def next
         | 
| 212 | 
            +
                  @enumeration.next
         | 
| 213 | 
            +
                end
         | 
| 214 | 
            +
             | 
| 215 | 
            +
                def map(*args, &block)
         | 
| 216 | 
            +
                  @enumeration.map(*args, &block)
         | 
| 217 | 
            +
                end
         | 
| 218 | 
            +
             | 
| 219 | 
            +
                def reduce(*args, &block)
         | 
| 220 | 
            +
                  @enumeration.reduce(*args, &block)
         | 
| 221 | 
            +
                end
         | 
| 222 | 
            +
             | 
| 223 | 
            +
                def all?(&block)
         | 
| 224 | 
            +
                  @enumeration.all?(&block)
         | 
| 225 | 
            +
                end
         | 
| 226 | 
            +
             | 
| 227 | 
            +
                def any?(&block)
         | 
| 228 | 
            +
                  @enumeration.any?(&block)
         | 
| 229 | 
            +
                end
         | 
| 230 | 
            +
             | 
| 205 231 | 
             
                def step(step, &block)
         | 
| 206 232 | 
             
                  raise ArgumentError if step <= 0
         | 
| 207 233 | 
             
                  r = self
         | 
| @@ -595,36 +595,40 @@ class Checker4_0 < Evaluator::LiteralEvaluator | |
| 595 595 | 
             
              # @api private
         | 
| 596 596 | 
             
              class Puppet::Util::FileNamespaceAdapter < Puppet::Pops::Adaptable::Adapter
         | 
| 597 597 | 
             
                attr_accessor :file_to_namespace
         | 
| 598 | 
            +
             | 
| 599 | 
            +
                def self.create_adapter(env)
         | 
| 600 | 
            +
                  adapter = super(env)
         | 
| 601 | 
            +
                  adapter.file_to_namespace = {}
         | 
| 602 | 
            +
                  adapter
         | 
| 603 | 
            +
                end
         | 
| 598 604 | 
             
              end
         | 
| 599 605 |  | 
| 600 606 | 
             
              def namespace_for_file(file)
         | 
| 601 607 | 
             
                env = Puppet.lookup(:current_environment)
         | 
| 602 608 | 
             
                return NO_NAMESPACE if env.nil?
         | 
| 603 609 |  | 
| 604 | 
            -
                Puppet::Util::FileNamespaceAdapter.adapt(env) | 
| 605 | 
            -
                  adapter.file_to_namespace ||= {}
         | 
| 610 | 
            +
                adapter = Puppet::Util::FileNamespaceAdapter.adapt(env)
         | 
| 606 611 |  | 
| 607 | 
            -
             | 
| 608 | 
            -
             | 
| 612 | 
            +
                file_namespace = adapter.file_to_namespace[file]
         | 
| 613 | 
            +
                return file_namespace unless file_namespace.nil? # No cache entry, so we do the calculation
         | 
| 609 614 |  | 
| 610 | 
            -
             | 
| 615 | 
            +
                path = Pathname.new(file)
         | 
| 611 616 |  | 
| 612 | 
            -
             | 
| 617 | 
            +
                return adapter.file_to_namespace[file] = NO_NAMESPACE if path.extname != ".pp"
         | 
| 613 618 |  | 
| 614 | 
            -
             | 
| 619 | 
            +
                path = path.expand_path
         | 
| 615 620 |  | 
| 616 | 
            -
             | 
| 621 | 
            +
                return adapter.file_to_namespace[file] = NO_NAMESPACE if initial_manifest?(path, env.manifest)
         | 
| 617 622 |  | 
| 618 | 
            -
             | 
| 619 | 
            -
             | 
| 623 | 
            +
                #All auto-loaded files from modules come from a module search path dir
         | 
| 624 | 
            +
                relative_path = get_module_relative_path(path, env.full_modulepath)
         | 
| 620 625 |  | 
| 621 | 
            -
             | 
| 626 | 
            +
                return adapter.file_to_namespace[file] = NO_NAMESPACE if relative_path == NO_PATH
         | 
| 622 627 |  | 
| 623 | 
            -
             | 
| 624 | 
            -
             | 
| 628 | 
            +
                #If a file comes from a module, but isn't in the right place, always error
         | 
| 629 | 
            +
                names = dir_to_names(relative_path)
         | 
| 625 630 |  | 
| 626 | 
            -
             | 
| 627 | 
            -
                end
         | 
| 631 | 
            +
                return adapter.file_to_namespace[file] = (names == BAD_MODULE_FILE ? BAD_MODULE_FILE : names.join("::").freeze)
         | 
| 628 632 | 
             
              end
         | 
| 629 633 |  | 
| 630 634 | 
             
              def initial_manifest?(path, manifest_setting)
         | 
| @@ -126,7 +126,7 @@ Puppet::Type.type(:file).provide :windows do | |
| 126 126 | 
             
                      # If the SYSTEM account does _not_ have FullControl in this scenario, we should
         | 
| 127 127 | 
             
                      # force the resource out of sync no matter what.
         | 
| 128 128 | 
             
                      #TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
         | 
| 129 | 
            -
                      Puppet.debug _("%{resource_name}: %{mode_part_type} set to SYSTEM. SYSTEM permissions cannot be set below FullControl ('7')") % { resource_name: resource[:name], mode_part_type: mode_part['type']}
         | 
| 129 | 
            +
                      Puppet.debug { _("%{resource_name}: %{mode_part_type} set to SYSTEM. SYSTEM permissions cannot be set below FullControl ('7')") % { resource_name: resource[:name], mode_part_type: mode_part['type']} }
         | 
| 130 130 | 
             
                      return nil
         | 
| 131 131 | 
             
                    end
         | 
| 132 132 | 
             
                  end
         | 
| @@ -16,6 +16,7 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do | |
| 16 16 |  | 
| 17 17 | 
             
              commands :aptget => "/usr/bin/apt-get"
         | 
| 18 18 | 
             
              commands :aptcache => "/usr/bin/apt-cache"
         | 
| 19 | 
            +
              commands :aptmark => "/usr/bin/apt-mark"
         | 
| 19 20 | 
             
              commands :preseed => "/usr/bin/debconf-set-selections"
         | 
| 20 21 |  | 
| 21 22 | 
             
              defaultfor :osfamily => :debian
         | 
| @@ -30,6 +31,39 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do | |
| 30 31 | 
             
                false
         | 
| 31 32 | 
             
              end
         | 
| 32 33 |  | 
| 34 | 
            +
              def self.instances
         | 
| 35 | 
            +
                packages = super
         | 
| 36 | 
            +
                manual_marks = aptmark('showmanual').split("\n")
         | 
| 37 | 
            +
                packages.each do |package|
         | 
| 38 | 
            +
                  package.mark = :manual if manual_marks.include?(package.name)
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
                packages
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              def query
         | 
| 44 | 
            +
                hash = super
         | 
| 45 | 
            +
                hash[:mark] = :manual if aptmark('showmanual').split("\n").include?(@resource[:name])
         | 
| 46 | 
            +
                hash
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
              def initialize(value={})
         | 
| 50 | 
            +
                super(value)
         | 
| 51 | 
            +
                @property_flush = {}
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
              def mark=(value)
         | 
| 55 | 
            +
                @property_flush[:mark] = value
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              def flush
         | 
| 59 | 
            +
                # unless we are removing the package mark it if it hasn't already been marked
         | 
| 60 | 
            +
                if @property_flush
         | 
| 61 | 
            +
                  unless @property_flush[:mark] || [:purge, :absent].include?(resource[:ensure])
         | 
| 62 | 
            +
                    aptmark('manual', resource[:name])
         | 
| 63 | 
            +
                  end
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
              end
         | 
| 66 | 
            +
             | 
| 33 67 | 
             
              # A derivative of DPKG; this is how most people actually manage
         | 
| 34 68 | 
             
              # Debian boxes, and the only thing that differs is that it can
         | 
| 35 69 | 
             
              # install packages from remote sites.
         | 
| @@ -53,11 +53,13 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package:: | |
| 53 53 | 
             
              #
         | 
| 54 54 | 
             
              # In this case, causing the puppet_gem provider to inherit the parent gem provider's convenience gemcmd() methods, with the wrong path.
         | 
| 55 55 |  | 
| 56 | 
            -
              def self.execute_gem_command(command, command_options)
         | 
| 56 | 
            +
              def self.execute_gem_command(command, command_options, custom_environment = {})
         | 
| 57 57 | 
             
                validate_command(command)
         | 
| 58 58 | 
             
                cmd = [command] << command_options
         | 
| 59 59 |  | 
| 60 | 
            -
                 | 
| 60 | 
            +
                custom_environment = {'HOME'=>Puppet::Util.get_env('HOME')}.merge(custom_environment)
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                execute(cmd, {:failonfail => true, :combine => true, :custom_environment => custom_environment})
         | 
| 61 63 | 
             
              end
         | 
| 62 64 |  | 
| 63 65 | 
             
              def self.instances(target_command = nil)
         | 
| @@ -18,4 +18,9 @@ Puppet::Type.type(:package).provide :puppet_gem, :parent => :gem do | |
| 18 18 | 
             
                Puppet.debug("Invalidating rubygems cache after uninstalling gem '#{resource[:name]}'")
         | 
| 19 19 | 
             
                Puppet::Util::Autoload.gem_source.clear_paths
         | 
| 20 20 | 
             
              end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              def self.execute_gem_command(command, command_options, custom_environment = {})
         | 
| 23 | 
            +
                custom_environment['PKG_CONFIG_PATH'] = '/opt/puppetlabs/puppet/lib/pkgconfig' unless Puppet::Util::Platform.windows?
         | 
| 24 | 
            +
                super(command, command_options, custom_environment)
         | 
| 25 | 
            +
              end
         | 
| 21 26 | 
             
            end
         | 
| @@ -187,6 +187,9 @@ Puppet::Type.type(:package).provide :zypper, :parent => :rpm, :source => :rpm do | |
| 187 187 | 
             
                if should.is_a?(String)
         | 
| 188 188 | 
             
                  begin
         | 
| 189 189 | 
             
                    should_version = Puppet::Util::Package::Version::Range.parse(should, Puppet::Util::Package::Version::Rpm)
         | 
| 190 | 
            +
                    if should_version.is_a?(RPM_VERSION_RANGE::Eq)
         | 
| 191 | 
            +
                      return super
         | 
| 192 | 
            +
                    end
         | 
| 190 193 | 
             
                  rescue Puppet::Util::Package::Version::Range::ValidationFailure, Puppet::Util::Package::Version::Rpm::ValidationFailure
         | 
| 191 194 | 
             
                    Puppet.debug("Cannot parse #{should} as a RPM version range")
         | 
| 192 195 | 
             
                    return super
         | 
| @@ -288,7 +288,7 @@ Puppet::Type.type(:user).provide :aix, :parent => Puppet::Provider::AixObject do | |
| 288 288 | 
             
              # UNSUPPORTED
         | 
| 289 289 | 
             
              #- **roles**
         | 
| 290 290 | 
             
              #    The roles the user has.  Multiple roles should be
         | 
| 291 | 
            -
              #    specified as an array.  Requires features  | 
| 291 | 
            +
              #    specified as an array.  Requires features manages_roles.
         | 
| 292 292 | 
             
              # UNSUPPORTED
         | 
| 293 293 | 
             
              #- **key_membership**
         | 
| 294 294 | 
             
              #    Whether specified key value pairs should be treated as the only
         | 
| @@ -33,7 +33,7 @@ Puppet::Type.type(:user).provide :user_role_add, :parent => :useradd, :source => | |
| 33 33 | 
             
                set("shell", value)
         | 
| 34 34 | 
             
              end
         | 
| 35 35 |  | 
| 36 | 
            -
              has_features :manages_homedir, :allows_duplicates, :manages_solaris_rbac, :manages_passwords, :manages_password_age, :manages_shell
         | 
| 36 | 
            +
              has_features :manages_homedir, :allows_duplicates, :manages_solaris_rbac, :manages_roles, :manages_passwords, :manages_password_age, :manages_shell
         | 
| 37 37 |  | 
| 38 38 | 
             
              def check_valid_shell
         | 
| 39 39 | 
             
                unless File.exist?(@resource.should(:shell))
         | 
| @@ -6,7 +6,7 @@ Puppet::Type.type(:user).provide :windows_adsi do | |
| 6 6 | 
             
              defaultfor :operatingsystem => :windows
         | 
| 7 7 | 
             
              confine    :operatingsystem => :windows
         | 
| 8 8 |  | 
| 9 | 
            -
              has_features :manages_homedir, :manages_passwords
         | 
| 9 | 
            +
              has_features :manages_homedir, :manages_passwords, :manages_roles
         | 
| 10 10 |  | 
| 11 11 | 
             
              def initialize(value={})
         | 
| 12 12 | 
             
                super(value)
         | 
| @@ -17,6 +17,23 @@ Puppet::Type.type(:user).provide :windows_adsi do | |
| 17 17 | 
             
                @user ||= Puppet::Util::Windows::ADSI::User.new(@resource[:name])
         | 
| 18 18 | 
             
              end
         | 
| 19 19 |  | 
| 20 | 
            +
              def roles
         | 
| 21 | 
            +
                Puppet::Util::Windows::User::get_rights(@resource[:name])
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              def roles=(value)
         | 
| 25 | 
            +
                current = roles.split(',')
         | 
| 26 | 
            +
                should  = value.split(',')
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                add_list = should - current
         | 
| 29 | 
            +
                Puppet::Util::Windows::User::set_rights(@resource[:name], add_list) unless add_list.empty?
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                if @resource[:role_membership] == :inclusive
         | 
| 32 | 
            +
                  remove_list = current - should
         | 
| 33 | 
            +
                  Puppet::Util::Windows::User::remove_rights(@resource[:name], remove_list) unless remove_list.empty?
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
             | 
| 20 37 | 
             
              def groups
         | 
| 21 38 | 
             
                @groups ||= Puppet::Util::Windows::ADSI::Group.name_sid_hash(user.groups)
         | 
| 22 39 | 
             
                @groups.keys
         | 
    
        data/lib/puppet/settings.rb
    CHANGED
    
    | @@ -1058,7 +1058,7 @@ Generated on #{Time.now}. | |
| 1058 1058 |  | 
| 1059 1059 | 
             
                return if sections.empty?
         | 
| 1060 1060 |  | 
| 1061 | 
            -
                Puppet.debug | 
| 1061 | 
            +
                Puppet.debug { "Applying settings catalog for sections #{sections.join(', ')}" }
         | 
| 1062 1062 |  | 
| 1063 1063 | 
             
                begin
         | 
| 1064 1064 | 
             
                  catalog = to_catalog(*sections).to_ral
         |