pdk 2.4.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1336 -1329
  3. data/LICENSE +201 -201
  4. data/README.md +163 -163
  5. data/exe/pdk +10 -10
  6. data/lib/pdk/analytics/client/google_analytics.rb +143 -143
  7. data/lib/pdk/analytics/client/noop.rb +25 -25
  8. data/lib/pdk/analytics/util.rb +19 -19
  9. data/lib/pdk/analytics.rb +30 -30
  10. data/lib/pdk/answer_file.rb +12 -12
  11. data/lib/pdk/bolt.rb +19 -19
  12. data/lib/pdk/cli/build.rb +82 -82
  13. data/lib/pdk/cli/bundle.rb +48 -48
  14. data/lib/pdk/cli/config/get.rb +26 -26
  15. data/lib/pdk/cli/config.rb +22 -22
  16. data/lib/pdk/cli/console.rb +148 -148
  17. data/lib/pdk/cli/convert.rb +52 -52
  18. data/lib/pdk/cli/env.rb +52 -52
  19. data/lib/pdk/cli/errors.rb +25 -25
  20. data/lib/pdk/cli/exec/command.rb +293 -293
  21. data/lib/pdk/cli/exec/interactive_command.rb +114 -114
  22. data/lib/pdk/cli/exec.rb +84 -84
  23. data/lib/pdk/cli/exec_group.rb +104 -104
  24. data/lib/pdk/cli/get/config.rb +24 -24
  25. data/lib/pdk/cli/get.rb +20 -20
  26. data/lib/pdk/cli/module/build.rb +12 -12
  27. data/lib/pdk/cli/module/generate.rb +47 -47
  28. data/lib/pdk/cli/module.rb +14 -14
  29. data/lib/pdk/cli/new/class.rb +32 -32
  30. data/lib/pdk/cli/new/defined_type.rb +32 -32
  31. data/lib/pdk/cli/new/fact.rb +29 -29
  32. data/lib/pdk/cli/new/function.rb +29 -29
  33. data/lib/pdk/cli/new/module.rb +53 -53
  34. data/lib/pdk/cli/new/provider.rb +29 -29
  35. data/lib/pdk/cli/new/task.rb +34 -34
  36. data/lib/pdk/cli/new/test.rb +52 -52
  37. data/lib/pdk/cli/new/transport.rb +27 -27
  38. data/lib/pdk/cli/new.rb +21 -21
  39. data/lib/pdk/cli/release/prep.rb +39 -39
  40. data/lib/pdk/cli/release/publish.rb +50 -50
  41. data/lib/pdk/cli/release.rb +194 -194
  42. data/lib/pdk/cli/remove/config.rb +80 -80
  43. data/lib/pdk/cli/remove.rb +20 -20
  44. data/lib/pdk/cli/set/config.rb +119 -119
  45. data/lib/pdk/cli/set.rb +20 -20
  46. data/lib/pdk/cli/test/unit.rb +90 -90
  47. data/lib/pdk/cli/test.rb +11 -11
  48. data/lib/pdk/cli/update.rb +64 -64
  49. data/lib/pdk/cli/util/command_redirector.rb +27 -27
  50. data/lib/pdk/cli/util/interview.rb +72 -72
  51. data/lib/pdk/cli/util/option_normalizer.rb +55 -55
  52. data/lib/pdk/cli/util/option_validator.rb +68 -68
  53. data/lib/pdk/cli/util/spinner.rb +13 -13
  54. data/lib/pdk/cli/util/update_manager_printer.rb +82 -82
  55. data/lib/pdk/cli/util.rb +305 -305
  56. data/lib/pdk/cli/validate.rb +116 -116
  57. data/lib/pdk/cli.rb +175 -175
  58. data/lib/pdk/config/analytics_schema.json +26 -26
  59. data/lib/pdk/config/errors.rb +5 -5
  60. data/lib/pdk/config/ini_file.rb +183 -183
  61. data/lib/pdk/config/ini_file_setting.rb +39 -39
  62. data/lib/pdk/config/json.rb +34 -34
  63. data/lib/pdk/config/json_schema_namespace.rb +142 -142
  64. data/lib/pdk/config/json_schema_setting.rb +53 -53
  65. data/lib/pdk/config/json_with_schema.rb +49 -49
  66. data/lib/pdk/config/namespace.rb +354 -354
  67. data/lib/pdk/config/setting.rb +135 -135
  68. data/lib/pdk/config/validator.rb +31 -31
  69. data/lib/pdk/config/yaml.rb +46 -46
  70. data/lib/pdk/config/yaml_with_schema.rb +59 -59
  71. data/lib/pdk/config.rb +390 -390
  72. data/lib/pdk/context/control_repo.rb +60 -60
  73. data/lib/pdk/context/module.rb +28 -28
  74. data/lib/pdk/context/none.rb +22 -22
  75. data/lib/pdk/context.rb +99 -99
  76. data/lib/pdk/control_repo.rb +90 -90
  77. data/lib/pdk/generate/defined_type.rb +43 -43
  78. data/lib/pdk/generate/fact.rb +25 -25
  79. data/lib/pdk/generate/function.rb +48 -48
  80. data/lib/pdk/generate/module.rb +352 -352
  81. data/lib/pdk/generate/provider.rb +28 -28
  82. data/lib/pdk/generate/puppet_class.rb +43 -43
  83. data/lib/pdk/generate/puppet_object.rb +232 -232
  84. data/lib/pdk/generate/task.rb +68 -68
  85. data/lib/pdk/generate/transport.rb +33 -33
  86. data/lib/pdk/generate.rb +24 -24
  87. data/lib/pdk/i18n.rb +4 -4
  88. data/lib/pdk/logger.rb +45 -45
  89. data/lib/pdk/module/build.rb +322 -322
  90. data/lib/pdk/module/convert.rb +296 -296
  91. data/lib/pdk/module/metadata.rb +202 -202
  92. data/lib/pdk/module/release.rb +260 -260
  93. data/lib/pdk/module/update.rb +131 -131
  94. data/lib/pdk/module/update_manager.rb +227 -227
  95. data/lib/pdk/module.rb +30 -30
  96. data/lib/pdk/report/event.rb +370 -370
  97. data/lib/pdk/report.rb +121 -121
  98. data/lib/pdk/template/fetcher/git.rb +85 -85
  99. data/lib/pdk/template/fetcher/local.rb +28 -28
  100. data/lib/pdk/template/fetcher.rb +98 -98
  101. data/lib/pdk/template/renderer/v1/legacy_template_dir.rb +116 -116
  102. data/lib/pdk/template/renderer/v1/renderer.rb +132 -132
  103. data/lib/pdk/template/renderer/v1/template_file.rb +102 -102
  104. data/lib/pdk/template/renderer/v1.rb +25 -25
  105. data/lib/pdk/template/renderer.rb +96 -96
  106. data/lib/pdk/template/template_dir.rb +67 -67
  107. data/lib/pdk/template.rb +59 -59
  108. data/lib/pdk/tests/unit.rb +252 -252
  109. data/lib/pdk/util/bundler.rb +259 -259
  110. data/lib/pdk/util/changelog_generator.rb +137 -137
  111. data/lib/pdk/util/env.rb +47 -47
  112. data/lib/pdk/util/filesystem.rb +138 -138
  113. data/lib/pdk/util/git.rb +179 -179
  114. data/lib/pdk/util/json_finder.rb +85 -85
  115. data/lib/pdk/util/puppet_strings.rb +125 -125
  116. data/lib/pdk/util/puppet_version.rb +266 -266
  117. data/lib/pdk/util/ruby_version.rb +179 -179
  118. data/lib/pdk/util/template_uri.rb +295 -295
  119. data/lib/pdk/util/vendored_file.rb +93 -93
  120. data/lib/pdk/util/version.rb +43 -43
  121. data/lib/pdk/util/windows/api_types.rb +82 -82
  122. data/lib/pdk/util/windows/file.rb +36 -36
  123. data/lib/pdk/util/windows/process.rb +79 -79
  124. data/lib/pdk/util/windows/string.rb +16 -16
  125. data/lib/pdk/util/windows.rb +15 -15
  126. data/lib/pdk/util.rb +278 -278
  127. data/lib/pdk/validate/control_repo/control_repo_validator_group.rb +23 -23
  128. data/lib/pdk/validate/control_repo/environment_conf_validator.rb +98 -98
  129. data/lib/pdk/validate/external_command_validator.rb +208 -208
  130. data/lib/pdk/validate/internal_ruby_validator.rb +100 -100
  131. data/lib/pdk/validate/invokable_validator.rb +228 -228
  132. data/lib/pdk/validate/metadata/metadata_json_lint_validator.rb +86 -86
  133. data/lib/pdk/validate/metadata/metadata_syntax_validator.rb +78 -78
  134. data/lib/pdk/validate/metadata/metadata_validator_group.rb +20 -20
  135. data/lib/pdk/validate/puppet/puppet_epp_validator.rb +133 -133
  136. data/lib/pdk/validate/puppet/puppet_lint_validator.rb +66 -66
  137. data/lib/pdk/validate/puppet/puppet_syntax_validator.rb +137 -137
  138. data/lib/pdk/validate/puppet/puppet_validator_group.rb +21 -21
  139. data/lib/pdk/validate/ruby/ruby_rubocop_validator.rb +80 -80
  140. data/lib/pdk/validate/ruby/ruby_validator_group.rb +19 -19
  141. data/lib/pdk/validate/tasks/tasks_metadata_lint_validator.rb +88 -88
  142. data/lib/pdk/validate/tasks/tasks_name_validator.rb +50 -50
  143. data/lib/pdk/validate/tasks/tasks_validator_group.rb +20 -20
  144. data/lib/pdk/validate/validator.rb +118 -118
  145. data/lib/pdk/validate/validator_group.rb +104 -104
  146. data/lib/pdk/validate/yaml/yaml_syntax_validator.rb +95 -95
  147. data/lib/pdk/validate/yaml/yaml_validator_group.rb +19 -19
  148. data/lib/pdk/validate.rb +94 -94
  149. data/lib/pdk/version.rb +4 -4
  150. data/lib/pdk.rb +76 -76
  151. data/locales/config.yaml +21 -21
  152. data/locales/pdk.pot +2111 -2094
  153. metadata +3 -3
@@ -1,93 +1,93 @@
1
- require 'pdk'
2
-
3
- module PDK
4
- module Util
5
- class VendoredFile
6
- class DownloadError < StandardError; end
7
-
8
- attr_reader :file_name
9
- attr_reader :url
10
-
11
- def initialize(file_name, url)
12
- @file_name = file_name
13
- @url = url
14
- end
15
-
16
- def read
17
- require 'pdk/util'
18
- require 'pdk/util/filesystem'
19
-
20
- return PDK::Util::Filesystem.read_file(package_vendored_path) if PDK::Util.package_install?
21
- return PDK::Util::Filesystem.read_file(gem_vendored_path) if PDK::Util::Filesystem.file?(gem_vendored_path)
22
-
23
- content = download_file
24
-
25
- # TODO: should only write if it's valid JSON
26
- # TODO: need a way to invalidate if out of date
27
- PDK::Util::Filesystem.mkdir_p(File.dirname(gem_vendored_path))
28
- PDK::Util::Filesystem.write_file(gem_vendored_path, content)
29
- content
30
- end
31
-
32
- private
33
-
34
- def download_file
35
- require 'uri'
36
- require 'net/https'
37
- require 'openssl'
38
-
39
- http_errors = [
40
- EOFError,
41
- Errno::ECONNRESET,
42
- Errno::EINVAL,
43
- Errno::ECONNREFUSED,
44
- Net::HTTPBadResponse,
45
- Net::HTTPHeaderSyntaxError,
46
- Net::ProtocolError,
47
- Timeout::Error,
48
- ]
49
-
50
- PDK.logger.debug _('%{file_name} was not found in the cache, downloading it from %{url}.') % {
51
- file_name: file_name,
52
- url: url,
53
- }
54
-
55
- uri = URI.parse(url)
56
- http = Net::HTTP.new(uri.host, uri.port)
57
- http.use_ssl = true
58
- # TODO: Get rid of this
59
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE if Gem.win_platform?
60
- request = Net::HTTP::Get.new(uri.request_uri)
61
- response = http.request(request)
62
-
63
- unless response.code == '200'
64
- raise DownloadError, _('Unable to download %{url}. %{code}: %{message}.') % {
65
- url: url,
66
- code: response.code,
67
- message: response.message,
68
- }
69
- end
70
-
71
- response.body
72
- rescue *http_errors => e
73
- raise DownloadError, _('Unable to download %{url}. Check internet connectivity and try again. %{error}') % {
74
- url: url,
75
- error: e,
76
- }
77
- end
78
-
79
- def package_vendored_path
80
- require 'pdk/util'
81
-
82
- @package_vendored_path ||= File.join(PDK::Util.package_cachedir, file_name)
83
- end
84
-
85
- def gem_vendored_path
86
- require 'pdk/util'
87
- require 'pdk/version'
88
-
89
- @gem_vendored_path ||= File.join(PDK::Util.cachedir, PDK::VERSION, file_name)
90
- end
91
- end
92
- end
93
- end
1
+ require 'pdk'
2
+
3
+ module PDK
4
+ module Util
5
+ class VendoredFile
6
+ class DownloadError < StandardError; end
7
+
8
+ attr_reader :file_name
9
+ attr_reader :url
10
+
11
+ def initialize(file_name, url)
12
+ @file_name = file_name
13
+ @url = url
14
+ end
15
+
16
+ def read
17
+ require 'pdk/util'
18
+ require 'pdk/util/filesystem'
19
+
20
+ return PDK::Util::Filesystem.read_file(package_vendored_path) if PDK::Util.package_install?
21
+ return PDK::Util::Filesystem.read_file(gem_vendored_path) if PDK::Util::Filesystem.file?(gem_vendored_path)
22
+
23
+ content = download_file
24
+
25
+ # TODO: should only write if it's valid JSON
26
+ # TODO: need a way to invalidate if out of date
27
+ PDK::Util::Filesystem.mkdir_p(File.dirname(gem_vendored_path))
28
+ PDK::Util::Filesystem.write_file(gem_vendored_path, content)
29
+ content
30
+ end
31
+
32
+ private
33
+
34
+ def download_file
35
+ require 'uri'
36
+ require 'net/https'
37
+ require 'openssl'
38
+
39
+ http_errors = [
40
+ EOFError,
41
+ Errno::ECONNRESET,
42
+ Errno::EINVAL,
43
+ Errno::ECONNREFUSED,
44
+ Net::HTTPBadResponse,
45
+ Net::HTTPHeaderSyntaxError,
46
+ Net::ProtocolError,
47
+ Timeout::Error,
48
+ ]
49
+
50
+ PDK.logger.debug _('%{file_name} was not found in the cache, downloading it from %{url}.') % {
51
+ file_name: file_name,
52
+ url: url,
53
+ }
54
+
55
+ uri = URI.parse(url)
56
+ http = Net::HTTP.new(uri.host, uri.port)
57
+ http.use_ssl = true
58
+ # TODO: Get rid of this
59
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE if Gem.win_platform?
60
+ request = Net::HTTP::Get.new(uri.request_uri)
61
+ response = http.request(request)
62
+
63
+ unless response.code == '200'
64
+ raise DownloadError, _('Unable to download %{url}. %{code}: %{message}.') % {
65
+ url: url,
66
+ code: response.code,
67
+ message: response.message,
68
+ }
69
+ end
70
+
71
+ response.body
72
+ rescue *http_errors => e
73
+ raise DownloadError, _('Unable to download %{url}. Check internet connectivity and try again. %{error}') % {
74
+ url: url,
75
+ error: e,
76
+ }
77
+ end
78
+
79
+ def package_vendored_path
80
+ require 'pdk/util'
81
+
82
+ @package_vendored_path ||= File.join(PDK::Util.package_cachedir, file_name)
83
+ end
84
+
85
+ def gem_vendored_path
86
+ require 'pdk/util'
87
+ require 'pdk/version'
88
+
89
+ @gem_vendored_path ||= File.join(PDK::Util.cachedir, PDK::VERSION, file_name)
90
+ end
91
+ end
92
+ end
93
+ end
@@ -1,43 +1,43 @@
1
- require 'pdk'
2
-
3
- module PDK
4
- module Util
5
- module Version
6
- def self.version_string
7
- require 'pdk/version'
8
-
9
- "#{PDK::VERSION} #{pdk_ref}".strip.freeze
10
- end
11
-
12
- def self.pdk_ref
13
- ref = "#{pkg_sha} #{git_ref}".strip
14
- ref.empty? ? nil : "(#{ref})"
15
- end
16
-
17
- def self.pkg_sha
18
- if version_file && PDK::Util::Filesystem.exist?(version_file)
19
- ver = PDK::Util::Filesystem.read_file(version_file)
20
- sha = ver.strip.split('.')[5] unless ver.nil?
21
- end
22
-
23
- sha
24
- end
25
-
26
- def self.git_ref
27
- require 'pdk/util/git'
28
- source_git_dir = File.join(PDK::Util::Filesystem.expand_path('../../..', File.dirname(__FILE__)), '.git')
29
-
30
- return unless PDK::Util::Filesystem.directory?(source_git_dir)
31
-
32
- PDK::Util::Git.describe(source_git_dir)
33
- end
34
-
35
- def self.version_file
36
- require 'pdk/util'
37
-
38
- # FIXME: this gets called a LOT and doesn't currently get cached
39
- PDK::Util.find_upwards('PDK_VERSION', File.dirname(__FILE__))
40
- end
41
- end
42
- end
43
- end
1
+ require 'pdk'
2
+
3
+ module PDK
4
+ module Util
5
+ module Version
6
+ def self.version_string
7
+ require 'pdk/version'
8
+
9
+ "#{PDK::VERSION} #{pdk_ref}".strip.freeze
10
+ end
11
+
12
+ def self.pdk_ref
13
+ ref = "#{pkg_sha} #{git_ref}".strip
14
+ ref.empty? ? nil : "(#{ref})"
15
+ end
16
+
17
+ def self.pkg_sha
18
+ if version_file && PDK::Util::Filesystem.exist?(version_file)
19
+ ver = PDK::Util::Filesystem.read_file(version_file)
20
+ sha = ver.strip.split('.')[5] unless ver.nil?
21
+ end
22
+
23
+ sha
24
+ end
25
+
26
+ def self.git_ref
27
+ require 'pdk/util/git'
28
+ source_git_dir = File.join(PDK::Util::Filesystem.expand_path('../../..', File.dirname(__FILE__)), '.git')
29
+
30
+ return unless PDK::Util::Filesystem.directory?(source_git_dir)
31
+
32
+ PDK::Util::Git.describe(source_git_dir)
33
+ end
34
+
35
+ def self.version_file
36
+ require 'pdk/util'
37
+
38
+ # FIXME: this gets called a LOT and doesn't currently get cached
39
+ PDK::Util.find_upwards('PDK_VERSION', File.dirname(__FILE__))
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,82 +1,82 @@
1
- require 'ffi'
2
- require 'pdk/util/windows/string'
3
-
4
- module PDK::Util::Windows::APITypes
5
- module ::FFI::Library
6
- def attach_function_private(*args)
7
- attach_function(*args)
8
- private args[0]
9
- end
10
- end
11
-
12
- class ::FFI::Pointer
13
- def self.from_string_to_wide_string(str, &_block)
14
- str = PDK::Util::Windows::String.wide_string(str)
15
- FFI::MemoryPointer.new(:byte, str.bytesize) do |ptr|
16
- # uchar here is synonymous with byte
17
- ptr.put_array_of_uchar(0, str.bytes.to_a)
18
-
19
- yield ptr
20
- end
21
-
22
- # ptr has already had free called, so nothing to return
23
- nil
24
- end
25
-
26
- def read_wide_string(char_length, dst_encoding = Encoding::UTF_8, encode_options = {})
27
- # char_length is number of wide chars (typically excluding NULLs), *not* bytes
28
- str = get_bytes(0, char_length * 2).force_encoding('UTF-16LE')
29
- str.encode(dst_encoding, str.encoding, encode_options)
30
- rescue StandardError => e
31
- PDK.logger.debug _('Unable to convert value %{string} to encoding %{encoding} due to %{error}') % {
32
- string: str.dump,
33
- encoding: dst_encoding,
34
- error: e.inspect,
35
- }
36
- raise
37
- end
38
-
39
- def read_arbitrary_wide_string_up_to(max_char_length = 512, null_terminator = :single_null, encode_options = {})
40
- unless [:single_null, :double_null].include?(null_terminator)
41
- raise ArgumentError, _(
42
- 'Unable to read wide strings with %{null_terminator} terminal nulls',
43
- ) % { null_terminator: null_terminator }
44
- end
45
-
46
- terminator_width = (null_terminator == :single_null) ? 1 : 2
47
- reader_method = (null_terminator == :single_null) ? :get_uint16 : :get_uint32
48
-
49
- # Look for the null_terminator; if found, read up to that null
50
- # (exclusive)
51
- (0...max_char_length - terminator_width).each do |i|
52
- return read_wide_string(i, Encoding::UTF_8, encode_options) if send(reader_method, (i * 2)).zero?
53
- end
54
-
55
- # String is longer than the max, read just up to the max
56
- read_wide_string(max_char_length, Encoding::UTF_8, encode_options)
57
- end
58
- end
59
-
60
- # FFI Types
61
- # https://github.com/ffi/ffi/wiki/Types
62
-
63
- # Windows - Common Data Types
64
- # https://msdn.microsoft.com/en-us/library/cc230309.aspx
65
-
66
- # Windows Data Types
67
- # https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx
68
-
69
- FFI.typedef :uint32, :dword
70
- # buffer_inout is similar to pointer (platform specific), but optimized for buffers
71
- FFI.typedef :buffer_inout, :lpwstr
72
- # buffer_in is similar to pointer (platform specific), but optimized for CONST read only buffers
73
- FFI.typedef :buffer_in, :lpcwstr
74
- # 8 bits per byte
75
- FFI.typedef :uchar, :byte
76
- FFI.typedef :uint16, :wchar
77
-
78
- # FFI bool can be only 1 byte at times,
79
- # Win32 BOOL is a signed int, and is always 4 bytes, even on x64
80
- # https://blogs.msdn.com/b/oldnewthing/archive/2011/03/28/10146459.aspx
81
- FFI.typedef :int32, :win32_bool
82
- end
1
+ require 'ffi'
2
+ require 'pdk/util/windows/string'
3
+
4
+ module PDK::Util::Windows::APITypes
5
+ module ::FFI::Library
6
+ def attach_function_private(*args)
7
+ attach_function(*args)
8
+ private args[0]
9
+ end
10
+ end
11
+
12
+ class ::FFI::Pointer
13
+ def self.from_string_to_wide_string(str, &_block)
14
+ str = PDK::Util::Windows::String.wide_string(str)
15
+ FFI::MemoryPointer.new(:byte, str.bytesize) do |ptr|
16
+ # uchar here is synonymous with byte
17
+ ptr.put_array_of_uchar(0, str.bytes.to_a)
18
+
19
+ yield ptr
20
+ end
21
+
22
+ # ptr has already had free called, so nothing to return
23
+ nil
24
+ end
25
+
26
+ def read_wide_string(char_length, dst_encoding = Encoding::UTF_8, encode_options = {})
27
+ # char_length is number of wide chars (typically excluding NULLs), *not* bytes
28
+ str = get_bytes(0, char_length * 2).force_encoding('UTF-16LE')
29
+ str.encode(dst_encoding, str.encoding, encode_options)
30
+ rescue StandardError => e
31
+ PDK.logger.debug _('Unable to convert value %{string} to encoding %{encoding} due to %{error}') % {
32
+ string: str.dump,
33
+ encoding: dst_encoding,
34
+ error: e.inspect,
35
+ }
36
+ raise
37
+ end
38
+
39
+ def read_arbitrary_wide_string_up_to(max_char_length = 512, null_terminator = :single_null, encode_options = {})
40
+ unless [:single_null, :double_null].include?(null_terminator)
41
+ raise ArgumentError, _(
42
+ 'Unable to read wide strings with %{null_terminator} terminal nulls',
43
+ ) % { null_terminator: null_terminator }
44
+ end
45
+
46
+ terminator_width = (null_terminator == :single_null) ? 1 : 2
47
+ reader_method = (null_terminator == :single_null) ? :get_uint16 : :get_uint32
48
+
49
+ # Look for the null_terminator; if found, read up to that null
50
+ # (exclusive)
51
+ (0...max_char_length - terminator_width).each do |i|
52
+ return read_wide_string(i, Encoding::UTF_8, encode_options) if send(reader_method, (i * 2)).zero?
53
+ end
54
+
55
+ # String is longer than the max, read just up to the max
56
+ read_wide_string(max_char_length, Encoding::UTF_8, encode_options)
57
+ end
58
+ end
59
+
60
+ # FFI Types
61
+ # https://github.com/ffi/ffi/wiki/Types
62
+
63
+ # Windows - Common Data Types
64
+ # https://msdn.microsoft.com/en-us/library/cc230309.aspx
65
+
66
+ # Windows Data Types
67
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx
68
+
69
+ FFI.typedef :uint32, :dword
70
+ # buffer_inout is similar to pointer (platform specific), but optimized for buffers
71
+ FFI.typedef :buffer_inout, :lpwstr
72
+ # buffer_in is similar to pointer (platform specific), but optimized for CONST read only buffers
73
+ FFI.typedef :buffer_in, :lpcwstr
74
+ # 8 bits per byte
75
+ FFI.typedef :uchar, :byte
76
+ FFI.typedef :uint16, :wchar
77
+
78
+ # FFI bool can be only 1 byte at times,
79
+ # Win32 BOOL is a signed int, and is always 4 bytes, even on x64
80
+ # https://blogs.msdn.com/b/oldnewthing/archive/2011/03/28/10146459.aspx
81
+ FFI.typedef :int32, :win32_bool
82
+ end
@@ -1,36 +1,36 @@
1
- require 'pdk/util/windows'
2
-
3
- module PDK::Util::Windows::File
4
- require 'ffi'
5
- extend FFI::Library
6
- extend PDK::Util::Windows::String
7
-
8
- def get_long_pathname(path)
9
- converted = ''
10
- FFI::Pointer.from_string_to_wide_string(path) do |path_ptr|
11
- # includes terminating NULL
12
- buffer_size = GetLongPathNameW(path_ptr, FFI::Pointer::NULL, 0)
13
- FFI::MemoryPointer.new(:wchar, buffer_size) do |converted_ptr|
14
- if GetLongPathNameW(path_ptr, converted_ptr, buffer_size) == PDK::Util::Windows::WIN32_FALSE
15
- raise _('Failed to call GetLongPathName')
16
- end
17
-
18
- converted = converted_ptr.read_wide_string(buffer_size - 1)
19
- end
20
- end
21
-
22
- converted
23
- end
24
- module_function :get_long_pathname
25
-
26
- ffi_convention :stdcall
27
-
28
- # https://msdn.microsoft.com/en-us/library/windows/desktop/aa364980(v=vs.85).aspx
29
- # DWORD WINAPI GetLongPathName(
30
- # _In_ LPCTSTR lpszShortPath,
31
- # _Out_ LPTSTR lpszLongPath,
32
- # _In_ DWORD cchBuffer
33
- # );
34
- ffi_lib :kernel32
35
- attach_function :GetLongPathNameW, [:lpcwstr, :lpwstr, :dword], :dword
36
- end
1
+ require 'pdk/util/windows'
2
+
3
+ module PDK::Util::Windows::File
4
+ require 'ffi'
5
+ extend FFI::Library
6
+ extend PDK::Util::Windows::String
7
+
8
+ def get_long_pathname(path)
9
+ converted = ''
10
+ FFI::Pointer.from_string_to_wide_string(path) do |path_ptr|
11
+ # includes terminating NULL
12
+ buffer_size = GetLongPathNameW(path_ptr, FFI::Pointer::NULL, 0)
13
+ FFI::MemoryPointer.new(:wchar, buffer_size) do |converted_ptr|
14
+ if GetLongPathNameW(path_ptr, converted_ptr, buffer_size) == PDK::Util::Windows::WIN32_FALSE
15
+ raise _('Failed to call GetLongPathName')
16
+ end
17
+
18
+ converted = converted_ptr.read_wide_string(buffer_size - 1)
19
+ end
20
+ end
21
+
22
+ converted
23
+ end
24
+ module_function :get_long_pathname
25
+
26
+ ffi_convention :stdcall
27
+
28
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa364980(v=vs.85).aspx
29
+ # DWORD WINAPI GetLongPathName(
30
+ # _In_ LPCTSTR lpszShortPath,
31
+ # _Out_ LPTSTR lpszLongPath,
32
+ # _In_ DWORD cchBuffer
33
+ # );
34
+ ffi_lib :kernel32
35
+ attach_function :GetLongPathNameW, [:lpcwstr, :lpwstr, :dword], :dword
36
+ end
@@ -1,79 +1,79 @@
1
- require 'pdk/util/windows'
2
-
3
- module PDK::Util::Windows::Process
4
- require 'ffi'
5
- extend PDK::Util::Windows::String
6
- extend FFI::Library
7
-
8
- def environment_hash
9
- env_ptr = GetEnvironmentStringsW()
10
-
11
- contains_unicode_replacement = ->(string) do
12
- return false unless string.include?("\uFFFD")
13
-
14
- PDK.logger.warning _(
15
- 'Discarding environment variable %{string} which contains invalid ' \
16
- 'bytes',
17
- ) % { string: string }
18
- true
19
- end
20
-
21
- # pass :invalid => :replace to the Ruby String#encode to use replacement
22
- # characters
23
- pairs = env_ptr.read_arbitrary_wide_string_up_to(65_534, :double_null, invalid: :replace)
24
- .split(?\x00)
25
- .reject { |env_str| env_str.nil? || env_str.empty? || env_str[0] == '=' }
26
- .reject { |env_str| contains_unicode_replacement.call(env_str) }
27
- .map { |env_pair| env_pair.split('=', 2) }
28
- Hash[pairs]
29
- ensure
30
- if env_ptr && !env_ptr.null?
31
- if FreeEnvironmentStringsW(env_ptr) == PDK::Util::Windows::WIN32_FALSE
32
- PDK.logger.debug _('FreeEnvironmentStringsW memory leak')
33
- end
34
- end
35
- end
36
- module_function :environment_hash
37
-
38
- def set_environment_variable(name, val)
39
- raise ArgumentError, _('Environment variable name must not be nil or empty') if name.nil? || name.empty?
40
-
41
- FFI::MemoryPointer.from_string_to_wide_string(name) do |name_ptr|
42
- if val.nil?
43
- if SetEnvironmentVariableW(name_ptr, FFI::MemoryPointer::NULL) == PDK::Util::Windows::WIN32_FALSE
44
- raise _('Failed to remove environment variable: %{name}') % { name: name }
45
- end
46
- else
47
- FFI::MemoryPointer.from_string_to_wide_string(val) do |val_ptr|
48
- if SetEnvironmentVariableW(name_ptr, val_ptr) == PDK::Util::Windows::WIN32_FALSE
49
- raise _('Failed to set environment variaible: %{name}') % { name: name }
50
- end
51
- end
52
- end
53
- end
54
- end
55
- module_function :set_environment_variable
56
-
57
- ffi_convention :stdcall
58
-
59
- # https://msdn.microsoft.com/en-us/library/windows/desktop/ms683187(v=vs.85).aspx
60
- # LPTCH GetEnvironmentStrings(void);
61
- ffi_lib :kernel32
62
- attach_function_private :GetEnvironmentStringsW, [], :pointer
63
-
64
- # https://msdn.microsoft.com/en-us/library/windows/desktop/ms683151(v=vs.85).aspx
65
- # BOOL FreeEnvironmentStrings(
66
- # _In_ LPTCH lpszEnvironmentBlock
67
- # );
68
- ffi_lib :kernel32
69
- attach_function_private :FreeEnvironmentStringsW, [:pointer], :win32_bool
70
-
71
- # https://msdn.microsoft.com/en-us/library/windows/desktop/ms686206(v=vs.85).aspx
72
- # BOOL WINAPI SetEnvironmentVariableW(
73
- # _In_ LPCTSTR lpName,
74
- # _In_opt_ LPCTSTR lpValue
75
- # );
76
- ffi_lib :kernel32
77
- attach_function_private :SetEnvironmentVariableW, [:lpcwstr, :lpcwstr],
78
- :win32_bool
79
- end
1
+ require 'pdk/util/windows'
2
+
3
+ module PDK::Util::Windows::Process
4
+ require 'ffi'
5
+ extend PDK::Util::Windows::String
6
+ extend FFI::Library
7
+
8
+ def environment_hash
9
+ env_ptr = GetEnvironmentStringsW()
10
+
11
+ contains_unicode_replacement = ->(string) do
12
+ return false unless string.include?("\uFFFD")
13
+
14
+ PDK.logger.warning _(
15
+ 'Discarding environment variable %{string} which contains invalid ' \
16
+ 'bytes',
17
+ ) % { string: string }
18
+ true
19
+ end
20
+
21
+ # pass :invalid => :replace to the Ruby String#encode to use replacement
22
+ # characters
23
+ pairs = env_ptr.read_arbitrary_wide_string_up_to(65_534, :double_null, invalid: :replace)
24
+ .split(?\x00)
25
+ .reject { |env_str| env_str.nil? || env_str.empty? || env_str[0] == '=' }
26
+ .reject { |env_str| contains_unicode_replacement.call(env_str) }
27
+ .map { |env_pair| env_pair.split('=', 2) }
28
+ Hash[pairs]
29
+ ensure
30
+ if env_ptr && !env_ptr.null?
31
+ if FreeEnvironmentStringsW(env_ptr) == PDK::Util::Windows::WIN32_FALSE
32
+ PDK.logger.debug _('FreeEnvironmentStringsW memory leak')
33
+ end
34
+ end
35
+ end
36
+ module_function :environment_hash
37
+
38
+ def set_environment_variable(name, val)
39
+ raise ArgumentError, _('Environment variable name must not be nil or empty') if name.nil? || name.empty?
40
+
41
+ FFI::MemoryPointer.from_string_to_wide_string(name) do |name_ptr|
42
+ if val.nil?
43
+ if SetEnvironmentVariableW(name_ptr, FFI::MemoryPointer::NULL) == PDK::Util::Windows::WIN32_FALSE
44
+ raise _('Failed to remove environment variable: %{name}') % { name: name }
45
+ end
46
+ else
47
+ FFI::MemoryPointer.from_string_to_wide_string(val) do |val_ptr|
48
+ if SetEnvironmentVariableW(name_ptr, val_ptr) == PDK::Util::Windows::WIN32_FALSE
49
+ raise _('Failed to set environment variaible: %{name}') % { name: name }
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ module_function :set_environment_variable
56
+
57
+ ffi_convention :stdcall
58
+
59
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms683187(v=vs.85).aspx
60
+ # LPTCH GetEnvironmentStrings(void);
61
+ ffi_lib :kernel32
62
+ attach_function_private :GetEnvironmentStringsW, [], :pointer
63
+
64
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms683151(v=vs.85).aspx
65
+ # BOOL FreeEnvironmentStrings(
66
+ # _In_ LPTCH lpszEnvironmentBlock
67
+ # );
68
+ ffi_lib :kernel32
69
+ attach_function_private :FreeEnvironmentStringsW, [:pointer], :win32_bool
70
+
71
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms686206(v=vs.85).aspx
72
+ # BOOL WINAPI SetEnvironmentVariableW(
73
+ # _In_ LPCTSTR lpName,
74
+ # _In_opt_ LPCTSTR lpValue
75
+ # );
76
+ ffi_lib :kernel32
77
+ attach_function_private :SetEnvironmentVariableW, [:lpcwstr, :lpcwstr],
78
+ :win32_bool
79
+ end