puppet 5.5.17-x64-mingw32 → 5.5.22-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/CODEOWNERS +1 -1
- data/Gemfile +4 -5
- data/Gemfile.lock +59 -55
- data/ext/build_defaults.yaml +1 -0
- data/ext/cert_inspector +3 -3
- data/ext/puppet-test +2 -2
- data/ext/regexp_nodes/regexp_nodes.rb +4 -4
- data/ext/windows/service/daemon.rb +54 -8
- data/install.rb +6 -6
- data/lib/puppet.rb +5 -2
- data/lib/puppet/agent.rb +5 -13
- data/lib/puppet/application.rb +1 -1
- data/lib/puppet/application/agent.rb +3 -1
- data/lib/puppet/application/apply.rb +2 -2
- data/lib/puppet/application/describe.rb +3 -9
- data/lib/puppet/application/doc.rb +1 -1
- data/lib/puppet/application/filebucket.rb +13 -0
- data/lib/puppet/application/lookup.rb +1 -1
- data/lib/puppet/application/script.rb +2 -2
- data/lib/puppet/configurer.rb +106 -31
- data/lib/puppet/configurer/downloader.rb +33 -16
- data/lib/puppet/daemon.rb +1 -1
- data/lib/puppet/defaults.rb +86 -40
- data/lib/puppet/error.rb +9 -1
- data/lib/puppet/external/nagios/base.rb +1 -1
- data/lib/puppet/face/ca.rb +1 -1
- data/lib/puppet/face/module/list.rb +5 -5
- data/lib/puppet/face/module/search.rb +1 -1
- data/lib/puppet/face/module/uninstall.rb +1 -1
- data/lib/puppet/face/module/upgrade.rb +1 -1
- data/lib/puppet/file_serving/http_metadata.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.rb +0 -8
- data/lib/puppet/file_system/memory_file.rb +1 -1
- data/lib/puppet/file_system/posix.rb +3 -2
- data/lib/puppet/file_system/uniquefile.rb +4 -0
- data/lib/puppet/forge.rb +3 -3
- data/lib/puppet/functions/epp.rb +4 -4
- data/lib/puppet/functions/inline_epp.rb +5 -5
- data/lib/puppet/functions/new.rb +8 -3
- data/lib/puppet/functions/reduce.rb +2 -4
- data/lib/puppet/functions/reverse_each.rb +1 -1
- data/lib/puppet/functions/step.rb +1 -1
- data/lib/puppet/gettext/module_translations.rb +1 -1
- data/lib/puppet/graph/rb_tree_map.rb +2 -2
- data/lib/puppet/graph/simple_graph.rb +6 -5
- data/lib/puppet/indirector/catalog/compiler.rb +8 -0
- data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
- data/lib/puppet/indirector/hiera.rb +6 -0
- data/lib/puppet/indirector/resource/ral.rb +1 -3
- data/lib/puppet/indirector/resource/validator.rb +1 -1
- data/lib/puppet/interface.rb +2 -1
- data/lib/puppet/loaders.rb +0 -1
- data/lib/puppet/metatype/manager.rb +1 -1
- data/lib/puppet/module.rb +1 -1
- data/lib/puppet/module_tool/applications/builder.rb +1 -1
- data/lib/puppet/module_tool/applications/installer.rb +1 -1
- data/lib/puppet/module_tool/applications/uninstaller.rb +3 -3
- data/lib/puppet/module_tool/metadata.rb +1 -1
- data/lib/puppet/module_tool/shared_behaviors.rb +4 -4
- data/lib/puppet/module_tool/tar/mini.rb +1 -1
- data/lib/puppet/network/http/api/indirected_routes.rb +13 -12
- data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
- data/lib/puppet/network/http/connection.rb +14 -12
- data/lib/puppet/network/http/pool.rb +7 -1
- data/lib/puppet/network/http/rack/rest.rb +2 -2
- data/lib/puppet/network/http/site.rb +1 -1
- data/lib/puppet/network/resolver.rb +2 -2
- data/lib/puppet/node/environment.rb +11 -3
- data/lib/puppet/parser/ast.rb +1 -1
- data/lib/puppet/parser/ast/resourceparam.rb +1 -1
- data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
- data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
- data/lib/puppet/parser/environment_compiler.rb +3 -0
- data/lib/puppet/parser/functions.rb +14 -10
- data/lib/puppet/parser/functions/epp.rb +3 -3
- data/lib/puppet/parser/functions/inline_epp.rb +5 -5
- data/lib/puppet/parser/resource.rb +3 -2
- data/lib/puppet/parser/resource/param.rb +6 -0
- data/lib/puppet/pops/adaptable.rb +7 -13
- data/lib/puppet/pops/adapters.rb +8 -4
- data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
- data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
- data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
- data/lib/puppet/pops/evaluator/external_syntax_support.rb +3 -2
- data/lib/puppet/pops/evaluator/runtime3_support.rb +4 -4
- data/lib/puppet/pops/issues.rb +5 -0
- data/lib/puppet/pops/loaders.rb +1 -1
- data/lib/puppet/pops/lookup/hiera_config.rb +1 -0
- data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
- data/lib/puppet/pops/merge_strategy.rb +22 -18
- data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
- data/lib/puppet/pops/parser/interpolation_support.rb +4 -4
- data/lib/puppet/pops/parser/locator.rb +1 -1
- data/lib/puppet/pops/parser/pn_parser.rb +17 -16
- data/lib/puppet/pops/puppet_stack.rb +51 -48
- data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
- data/lib/puppet/pops/types/iterable.rb +34 -8
- data/lib/puppet/pops/types/p_meta_type.rb +1 -1
- data/lib/puppet/pops/types/p_sensitive_type.rb +1 -1
- data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
- data/lib/puppet/pops/types/string_converter.rb +10 -10
- data/lib/puppet/pops/types/type_calculator.rb +24 -0
- data/lib/puppet/pops/types/types.rb +3 -3
- data/lib/puppet/pops/validation/checker4_0.rb +29 -15
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
- data/lib/puppet/property.rb +1 -1
- data/lib/puppet/property/ensure.rb +1 -1
- data/lib/puppet/provider/augeas/augeas.rb +1 -1
- data/lib/puppet/provider/cron/crontab.rb +1 -1
- data/lib/puppet/provider/exec.rb +6 -2
- data/lib/puppet/provider/group/groupadd.rb +19 -19
- data/lib/puppet/provider/group/windows_adsi.rb +3 -3
- data/lib/puppet/provider/mailalias/aliases.rb +1 -1
- data/lib/puppet/provider/mount.rb +1 -1
- data/lib/puppet/provider/mount/parsed.rb +8 -8
- data/lib/puppet/provider/nameservice/directoryservice.rb +1 -1
- data/lib/puppet/provider/nameservice/pw.rb +2 -2
- data/lib/puppet/provider/package/aix.rb +17 -2
- data/lib/puppet/provider/package/apt.rb +14 -3
- data/lib/puppet/provider/package/dnfmodule.rb +141 -0
- data/lib/puppet/provider/package/dpkg.rb +16 -18
- data/lib/puppet/provider/package/fink.rb +20 -3
- data/lib/puppet/provider/package/gem.rb +4 -2
- data/lib/puppet/provider/package/openbsd.rb +14 -2
- data/lib/puppet/provider/package/pip.rb +37 -10
- data/lib/puppet/provider/package/pkg.rb +18 -5
- data/lib/puppet/provider/package/pkgdmg.rb +1 -1
- data/lib/puppet/provider/package/pkgng.rb +16 -4
- data/lib/puppet/provider/package/portage.rb +4 -4
- data/lib/puppet/provider/package/puppet_gem.rb +5 -0
- data/lib/puppet/provider/package/rpm.rb +6 -6
- data/lib/puppet/provider/package/windows/package.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +28 -20
- data/lib/puppet/provider/package/zypper.rb +1 -0
- data/lib/puppet/provider/package_targetable.rb +5 -4
- data/lib/puppet/provider/parsedfile.rb +1 -1
- data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +3 -3
- data/lib/puppet/provider/selmodule/semodule.rb +43 -26
- data/lib/puppet/provider/service/daemontools.rb +9 -9
- data/lib/puppet/provider/service/openbsd.rb +1 -1
- data/lib/puppet/provider/service/rcng.rb +2 -2
- data/lib/puppet/provider/service/runit.rb +2 -8
- data/lib/puppet/provider/service/systemd.rb +31 -13
- data/lib/puppet/provider/user/directoryservice.rb +31 -6
- data/lib/puppet/provider/user/hpux.rb +1 -1
- data/lib/puppet/provider/user/user_role_add.rb +1 -1
- data/lib/puppet/provider/user/useradd.rb +39 -20
- data/lib/puppet/provider/user/windows_adsi.rb +4 -5
- data/lib/puppet/provider/yumrepo/inifile.rb +2 -2
- data/lib/puppet/reference/indirection.rb +2 -2
- data/lib/puppet/reference/metaparameter.rb +1 -3
- data/lib/puppet/reference/providers.rb +1 -1
- data/lib/puppet/reference/type.rb +3 -9
- data/lib/puppet/reports.rb +1 -1
- data/lib/puppet/resource.rb +1 -1
- data/lib/puppet/resource/catalog.rb +1 -1
- data/lib/puppet/resource/type.rb +10 -1
- data/lib/puppet/settings.rb +3 -3
- data/lib/puppet/settings/environment_conf.rb +1 -0
- data/lib/puppet/ssl/certificate.rb +2 -1
- data/lib/puppet/ssl/certificate_authority.rb +6 -5
- data/lib/puppet/ssl/certificate_authority/interface.rb +1 -1
- data/lib/puppet/ssl/certificate_factory.rb +2 -2
- data/lib/puppet/ssl/host.rb +3 -3
- data/lib/puppet/ssl/oids.rb +1 -1
- data/lib/puppet/test/test_helper.rb +20 -12
- data/lib/puppet/transaction/report.rb +1 -1
- data/lib/puppet/transaction/resource_harness.rb +1 -1
- data/lib/puppet/type.rb +8 -4
- data/lib/puppet/type/cron.rb +1 -1
- data/lib/puppet/type/exec.rb +7 -3
- data/lib/puppet/type/file.rb +14 -2
- data/lib/puppet/type/file/data_sync.rb +5 -1
- data/lib/puppet/type/group.rb +4 -2
- data/lib/puppet/type/interface.rb +1 -1
- data/lib/puppet/type/notify.rb +3 -2
- data/lib/puppet/type/package.rb +97 -8
- data/lib/puppet/type/schedule.rb +1 -1
- data/lib/puppet/type/selboolean.rb +17 -3
- data/lib/puppet/type/service.rb +2 -8
- data/lib/puppet/type/user.rb +5 -9
- data/lib/puppet/util.rb +35 -12
- data/lib/puppet/util/autoload.rb +9 -7
- data/lib/puppet/util/command_line/trollop.rb +1 -1
- data/lib/puppet/util/http_proxy.rb +8 -14
- data/lib/puppet/util/instance_loader.rb +1 -1
- data/lib/puppet/util/log.rb +1 -1
- data/lib/puppet/util/log/destinations.rb +3 -12
- data/lib/puppet/util/logging.rb +30 -18
- data/lib/puppet/util/metric.rb +2 -2
- data/lib/puppet/util/monkey_patches.rb +1 -1
- data/lib/puppet/util/nagios_maker.rb +2 -2
- data/lib/puppet/util/network_device/cisco/device.rb +1 -1
- data/lib/puppet/util/network_device/cisco/interface.rb +2 -2
- data/lib/puppet/util/network_device/transport/ssh.rb +1 -1
- data/lib/puppet/util/pidlock.rb +12 -6
- data/lib/puppet/util/plist.rb +6 -0
- data/lib/puppet/util/provider_features.rb +2 -4
- data/lib/puppet/util/rdoc.rb +1 -1
- data/lib/puppet/util/reference.rb +1 -1
- data/lib/puppet/util/resource_template.rb +1 -1
- data/lib/puppet/util/selinux.rb +3 -1
- data/lib/puppet/util/windows/adsi.rb +60 -30
- data/lib/puppet/util/windows/api_types.rb +45 -32
- data/lib/puppet/util/windows/eventlog.rb +1 -6
- data/lib/puppet/util/windows/principal.rb +8 -6
- data/lib/puppet/util/windows/process.rb +16 -15
- data/lib/puppet/util/windows/registry.rb +17 -15
- data/lib/puppet/util/windows/security.rb +1 -0
- data/lib/puppet/util/windows/sid.rb +3 -3
- data/lib/puppet/vendor.rb +1 -1
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet_pal.rb +2 -2
- data/locales/puppet.pot +362 -318
- data/man/man5/puppet.conf.5 +39 -9
- data/man/man8/puppet-agent.8 +2 -2
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-ca.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-cert.8 +1 -1
- data/man/man8/puppet-certificate.8 +1 -1
- data/man/man8/puppet-certificate_request.8 +1 -1
- data/man/man8/puppet-certificate_revocation_list.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 +16 -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 +1 -1
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-master.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-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/integration/provider/mailalias/aliases/test1 +1 -0
- data/spec/fixtures/unit/provider/package/dnfmodule/dnf-module-list.txt +19 -0
- data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
- data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
- data/spec/integration/configurer_spec.rb +66 -0
- data/spec/integration/data_binding_spec.rb +1 -0
- data/spec/integration/defaults_spec.rb +1 -2
- data/spec/integration/faces/plugin_spec.rb +29 -47
- data/spec/integration/indirector/facts/facter_spec.rb +4 -0
- data/spec/integration/parser/compiler_spec.rb +11 -0
- data/spec/integration/type/notify_spec.rb +46 -0
- data/spec/integration/util/windows/adsi_spec.rb +6 -1
- data/spec/integration/util/windows/registry_spec.rb +7 -7
- data/spec/shared_contexts/types_setup.rb +2 -0
- data/spec/unit/agent_spec.rb +34 -26
- data/spec/unit/application/apply_spec.rb +2 -12
- data/spec/unit/configurer/downloader_spec.rb +10 -0
- data/spec/unit/configurer/fact_handler_spec.rb +0 -4
- data/spec/unit/configurer_spec.rb +430 -415
- data/spec/unit/daemon_spec.rb +0 -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 +11 -0
- data/spec/unit/forge/forge_spec.rb +1 -3
- data/spec/unit/forge/repository_spec.rb +1 -3
- data/spec/unit/indirector/catalog/compiler_spec.rb +45 -26
- data/spec/unit/indirector/resource/ral_spec.rb +4 -4
- data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
- data/spec/unit/network/http/connection_spec.rb +43 -1
- data/spec/unit/network/http/pool_spec.rb +32 -0
- data/spec/unit/node_spec.rb +7 -4
- data/spec/unit/parser/environment_compiler_spec.rb +7 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
- data/spec/unit/provider/exec_spec.rb +209 -0
- data/spec/unit/provider/group/groupadd_spec.rb +30 -1
- data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
- data/spec/unit/provider/package/aix_spec.rb +29 -0
- data/spec/unit/provider/package/apt_spec.rb +13 -2
- data/spec/unit/provider/package/aptitude_spec.rb +1 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +247 -0
- data/spec/unit/provider/package/dpkg_spec.rb +35 -7
- data/spec/unit/provider/package/openbsd_spec.rb +17 -0
- data/spec/unit/provider/package/pip_spec.rb +93 -22
- data/spec/unit/provider/package/pkg_spec.rb +13 -1
- data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
- data/spec/unit/provider/package/pkgng_spec.rb +36 -0
- data/spec/unit/provider/package/portage_spec.rb +4 -4
- data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
- data/spec/unit/provider/package/yum_spec.rb +90 -0
- data/spec/unit/provider/package/zypper_spec.rb +13 -0
- data/spec/unit/provider/package_targetable_spec.rb +60 -0
- data/spec/unit/provider/selmodule_spec.rb +118 -47
- data/spec/unit/provider/service/daemontools_spec.rb +24 -0
- data/spec/unit/provider/service/runit_spec.rb +24 -0
- data/spec/unit/provider/service/systemd_spec.rb +109 -36
- data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
- data/spec/unit/provider/user/hpux_spec.rb +2 -2
- data/spec/unit/provider/user/openbsd_spec.rb +1 -0
- data/spec/unit/provider/user/useradd_spec.rb +81 -16
- data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
- data/spec/unit/puppet_pal_2pec.rb +3 -0
- data/spec/unit/ssl/certificate_authority_spec.rb +2 -3
- data/spec/unit/ssl/certificate_spec.rb +7 -0
- data/spec/unit/ssl/host_spec.rb +2 -0
- data/spec/unit/test/test_helper_spec.rb +17 -0
- data/spec/unit/type/exec_spec.rb +6 -12
- data/spec/unit/type/file/content_spec.rb +9 -3
- data/spec/unit/type/file_spec.rb +9 -4
- data/spec/unit/type/package_spec.rb +8 -0
- data/spec/unit/type/selboolean_spec.rb +4 -6
- data/spec/unit/type/service_spec.rb +9 -8
- data/spec/unit/type/user_spec.rb +19 -13
- data/spec/unit/util/execution_spec.rb +16 -0
- data/spec/unit/util/http_proxy_spec.rb +97 -0
- data/spec/unit/util/log/destinations_spec.rb +2 -26
- data/spec/unit/util/log_spec.rb +0 -138
- data/spec/unit/util/logging_spec.rb +200 -0
- data/spec/unit/util/pidlock_spec.rb +67 -40
- data/spec/unit/util/plist_spec.rb +20 -0
- data/spec/unit/util/windows/adsi_spec.rb +55 -4
- data/spec/unit/util/windows/api_types_spec.rb +104 -40
- data/spec/unit/util/windows/sid_spec.rb +2 -2
- data/tasks/manpages.rake +1 -0
- metadata +16 -7
- data/lib/puppet/pops/loader/null_loader.rb +0 -60
- data/locales/ja/puppet.po +0 -12114
- data/spec/integration/test/test_helper_spec.rb +0 -31
    
        data/lib/puppet/util/autoload.rb
    CHANGED
    
    | @@ -10,6 +10,14 @@ require 'puppet/pops/adaptable' | |
| 10 10 | 
             
            # @api private
         | 
| 11 11 | 
             
            class Puppet::Util::ModuleDirectoriesAdapter < Puppet::Pops::Adaptable::Adapter
         | 
| 12 12 | 
             
              attr_accessor :directories
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              def self.create_adapter(env)
         | 
| 15 | 
            +
                adapter = super(env)
         | 
| 16 | 
            +
                adapter.directories = env.modulepath.flat_map do |dir|
         | 
| 17 | 
            +
                  Dir.glob(File.join(dir, '*', 'lib'))
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
                adapter
         | 
| 20 | 
            +
              end
         | 
| 13 21 | 
             
            end
         | 
| 14 22 |  | 
| 15 23 | 
             
            # Autoload paths, either based on names or all at once.
         | 
| @@ -132,13 +140,7 @@ class Puppet::Util::Autoload | |
| 132 140 |  | 
| 133 141 | 
             
                    if env
         | 
| 134 142 | 
             
                      # if the app defaults have been initialized then it should be safe to access the module path setting.
         | 
| 135 | 
            -
                      Puppet::Util::ModuleDirectoriesAdapter.adapt(env) | 
| 136 | 
            -
                        a.directories ||= env.modulepath.collect do |dir|
         | 
| 137 | 
            -
                          Dir.entries(dir).reject { |f| f =~ /^\./ }.collect { |f| File.join(dir, f, "lib") }
         | 
| 138 | 
            -
                        end.flatten.find_all do |d|
         | 
| 139 | 
            -
                          FileTest.directory?(d)
         | 
| 140 | 
            -
                        end
         | 
| 141 | 
            -
                      end.directories
         | 
| 143 | 
            +
                      Puppet::Util::ModuleDirectoriesAdapter.adapt(env).directories
         | 
| 142 144 | 
             
                    else
         | 
| 143 145 | 
             
                      []
         | 
| 144 146 | 
             
                    end
         | 
| @@ -215,7 +215,7 @@ class Parser | |
| 215 215 | 
             
                opts[:type] = opts[:type] || type_from_default || :flag
         | 
| 216 216 |  | 
| 217 217 | 
             
                ## fill in :long
         | 
| 218 | 
            -
                opts[:long] = opts[:long] ? opts[:long].to_s : name.to_s. | 
| 218 | 
            +
                opts[:long] = opts[:long] ? opts[:long].to_s : name.to_s.tr("_", "-")
         | 
| 219 219 | 
             
                opts[:long] =
         | 
| 220 220 | 
             
                  case opts[:long]
         | 
| 221 221 | 
             
                  when /^--([^-].*)$/
         | 
| @@ -4,13 +4,15 @@ require 'puppet/network/http' | |
| 4 4 |  | 
| 5 5 | 
             
            module Puppet::Util::HttpProxy
         | 
| 6 6 | 
             
              def self.proxy(uri)
         | 
| 7 | 
            -
                if  | 
| 8 | 
            -
                   | 
| 7 | 
            +
                if http_proxy_host && !no_proxy?(uri)
         | 
| 8 | 
            +
                  Net::HTTP.new(uri.host, uri.port, self.http_proxy_host, self.http_proxy_port, self.http_proxy_user, self.http_proxy_password)
         | 
| 9 9 | 
             
                else
         | 
| 10 | 
            -
                   | 
| 10 | 
            +
                  http = Net::HTTP.new(uri.host, uri.port, nil, nil, nil, nil)
         | 
| 11 | 
            +
                  # Net::HTTP defaults the proxy port even though we said not to
         | 
| 12 | 
            +
                  # use one. Set it to nil so caller is not surprised
         | 
| 13 | 
            +
                  http.proxy_port = nil if http.respond_to?(:proxy_port=)
         | 
| 14 | 
            +
                  http
         | 
| 11 15 | 
             
                end
         | 
| 12 | 
            -
             | 
| 13 | 
            -
                return proxy_class.new(uri.host, uri.port)
         | 
| 14 16 | 
             
              end
         | 
| 15 17 |  | 
| 16 18 | 
             
              def self.http_proxy_env
         | 
| @@ -49,14 +51,6 @@ module Puppet::Util::HttpProxy | |
| 49 51 | 
             
                  host, port = d.split(':')
         | 
| 50 52 | 
             
                  host = Regexp.escape(host).gsub('\*', '.*')
         | 
| 51 53 |  | 
| 52 | 
            -
                  #If the host of this no_proxy value starts with '.', this entry is
         | 
| 53 | 
            -
                  #a domain level entry. Don't pin the regex to the beginning of the entry.
         | 
| 54 | 
            -
                  #If it does not start with a '.' then it is a host specific entry and
         | 
| 55 | 
            -
                  #should be matched to the destination starting at the beginning.
         | 
| 56 | 
            -
                  unless host =~ /^\\\./
         | 
| 57 | 
            -
                    host = "^#{host}"
         | 
| 58 | 
            -
                  end
         | 
| 59 | 
            -
             | 
| 60 54 | 
             
                  #If this no_proxy entry specifies a port, we want to match it against
         | 
| 61 55 | 
             
                  #the destination port.  Otherwise just match hosts.
         | 
| 62 56 | 
             
                  if port
         | 
| @@ -192,7 +186,7 @@ module Puppet::Util::HttpProxy | |
| 192 186 |  | 
| 193 187 | 
             
                  headers = { 'Accept' => '*/*', 'User-Agent' => Puppet[:http_user_agent] }
         | 
| 194 188 | 
             
                  if Puppet.features.zlib?
         | 
| 195 | 
            -
                    headers | 
| 189 | 
            +
                    headers["Accept-Encoding"] = Puppet::Network::HTTP::Compression::ACCEPT_ENCODING
         | 
| 196 190 | 
             
                  end
         | 
| 197 191 |  | 
| 198 192 | 
             
                  response = proxy.send(:head, current_uri.path, headers)
         | 
| @@ -40,7 +40,7 @@ module Puppet::Util::InstanceLoader | |
| 40 40 | 
             
                instance_loader(type).loadall
         | 
| 41 41 |  | 
| 42 42 | 
             
                # Use this method so they all get loaded
         | 
| 43 | 
            -
                loaded_instances(type). | 
| 43 | 
            +
                loaded_instances(type).sort_by(&:to_s).each do |name|
         | 
| 44 44 | 
             
                  mod = self.loaded_instance(type, name)
         | 
| 45 45 | 
             
                  docs << "#{name}\n#{"-" * name.to_s.length}\n"
         | 
| 46 46 |  | 
    
        data/lib/puppet/util/log.rb
    CHANGED
    
    
| @@ -34,7 +34,7 @@ Puppet::Util::Log.newdesttype :syslog do | |
| 34 34 | 
             
                  end
         | 
| 35 35 | 
             
                else
         | 
| 36 36 | 
             
                  msg.to_s.split("\n").each do |line|
         | 
| 37 | 
            -
                    @syslog.send(msg.level, "(%s) %s" % [msg.source.to_s. | 
| 37 | 
            +
                    @syslog.send(msg.level, "(%s) %s" % [msg.source.to_s.delete("%"),
         | 
| 38 38 | 
             
                        line.gsub("%", '%%')
         | 
| 39 39 | 
             
                      ]
         | 
| 40 40 | 
             
                    )
         | 
| @@ -77,7 +77,7 @@ Puppet::Util::Log.newdesttype :file do | |
| 77 77 |  | 
| 78 78 | 
             
                # create the log file, if it doesn't already exist
         | 
| 79 79 | 
             
                need_array_start = false
         | 
| 80 | 
            -
                file_exists =  | 
| 80 | 
            +
                file_exists = Puppet::FileSystem.exist?(path)
         | 
| 81 81 | 
             
                if @json == 1
         | 
| 82 82 | 
             
                  need_array_start = true
         | 
| 83 83 | 
             
                  if file_exists
         | 
| @@ -90,18 +90,9 @@ Puppet::Util::Log.newdesttype :file do | |
| 90 90 | 
             
                  end
         | 
| 91 91 | 
             
                end
         | 
| 92 92 |  | 
| 93 | 
            -
                file = File.open(path, | 
| 93 | 
            +
                file = File.open(path, File::WRONLY|File::CREAT|File::APPEND)
         | 
| 94 94 | 
             
                file.puts('[') if need_array_start
         | 
| 95 95 |  | 
| 96 | 
            -
                # Give ownership to the user and group puppet will run as
         | 
| 97 | 
            -
                if Puppet.features.root? && !Puppet::Util::Platform.windows? && !file_exists
         | 
| 98 | 
            -
                  begin
         | 
| 99 | 
            -
                    FileUtils.chown(Puppet[:user], Puppet[:group], path)
         | 
| 100 | 
            -
                  rescue ArgumentError, Errno::EPERM
         | 
| 101 | 
            -
                    Puppet.err _("Unable to set ownership to %{user}:%{group} for log file: %{path}") % { user: Puppet[:user], group: Puppet[:group], path: path }
         | 
| 102 | 
            -
                  end
         | 
| 103 | 
            -
                end
         | 
| 104 | 
            -
             | 
| 105 96 | 
             
                @file = file
         | 
| 106 97 |  | 
| 107 98 | 
             
                @autoflush = Puppet[:autoflush]
         | 
    
        data/lib/puppet/util/logging.rb
    CHANGED
    
    | @@ -48,11 +48,12 @@ module Logging | |
| 48 48 | 
             
              #    wish to log a message at all; in this case it is likely that you are only calling this method in order
         | 
| 49 49 | 
             
              #    to take advantage of the backtrace logging.
         | 
| 50 50 | 
             
              def log_exception(exception, message = :default, options = {})
         | 
| 51 | 
            -
                 | 
| 51 | 
            +
                combined_trace = Puppet[:trace] || options[:trace]
         | 
| 52 | 
            +
                puppet_trace = Puppet[:puppet_trace] || options[:puppet_trace]
         | 
| 53 | 
            +
             | 
| 52 54 | 
             
                if message == :default && exception.is_a?(Puppet::ParseErrorWithIssue)
         | 
| 53 55 | 
             
                  # Retain all detailed info and keep plain message and stacktrace separate
         | 
| 54 | 
            -
                  backtrace =  | 
| 55 | 
            -
                  build_exception_trace(backtrace, exception, trace)
         | 
| 56 | 
            +
                  backtrace = build_exception_trace(exception, combined_trace, puppet_trace)
         | 
| 56 57 | 
             
                  Puppet::Util::Log.create({
         | 
| 57 58 | 
             
                      :level => options[:level] || :err,
         | 
| 58 59 | 
             
                      :source => log_source,
         | 
| @@ -66,28 +67,27 @@ module Logging | |
| 66 67 | 
             
                      :node => exception.node
         | 
| 67 68 | 
             
                    }.merge(log_metadata))
         | 
| 68 69 | 
             
                else
         | 
| 69 | 
            -
                  err(format_exception(exception, message,  | 
| 70 | 
            +
                  err(format_exception(exception, message, combined_trace, puppet_trace))
         | 
| 70 71 | 
             
                end
         | 
| 71 72 | 
             
              end
         | 
| 72 73 |  | 
| 73 | 
            -
              def build_exception_trace( | 
| 74 | 
            -
                 | 
| 75 | 
            -
             | 
| 76 | 
            -
                    arr << line =~ /^(.+):(\d+.*)$/ ? ("#{Pathname($1).realpath}:#{$2}" rescue line) : line
         | 
| 77 | 
            -
                  end
         | 
| 78 | 
            -
                end
         | 
| 74 | 
            +
              def build_exception_trace(exception, combined_trace = true, puppet_trace = false)
         | 
| 75 | 
            +
                built_trace = format_backtrace(exception, combined_trace, puppet_trace)
         | 
| 76 | 
            +
             | 
| 79 77 | 
             
                if exception.respond_to?(:original)
         | 
| 80 78 | 
             
                  original =  exception.original
         | 
| 81 79 | 
             
                  unless original.nil?
         | 
| 82 | 
            -
                     | 
| 83 | 
            -
                     | 
| 84 | 
            -
                    build_exception_trace( | 
| 80 | 
            +
                    built_trace << _('Wrapped exception:')
         | 
| 81 | 
            +
                    built_trace << original.message
         | 
| 82 | 
            +
                    built_trace += build_exception_trace(original, combined_trace, puppet_trace)
         | 
| 85 83 | 
             
                  end
         | 
| 86 84 | 
             
                end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                built_trace
         | 
| 87 87 | 
             
              end
         | 
| 88 88 | 
             
              private :build_exception_trace
         | 
| 89 89 |  | 
| 90 | 
            -
              def format_exception(exception, message = :default,  | 
| 90 | 
            +
              def format_exception(exception, message = :default, combined_trace = true, puppet_trace = false)
         | 
| 91 91 | 
             
                arr = []
         | 
| 92 92 | 
             
                case message
         | 
| 93 93 | 
             
                when :default
         | 
| @@ -98,16 +98,28 @@ module Logging | |
| 98 98 | 
             
                  arr << message
         | 
| 99 99 | 
             
                end
         | 
| 100 100 |  | 
| 101 | 
            -
                 | 
| 102 | 
            -
             | 
| 103 | 
            -
                end
         | 
| 101 | 
            +
                arr += format_backtrace(exception, combined_trace, puppet_trace)
         | 
| 102 | 
            +
             | 
| 104 103 | 
             
                if exception.respond_to?(:original) and exception.original
         | 
| 105 104 | 
             
                  arr << _("Wrapped exception:")
         | 
| 106 | 
            -
                  arr << format_exception(exception.original, :default,  | 
| 105 | 
            +
                  arr << format_exception(exception.original, :default, combined_trace, puppet_trace)
         | 
| 107 106 | 
             
                end
         | 
| 107 | 
            +
             | 
| 108 108 | 
             
                arr.flatten.join("\n")
         | 
| 109 109 | 
             
              end
         | 
| 110 110 |  | 
| 111 | 
            +
              def format_backtrace(exception, combined_trace, puppet_trace)
         | 
| 112 | 
            +
                puppetstack = exception.respond_to?(:puppetstack) ? exception.puppetstack : []
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                if combined_trace and exception.backtrace
         | 
| 115 | 
            +
                  Puppet::Util.format_backtrace_array(exception.backtrace, puppetstack)
         | 
| 116 | 
            +
                elsif puppet_trace && !puppetstack.empty?
         | 
| 117 | 
            +
                  Puppet::Util.format_backtrace_array(puppetstack)
         | 
| 118 | 
            +
                else
         | 
| 119 | 
            +
                  []
         | 
| 120 | 
            +
                end
         | 
| 121 | 
            +
              end
         | 
| 122 | 
            +
             | 
| 111 123 | 
             
              def log_and_raise(exception, message)
         | 
| 112 124 | 
             
                log_exception(exception, message)
         | 
| 113 125 | 
             
                raise exception, message + "\n" + exception.to_s, exception.backtrace
         | 
    
        data/lib/puppet/util/metric.rb
    CHANGED
    
    | @@ -54,11 +54,11 @@ class Puppet::Util::Metric | |
| 54 54 | 
             
              end
         | 
| 55 55 |  | 
| 56 56 | 
             
              def values
         | 
| 57 | 
            -
                @values. | 
| 57 | 
            +
                @values.sort_by { |a| a[1] }
         | 
| 58 58 | 
             
              end
         | 
| 59 59 |  | 
| 60 60 | 
             
              # Convert a name into a label.
         | 
| 61 61 | 
             
              def self.labelize(name)
         | 
| 62 | 
            -
                name.to_s.capitalize. | 
| 62 | 
            +
                name.to_s.capitalize.tr("_", " ")
         | 
| 63 63 | 
             
              end
         | 
| 64 64 | 
             
            end
         | 
| @@ -65,11 +65,11 @@ module Puppet::Util::NagiosMaker | |
| 65 65 | 
             
                  end
         | 
| 66 66 | 
             
                end
         | 
| 67 67 |  | 
| 68 | 
            -
                target = "/etc/nagios/#{full_name | 
| 68 | 
            +
                target = "/etc/nagios/#{full_name}.cfg"
         | 
| 69 69 | 
             
                provider = type.provide(:naginator, :parent => Puppet::Provider::Naginator, :default_target => target) {}
         | 
| 70 70 | 
             
                provider.nagios_type
         | 
| 71 71 |  | 
| 72 | 
            -
                type.desc "The Nagios type #{name | 
| 72 | 
            +
                type.desc "The Nagios type #{name}.  This resource type is autogenerated using the
         | 
| 73 73 | 
             
                  model developed in Naginator, and all of the Nagios types are generated using the
         | 
| 74 74 | 
             
                  same code and the same library.
         | 
| 75 75 |  | 
| @@ -103,7 +103,7 @@ class Puppet::Util::NetworkDevice::Cisco::Device < Puppet::Util::NetworkDevice:: | |
| 103 103 | 
             
                IF.each do |k,ifnames|
         | 
| 104 104 | 
             
                  if found = ifnames.find { |ifname| interface =~ /^#{ifname}\s*\d/i }
         | 
| 105 105 | 
             
                    found = /^#{found}(.+)\Z/i.match(interface)
         | 
| 106 | 
            -
                    return "#{k | 
| 106 | 
            +
                    return "#{k}#{found[1]}".gsub(/\s+/,'')
         | 
| 107 107 | 
             
                  end
         | 
| 108 108 | 
             
                end
         | 
| 109 109 | 
             
                interface
         | 
| @@ -27,8 +27,8 @@ class Puppet::Util::NetworkDevice::Cisco::Interface | |
| 27 27 | 
             
                :etherchannel  => [9, ["channel-group %s", "port group %s"]],
         | 
| 28 28 | 
             
                :ipaddress     => [10,
         | 
| 29 29 | 
             
                  lambda do |prefix,ip,option|
         | 
| 30 | 
            -
                    ip.ipv6? ? "ipv6 address #{ip | 
| 31 | 
            -
                               "ip address #{ip | 
| 30 | 
            +
                    ip.ipv6? ? "ipv6 address #{ip}/#{prefix} #{option}" :
         | 
| 31 | 
            +
                               "ip address #{ip} #{netmask(Socket::AF_INET,prefix)}"
         | 
| 32 32 | 
             
                  end],
         | 
| 33 33 | 
             
                :ensure        => [11, lambda { |value| value == :present ? "no shutdown" : "shutdown" } ]
         | 
| 34 34 | 
             
              }
         | 
| @@ -59,7 +59,7 @@ class Puppet::Util::NetworkDevice::Transport::Ssh < Puppet::Util::NetworkDevice: | |
| 59 59 | 
             
                    # the ssh loop there while still having the ssh connection up
         | 
| 60 60 | 
             
                    # otherwise we wouldn't be able to return ssh stdout/stderr
         | 
| 61 61 | 
             
                    # for a given call of command.
         | 
| 62 | 
            -
                    return
         | 
| 62 | 
            +
                    return # rubocop:disable Lint/NonLocalExitFromIterator
         | 
| 63 63 | 
             
                  end
         | 
| 64 64 |  | 
| 65 65 | 
             
                end
         | 
    
        data/lib/puppet/util/pidlock.rb
    CHANGED
    
    | @@ -44,7 +44,9 @@ class Puppet::Util::Pidlock | |
| 44 44 | 
             
              end
         | 
| 45 45 |  | 
| 46 46 | 
             
              def clear_if_stale
         | 
| 47 | 
            -
                 | 
| 47 | 
            +
                pid = lock_pid
         | 
| 48 | 
            +
                return @lockfile.unlock if pid == nil
         | 
| 49 | 
            +
                return if Process.pid == pid
         | 
| 48 50 |  | 
| 49 51 | 
             
                errors = [Errno::ESRCH]
         | 
| 50 52 | 
             
                # Win32::Process now throws SystemCallError. Since this could be
         | 
| @@ -52,7 +54,7 @@ class Puppet::Util::Pidlock | |
| 52 54 | 
             
                errors << SystemCallError if Puppet::Util::Platform.windows?
         | 
| 53 55 |  | 
| 54 56 | 
             
                begin
         | 
| 55 | 
            -
                  Process.kill(0,  | 
| 57 | 
            +
                  Process.kill(0, pid)
         | 
| 56 58 | 
             
                rescue *errors
         | 
| 57 59 | 
             
                  return @lockfile.unlock
         | 
| 58 60 | 
             
                end
         | 
| @@ -61,14 +63,18 @@ class Puppet::Util::Pidlock | |
| 61 63 | 
             
                # not, we can unlock the lockfile. For now this is only done on
         | 
| 62 64 | 
             
                # POSIX and Windows platforms (PUP-9247).
         | 
| 63 65 | 
             
                if Puppet.features.posix?
         | 
| 64 | 
            -
                  procname = Puppet::Util::Execution.execute(["ps", "-p",  | 
| 65 | 
            -
                  args     = Puppet::Util::Execution.execute(["ps", "-p",  | 
| 66 | 
            +
                  procname = Puppet::Util::Execution.execute(["ps", "-p", pid, "-o", "comm="]).strip
         | 
| 67 | 
            +
                  args     = Puppet::Util::Execution.execute(["ps", "-p", pid, "-o", "args="]).strip
         | 
| 66 68 | 
             
                  @lockfile.unlock unless procname =~ /ruby/ && args =~ /puppet/ || procname =~ /puppet(-.*)?$/
         | 
| 67 69 | 
             
                elsif Puppet.features.microsoft_windows?
         | 
| 68 70 | 
             
                  # On Windows, we're checking if the filesystem path name of the running
         | 
| 69 71 | 
             
                  # process is our vendored ruby:
         | 
| 70 | 
            -
                   | 
| 71 | 
            -
             | 
| 72 | 
            +
                  begin
         | 
| 73 | 
            +
                    exe_path = Puppet::Util::Windows::Process::get_process_image_name_by_pid(pid)
         | 
| 74 | 
            +
                    @lockfile.unlock unless exe_path =~ /\\bin\\ruby.exe$/
         | 
| 75 | 
            +
                  rescue Puppet::Util::Windows::Error => e
         | 
| 76 | 
            +
                    Puppet.debug("Failed to read pidfile #{file_path}: #{e.message}")
         | 
| 77 | 
            +
                  end
         | 
| 72 78 | 
             
                end
         | 
| 73 79 | 
             
              end
         | 
| 74 80 | 
             
              private :clear_if_stale
         | 
    
        data/lib/puppet/util/plist.rb
    CHANGED
    
    | @@ -56,6 +56,12 @@ module Puppet::Util::Plist | |
| 56 56 | 
             
                # Read plist text using the CFPropertyList gem.
         | 
| 57 57 | 
             
                def parse_plist(plist_data, file_path = '')
         | 
| 58 58 | 
             
                  bad_xml_doctype = /^.*<!DOCTYPE plist PUBLIC -\/\/Apple Computer.*$/
         | 
| 59 | 
            +
                  # Depending on where parse_plist is called from, plist_data can be either XML or binary.
         | 
| 60 | 
            +
                  # If we get XML, make sure ruby knows it's UTF-8 so we avoid invalid byte sequence errors.
         | 
| 61 | 
            +
                  if plist_data.include?('encoding="UTF-8"') && plist_data.encoding != Encoding::UTF_8
         | 
| 62 | 
            +
                    plist_data.force_encoding(Encoding::UTF_8)
         | 
| 63 | 
            +
                  end
         | 
| 64 | 
            +
             | 
| 59 65 | 
             
                  begin
         | 
| 60 66 | 
             
                    if plist_data =~ bad_xml_doctype
         | 
| 61 67 | 
             
                      plist_data.gsub!( bad_xml_doctype, plist_xml_doctype )
         | 
| @@ -81,7 +81,7 @@ module Puppet::Util::ProviderFeatures | |
| 81 81 | 
             
                str = ""
         | 
| 82 82 | 
             
                @features ||= {}
         | 
| 83 83 | 
             
                return nil if @features.empty?
         | 
| 84 | 
            -
                names = @features.keys. | 
| 84 | 
            +
                names = @features.keys.sort_by(&:to_s)
         | 
| 85 85 | 
             
                names.each do |name|
         | 
| 86 86 | 
             
                  doc = @features[name].docs.gsub(/\n\s+/, " ")
         | 
| 87 87 | 
             
                  str << "- *#{name}*: #{doc}\n"
         | 
| @@ -130,9 +130,7 @@ module Puppet::Util::ProviderFeatures | |
| 130 130 | 
             
                  # Create a method that will list all functional features.
         | 
| 131 131 | 
             
                  @feature_module.send(:define_method, :features) do
         | 
| 132 132 | 
             
                    return false unless defined?(features)
         | 
| 133 | 
            -
                    features.keys.find_all { |n| feature?(n) }. | 
| 134 | 
            -
                      a.to_s <=> b.to_s
         | 
| 135 | 
            -
                    }
         | 
| 133 | 
            +
                    features.keys.find_all { |n| feature?(n) }.sort_by(&:to_s)
         | 
| 136 134 | 
             
                  end
         | 
| 137 135 |  | 
| 138 136 | 
             
                  # Create a method that will determine if a provided list of
         | 
    
        data/lib/puppet/util/rdoc.rb
    CHANGED
    
    | @@ -31,7 +31,7 @@ module Puppet::Util::RDoc | |
| 31 31 | 
             
                # uses relative_path_from that will generate errors when the slashes don't
         | 
| 32 32 | 
             
                # properly match.  This is a workaround for that issue.
         | 
| 33 33 | 
             
                if Puppet.features.microsoft_windows? && RDoc::VERSION !~ /^[0-3]\./
         | 
| 34 | 
            -
                  options += [ "--root", Dir.pwd. | 
| 34 | 
            +
                  options += [ "--root", Dir.pwd.tr('\\', '/')]
         | 
| 35 35 | 
             
                end
         | 
| 36 36 | 
             
                options += files
         | 
| 37 37 |  | 
| @@ -60,7 +60,7 @@ class Puppet::Util::Reference | |
| 60 60 |  | 
| 61 61 | 
             
              def self.references
         | 
| 62 62 | 
             
                instance_loader(:reference).loadall
         | 
| 63 | 
            -
                loaded_instances(:reference). | 
| 63 | 
            +
                loaded_instances(:reference).sort_by(&:to_s)
         | 
| 64 64 | 
             
              end
         | 
| 65 65 |  | 
| 66 66 | 
             
              attr_accessor :page, :depth, :header, :title, :dynamic
         | 
    
        data/lib/puppet/util/selinux.rb
    CHANGED
    
    | @@ -206,7 +206,9 @@ module Puppet::Util::SELinux | |
| 206 206 | 
             
                    # If possible we use read_nonblock in a loop rather than read to work-
         | 
| 207 207 | 
             
                    # a linux kernel bug.  See ticket #1963 for details.
         | 
| 208 208 | 
             
                    mountfh = File.open("/proc/mounts")
         | 
| 209 | 
            -
                     | 
| 209 | 
            +
                    loop do
         | 
| 210 | 
            +
                      mounts += mountfh.read_nonblock(1024)
         | 
| 211 | 
            +
                    end
         | 
| 210 212 | 
             
                  else
         | 
| 211 213 | 
             
                    # Otherwise we shell out and let cat do it for us
         | 
| 212 214 | 
             
                    mountfh = IO.popen("/bin/cat /proc/mounts")
         | 
| @@ -1,6 +1,23 @@ | |
| 1 1 | 
             
            module Puppet::Util::Windows::ADSI
         | 
| 2 2 | 
             
              require 'ffi'
         | 
| 3 3 |  | 
| 4 | 
            +
              # https://docs.microsoft.com/en-us/windows/win32/api/dsrole/ne-dsrole-dsrole_machine_role
         | 
| 5 | 
            +
              STANDALONE_WORKSTATION = 0
         | 
| 6 | 
            +
              MEMBER_WORKSTATION = 1
         | 
| 7 | 
            +
              STANDALONE_SERVER = 2
         | 
| 8 | 
            +
              MEMBER_SERVER = 3
         | 
| 9 | 
            +
              BACKUP_DOMAIN_CONTROLLER = 4
         | 
| 10 | 
            +
              PRIMARY_DOMAIN_CONTROLLER = 5
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              DOMAIN_ROLES = {
         | 
| 13 | 
            +
                STANDALONE_WORKSTATION => :STANDALONE_WORKSTATION,
         | 
| 14 | 
            +
                MEMBER_WORKSTATION => :MEMBER_WORKSTATION,
         | 
| 15 | 
            +
                STANDALONE_SERVER => :STANDALONE_SERVER,
         | 
| 16 | 
            +
                MEMBER_SERVER => :MEMBER_SERVER,
         | 
| 17 | 
            +
                BACKUP_DOMAIN_CONTROLLER => :BACKUP_DOMAIN_CONTROLLER,
         | 
| 18 | 
            +
                PRIMARY_DOMAIN_CONTROLLER => :PRIMARY_DOMAIN_CONTROLLER,
         | 
| 19 | 
            +
              }
         | 
| 20 | 
            +
             | 
| 4 21 | 
             
              class << self
         | 
| 5 22 | 
             
                extend FFI::Library
         | 
| 6 23 |  | 
| @@ -94,6 +111,14 @@ module Puppet::Util::Windows::ADSI | |
| 94 111 | 
             
                  wmi_connection.execquery(query)
         | 
| 95 112 | 
             
                end
         | 
| 96 113 |  | 
| 114 | 
            +
                def domain_role
         | 
| 115 | 
            +
                  unless @domain_role
         | 
| 116 | 
            +
                    query_result = Puppet::Util::Windows::ADSI.execquery('select DomainRole from Win32_ComputerSystem').to_enum.first
         | 
| 117 | 
            +
                    @domain_role = DOMAIN_ROLES[query_result.DomainRole] if query_result
         | 
| 118 | 
            +
                  end
         | 
| 119 | 
            +
                  @domain_role
         | 
| 120 | 
            +
                end
         | 
| 121 | 
            +
             | 
| 97 122 | 
             
                ffi_convention :stdcall
         | 
| 98 123 |  | 
| 99 124 | 
             
                # https://msdn.microsoft.com/en-us/library/windows/desktop/ms724295(v=vs.85).aspx
         | 
| @@ -126,24 +151,24 @@ module Puppet::Util::Windows::ADSI | |
| 126 151 | 
             
                      Puppet::Util::Windows::SID.name_to_principal('SYSTEM').domain.upcase
         | 
| 127 152 | 
             
                    ]
         | 
| 128 153 | 
             
                  end
         | 
| 129 | 
            -
             | 
| 154 | 
            +
             | 
| 130 155 | 
             
                  def uri(name, host = '.')
         | 
| 131 156 | 
             
                    host = '.' if (localized_domains << Socket.gethostname.upcase).include?(host.upcase)
         | 
| 132 157 | 
             
                    Puppet::Util::Windows::ADSI.uri(name, @object_class, host)
         | 
| 133 158 | 
             
                  end
         | 
| 134 | 
            -
             | 
| 159 | 
            +
             | 
| 135 160 | 
             
                  def parse_name(name)
         | 
| 136 161 | 
             
                    if name =~ /\//
         | 
| 137 162 | 
             
                      raise Puppet::Error.new( _("Value must be in DOMAIN\\%{object_class} style syntax") % { object_class: @object_class } )
         | 
| 138 163 | 
             
                    end
         | 
| 139 | 
            -
             | 
| 164 | 
            +
             | 
| 140 165 | 
             
                    matches = name.scan(/((.*)\\)?(.*)/)
         | 
| 141 166 | 
             
                    domain = matches[0][1] || '.'
         | 
| 142 167 | 
             
                    account = matches[0][2]
         | 
| 143 | 
            -
             | 
| 168 | 
            +
             | 
| 144 169 | 
             
                    return account, domain
         | 
| 145 170 | 
             
                  end
         | 
| 146 | 
            -
             | 
| 171 | 
            +
             | 
| 147 172 | 
             
                  # returns Puppet::Util::Windows::SID::Principal[]
         | 
| 148 173 | 
             
                  # may contain objects that represent unresolvable SIDs
         | 
| 149 174 | 
             
                  def get_sids(adsi_child_collection)
         | 
| @@ -151,19 +176,19 @@ module Puppet::Util::Windows::ADSI | |
| 151 176 | 
             
                    adsi_child_collection.each do |m|
         | 
| 152 177 | 
             
                      sids << Puppet::Util::Windows::SID.ads_to_principal(m)
         | 
| 153 178 | 
             
                    end
         | 
| 154 | 
            -
             | 
| 179 | 
            +
             | 
| 155 180 | 
             
                    sids
         | 
| 156 181 | 
             
                  end
         | 
| 157 | 
            -
             | 
| 158 | 
            -
                  def name_sid_hash(names)
         | 
| 182 | 
            +
             | 
| 183 | 
            +
                  def name_sid_hash(names, allow_unresolved = false)
         | 
| 159 184 | 
             
                    return {} if names.nil? || names.empty?
         | 
| 160 | 
            -
             | 
| 185 | 
            +
             | 
| 161 186 | 
             
                    sids = names.map do |name|
         | 
| 162 | 
            -
                      sid = Puppet::Util::Windows::SID.name_to_principal(name)
         | 
| 187 | 
            +
                      sid = Puppet::Util::Windows::SID.name_to_principal(name, allow_unresolved)
         | 
| 163 188 | 
             
                      raise Puppet::Error.new( _("Could not resolve name: %{name}") % { name: name } ) if !sid
         | 
| 164 189 | 
             
                      [sid.sid, sid]
         | 
| 165 190 | 
             
                    end
         | 
| 166 | 
            -
             | 
| 191 | 
            +
             | 
| 167 192 | 
             
                    Hash[ sids ]
         | 
| 168 193 | 
             
                  end
         | 
| 169 194 |  | 
| @@ -176,8 +201,13 @@ module Puppet::Util::Windows::ADSI | |
| 176 201 | 
             
                    well_known = false
         | 
| 177 202 | 
             
                    if (sid = Puppet::Util::Windows::SID.name_to_principal(name_or_sid))
         | 
| 178 203 | 
             
                      # Examples of SidType include SidTypeUser, SidTypeGroup
         | 
| 179 | 
            -
                       | 
| 180 | 
            -
             | 
| 204 | 
            +
                      if sid.account_type == "SidType#{@object_class.capitalize}".to_sym
         | 
| 205 | 
            +
                        # Check if we're getting back a local user when domain-joined
         | 
| 206 | 
            +
                        return true unless [:MEMBER_WORKSTATION, :MEMBER_SERVER].include?(Puppet::Util::Windows::ADSI.domain_role)
         | 
| 207 | 
            +
                        # The resource domain and the computer name are not always case-matching
         | 
| 208 | 
            +
                        return sid.domain.casecmp(Puppet::Util::Windows::ADSI.computer_name) == 0
         | 
| 209 | 
            +
                      end
         | 
| 210 | 
            +
             | 
| 181 211 | 
             
                      # 'well known group' is special as it can be a group like Everyone OR a user like SYSTEM
         | 
| 182 212 | 
             
                      # so try to resolve it
         | 
| 183 213 | 
             
                      # https://msdn.microsoft.com/en-us/library/cc234477.aspx
         | 
| @@ -388,23 +418,23 @@ module Puppet::Util::Windows::ADSI | |
| 388 418 | 
             
                  ADS_UF_SCRIPT:                                 0x0001,
         | 
| 389 419 | 
             
                  ADS_UF_ACCOUNTDISABLE:                         0x0002,
         | 
| 390 420 | 
             
                  ADS_UF_HOMEDIR_REQUIRED:                       0x0008,
         | 
| 391 | 
            -
                  ADS_UF_LOCKOUT:                                0x0010, | 
| 392 | 
            -
                  ADS_UF_PASSWD_NOTREQD:                         0x0020, | 
| 393 | 
            -
                  ADS_UF_PASSWD_CANT_CHANGE:                     0x0040, | 
| 394 | 
            -
                  ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED:        0x0080, | 
| 395 | 
            -
                  ADS_UF_TEMP_DUPLICATE_ACCOUNT:                 0x0100, | 
| 396 | 
            -
                  ADS_UF_NORMAL_ACCOUNT:                         0x0200, | 
| 397 | 
            -
                  ADS_UF_INTERDOMAIN_TRUST_ACCOUNT:              0x0800, | 
| 398 | 
            -
                  ADS_UF_WORKSTATION_TRUST_ACCOUNT:              0x1000, | 
| 399 | 
            -
                  ADS_UF_SERVER_TRUST_ACCOUNT:                   0x2000, | 
| 400 | 
            -
                  ADS_UF_DONT_EXPIRE_PASSWD:                     0x10000, | 
| 401 | 
            -
                  ADS_UF_MNS_LOGON_ACCOUNT:                      0x20000, | 
| 402 | 
            -
                  ADS_UF_SMARTCARD_REQUIRED:                     0x40000, | 
| 403 | 
            -
                  ADS_UF_TRUSTED_FOR_DELEGATION:                 0x80000, | 
| 404 | 
            -
                  ADS_UF_NOT_DELEGATED:                          0x100000, | 
| 405 | 
            -
                  ADS_UF_USE_DES_KEY_ONLY:                       0x200000, | 
| 406 | 
            -
                  ADS_UF_DONT_REQUIRE_PREAUTH:                   0x400000, | 
| 407 | 
            -
                  ADS_UF_PASSWORD_EXPIRED:                       0x800000, | 
| 421 | 
            +
                  ADS_UF_LOCKOUT:                                0x0010,
         | 
| 422 | 
            +
                  ADS_UF_PASSWD_NOTREQD:                         0x0020,
         | 
| 423 | 
            +
                  ADS_UF_PASSWD_CANT_CHANGE:                     0x0040,
         | 
| 424 | 
            +
                  ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED:        0x0080,
         | 
| 425 | 
            +
                  ADS_UF_TEMP_DUPLICATE_ACCOUNT:                 0x0100,
         | 
| 426 | 
            +
                  ADS_UF_NORMAL_ACCOUNT:                         0x0200,
         | 
| 427 | 
            +
                  ADS_UF_INTERDOMAIN_TRUST_ACCOUNT:              0x0800,
         | 
| 428 | 
            +
                  ADS_UF_WORKSTATION_TRUST_ACCOUNT:              0x1000,
         | 
| 429 | 
            +
                  ADS_UF_SERVER_TRUST_ACCOUNT:                   0x2000,
         | 
| 430 | 
            +
                  ADS_UF_DONT_EXPIRE_PASSWD:                     0x10000,
         | 
| 431 | 
            +
                  ADS_UF_MNS_LOGON_ACCOUNT:                      0x20000,
         | 
| 432 | 
            +
                  ADS_UF_SMARTCARD_REQUIRED:                     0x40000,
         | 
| 433 | 
            +
                  ADS_UF_TRUSTED_FOR_DELEGATION:                 0x80000,
         | 
| 434 | 
            +
                  ADS_UF_NOT_DELEGATED:                          0x100000,
         | 
| 435 | 
            +
                  ADS_UF_USE_DES_KEY_ONLY:                       0x200000,
         | 
| 436 | 
            +
                  ADS_UF_DONT_REQUIRE_PREAUTH:                   0x400000,
         | 
| 437 | 
            +
                  ADS_UF_PASSWORD_EXPIRED:                       0x800000,
         | 
| 408 438 | 
             
                  ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION: 0x1000000
         | 
| 409 439 | 
             
                }
         | 
| 410 440 |  |