puppet 5.5.16-x64-mingw32 → 5.5.21-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 +10 -10
- data/Gemfile +2 -3
- data/Gemfile.lock +57 -52
- data/ext/build_defaults.yaml +1 -0
- data/ext/cert_inspector +3 -3
- data/ext/project_data.yaml +2 -2
- 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 -24
- 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 +15 -1
- data/lib/puppet/application/apply.rb +2 -2
- data/lib/puppet/application/describe.rb +3 -9
- data/lib/puppet/application/device.rb +4 -4
- 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/resource.rb +4 -4
- data/lib/puppet/application/script.rb +2 -2
- data/lib/puppet/configurer.rb +86 -28
- data/lib/puppet/configurer/downloader.rb +2 -6
- data/lib/puppet/daemon.rb +1 -1
- data/lib/puppet/defaults.rb +82 -38
- 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/config.rb +10 -48
- data/lib/puppet/face/facts.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/face/plugin.rb +9 -2
- data/lib/puppet/file_serving/http_metadata.rb +1 -1
- 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/reduce.rb +2 -4
- 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 +2 -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 +12 -2
- 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/factory.rb +1 -11
- 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 +4 -2
- data/lib/puppet/parameter.rb +8 -0
- 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 +1 -1
- 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/evaluator/access_operator.rb +2 -2
- 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/p_sensitive_type.rb +1 -1
- 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 +10 -0
- 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/file/posix.rb +5 -0
- 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.rb +10 -3
- 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/dnf.rb +1 -1
- 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/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/rpm.rb +57 -19
- data/lib/puppet/provider/package/windows/package.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +35 -24
- 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/launchd.rb +20 -5
- 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 +35 -22
- data/lib/puppet/provider/service/windows.rb +8 -0
- data/lib/puppet/provider/user/directoryservice.rb +31 -6
- data/lib/puppet/provider/user/hpux.rb +1 -1
- data/lib/puppet/provider/user/pw.rb +12 -3
- data/lib/puppet/provider/user/user_role_add.rb +5 -1
- data/lib/puppet/provider/user/useradd.rb +62 -27
- 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 +18 -1
- data/lib/puppet/resource/catalog.rb +1 -1
- data/lib/puppet/resource/type.rb +8 -0
- data/lib/puppet/settings.rb +43 -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 +15 -10
- data/lib/puppet/transaction/report.rb +1 -1
- data/lib/puppet/transaction/resource_harness.rb +1 -1
- data/lib/puppet/type.rb +15 -4
- data/lib/puppet/type/cron.rb +1 -1
- data/lib/puppet/type/exec.rb +21 -9
- 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 +107 -8
- data/lib/puppet/type/schedule.rb +1 -1
- data/lib/puppet/type/selboolean.rb +17 -3
- data/lib/puppet/type/service.rb +9 -10
- data/lib/puppet/type/user.rb +6 -24
- data/lib/puppet/type/yumrepo.rb +3 -7
- data/lib/puppet/util.rb +47 -25
- data/lib/puppet/util/command_line/trollop.rb +1 -1
- data/lib/puppet/util/execution.rb +4 -3
- data/lib/puppet/util/http_proxy.rb +24 -16
- 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 +8 -2
- 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 +3 -0
- data/lib/puppet/util/windows/service.rb +149 -4
- data/lib/puppet/util/windows/sid.rb +4 -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 +479 -443
- data/man/man5/puppet.conf.5 +38 -8
- 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 +52 -0
- data/spec/integration/defaults_spec.rb +1 -2
- data/spec/integration/indirector/facts/facter_spec.rb +4 -0
- data/spec/integration/parser/compiler_spec.rb +11 -0
- data/spec/integration/provider/service/systemd_spec.rb +8 -5
- data/spec/integration/type/file_spec.rb +28 -0
- data/spec/integration/type/notify_spec.rb +46 -0
- data/spec/integration/util/execution_spec.rb +27 -0
- data/spec/integration/util/windows/adsi_spec.rb +6 -1
- data/spec/integration/util/windows/registry_spec.rb +7 -7
- data/spec/unit/agent_spec.rb +34 -26
- data/spec/unit/application/agent_spec.rb +18 -0
- data/spec/unit/application/apply_spec.rb +2 -12
- data/spec/unit/application/device_spec.rb +1 -1
- data/spec/unit/configurer/fact_handler_spec.rb +0 -4
- data/spec/unit/configurer_spec.rb +377 -397
- data/spec/unit/daemon_spec.rb +0 -1
- data/spec/unit/face/facts_spec.rb +9 -0
- data/spec/unit/face/plugin_spec.rb +8 -0
- 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/module_tool/tar/mini_spec.rb +1 -1
- data/spec/unit/network/http/api/indirected_routes_spec.rb +28 -11
- data/spec/unit/network/http/connection_spec.rb +43 -1
- data/spec/unit/network/http/factory_spec.rb +27 -5
- 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/pops/validator/validator_spec.rb +7 -0
- 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/aptrpm_spec.rb +1 -1
- data/spec/unit/provider/package/dnf_spec.rb +7 -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/rpm_spec.rb +150 -16
- data/spec/unit/provider/package/yum_spec.rb +66 -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/launchd_spec.rb +28 -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/service/windows_spec.rb +20 -0
- 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/pw_spec.rb +37 -0
- data/spec/unit/provider/user/useradd_spec.rb +122 -15
- data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
- data/spec/unit/puppet_pal_2pec.rb +3 -0
- data/spec/unit/resource_spec.rb +26 -1
- data/spec/unit/ssl/certificate_authority_spec.rb +2 -3
- data/spec/unit/ssl/certificate_spec.rb +7 -0
- data/spec/unit/test/test_helper_spec.rb +17 -0
- data/spec/unit/transaction_spec.rb +18 -0
- data/spec/unit/type/exec_spec.rb +15 -12
- data/spec/unit/type/file/content_spec.rb +9 -3
- data/spec/unit/type/file/source_spec.rb +4 -4
- data/spec/unit/type/file_spec.rb +9 -4
- data/spec/unit/type/package_spec.rb +8 -0
- data/spec/unit/type/schedule_spec.rb +3 -1
- data/spec/unit/type/selboolean_spec.rb +4 -6
- data/spec/unit/type/service_spec.rb +25 -8
- data/spec/unit/type/user_spec.rb +32 -26
- data/spec/unit/type/yumrepo_spec.rb +30 -0
- data/spec/unit/type_spec.rb +40 -0
- data/spec/unit/util/execution_spec.rb +16 -0
- data/spec/unit/util/http_proxy_spec.rb +121 -1
- data/spec/unit/util/log/destinations_spec.rb +2 -26
- data/spec/unit/util/log_spec.rb +0 -112
- 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/service_spec.rb +9 -0
- data/spec/unit/util/windows/sid_spec.rb +2 -2
- data/tasks/manpages.rake +1 -0
- metadata +18 -13
- data/ext/windows/eventlog/Rakefile +0 -32
- data/ext/windows/eventlog/puppetres.dll +0 -0
- data/ext/windows/eventlog/puppetres.mc +0 -18
- 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
| @@ -140,12 +140,7 @@ class Puppet::Util::Windows::EventLog | |
| 140 140 | 
             
              # @api private
         | 
| 141 141 | 
             
              def from_string_to_wide_string(str, &block)
         | 
| 142 142 | 
             
                str = wide_string(str)
         | 
| 143 | 
            -
                FFI::MemoryPointer. | 
| 144 | 
            -
                  # uchar here is synonymous with byte
         | 
| 145 | 
            -
                  ptr.put_array_of_uchar(0, str.bytes.to_a)
         | 
| 146 | 
            -
             | 
| 147 | 
            -
                  yield ptr
         | 
| 148 | 
            -
                end
         | 
| 143 | 
            +
                FFI::MemoryPointer.from_wide_string(str) { |ptr| yield ptr }
         | 
| 149 144 |  | 
| 150 145 | 
             
                # ptr has already had free called, so nothing to return
         | 
| 151 146 | 
             
                nil
         | 
| @@ -41,6 +41,7 @@ module Puppet::Util::Windows::SID | |
| 41 41 | 
             
                # = 8 + max sub identifiers (15) * 4
         | 
| 42 42 | 
             
                MAXIMUM_SID_BYTE_LENGTH = 68
         | 
| 43 43 |  | 
| 44 | 
            +
                ERROR_INVALID_PARAMETER   = 87
         | 
| 44 45 | 
             
                ERROR_INSUFFICIENT_BUFFER = 122
         | 
| 45 46 |  | 
| 46 47 | 
             
                def self.lookup_account_name(system_name = nil, account_name)
         | 
| @@ -48,9 +49,7 @@ module Puppet::Util::Windows::SID | |
| 48 49 | 
             
                  begin
         | 
| 49 50 | 
             
                    if system_name
         | 
| 50 51 | 
             
                      system_name_wide = Puppet::Util::Windows::String.wide_string(system_name)
         | 
| 51 | 
            -
                       | 
| 52 | 
            -
                      system_name_ptr = FFI::MemoryPointer.new(:byte, system_name_wide.bytesize)
         | 
| 53 | 
            -
                      system_name_ptr.put_array_of_uchar(0, system_name_wide.bytes.to_a)
         | 
| 52 | 
            +
                      system_name_ptr = FFI::MemoryPointer.from_wide_string(system_name_wide)
         | 
| 54 53 | 
             
                    end
         | 
| 55 54 |  | 
| 56 55 | 
             
                    FFI::MemoryPointer.from_string_to_wide_string(account_name) do |account_name_ptr|
         | 
| @@ -101,9 +100,7 @@ module Puppet::Util::Windows::SID | |
| 101 100 | 
             
                  begin
         | 
| 102 101 | 
             
                    if system_name
         | 
| 103 102 | 
             
                      system_name_wide = Puppet::Util::Windows::String.wide_string(system_name)
         | 
| 104 | 
            -
                       | 
| 105 | 
            -
                      system_name_ptr = FFI::MemoryPointer.new(:byte, system_name_wide.bytesize)
         | 
| 106 | 
            -
                      system_name_ptr.put_array_of_uchar(0, system_name_wide.bytes.to_a)
         | 
| 103 | 
            +
                      system_name_ptr = FFI::MemoryPointer.from_wide_string(system_name_wide)
         | 
| 107 104 | 
             
                    end
         | 
| 108 105 |  | 
| 109 106 | 
             
                    FFI::MemoryPointer.new(:byte, sid_bytes.length) do |sid_ptr|
         | 
| @@ -112,6 +109,11 @@ module Puppet::Util::Windows::SID | |
| 112 109 | 
             
                          FFI::MemoryPointer.new(:uint32, 1) do |name_use_enum_ptr|
         | 
| 113 110 |  | 
| 114 111 | 
             
                            sid_ptr.write_array_of_uchar(sid_bytes)
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                            if Puppet::Util::Windows::SID.IsValidSid(sid_ptr) == FFI::WIN32_FALSE
         | 
| 114 | 
            +
                              raise Puppet::Util::Windows::Error.new(_('Byte array for lookup_account_sid is invalid: %{sid_bytes}') % { sid_bytes: sid_bytes }, ERROR_INVALID_PARAMETER)
         | 
| 115 | 
            +
                            end
         | 
| 116 | 
            +
             | 
| 115 117 | 
             
                            success = LookupAccountSidW(system_name_ptr, sid_ptr, FFI::Pointer::NULL, name_length_ptr,
         | 
| 116 118 | 
             
                              FFI::Pointer::NULL, domain_length_ptr, name_use_enum_ptr)
         | 
| 117 119 | 
             
                            last_error = FFI.errno
         | 
| @@ -124,26 +124,27 @@ module Puppet::Util::Windows::Process | |
| 124 124 | 
             
              def get_process_image_name_by_pid(pid)
         | 
| 125 125 | 
             
                image_name = ""
         | 
| 126 126 |  | 
| 127 | 
            -
             | 
| 128 | 
            -
             | 
| 129 | 
            -
             | 
| 130 | 
            -
             | 
| 131 | 
            -
             | 
| 132 | 
            -
             | 
| 133 | 
            -
             | 
| 134 | 
            -
             | 
| 135 | 
            -
             | 
| 136 | 
            -
             | 
| 137 | 
            -
             | 
| 138 | 
            -
             | 
| 139 | 
            -
             | 
| 127 | 
            +
                Puppet::Util::Windows::Security.with_privilege(Puppet::Util::Windows::Security::SE_DEBUG_NAME) do
         | 
| 128 | 
            +
                  open_process(PROCESS_QUERY_INFORMATION, false, pid) do |phandle|
         | 
| 129 | 
            +
                    FFI::MemoryPointer.new(:dword, 1) do |exe_name_length_ptr|
         | 
| 130 | 
            +
                      # UTF is 2 bytes/char:
         | 
| 131 | 
            +
                      max_chars = MAX_PATH_LENGTH + 1
         | 
| 132 | 
            +
                      exe_name_length_ptr.write_dword(max_chars)
         | 
| 133 | 
            +
                      FFI::MemoryPointer.new(:wchar, max_chars) do |exe_name_ptr|
         | 
| 134 | 
            +
                        use_win32_path_format = 0
         | 
| 135 | 
            +
                        result = QueryFullProcessImageNameW(phandle, use_win32_path_format, exe_name_ptr, exe_name_length_ptr)
         | 
| 136 | 
            +
                        if result == FFI::WIN32_FALSE
         | 
| 137 | 
            +
                          raise Puppet::Util::Windows::Error.new(
         | 
| 138 | 
            +
                                  "QueryFullProcessImageNameW(phandle, #{use_win32_path_format}, " +
         | 
| 139 | 
            +
                                  "exe_name_ptr, #{max_chars}")
         | 
| 140 | 
            +
                        end
         | 
| 141 | 
            +
                        image_name = exe_name_ptr.read_wide_string(exe_name_length_ptr.read_dword)
         | 
| 140 142 | 
             
                      end
         | 
| 141 | 
            -
                      image_name = exe_name_ptr.read_wide_string(exe_name_length_ptr.read_dword)
         | 
| 142 143 | 
             
                    end
         | 
| 143 144 | 
             
                  end
         | 
| 144 145 | 
             
                end
         | 
| 145 146 |  | 
| 146 | 
            -
             | 
| 147 | 
            +
                image_name
         | 
| 147 148 | 
             
              end
         | 
| 148 149 | 
             
              module_function :get_process_image_name_by_pid
         | 
| 149 150 |  | 
| @@ -46,11 +46,12 @@ module Puppet::Util::Windows | |
| 46 46 |  | 
| 47 47 | 
             
                  subkey_max_len, _ = reg_query_info_key_max_lengths(key)
         | 
| 48 48 |  | 
| 49 | 
            -
                   | 
| 49 | 
            +
                  loop do
         | 
| 50 50 | 
             
                    subkey, filetime = reg_enum_key(key, index, subkey_max_len)
         | 
| 51 51 | 
             
                    yield subkey, filetime if !subkey.nil?
         | 
| 52 52 | 
             
                    index += 1
         | 
| 53 | 
            -
             | 
| 53 | 
            +
                    break if subkey.nil?
         | 
| 54 | 
            +
                  end
         | 
| 54 55 |  | 
| 55 56 | 
             
                  index
         | 
| 56 57 | 
             
                end
         | 
| @@ -93,11 +94,12 @@ module Puppet::Util::Windows | |
| 93 94 |  | 
| 94 95 | 
             
                  _, value_max_len = reg_query_info_key_max_lengths(key)
         | 
| 95 96 |  | 
| 96 | 
            -
                   | 
| 97 | 
            +
                  loop do
         | 
| 97 98 | 
             
                    subkey, type, data = reg_enum_value(key, index, value_max_len)
         | 
| 98 99 | 
             
                    yield subkey, type, data if !subkey.nil?
         | 
| 99 100 | 
             
                    index += 1
         | 
| 100 | 
            -
             | 
| 101 | 
            +
                    break if subkey.nil?
         | 
| 102 | 
            +
                  end
         | 
| 101 103 |  | 
| 102 104 | 
             
                  index
         | 
| 103 105 | 
             
                end
         | 
| @@ -108,13 +110,16 @@ module Puppet::Util::Windows | |
| 108 110 |  | 
| 109 111 | 
             
                private
         | 
| 110 112 |  | 
| 111 | 
            -
                 | 
| 113 | 
            +
                # max number of wide characters including NULL terminator
         | 
| 114 | 
            +
                MAX_KEY_CHAR_LENGTH = 255 + 1
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                def reg_enum_key(key, index, max_key_char_length = MAX_KEY_CHAR_LENGTH)
         | 
| 112 117 | 
             
                  subkey, filetime = nil, nil
         | 
| 113 118 |  | 
| 114 119 | 
             
                  FFI::MemoryPointer.new(:dword) do |subkey_length_ptr|
         | 
| 115 120 | 
             
                    FFI::MemoryPointer.new(FFI::WIN32::FILETIME.size) do |filetime_ptr|
         | 
| 116 | 
            -
                      FFI::MemoryPointer.new(:wchar,  | 
| 117 | 
            -
                        subkey_length_ptr.write_dword( | 
| 121 | 
            +
                      FFI::MemoryPointer.new(:wchar, max_key_char_length) do |subkey_ptr|
         | 
| 122 | 
            +
                        subkey_length_ptr.write_dword(max_key_char_length)
         | 
| 118 123 |  | 
| 119 124 | 
             
                        # RegEnumKeyEx cannot be called twice to properly size the buffer
         | 
| 120 125 | 
             
                        result = RegEnumKeyExW(key.hkey, index,
         | 
| @@ -139,7 +144,10 @@ module Puppet::Util::Windows | |
| 139 144 | 
             
                  [subkey, filetime]
         | 
| 140 145 | 
             
                end
         | 
| 141 146 |  | 
| 142 | 
            -
                 | 
| 147 | 
            +
                # max number of wide characters including NULL terminator
         | 
| 148 | 
            +
                MAX_VALUE_CHAR_LENGTH = 16383 + 1
         | 
| 149 | 
            +
             | 
| 150 | 
            +
                def reg_enum_value(key, index, max_value_length = MAX_VALUE_CHAR_LENGTH)
         | 
| 143 151 | 
             
                  subkey, type, data = nil, nil, nil
         | 
| 144 152 |  | 
| 145 153 | 
             
                  FFI::MemoryPointer.new(:dword) do |subkey_length_ptr|
         | 
| @@ -232,7 +240,7 @@ module Puppet::Util::Windows | |
| 232 240 | 
             
                    begin
         | 
| 233 241 | 
             
                      case type
         | 
| 234 242 | 
             
                        when Win32::Registry::REG_SZ, Win32::Registry::REG_EXPAND_SZ
         | 
| 235 | 
            -
                          result = [ type,  | 
| 243 | 
            +
                          result = [ type, data_ptr.read_wide_string(string_length, Encoding::UTF_8, true) ]
         | 
| 236 244 | 
             
                        when Win32::Registry::REG_MULTI_SZ
         | 
| 237 245 | 
             
                          result = [ type, data_ptr.read_wide_string(string_length).split(/\0/) ]
         | 
| 238 246 | 
             
                        when Win32::Registry::REG_BINARY
         | 
| @@ -312,12 +320,6 @@ module Puppet::Util::Windows | |
| 312 320 | 
             
                  result
         | 
| 313 321 | 
             
                end
         | 
| 314 322 |  | 
| 315 | 
            -
                def sanitize(value)
         | 
| 316 | 
            -
                  # Replace null bytes with a space
         | 
| 317 | 
            -
                  value.gsub!("\x00", ' ')
         | 
| 318 | 
            -
                  value
         | 
| 319 | 
            -
                end
         | 
| 320 | 
            -
             | 
| 321 323 | 
             
                ffi_convention :stdcall
         | 
| 322 324 |  | 
| 323 325 | 
             
                # https://msdn.microsoft.com/en-us/library/windows/desktop/ms724862(v=vs.85).aspx
         | 
| @@ -97,6 +97,7 @@ module Puppet::Util::Windows::Security | |
| 97 97 | 
             
              FILE = Puppet::Util::Windows::File
         | 
| 98 98 |  | 
| 99 99 | 
             
              SE_BACKUP_NAME              = 'SeBackupPrivilege'
         | 
| 100 | 
            +
              SE_DEBUG_NAME               = 'SeDebugPrivilege'
         | 
| 100 101 | 
             
              SE_RESTORE_NAME             = 'SeRestorePrivilege'
         | 
| 101 102 |  | 
| 102 103 | 
             
              DELETE                      = 0x00010000
         | 
| @@ -200,6 +201,7 @@ module Puppet::Util::Windows::Security | |
| 200 201 | 
             
                well_known_world_sid = Puppet::Util::Windows::SID::Everyone
         | 
| 201 202 | 
             
                well_known_nobody_sid = Puppet::Util::Windows::SID::Nobody
         | 
| 202 203 | 
             
                well_known_system_sid = Puppet::Util::Windows::SID::LocalSystem
         | 
| 204 | 
            +
                well_known_app_packages_sid = Puppet::Util::Windows::SID::AllAppPackages
         | 
| 203 205 |  | 
| 204 206 | 
             
                mode = S_ISYSTEM_MISSING
         | 
| 205 207 |  | 
| @@ -234,6 +236,7 @@ module Puppet::Util::Windows::Security | |
| 234 236 | 
             
                    if (ace.mask & FILE::FILE_APPEND_DATA).nonzero?
         | 
| 235 237 | 
             
                      mode |= S_ISVTX
         | 
| 236 238 | 
             
                    end
         | 
| 239 | 
            +
                  when well_known_app_packages_sid
         | 
| 237 240 | 
             
                  when well_known_system_sid
         | 
| 238 241 | 
             
                  else
         | 
| 239 242 | 
             
                    #puts "Warning, unable to map SID into POSIX mode: #{ace.sid}"
         | 
| @@ -1,3 +1,4 @@ | |
| 1 | 
            +
            # coding: utf-8
         | 
| 1 2 | 
             
            require 'puppet/util/windows'
         | 
| 2 3 | 
             
            require 'ffi'
         | 
| 3 4 |  | 
| @@ -180,7 +181,30 @@ module Puppet::Util::Windows | |
| 180 181 | 
             
                # // Value to indicate no change to an optional parameter
         | 
| 181 182 | 
             
                # //
         | 
| 182 183 | 
             
                # #define SERVICE_NO_CHANGE              0xffffffff
         | 
| 183 | 
            -
                 | 
| 184 | 
            +
                # https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-changeserviceconfig2w
         | 
| 185 | 
            +
                SERVICE_CONFIG_DESCRIPTION              = 0x00000001
         | 
| 186 | 
            +
                SERVICE_CONFIG_FAILURE_ACTIONS          = 0x00000002
         | 
| 187 | 
            +
                SERVICE_CONFIG_DELAYED_AUTO_START_INFO  = 0x00000003
         | 
| 188 | 
            +
                SERVICE_CONFIG_FAILURE_ACTIONS_FLAG     = 0x00000004
         | 
| 189 | 
            +
                SERVICE_CONFIG_SERVICE_SID_INFO         = 0x00000005
         | 
| 190 | 
            +
                SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO = 0x00000006
         | 
| 191 | 
            +
                SERVICE_CONFIG_PRESHUTDOWN_INFO         = 0x00000007
         | 
| 192 | 
            +
                SERVICE_CONFIG_TRIGGER_INFO             = 0x00000008
         | 
| 193 | 
            +
                SERVICE_CONFIG_PREFERRED_NODE           = 0x00000009
         | 
| 194 | 
            +
                SERVICE_CONFIG_LAUNCH_PROTECTED         = 0x00000012
         | 
| 195 | 
            +
                SERVICE_NO_CHANGE                       = 0xffffffff
         | 
| 196 | 
            +
                SERVICE_CONFIG_TYPES = {
         | 
| 197 | 
            +
                  SERVICE_CONFIG_DESCRIPTION => :SERVICE_CONFIG_DESCRIPTION,
         | 
| 198 | 
            +
                  SERVICE_CONFIG_FAILURE_ACTIONS => :SERVICE_CONFIG_FAILURE_ACTIONS,
         | 
| 199 | 
            +
                  SERVICE_CONFIG_DELAYED_AUTO_START_INFO => :SERVICE_CONFIG_DELAYED_AUTO_START_INFO,
         | 
| 200 | 
            +
                  SERVICE_CONFIG_FAILURE_ACTIONS_FLAG => :SERVICE_CONFIG_FAILURE_ACTIONS_FLAG,
         | 
| 201 | 
            +
                  SERVICE_CONFIG_SERVICE_SID_INFO => :SERVICE_CONFIG_SERVICE_SID_INFO,
         | 
| 202 | 
            +
                  SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO => :SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO,
         | 
| 203 | 
            +
                  SERVICE_CONFIG_PRESHUTDOWN_INFO => :SERVICE_CONFIG_PRESHUTDOWN_INFO,
         | 
| 204 | 
            +
                  SERVICE_CONFIG_TRIGGER_INFO => :SERVICE_CONFIG_TRIGGER_INFO,
         | 
| 205 | 
            +
                  SERVICE_CONFIG_PREFERRED_NODE => :SERVICE_CONFIG_PREFERRED_NODE,
         | 
| 206 | 
            +
                  SERVICE_CONFIG_LAUNCH_PROTECTED => :SERVICE_CONFIG_LAUNCH_PROTECTED,
         | 
| 207 | 
            +
                }
         | 
| 184 208 |  | 
| 185 209 | 
             
                # Service enum codes
         | 
| 186 210 | 
             
                # https://docs.microsoft.com/en-us/windows/desktop/api/winsvc/nf-winsvc-enumservicesstatusexa
         | 
| @@ -219,6 +243,19 @@ module Puppet::Util::Windows | |
| 219 243 | 
             
                  )
         | 
| 220 244 | 
             
                end
         | 
| 221 245 |  | 
| 246 | 
            +
                # https://docs.microsoft.com/en-us/windows/win32/api/winsvc/ns-winsvc-service_delayed_auto_start_info
         | 
| 247 | 
            +
                # typedef struct _SERVICE_DELAYED_AUTO_START_INFO {
         | 
| 248 | 
            +
                #   BOOL fDelayedAutostart;
         | 
| 249 | 
            +
                # } SERVICE_DELAYED_AUTO_START_INFO, *LPSERVICE_DELAYED_AUTO_START_INFO;
         | 
| 250 | 
            +
                class SERVICE_DELAYED_AUTO_START_INFO < FFI::Struct
         | 
| 251 | 
            +
                  layout(:fDelayedAutostart, :int)
         | 
| 252 | 
            +
                  alias aset []=
         | 
| 253 | 
            +
                  # Intercept the accessor so that we can handle either true/false or 1/0.
         | 
| 254 | 
            +
                  # Since there is only one member, there’s no need to check the key name.
         | 
| 255 | 
            +
                  def []=(key, value)
         | 
| 256 | 
            +
                    [0, false].include?(value) ? aset(key, 0) : aset(key, 1)
         | 
| 257 | 
            +
                  end
         | 
| 258 | 
            +
                end
         | 
| 222 259 |  | 
| 223 260 | 
             
                # https://docs.microsoft.com/en-us/windows/desktop/api/winsvc/ns-winsvc-_enum_service_status_processw
         | 
| 224 261 | 
             
                # typedef struct _ENUM_SERVICE_STATUS_PROCESSW {
         | 
| @@ -374,6 +411,7 @@ module Puppet::Util::Windows | |
| 374 411 | 
             
                module_function :service_state
         | 
| 375 412 |  | 
| 376 413 | 
             
                # Query the configuration of a service using QueryServiceConfigW
         | 
| 414 | 
            +
                # or QueryServiceConfig2W
         | 
| 377 415 | 
             
                #
         | 
| 378 416 | 
             
                # @param [:string] service_name name of the service to query
         | 
| 379 417 | 
             
                # @return [QUERY_SERVICE_CONFIGW.struct] the configuration of the service
         | 
| @@ -384,6 +422,14 @@ module Puppet::Util::Windows | |
| 384 422 | 
             
                      start_type = SERVICE_START_TYPES[config[:dwStartType]]
         | 
| 385 423 | 
             
                    end
         | 
| 386 424 | 
             
                  end
         | 
| 425 | 
            +
                  # if the service has type AUTO_START, check if it's a delayed service
         | 
| 426 | 
            +
                  if start_type == :SERVICE_AUTO_START
         | 
| 427 | 
            +
                    open_service(service_name, SC_MANAGER_CONNECT, SERVICE_QUERY_CONFIG) do |service|
         | 
| 428 | 
            +
                      query_config2(service, SERVICE_CONFIG_DELAYED_AUTO_START_INFO) do |config|
         | 
| 429 | 
            +
                        return :SERVICE_DELAYED_AUTO_START if config[:fDelayedAutostart] == 1
         | 
| 430 | 
            +
                      end
         | 
| 431 | 
            +
                    end
         | 
| 432 | 
            +
                  end
         | 
| 387 433 | 
             
                  if start_type.nil?
         | 
| 388 434 | 
             
                    raise Puppet::Error.new(_("Unknown start type '%{start_type}' for '%{service_name}'") % { start_type: start_type.to_s, service_name: service_name})
         | 
| 389 435 | 
             
                  end
         | 
| @@ -393,11 +439,12 @@ module Puppet::Util::Windows | |
| 393 439 |  | 
| 394 440 | 
             
                # Change the startup mode of a windows service
         | 
| 395 441 | 
             
                #
         | 
| 396 | 
            -
                # @param [ | 
| 397 | 
            -
                # @param [ | 
| 442 | 
            +
                # @param [String] service_name the name of the service to modify
         | 
| 443 | 
            +
                # @param [Integer] startup_type a code corresponding to a start type for
         | 
| 398 444 | 
             
                #  windows service, see the "Service start type codes" section in the
         | 
| 399 445 | 
             
                #  Puppet::Util::Windows::Service file for the list of available codes
         | 
| 400 | 
            -
                 | 
| 446 | 
            +
                # @param [Bool] delayed whether the service should be started with a delay
         | 
| 447 | 
            +
                def set_startup_mode(service_name, startup_type, delayed=false)
         | 
| 401 448 | 
             
                  startup_code = SERVICE_START_TYPES.key(startup_type)
         | 
| 402 449 | 
             
                  if startup_code.nil?
         | 
| 403 450 | 
             
                    raise Puppet::Error.new(_("Unknown start type %{start_type}") % {startup_type: startup_type.to_s})
         | 
| @@ -424,6 +471,7 @@ module Puppet::Util::Windows | |
| 424 471 | 
             
                      raise Puppet::Util::Windows::Error.new(_("Failed to update service configuration"))
         | 
| 425 472 | 
             
                    end
         | 
| 426 473 | 
             
                  end
         | 
| 474 | 
            +
                  set_startup_mode_delayed(service_name, delayed)
         | 
| 427 475 | 
             
                end
         | 
| 428 476 | 
             
                module_function :set_startup_mode
         | 
| 429 477 |  | 
| @@ -705,6 +753,82 @@ module Puppet::Util::Windows | |
| 705 753 | 
             
                  end
         | 
| 706 754 | 
             
                  private :query_config
         | 
| 707 755 |  | 
| 756 | 
            +
                  # @api private
         | 
| 757 | 
            +
                  # perform QueryServiceConfig2W on a windows service and return the
         | 
| 758 | 
            +
                  # result
         | 
| 759 | 
            +
                  #
         | 
| 760 | 
            +
                  # @param [:handle] service handle of the service to query
         | 
| 761 | 
            +
                  # @param [Integer] info_level the configuration information to be queried
         | 
| 762 | 
            +
                  # @return [QUERY_SERVICE_CONFIG2W struct] the result of the query
         | 
| 763 | 
            +
                  def query_config2(service, info_level, &block)
         | 
| 764 | 
            +
                    config = nil
         | 
| 765 | 
            +
                    size_required = nil
         | 
| 766 | 
            +
                    # Fetch the bytes of memory required to be allocated
         | 
| 767 | 
            +
                    # for QueryServiceConfig2W to return succesfully. This
         | 
| 768 | 
            +
                    # is done by sending NULL and 0 for the pointer and size
         | 
| 769 | 
            +
                    # respectively, letting the command fail, then reading the
         | 
| 770 | 
            +
                    # value of pcbBytesNeeded
         | 
| 771 | 
            +
                    FFI::MemoryPointer.new(:lpword) do |bytes_pointer|
         | 
| 772 | 
            +
                      # return value will be false from this call, since it's designed
         | 
| 773 | 
            +
                      # to fail. Just ignore it
         | 
| 774 | 
            +
                      QueryServiceConfig2W(service, info_level, FFI::Pointer::NULL, 0, bytes_pointer)
         | 
| 775 | 
            +
                      size_required = bytes_pointer.read_dword
         | 
| 776 | 
            +
                      FFI::MemoryPointer.new(size_required) do |ssp_ptr|
         | 
| 777 | 
            +
                        # We need to supply the appropriate struct to be created based on
         | 
| 778 | 
            +
                        # the info_level
         | 
| 779 | 
            +
                        case info_level
         | 
| 780 | 
            +
                        when SERVICE_CONFIG_DELAYED_AUTO_START_INFO
         | 
| 781 | 
            +
                          config = SERVICE_DELAYED_AUTO_START_INFO.new(ssp_ptr)
         | 
| 782 | 
            +
                        end
         | 
| 783 | 
            +
                        success = QueryServiceConfig2W(
         | 
| 784 | 
            +
                          service,
         | 
| 785 | 
            +
                          info_level,
         | 
| 786 | 
            +
                          ssp_ptr,
         | 
| 787 | 
            +
                          size_required,
         | 
| 788 | 
            +
                          bytes_pointer
         | 
| 789 | 
            +
                        )
         | 
| 790 | 
            +
                        if success == FFI::WIN32_FALSE
         | 
| 791 | 
            +
                          raise Puppet::Util::Windows::Error.new(_("Service query for %{parameter_name} failed") % { parameter_name: SERVICE_CONFIG_TYPES[info_level] } )
         | 
| 792 | 
            +
                        end
         | 
| 793 | 
            +
                        yield config
         | 
| 794 | 
            +
                      end
         | 
| 795 | 
            +
                    end
         | 
| 796 | 
            +
                  end
         | 
| 797 | 
            +
                  private :query_config2
         | 
| 798 | 
            +
             | 
| 799 | 
            +
                  # @api private
         | 
| 800 | 
            +
                  # Sets an optional parameter on a service by calling
         | 
| 801 | 
            +
                  # ChangeServiceConfig2W
         | 
| 802 | 
            +
                  #
         | 
| 803 | 
            +
                  # @param [String] service_name name of service
         | 
| 804 | 
            +
                  # @param [Integer] change parameter to change
         | 
| 805 | 
            +
                  # @param [struct] value appropriate struct based on the parameter to change
         | 
| 806 | 
            +
                  def set_optional_parameter(service_name, change, value)
         | 
| 807 | 
            +
                    open_service(service_name, SC_MANAGER_CONNECT, SERVICE_CHANGE_CONFIG) do |service|
         | 
| 808 | 
            +
                      success = ChangeServiceConfig2W(
         | 
| 809 | 
            +
                        service,
         | 
| 810 | 
            +
                        change, # dwInfoLevel
         | 
| 811 | 
            +
                        value,  # lpInfo
         | 
| 812 | 
            +
                      )
         | 
| 813 | 
            +
                      if success == FFI::WIN32_FALSE
         | 
| 814 | 
            +
                        raise Puppet::Util::windows::Error.new(_("Failed to update service %{change} configuration") % { change: change } )
         | 
| 815 | 
            +
                      end
         | 
| 816 | 
            +
                    end
         | 
| 817 | 
            +
                  end
         | 
| 818 | 
            +
                  private :set_optional_parameter
         | 
| 819 | 
            +
             | 
| 820 | 
            +
                  # @api private
         | 
| 821 | 
            +
                  # Controls the delayed auto-start setting of a service
         | 
| 822 | 
            +
                  #
         | 
| 823 | 
            +
                  # @param [String] service_name name of service
         | 
| 824 | 
            +
                  # @param [Bool] delayed whether the service should be started with a delay or not
         | 
| 825 | 
            +
                  def set_startup_mode_delayed(service_name, delayed)
         | 
| 826 | 
            +
                    delayed_start = SERVICE_DELAYED_AUTO_START_INFO.new
         | 
| 827 | 
            +
                    delayed_start[:fDelayedAutostart] = delayed
         | 
| 828 | 
            +
                    set_optional_parameter(service_name, SERVICE_CONFIG_DELAYED_AUTO_START_INFO, delayed_start)
         | 
| 829 | 
            +
                  end
         | 
| 830 | 
            +
                  private :set_startup_mode_delayed
         | 
| 831 | 
            +
             | 
| 708 832 | 
             
                  # @api private
         | 
| 709 833 | 
             
                  # Sends a service control signal to a service
         | 
| 710 834 | 
             
                  #
         | 
| @@ -899,6 +1023,18 @@ module Puppet::Util::Windows | |
| 899 1023 | 
             
                attach_function_private :QueryServiceConfigW,
         | 
| 900 1024 | 
             
                  [:handle, :lpbyte, :dword, :lpdword], :win32_bool
         | 
| 901 1025 |  | 
| 1026 | 
            +
                # https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-queryserviceconfig2w
         | 
| 1027 | 
            +
                # BOOL QueryServiceConfig2W(
         | 
| 1028 | 
            +
                #   SC_HANDLE hService,
         | 
| 1029 | 
            +
                #   DWORD     dwInfoLevel,
         | 
| 1030 | 
            +
                #   LPBYTE    lpBuffer,
         | 
| 1031 | 
            +
                #   DWORD     cbBufSize,
         | 
| 1032 | 
            +
                #   LPDWORD   pcbBytesNeeded
         | 
| 1033 | 
            +
                # );
         | 
| 1034 | 
            +
                ffi_lib :advapi32
         | 
| 1035 | 
            +
                attach_function_private :QueryServiceConfig2W,
         | 
| 1036 | 
            +
                  [:handle, :dword, :lpbyte, :dword, :lpdword], :win32_bool
         | 
| 1037 | 
            +
             | 
| 902 1038 | 
             
                # https://docs.microsoft.com/en-us/windows/desktop/api/Winsvc/nf-winsvc-startservicew
         | 
| 903 1039 | 
             
                # BOOL StartServiceW(
         | 
| 904 1040 | 
             
                #   SC_HANDLE hService,
         | 
| @@ -949,6 +1085,15 @@ module Puppet::Util::Windows | |
| 949 1085 | 
             
                    :lpcwstr
         | 
| 950 1086 | 
             
                  ], :win32_bool
         | 
| 951 1087 |  | 
| 1088 | 
            +
                # https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-changeserviceconfig2w
         | 
| 1089 | 
            +
                # BOOL ChangeServiceConfig2W(
         | 
| 1090 | 
            +
                #   SC_HANDLE hService,
         | 
| 1091 | 
            +
                #   DWORD     dwInfoLevel,
         | 
| 1092 | 
            +
                #   LPVOID    lpInfo
         | 
| 1093 | 
            +
                # );
         | 
| 1094 | 
            +
                ffi_lib :advapi32
         | 
| 1095 | 
            +
                attach_function_private :ChangeServiceConfig2W,
         | 
| 1096 | 
            +
                  [:handle, :dword, :lpvoid], :win32_bool
         | 
| 952 1097 |  | 
| 953 1098 | 
             
                # https://docs.microsoft.com/en-us/windows/desktop/api/winsvc/nf-winsvc-enumservicesstatusexw
         | 
| 954 1099 | 
             
                # BOOL EnumServicesStatusExW(
         | 
| @@ -46,6 +46,7 @@ module Puppet::Util::Windows | |
| 46 46 | 
             
                PrintOperators              = 'S-1-5-32-550'
         | 
| 47 47 | 
             
                BackupOperators             = 'S-1-5-32-551'
         | 
| 48 48 | 
             
                Replicators                 = 'S-1-5-32-552'
         | 
| 49 | 
            +
                AllAppPackages              = 'S-1-15-2-1'
         | 
| 49 50 |  | 
| 50 51 | 
             
                # Convert an account name, e.g. 'Administrators' into a SID string,
         | 
| 51 52 | 
             
                # e.g. 'S-1-5-32-544'. The name can be specified as 'Administrators',
         | 
| @@ -63,7 +64,7 @@ module Puppet::Util::Windows | |
| 63 64 | 
             
                # 'BUILTIN\Administrators', or 'S-1-5-32-544', and will return the
         | 
| 64 65 | 
             
                # SID object. Returns nil if the account doesn't exist.
         | 
| 65 66 | 
             
                # This method returns a SID::Principal with the account, domain, SID, etc
         | 
| 66 | 
            -
                def name_to_principal(name)
         | 
| 67 | 
            +
                def name_to_principal(name, allow_unresolved = false)
         | 
| 67 68 | 
             
                  # Apparently, we accept a symbol..
         | 
| 68 69 | 
             
                  name = name.to_s.strip if name
         | 
| 69 70 |  | 
| @@ -78,7 +79,7 @@ module Puppet::Util::Windows | |
| 78 79 |  | 
| 79 80 | 
             
                  raw_sid_bytes ? Principal.lookup_account_sid(raw_sid_bytes) : Principal.lookup_account_name(name)
         | 
| 80 81 | 
             
                rescue
         | 
| 81 | 
            -
                  nil
         | 
| 82 | 
            +
                  (allow_unresolved && raw_sid_bytes) ? unresolved_principal(name, raw_sid_bytes) : nil
         | 
| 82 83 | 
             
                end
         | 
| 83 84 | 
             
                module_function :name_to_principal
         | 
| 84 85 | 
             
                class << self; alias name_to_sid_object name_to_principal; end
         | 
| @@ -235,7 +236,7 @@ module Puppet::Util::Windows | |
| 235 236 | 
             
                # @api private
         | 
| 236 237 | 
             
                def self.unresolved_principal(name, sid_bytes)
         | 
| 237 238 | 
             
                  Principal.new(
         | 
| 238 | 
            -
                    name | 
| 239 | 
            +
                    name, # account
         | 
| 239 240 | 
             
                    sid_bytes, # sid_bytes
         | 
| 240 241 | 
             
                    name, # sid string
         | 
| 241 242 | 
             
                    nil, #domain
         |