puppet 5.3.3-x64-mingw32 → 5.3.4-x64-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- data/CONTRIBUTING.md +1 -1
- data/Gemfile +3 -0
- data/ext/puppet-test +3 -2
- data/lib/hiera/puppet_function.rb +5 -2
- data/lib/hiera_puppet.rb +3 -3
- data/lib/puppet.rb +2 -5
- data/lib/puppet/agent.rb +22 -2
- data/lib/puppet/agent/locker.rb +6 -5
- data/lib/puppet/application.rb +18 -1
- data/lib/puppet/application/agent.rb +9 -2
- data/lib/puppet/application/apply.rb +1 -1
- data/lib/puppet/application/config.rb +1 -0
- data/lib/puppet/application/device.rb +1 -2
- data/lib/puppet/application/filebucket.rb +22 -5
- data/lib/puppet/application/help.rb +1 -0
- data/lib/puppet/application/lookup.rb +1 -3
- data/lib/puppet/application_support.rb +6 -1
- data/lib/puppet/bindings.rb +2 -1
- data/lib/puppet/configurer.rb +9 -4
- data/lib/puppet/configurer/downloader_factory.rb +10 -0
- data/lib/puppet/configurer/plugin_handler.rb +11 -4
- data/lib/puppet/daemon.rb +2 -2
- data/lib/puppet/defaults.rb +99 -27
- data/lib/puppet/environments.rb +2 -0
- data/lib/puppet/error.rb +5 -15
- data/lib/puppet/external/pson/common.rb +2 -2
- data/lib/puppet/face/catalog.rb +1 -1
- data/lib/puppet/face/config.rb +14 -1
- data/lib/puppet/face/epp.rb +4 -2
- data/lib/puppet/face/help.rb +12 -14
- data/lib/puppet/face/man.rb +1 -0
- data/lib/puppet/face/module/build.rb +1 -1
- data/lib/puppet/face/module/list.rb +6 -17
- data/lib/puppet/face/module/uninstall.rb +14 -3
- data/lib/puppet/face/node.rb +1 -0
- data/lib/puppet/face/status.rb +1 -0
- data/lib/puppet/file_serving/base.rb +2 -1
- data/lib/puppet/file_serving/configuration.rb +3 -0
- data/lib/puppet/file_serving/configuration/parser.rb +23 -9
- data/lib/puppet/file_serving/mount/locales.rb +35 -0
- data/lib/puppet/forge.rb +2 -1
- data/lib/puppet/forge/errors.rb +24 -22
- data/lib/puppet/functions/binary_file.rb +1 -0
- data/lib/puppet/functions/each.rb +10 -4
- data/lib/puppet/functions/eyaml_lookup_key.rb +4 -2
- data/lib/puppet/functions/lookup.rb +2 -2
- data/lib/puppet/functions/map.rb +12 -2
- data/lib/puppet/functions/slice.rb +2 -3
- data/lib/puppet/functions/unique.rb +1 -1
- data/lib/puppet/functions/yaml_data.rb +1 -1
- data/lib/puppet/gettext/config.rb +144 -41
- data/lib/puppet/gettext/module_translations.rb +42 -0
- data/lib/puppet/graph/relationship_graph.rb +1 -1
- data/lib/puppet/graph/simple_graph.rb +3 -3
- data/lib/puppet/indirector/catalog/compiler.rb +40 -25
- data/lib/puppet/indirector/exec.rb +1 -1
- data/lib/puppet/indirector/facts/facter.rb +3 -3
- data/lib/puppet/indirector/facts/network_device.rb +2 -2
- data/lib/puppet/indirector/file_bucket_file/file.rb +4 -1
- data/lib/puppet/indirector/indirection.rb +17 -9
- data/lib/puppet/indirector/ldap.rb +2 -2
- data/lib/puppet/indirector/node/write_only_yaml.rb +3 -1
- data/lib/puppet/indirector/rest.rb +8 -5
- data/lib/puppet/indirector/ssl_file.rb +2 -2
- data/lib/puppet/indirector/terminus.rb +3 -3
- data/lib/puppet/interface.rb +2 -1
- data/lib/puppet/interface/action.rb +41 -24
- data/lib/puppet/interface/action_builder.rb +14 -5
- data/lib/puppet/interface/action_manager.rb +1 -1
- data/lib/puppet/interface/documentation.rb +21 -10
- data/lib/puppet/interface/face_collection.rb +4 -2
- data/lib/puppet/interface/option.rb +36 -15
- data/lib/puppet/interface/option_builder.rb +23 -9
- data/lib/puppet/interface/option_manager.rb +8 -3
- data/lib/puppet/metatype/manager.rb +7 -3
- data/lib/puppet/module.rb +18 -21
- data/lib/puppet/module_tool/errors/installer.rb +18 -20
- data/lib/puppet/module_tool/errors/shared.rb +20 -15
- data/lib/puppet/module_tool/errors/uninstaller.rb +1 -0
- data/lib/puppet/module_tool/errors/upgrader.rb +1 -1
- data/lib/puppet/module_tool/tar/mini.rb +57 -4
- data/lib/puppet/network/auth_config_parser.rb +18 -13
- data/lib/puppet/network/authstore.rb +2 -2
- data/lib/puppet/network/client_request.rb +1 -1
- data/lib/puppet/network/format.rb +3 -3
- data/lib/puppet/network/http/api/indirection_type.rb +1 -1
- data/lib/puppet/network/http/api/master/v3/environment.rb +5 -2
- data/lib/puppet/network/http/error.rb +7 -7
- data/lib/puppet/network/http/factory.rb +9 -0
- data/lib/puppet/network/http/rack.rb +2 -2
- data/lib/puppet/network/http/webrick.rb +2 -4
- data/lib/puppet/node.rb +25 -6
- data/lib/puppet/node/environment.rb +14 -0
- data/lib/puppet/node/facts.rb +9 -0
- data/lib/puppet/parameter.rb +3 -3
- data/lib/puppet/parameter/value_collection.rb +9 -9
- data/lib/puppet/parser/ast/leaf.rb +1 -1
- data/lib/puppet/parser/ast/node.rb +2 -2
- data/lib/puppet/parser/ast/pops_bridge.rb +1 -1
- data/lib/puppet/parser/compiler.rb +6 -5
- data/lib/puppet/parser/functions.rb +1 -1
- data/lib/puppet/parser/functions/generate.rb +2 -4
- data/lib/puppet/parser/functions/inline_template.rb +1 -2
- data/lib/puppet/parser/functions/sprintf.rb +17 -3
- data/lib/puppet/parser/functions/template.rb +6 -2
- data/lib/puppet/parser/resource.rb +30 -31
- data/lib/puppet/parser/scope.rb +20 -11
- data/lib/puppet/parser/templatewrapper.rb +4 -3
- data/lib/puppet/pops/evaluator/collector_transformer.rb +2 -1
- data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/epp_evaluator.rb +21 -8
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +2 -1
- data/lib/puppet/pops/evaluator/external_syntax_support.rb +1 -1
- data/lib/puppet/pops/evaluator/runtime3_converter.rb +3 -1
- data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +1 -1
- data/lib/puppet/pops/evaluator/runtime3_support.rb +4 -4
- data/lib/puppet/pops/functions/dispatch.rb +1 -1
- data/lib/puppet/pops/functions/function.rb +8 -2
- data/lib/puppet/pops/issue_reporter.rb +7 -2
- data/lib/puppet/pops/issues.rb +10 -4
- data/lib/puppet/pops/label_provider.rb +1 -1
- data/lib/puppet/pops/loader/module_loaders.rb +5 -2
- data/lib/puppet/pops/loader/static_loader.rb +1 -1
- data/lib/puppet/pops/loaders.rb +7 -3
- data/lib/puppet/pops/lookup/explainer.rb +2 -1
- data/lib/puppet/pops/lookup/hiera_config.rb +2 -2
- data/lib/puppet/pops/lookup/lookup_adapter.rb +4 -4
- data/lib/puppet/pops/merge_strategy.rb +6 -3
- data/lib/puppet/pops/migration/migration_checker.rb +8 -8
- data/lib/puppet/pops/model/ast_transformer.rb +1 -1
- data/lib/puppet/pops/model/factory.rb +4 -2
- data/lib/puppet/pops/resource/resource_type_impl.rb +1 -1
- data/lib/puppet/pops/serialization/abstract_writer.rb +2 -1
- data/lib/puppet/pops/types/iterable.rb +2 -0
- data/lib/puppet/pops/types/p_object_type.rb +36 -15
- data/lib/puppet/pops/types/type_calculator.rb +2 -1
- data/lib/puppet/pops/types/type_factory.rb +3 -1
- data/lib/puppet/pops/types/type_mismatch_describer.rb +19 -6
- data/lib/puppet/pops/types/type_parser.rb +7 -7
- data/lib/puppet/pops/types/types.rb +10 -4
- data/lib/puppet/pops/validation.rb +14 -12
- data/lib/puppet/property.rb +14 -6
- data/lib/puppet/property/ensure.rb +2 -2
- data/lib/puppet/provider.rb +4 -4
- data/lib/puppet/provider/group/aix.rb +4 -2
- data/lib/puppet/provider/ldap.rb +2 -2
- data/lib/puppet/provider/naginator.rb +1 -1
- data/lib/puppet/provider/nameservice.rb +7 -4
- data/lib/puppet/provider/nameservice/directoryservice.rb +4 -3
- data/lib/puppet/provider/package/aix.rb +1 -1
- data/lib/puppet/provider/package/nim.rb +7 -8
- data/lib/puppet/provider/package/opkg.rb +1 -1
- data/lib/puppet/provider/package/pkg.rb +9 -6
- data/lib/puppet/provider/package/pkgutil.rb +3 -3
- data/lib/puppet/provider/package/yum.rb +1 -1
- data/lib/puppet/provider/parsedfile.rb +4 -4
- data/lib/puppet/provider/selmodule/semodule.rb +5 -3
- data/lib/puppet/provider/service/base.rb +1 -1
- data/lib/puppet/provider/service/init.rb +1 -1
- data/lib/puppet/provider/service/launchd.rb +2 -2
- data/lib/puppet/provider/service/runit.rb +2 -1
- data/lib/puppet/provider/service/smf.rb +2 -0
- data/lib/puppet/provider/service/systemd.rb +1 -0
- data/lib/puppet/provider/service/upstart.rb +1 -1
- data/lib/puppet/provider/user/aix.rb +13 -6
- data/lib/puppet/provider/user/openbsd.rb +2 -1
- data/lib/puppet/provider/yumrepo/inifile.rb +2 -1
- data/lib/puppet/provider/zone/solaris.rb +2 -2
- data/lib/puppet/reference/configuration.rb +4 -2
- data/lib/puppet/relationship.rb +2 -1
- data/lib/puppet/reports/store.rb +1 -1
- data/lib/puppet/resource.rb +7 -5
- data/lib/puppet/resource/capability_finder.rb +14 -11
- data/lib/puppet/resource/catalog.rb +33 -18
- data/lib/puppet/resource/type.rb +5 -5
- data/lib/puppet/settings.rb +19 -13
- data/lib/puppet/settings/base_setting.rb +23 -8
- data/lib/puppet/settings/config_file.rb +14 -4
- data/lib/puppet/settings/environment_conf.rb +19 -9
- data/lib/puppet/ssl/base.rb +9 -4
- data/lib/puppet/ssl/oids.rb +8 -2
- data/lib/puppet/syntax_checkers/base64.rb +5 -6
- data/lib/puppet/transaction.rb +7 -3
- data/lib/puppet/transaction/persistence.rb +16 -1
- data/lib/puppet/transaction/report.rb +6 -0
- data/lib/puppet/type.rb +27 -35
- data/lib/puppet/type/file.rb +2 -1
- data/lib/puppet/type/file/data_sync.rb +2 -1
- data/lib/puppet/type/file/source.rb +1 -1
- data/lib/puppet/type/group.rb +1 -1
- data/lib/puppet/type/mount.rb +1 -1
- data/lib/puppet/type/resources.rb +1 -1
- data/lib/puppet/type/schedule.rb +26 -14
- data/lib/puppet/type/user.rb +9 -3
- data/lib/puppet/type/zone.rb +1 -1
- data/lib/puppet/util.rb +27 -21
- data/lib/puppet/util/at_fork/solaris.rb +6 -4
- data/lib/puppet/util/command_line.rb +5 -0
- data/lib/puppet/util/command_line/trollop.rb +6 -5
- data/lib/puppet/util/errors.rb +61 -8
- data/lib/puppet/util/fileparsing.rb +3 -5
- data/lib/puppet/util/http_proxy.rb +14 -6
- data/lib/puppet/util/instance_loader.rb +1 -3
- data/lib/puppet/util/ldap/manager.rb +6 -3
- data/lib/puppet/util/log.rb +19 -24
- data/lib/puppet/util/logging.rb +21 -28
- data/lib/puppet/util/methodhelper.rb +1 -1
- data/lib/puppet/util/nagios_maker.rb +1 -1
- data/lib/puppet/util/network_device/config.rb +21 -13
- data/lib/puppet/util/plist.rb +3 -1
- data/lib/puppet/util/posix.rb +1 -1
- data/lib/puppet/util/provider_features.rb +1 -1
- data/lib/puppet/util/rdoc/generators/puppet_generator.rb +1 -1
- data/lib/puppet/util/reference.rb +2 -3
- data/lib/puppet/util/selinux.rb +1 -1
- data/lib/puppet/util/storage.rb +2 -2
- data/lib/puppet/util/windows/eventlog.rb +10 -5
- data/lib/puppet/util/windows/file.rb +61 -9
- data/lib/puppet/util/windows/process.rb +1 -1
- data/lib/puppet/util/windows/taskscheduler.rb +2 -2
- data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +5 -1
- data/lib/puppet/version.rb +1 -1
- data/locales/en/puppet.po +19 -0
- data/locales/ja/puppet.po +2739 -809
- data/locales/puppet.pot +2367 -734
- data/spec/fixtures/unit/application/environments/production/data/common.yaml +2 -0
- data/spec/integration/agent/logging_spec.rb +2 -0
- data/spec/integration/faces/plugin_spec.rb +1 -0
- data/spec/integration/network/authconfig_spec.rb +2 -2
- data/spec/integration/parser/collection_spec.rb +2 -2
- data/spec/integration/parser/scope_spec.rb +16 -3
- data/spec/integration/provider/cron/crontab_spec.rb +1 -0
- data/spec/integration/transaction/report_spec.rb +5 -0
- data/spec/lib/matchers/json.rb +14 -13
- data/spec/unit/agent_spec.rb +33 -0
- data/spec/unit/application/config_spec.rb +4 -0
- data/spec/unit/application/lookup_spec.rb +30 -0
- data/spec/unit/application_spec.rb +18 -0
- data/spec/unit/configurer/downloader_factory_spec.rb +33 -0
- data/spec/unit/configurer/plugin_handler_spec.rb +71 -16
- data/spec/unit/environments_spec.rb +15 -0
- data/spec/unit/face/config_spec.rb +8 -9
- data/spec/unit/face/epp_face_spec.rb +2 -2
- data/spec/unit/face/plugin_spec.rb +50 -4
- data/spec/unit/file_serving/configuration/parser_spec.rb +2 -2
- data/spec/unit/file_serving/mount/locales_spec.rb +73 -0
- data/spec/unit/functions/break_spec.rb +108 -50
- data/spec/unit/functions/defined_spec.rb +2 -2
- data/spec/unit/functions/hiera_spec.rb +0 -1
- data/spec/unit/functions/lookup_spec.rb +85 -19
- data/spec/unit/functions/next_spec.rb +1 -1
- data/spec/unit/functions/return_spec.rb +2 -2
- data/spec/unit/gettext/config_spec.rb +125 -0
- data/spec/unit/gettext/module_loading_spec.rb +53 -0
- data/spec/unit/indirector/json_spec.rb +0 -11
- data/spec/unit/indirector/node/exec_spec.rb +1 -1
- data/spec/unit/info_service_spec.rb +1 -1
- data/spec/unit/interface_spec.rb +12 -0
- data/spec/unit/module_spec.rb +0 -28
- data/spec/unit/module_tool/tar/mini_spec.rb +34 -5
- data/spec/unit/network/http/factory_spec.rb +22 -0
- data/spec/unit/network/http/webrick_spec.rb +30 -29
- data/spec/unit/node/environment_spec.rb +16 -0
- data/spec/unit/node_spec.rb +102 -16
- data/spec/unit/parser/environment_compiler_spec.rb +1 -1
- data/spec/unit/parser/functions/sprintf_spec.rb +26 -0
- data/spec/unit/parser/resource/param_spec.rb +1 -1
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +9 -9
- data/spec/unit/pops/loaders/static_loader_spec.rb +1 -1
- data/spec/unit/pops/parser/parse_containers_spec.rb +1 -1
- data/spec/unit/pops/types/type_calculator_spec.rb +40 -0
- data/spec/unit/pops/types/type_mismatch_describer_spec.rb +9 -0
- data/spec/unit/provider/selmodule_spec.rb +6 -0
- data/spec/unit/provider/service/init_spec.rb +1 -1
- data/spec/unit/provider/service/smf_spec.rb +2 -0
- data/spec/unit/provider/service/systemd_spec.rb +14 -0
- data/spec/unit/resource/catalog_spec.rb +12 -2
- data/spec/unit/settings/config_file_spec.rb +1 -1
- data/spec/unit/transaction/persistence_spec.rb +42 -0
- data/spec/unit/transaction/report_spec.rb +19 -4
- data/spec/unit/transaction_spec.rb +27 -0
- data/spec/unit/type/schedule_spec.rb +14 -0
- data/spec/unit/type_spec.rb +3 -3
- data/spec/unit/util/errors_spec.rb +1 -1
- data/spec/unit/util/http_proxy_spec.rb +37 -0
- data/spec/unit/util/log_spec.rb +3 -3
- data/spec/unit/util/logging_spec.rb +7 -7
- data/spec/unit/util/monkey_patches_spec.rb +6 -2
- metadata +3445 -3416
- checksums.yaml +0 -7
- data/spec/unit/gettext_config_spec.rb +0 -57
@@ -67,9 +67,7 @@ module Puppet::Util::InstanceLoader
|
|
67
67
|
unless instances.include? name
|
68
68
|
if instance_loader(type).load(name)
|
69
69
|
unless instances.include? name
|
70
|
-
Puppet.warning(
|
71
|
-
_("Loaded %{type} file for %{name} but %{type} was not defined") % { type: type, name: name }
|
72
|
-
)
|
70
|
+
Puppet.warning(_("Loaded %{type} file for %{name} but %{type} was not defined") % { type: type, name: name })
|
73
71
|
return nil
|
74
72
|
end
|
75
73
|
else
|
@@ -44,7 +44,8 @@ class Puppet::Util::Ldap::Manager
|
|
44
44
|
# Open, yield, and close the connection. Cannot be left
|
45
45
|
# open, at this point.
|
46
46
|
def connect
|
47
|
-
|
47
|
+
#TRANSLATORS '#connect' is a method name and and should not be translated, 'block' refers to a Ruby code block
|
48
|
+
raise ArgumentError, _("You must pass a block to #connect") unless block_given?
|
48
49
|
|
49
50
|
unless @connection
|
50
51
|
if Puppet[:ldaptls]
|
@@ -85,7 +86,8 @@ class Puppet::Util::Ldap::Manager
|
|
85
86
|
|
86
87
|
# Convert an ldap-style entry hash to a provider-style hash.
|
87
88
|
def entry2provider(entry)
|
88
|
-
|
89
|
+
#TRANSLATOR 'dn' refers to a 'distinguished name' in LDAP (Lightweight Directory Access Protocol) and they should not be translated
|
90
|
+
raise ArgumentError, _("Could not get dn from ldap entry") unless entry["dn"]
|
89
91
|
|
90
92
|
# DN is always a single-entry array. Strip off the bits before the
|
91
93
|
# first comma, then the bits after the remaining equal sign. This is the
|
@@ -137,7 +139,8 @@ class Puppet::Util::Ldap::Manager
|
|
137
139
|
|
138
140
|
if generator.source
|
139
141
|
unless value = values[generator.source]
|
140
|
-
raise ArgumentError, "
|
142
|
+
raise ArgumentError, _("%{source} must be defined to generate %{name}") %
|
143
|
+
{ source: generator.source, name: generator.name }
|
141
144
|
end
|
142
145
|
result = generator.generate(value)
|
143
146
|
else
|
data/lib/puppet/util/log.rb
CHANGED
@@ -63,7 +63,8 @@ class Puppet::Util::Log
|
|
63
63
|
destinations.keys.each { |dest|
|
64
64
|
close(dest)
|
65
65
|
}
|
66
|
-
|
66
|
+
#TRANSLATORS "Log.close_all" is a method name and should not be translated
|
67
|
+
raise Puppet::DevError.new(_("Log.close_all failed to close %{destinations}") % { destinations: @destinations.keys.inspect }) if !@destinations.empty?
|
67
68
|
end
|
68
69
|
|
69
70
|
# Flush any log destinations that support such operations.
|
@@ -82,8 +83,8 @@ class Puppet::Util::Log
|
|
82
83
|
# Create a new log message. The primary role of this method is to
|
83
84
|
# avoid creating log messages below the loglevel.
|
84
85
|
def Log.create(hash)
|
85
|
-
raise Puppet::DevError, "Logs require a level" unless hash.include?(:level)
|
86
|
-
raise Puppet::DevError, "Invalid log level
|
86
|
+
raise Puppet::DevError, _("Logs require a level") unless hash.include?(:level)
|
87
|
+
raise Puppet::DevError, _("Invalid log level %{level}") % { level: hash[:level] } unless @levels.index(hash[:level])
|
87
88
|
@levels.index(hash[:level]) >= @loglevel ? Puppet::Util::Log.new(hash) : nil
|
88
89
|
end
|
89
90
|
|
@@ -105,7 +106,7 @@ class Puppet::Util::Log
|
|
105
106
|
def Log.level=(level)
|
106
107
|
level = level.intern unless level.is_a?(Symbol)
|
107
108
|
|
108
|
-
raise Puppet::DevError, "Invalid loglevel
|
109
|
+
raise Puppet::DevError, _("Invalid loglevel %{level}") % { level: level } unless @levels.include?(level)
|
109
110
|
|
110
111
|
@loglevel = @levels.index(level)
|
111
112
|
|
@@ -132,7 +133,7 @@ class Puppet::Util::Log
|
|
132
133
|
return
|
133
134
|
end
|
134
135
|
|
135
|
-
raise Puppet::DevError, "Unknown destination type
|
136
|
+
raise Puppet::DevError, _("Unknown destination type %{dest}") % { dest: dest} unless type
|
136
137
|
|
137
138
|
begin
|
138
139
|
if type.instance_method(:initialize).arity == 1
|
@@ -168,10 +169,11 @@ class Puppet::Util::Log
|
|
168
169
|
def Log.coerce_string(str)
|
169
170
|
return Puppet::Util::CharacterEncoding.convert_to_utf_8(str) if str.valid_encoding?
|
170
171
|
|
171
|
-
annotated_string = _("Received a Log attribute with invalid encoding:")
|
172
|
-
annotated_string << Puppet::Util::CharacterEncoding.convert_to_utf_8(str.dump) << "\n"
|
173
172
|
# We only select the last 10 callers in the stack to avoid being spammy
|
174
|
-
|
173
|
+
message = _("Received a Log attribute with invalid encoding:%{log_message}") %
|
174
|
+
{ log_message: Puppet::Util::CharacterEncoding.convert_to_utf_8(str.dump)}
|
175
|
+
message += '\n' + _("Backtrace:\n%{backtrace}") % { backtrace: caller[0..10].join("\n") }
|
176
|
+
message
|
175
177
|
end
|
176
178
|
|
177
179
|
public
|
@@ -357,15 +359,18 @@ class Puppet::Util::Log
|
|
357
359
|
end
|
358
360
|
|
359
361
|
def message=(msg)
|
360
|
-
|
362
|
+
#TRANSLATORS 'Puppet::Util::Log' refers to a Puppet source code class
|
363
|
+
raise ArgumentError, _("Puppet::Util::Log requires a message") unless msg
|
361
364
|
@message = msg.to_s
|
362
365
|
end
|
363
366
|
|
364
367
|
def level=(level)
|
365
|
-
|
366
|
-
raise ArgumentError, "Puppet::Util::Log requires a
|
368
|
+
#TRANSLATORS 'Puppet::Util::Log' refers to a Puppet source code class
|
369
|
+
raise ArgumentError, _("Puppet::Util::Log requires a log level") unless level
|
370
|
+
#TRANSLATORS 'Puppet::Util::Log' refers to a Puppet source code class
|
371
|
+
raise ArgumentError, _("Puppet::Util::Log requires a symbol or string") unless level.respond_to? "to_sym"
|
367
372
|
@level = level.to_sym
|
368
|
-
raise ArgumentError, "Invalid log level
|
373
|
+
raise ArgumentError, _("Invalid log level %{level}") % { level: @level } unless self.class.validlevel?(@level)
|
369
374
|
|
370
375
|
# Tag myself with my log level
|
371
376
|
tag(level)
|
@@ -394,18 +399,8 @@ class Puppet::Util::Log
|
|
394
399
|
# Issue based messages do not have details in the message. It
|
395
400
|
# must be appended here
|
396
401
|
unless issue_code.nil?
|
397
|
-
msg = _("Could not parse for environment %{
|
398
|
-
|
399
|
-
msg = _("%{msg} at %{file}:%{line}:%{pos}") % { msg: msg, file: file, line: line, pos: pos }
|
400
|
-
elsif file and line
|
401
|
-
msg = _("%{msg} at %{file}:%{line}") % { msg: msg, file: file, line: line }
|
402
|
-
elsif line && pos
|
403
|
-
msg = _("%{msg} at line %{line}:%{pos}") % { msg: msg, line: line, pos: pos }
|
404
|
-
elsif line
|
405
|
-
msg = _("%{msg} at line %{line}") % { msg: msg, line: line }
|
406
|
-
elsif file
|
407
|
-
msg = _("%{msg} in %{file}") % { msg: msg, file: file }
|
408
|
-
end
|
402
|
+
msg = _("Could not parse for environment %{environment}: %{msg}") % { environment: environment, msg: msg } unless environment.nil?
|
403
|
+
msg += Puppet::Util::Errors.error_location_with_space(file, line, pos)
|
409
404
|
msg = _("%{msg} on node %{node}") % { msg: msg, node: node } unless node.nil?
|
410
405
|
if @backtrace.is_a?(Array)
|
411
406
|
msg += "\n"
|
data/lib/puppet/util/logging.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# A module to make logging a bit easier.
|
2
2
|
require 'puppet/util/log'
|
3
3
|
require 'puppet/error'
|
4
|
-
require 'puppet/util/multi_match.rb'
|
5
4
|
|
6
5
|
require 'facter'
|
7
6
|
|
@@ -146,16 +145,12 @@ module Logging
|
|
146
145
|
key = options[:key]
|
147
146
|
file = options[:file]
|
148
147
|
line = options[:line]
|
149
|
-
|
148
|
+
#TRANSLATORS the literals ":file", ":line", and ":key" should not be translated
|
149
|
+
raise Puppet::DevError, _("Need either :file and :line, or :key") if (key.nil?) && (file.nil? || line.nil?)
|
150
150
|
|
151
151
|
key ||= "#{file}:#{line}"
|
152
152
|
issue_deprecation_warning(message, key, file, line, false)
|
153
153
|
end
|
154
|
-
MM = MultiMatch
|
155
|
-
FILE_AND_LINE = MM::TUPLE
|
156
|
-
FILE_NO_LINE = MM.new(MM::NOT_NIL, nil).freeze
|
157
|
-
NO_FILE_LINE = MM.new(nil, MM::NOT_NIL).freeze
|
158
|
-
SUPPRESS_FILE_LINE = MM.new(:default, :default).freeze
|
159
154
|
|
160
155
|
# Logs a (non deprecation) warning once for a given key.
|
161
156
|
#
|
@@ -175,19 +170,17 @@ module Logging
|
|
175
170
|
if $unique_warnings.length < 100 then
|
176
171
|
if (! $unique_warnings.has_key?(key)) then
|
177
172
|
$unique_warnings[key] = message
|
178
|
-
call_trace =
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
_("\n (file & line not available)")
|
190
|
-
end
|
173
|
+
call_trace = if file == :default and line == :default
|
174
|
+
# Suppress the file and line number output
|
175
|
+
''
|
176
|
+
else
|
177
|
+
error_location_str = Puppet::Util::Errors.error_location(file, line)
|
178
|
+
if error_location_str.empty?
|
179
|
+
'\n ' + _('(file & line not available)')
|
180
|
+
else
|
181
|
+
"\n %{error_location}" % { error_location: error_location_str }
|
182
|
+
end
|
183
|
+
end
|
191
184
|
send_log(level, "#{message}#{call_trace}")
|
192
185
|
end
|
193
186
|
end
|
@@ -279,17 +272,17 @@ module Logging
|
|
279
272
|
def issue_deprecation_warning(message, key, file, line, use_caller)
|
280
273
|
return if Puppet[:disable_warnings].include?('deprecations')
|
281
274
|
$deprecation_warnings ||= {}
|
282
|
-
if $deprecation_warnings.length < 100
|
275
|
+
if $deprecation_warnings.length < 100
|
283
276
|
key ||= (offender = get_deprecation_offender)
|
284
|
-
|
277
|
+
unless $deprecation_warnings.has_key?(key)
|
285
278
|
$deprecation_warnings[key] = message
|
286
279
|
# split out to allow translation
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
warning(
|
280
|
+
call_trace = if use_caller
|
281
|
+
_("(location: %{location})") % { location: (offender || get_deprecation_offender).join('; ') }
|
282
|
+
else
|
283
|
+
Puppet::Util::Errors.error_location_with_unknowns(file, line)
|
284
|
+
end
|
285
|
+
warning("%{message}\n %{call_trace}" % { message: message, call_trace: call_trace })
|
293
286
|
end
|
294
287
|
end
|
295
288
|
end
|
@@ -13,7 +13,7 @@ module Puppet::Util::MethodHelper
|
|
13
13
|
if respond_to? method
|
14
14
|
self.send(method, value)
|
15
15
|
else
|
16
|
-
raise ArgumentError, "Invalid parameter
|
16
|
+
raise ArgumentError, _("Invalid parameter %{parameter} to object class %{class_name}") % { parameter: param, class_name: self.class }
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -9,7 +9,7 @@ module Puppet::Util::NagiosMaker
|
|
9
9
|
name = name.to_sym
|
10
10
|
full_name = ("nagios_#{name}").to_sym
|
11
11
|
|
12
|
-
raise
|
12
|
+
raise Puppet::DevError, _("No nagios type for %{name}") % { name: name } unless nagtype = Nagios::Base.type(name)
|
13
13
|
|
14
14
|
type = Puppet::Type.newtype(full_name) do
|
15
15
|
|
@@ -39,34 +39,41 @@ class Puppet::Util::NetworkDevice::Config
|
|
39
39
|
begin
|
40
40
|
devices = {}
|
41
41
|
device = nil
|
42
|
-
File.open(@file)
|
43
|
-
|
44
|
-
f.each
|
42
|
+
File.open(@file) do |f|
|
43
|
+
file_line_count = 1
|
44
|
+
f.each do |line|
|
45
45
|
case line
|
46
46
|
when /^\s*#/ # skip comments
|
47
|
-
|
47
|
+
file_line_count += 1
|
48
48
|
next
|
49
49
|
when /^\s*$/ # skip blank lines
|
50
|
-
|
50
|
+
file_line_count += 1
|
51
51
|
next
|
52
52
|
when /^\[([\w.-]+)\]\s*$/ # [device.fqdn]
|
53
53
|
name = $1
|
54
54
|
name.chomp!
|
55
|
-
|
55
|
+
if devices.include?(name)
|
56
|
+
file_error_location = Puppet::Util::Errors.error_location(nil, file_line_count)
|
57
|
+
device_error_location = Puppet::Util::Errors.error_location(nil, device.line)
|
58
|
+
raise Puppet::Error, _("Duplicate device found at %{file_error_location}, already found at %{device_error_location}") %
|
59
|
+
{ file_error_location: file_error_location, device_error_location: device_error_location }
|
60
|
+
end
|
56
61
|
device = OpenStruct.new
|
57
62
|
device.name = name
|
58
|
-
device.line =
|
63
|
+
device.line = file_line_count
|
59
64
|
device.options = { :debug => false }
|
60
65
|
Puppet.debug "found device: #{device.name} at #{device.line}"
|
61
66
|
devices[name] = device
|
62
67
|
when /^\s*(type|url|debug)(\s+(.+)\s*)*$/
|
63
|
-
parse_directive(device, $1, $3,
|
68
|
+
parse_directive(device, $1, $3, file_line_count)
|
64
69
|
else
|
65
|
-
|
70
|
+
error_location_str = Puppet::Util::Errors.error_location(nil, file_line_count)
|
71
|
+
raise Puppet::Error, _("Invalid entry at %{error_location}: %{file_text}") %
|
72
|
+
{ error_location: error_location_str, file_text: line }
|
66
73
|
end
|
67
|
-
|
68
|
-
|
69
|
-
|
74
|
+
file_line_count += 1
|
75
|
+
end
|
76
|
+
end
|
70
77
|
rescue Errno::EACCES => detail
|
71
78
|
Puppet.err _("Configuration error: Cannot read %{file}; cannot serve") % { file: @file }
|
72
79
|
#raise Puppet::Error, "Cannot read #{@config}"
|
@@ -91,7 +98,8 @@ class Puppet::Util::NetworkDevice::Config
|
|
91
98
|
when "debug"
|
92
99
|
device.options[:debug] = true
|
93
100
|
else
|
94
|
-
|
101
|
+
error_location_str = Puppet::Util::Errors.error_location(nil, count)
|
102
|
+
raise Puppet::Error, _("Invalid argument '%{var}' at %{error_location}") % { var: var, error_location: error_location_str }
|
95
103
|
end
|
96
104
|
end
|
97
105
|
|
data/lib/puppet/util/plist.rb
CHANGED
@@ -45,7 +45,9 @@ module Puppet::Util::Plist
|
|
45
45
|
{:failonfail => true, :combine => true})
|
46
46
|
return parse_plist(plist)
|
47
47
|
rescue Puppet::ExecutionFailure => detail
|
48
|
-
|
48
|
+
message = _("Cannot read file %{file_path}; Puppet is skipping it.") % { file_path: file_path }
|
49
|
+
message += '\n' + _("Details: %{detail}") % { detail: detail }
|
50
|
+
Puppet.warning(message)
|
49
51
|
end
|
50
52
|
end
|
51
53
|
return nil
|
data/lib/puppet/util/posix.rb
CHANGED
@@ -17,7 +17,7 @@ module Puppet::Util::POSIX
|
|
17
17
|
# method search_posix_field in the gid and uid methods if a sanity check
|
18
18
|
# fails
|
19
19
|
def get_posix_field(space, field, id)
|
20
|
-
raise Puppet::DevError, "Did not get id from caller" unless id
|
20
|
+
raise Puppet::DevError, _("Did not get id from caller") unless id
|
21
21
|
|
22
22
|
if id.is_a?(Integer)
|
23
23
|
if id > Puppet[:maximum_uid].to_i
|
@@ -63,7 +63,7 @@ module Puppet::Util::ProviderFeatures
|
|
63
63
|
# @todo How methods that determine if the feature is present are specified.
|
64
64
|
def feature(name, docs, hash = {})
|
65
65
|
@features ||= {}
|
66
|
-
raise
|
66
|
+
raise Puppet::DevError, _("Feature %{name} is already defined") % { name: name } if @features.include?(name)
|
67
67
|
begin
|
68
68
|
obj = ProviderFeature.new(name, docs, hash)
|
69
69
|
@features[obj.name] = obj
|
@@ -245,7 +245,7 @@ module Generators
|
|
245
245
|
end
|
246
246
|
end
|
247
247
|
|
248
|
-
def gen_composite_index(collection, template, filename)
|
248
|
+
def gen_composite_index(collection, template, filename)
|
249
249
|
return if Puppet::FileSystem.exist?(filename)
|
250
250
|
|
251
251
|
template = TemplatePage.new(RDoc::Page::FR_INDEX_BODY, template)
|
@@ -13,8 +13,7 @@ class Puppet::Util::Reference
|
|
13
13
|
instance_load(:reference, 'puppet/reference')
|
14
14
|
|
15
15
|
def self.footer
|
16
|
-
|
17
|
-
"\n\n----------------\n\n*" + _("This page autogenerated on ") + "#{Time.now}*\n"
|
16
|
+
"\n\n----------------\n\n" + _("*This page autogenerated on %{current_time}*\n") % { current_time: Time.now.to_s }
|
18
17
|
end
|
19
18
|
|
20
19
|
def self.modes
|
@@ -113,7 +112,7 @@ class Puppet::Util::Reference
|
|
113
112
|
# First the header
|
114
113
|
text = markdown_header(@title, 1)
|
115
114
|
#TRANSLATORS message accompanied by date of generation
|
116
|
-
text << _("\n\n**This page is autogenerated; any changes will get overwritten** *(last generated on ")
|
115
|
+
text << _("\n\n**This page is autogenerated; any changes will get overwritten** *(last generated on %{current_time})*\n\n") % { current_time: Time.now.to_s }
|
117
116
|
|
118
117
|
text << @header
|
119
118
|
|
data/lib/puppet/util/selinux.rb
CHANGED
@@ -240,7 +240,7 @@ module Puppet::Util::SELinux
|
|
240
240
|
# while we try and figure out what file-system the target lives on.
|
241
241
|
path = Pathname(path).cleanpath
|
242
242
|
unless path.absolute?
|
243
|
-
raise Puppet::DevError, "got a relative path in SELinux find_fs:
|
243
|
+
raise Puppet::DevError, _("got a relative path in SELinux find_fs: %{path}") % { path: path }
|
244
244
|
end
|
245
245
|
|
246
246
|
# Now, walk up the tree until we find a match for that path in the hash.
|
data/lib/puppet/util/storage.rb
CHANGED
@@ -53,7 +53,7 @@ class Puppet::Util::Storage
|
|
53
53
|
Puppet.warning(_("Checksumfile %{filename} is not a file, ignoring") % { filename: filename })
|
54
54
|
return
|
55
55
|
end
|
56
|
-
Puppet::Util.benchmark(:debug, "Loaded state") do
|
56
|
+
Puppet::Util.benchmark(:debug, "Loaded state in %{seconds} seconds") do
|
57
57
|
begin
|
58
58
|
@@state = Puppet::Util::Yaml.load_file(filename)
|
59
59
|
rescue Puppet::Util::Yaml::YamlLoadError => detail
|
@@ -82,7 +82,7 @@ class Puppet::Util::Storage
|
|
82
82
|
|
83
83
|
Puppet.info _("Creating state file %{file}") % { file: Puppet[:statefile] } unless Puppet::FileSystem.exist?(Puppet[:statefile])
|
84
84
|
|
85
|
-
Puppet::Util.benchmark(:debug, "Stored state") do
|
85
|
+
Puppet::Util.benchmark(:debug, "Stored state in %{seconds} seconds") do
|
86
86
|
Puppet::Util::Yaml.dump(@@state, Puppet[:statefile])
|
87
87
|
end
|
88
88
|
end
|
@@ -31,7 +31,8 @@ class Puppet::Util::Windows::EventLog
|
|
31
31
|
def initialize(source_name = 'Puppet')
|
32
32
|
@eventlog_handle = RegisterEventSourceW(FFI::Pointer::NULL, wide_string(source_name))
|
33
33
|
if @eventlog_handle == NULL_HANDLE
|
34
|
-
|
34
|
+
#TRANSLATORS 'Windows' is the operating system and 'RegisterEventSourceW' is a API call and should not be translated
|
35
|
+
raise EventLogError.new(_("RegisterEventSourceW failed to open Windows eventlog"), FFI.errno)
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
@@ -55,7 +56,9 @@ class Puppet::Util::Windows::EventLog
|
|
55
56
|
# @return [void]
|
56
57
|
# @api public
|
57
58
|
def report_event(args = {})
|
58
|
-
|
59
|
+
unless args[:data].is_a?(String)
|
60
|
+
raise ArgumentError, _("data must be a string, not %{class_name}") % { class_name: args[:data].class }
|
61
|
+
end
|
59
62
|
from_string_to_wide_string(args[:data]) do |message_ptr|
|
60
63
|
FFI::MemoryPointer.new(:pointer) do |message_array_ptr|
|
61
64
|
message_array_ptr.write_pointer(message_ptr)
|
@@ -69,7 +72,8 @@ class Puppet::Util::Windows::EventLog
|
|
69
72
|
num_strings, raw_data_size, message_array_ptr, raw_data)
|
70
73
|
|
71
74
|
if report_result == WIN32_FALSE
|
72
|
-
|
75
|
+
#TRANSLATORS 'Windows' is the operating system and 'ReportEventW' is a API call and should not be translated
|
76
|
+
raise EventLogError.new(_("ReportEventW failed to report event to Windows eventlog"), FFI.errno)
|
73
77
|
end
|
74
78
|
end
|
75
79
|
end
|
@@ -92,7 +96,7 @@ class Puppet::Util::Windows::EventLog
|
|
92
96
|
when :err,:alert,:emerg,:crit
|
93
97
|
[EVENTLOG_ERROR_TYPE, 0x03]
|
94
98
|
else
|
95
|
-
raise ArgumentError, "Invalid log level
|
99
|
+
raise ArgumentError, _("Invalid log level %{level}") % { level: level }
|
96
100
|
end
|
97
101
|
end
|
98
102
|
end
|
@@ -110,7 +114,8 @@ class Puppet::Util::Windows::EventLog
|
|
110
114
|
else
|
111
115
|
class EventLogError < RuntimeError
|
112
116
|
def initialize(msg, code)
|
113
|
-
|
117
|
+
#TRANSLATORS 'Win32' is the Windows API and should not be translated
|
118
|
+
super(msg + ' ' + _("(Win32 error: %{detail})") % { detail: code})
|
114
119
|
end
|
115
120
|
end
|
116
121
|
end
|
@@ -111,11 +111,15 @@ module Puppet::Util::Windows::File
|
|
111
111
|
|
112
112
|
# return true if path exists and it's not a symlink
|
113
113
|
# Other file attributes are ignored. https://msdn.microsoft.com/en-us/library/windows/desktop/gg258117(v=vs.85).aspx
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
114
|
+
reparse_point = (result & FILE_ATTRIBUTE_REPARSE_POINT) == FILE_ATTRIBUTE_REPARSE_POINT
|
115
|
+
if reparse_point && symlink_reparse_point?(path)
|
116
|
+
# walk the symlink and try again...
|
117
|
+
seen_paths << path.downcase
|
118
|
+
path = readlink(path)
|
119
|
+
else
|
120
|
+
# file was found and its not a symlink
|
121
|
+
return true
|
122
|
+
end
|
119
123
|
end
|
120
124
|
|
121
125
|
false
|
@@ -177,6 +181,18 @@ module Puppet::Util::Windows::File
|
|
177
181
|
"#{flags_and_attributes.to_s(8)}, #{template_file_handle})")
|
178
182
|
end
|
179
183
|
|
184
|
+
IO_REPARSE_TAG_MOUNT_POINT = 0xA0000003
|
185
|
+
IO_REPARSE_TAG_HSM = 0xC0000004
|
186
|
+
IO_REPARSE_TAG_HSM2 = 0x80000006
|
187
|
+
IO_REPARSE_TAG_SIS = 0x80000007
|
188
|
+
IO_REPARSE_TAG_WIM = 0x80000008
|
189
|
+
IO_REPARSE_TAG_CSV = 0x80000009
|
190
|
+
IO_REPARSE_TAG_DFS = 0x8000000A
|
191
|
+
IO_REPARSE_TAG_SYMLINK = 0xA000000C
|
192
|
+
IO_REPARSE_TAG_DFSR = 0x80000012
|
193
|
+
IO_REPARSE_TAG_DEDUP = 0x80000013
|
194
|
+
IO_REPARSE_TAG_NFS = 0x80000014
|
195
|
+
|
180
196
|
def self.get_reparse_point_data(handle, &block)
|
181
197
|
# must be multiple of 1024, min 10240
|
182
198
|
FFI::MemoryPointer.new(MAXIMUM_REPARSE_DATA_BUFFER_SIZE) do |reparse_data_buffer_ptr|
|
@@ -184,11 +200,11 @@ module Puppet::Util::Windows::File
|
|
184
200
|
|
185
201
|
reparse_tag = reparse_data_buffer_ptr.read_win32_ulong
|
186
202
|
buffer_type = case reparse_tag
|
187
|
-
when
|
203
|
+
when IO_REPARSE_TAG_SYMLINK
|
188
204
|
SYMLINK_REPARSE_DATA_BUFFER
|
189
|
-
when
|
205
|
+
when IO_REPARSE_TAG_MOUNT_POINT
|
190
206
|
MOUNT_POINT_REPARSE_DATA_BUFFER
|
191
|
-
when
|
207
|
+
when IO_REPARSE_TAG_NFS
|
192
208
|
raise Puppet::Util::Windows::Error.new("Retrieving NFS reparse point data is unsupported")
|
193
209
|
else
|
194
210
|
raise Puppet::Util::Windows::Error.new("DeviceIoControl(#{handle}, " +
|
@@ -202,6 +218,20 @@ module Puppet::Util::Windows::File
|
|
202
218
|
nil
|
203
219
|
end
|
204
220
|
|
221
|
+
def self.get_reparse_point_tag(handle)
|
222
|
+
reparse_tag = nil
|
223
|
+
|
224
|
+
# must be multiple of 1024, min 10240
|
225
|
+
FFI::MemoryPointer.new(MAXIMUM_REPARSE_DATA_BUFFER_SIZE) do |reparse_data_buffer_ptr|
|
226
|
+
device_io_control(handle, FSCTL_GET_REPARSE_POINT, nil, reparse_data_buffer_ptr)
|
227
|
+
|
228
|
+
# DWORD ReparseTag is the first member of the struct
|
229
|
+
reparse_tag = reparse_data_buffer_ptr.read_win32_ulong
|
230
|
+
end
|
231
|
+
|
232
|
+
reparse_tag
|
233
|
+
end
|
234
|
+
|
205
235
|
def self.device_io_control(handle, io_control_code, in_buffer = nil, out_buffer = nil)
|
206
236
|
if out_buffer.nil?
|
207
237
|
raise Puppet::Util::Windows::Error.new(_("out_buffer is required"))
|
@@ -229,12 +259,18 @@ module Puppet::Util::Windows::File
|
|
229
259
|
end
|
230
260
|
|
231
261
|
FILE_ATTRIBUTE_REPARSE_POINT = 0x400
|
232
|
-
def
|
262
|
+
def reparse_point?(file_name)
|
233
263
|
attributes = get_attributes(file_name, false)
|
234
264
|
|
235
265
|
return false if (attributes == INVALID_FILE_ATTRIBUTES)
|
236
266
|
(attributes & FILE_ATTRIBUTE_REPARSE_POINT) == FILE_ATTRIBUTE_REPARSE_POINT
|
237
267
|
end
|
268
|
+
module_function :reparse_point?
|
269
|
+
|
270
|
+
def symlink?(file_name)
|
271
|
+
# Puppet currently only handles mount point and symlink reparse points, ignores others
|
272
|
+
reparse_point?(file_name) && symlink_reparse_point?(file_name)
|
273
|
+
end
|
238
274
|
module_function :symlink?
|
239
275
|
|
240
276
|
GENERIC_READ = 0x80000000
|
@@ -375,6 +411,22 @@ module Puppet::Util::Windows::File
|
|
375
411
|
path
|
376
412
|
end
|
377
413
|
|
414
|
+
# these reparse point types are the only ones Puppet currently understands
|
415
|
+
# so rather than raising an exception in readlink, prefer to not consider
|
416
|
+
# the path a symlink when stat'ing later
|
417
|
+
def self.symlink_reparse_point?(path)
|
418
|
+
symlink = false
|
419
|
+
|
420
|
+
open_symlink(path) do |handle|
|
421
|
+
symlink = [
|
422
|
+
IO_REPARSE_TAG_SYMLINK,
|
423
|
+
IO_REPARSE_TAG_MOUNT_POINT
|
424
|
+
].include?(get_reparse_point_tag(handle))
|
425
|
+
end
|
426
|
+
|
427
|
+
symlink
|
428
|
+
end
|
429
|
+
|
378
430
|
ffi_convention :stdcall
|
379
431
|
|
380
432
|
# https://msdn.microsoft.com/en-us/library/windows/desktop/aa365512(v=vs.85).aspx
|