pdk 2.3.0 → 2.4.0

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.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1329 -1321
  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 -277
  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 +2094 -2094
  153. metadata +5 -6
@@ -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