pdk 1.9.0 → 3.2.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 (163) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +744 -711
  3. data/README.md +23 -21
  4. data/lib/pdk/answer_file.rb +3 -112
  5. data/lib/pdk/bolt.rb +20 -0
  6. data/lib/pdk/cli/build.rb +51 -54
  7. data/lib/pdk/cli/bundle.rb +33 -29
  8. data/lib/pdk/cli/console.rb +148 -0
  9. data/lib/pdk/cli/convert.rb +46 -37
  10. data/lib/pdk/cli/env.rb +51 -0
  11. data/lib/pdk/cli/errors.rb +4 -3
  12. data/lib/pdk/cli/exec/command.rb +285 -0
  13. data/lib/pdk/cli/exec/interactive_command.rb +109 -0
  14. data/lib/pdk/cli/exec.rb +32 -201
  15. data/lib/pdk/cli/exec_group.rb +79 -43
  16. data/lib/pdk/cli/get/config.rb +26 -0
  17. data/lib/pdk/cli/get.rb +22 -0
  18. data/lib/pdk/cli/new/class.rb +20 -22
  19. data/lib/pdk/cli/new/defined_type.rb +21 -21
  20. data/lib/pdk/cli/new/fact.rb +27 -0
  21. data/lib/pdk/cli/new/function.rb +27 -0
  22. data/lib/pdk/cli/new/module.rb +40 -29
  23. data/lib/pdk/cli/new/provider.rb +18 -18
  24. data/lib/pdk/cli/new/task.rb +23 -22
  25. data/lib/pdk/cli/new/test.rb +52 -0
  26. data/lib/pdk/cli/new/transport.rb +27 -0
  27. data/lib/pdk/cli/new.rb +15 -9
  28. data/lib/pdk/cli/release/prep.rb +39 -0
  29. data/lib/pdk/cli/release/publish.rb +46 -0
  30. data/lib/pdk/cli/release.rb +185 -0
  31. data/lib/pdk/cli/remove/config.rb +83 -0
  32. data/lib/pdk/cli/remove.rb +22 -0
  33. data/lib/pdk/cli/set/config.rb +121 -0
  34. data/lib/pdk/cli/set.rb +22 -0
  35. data/lib/pdk/cli/test/unit.rb +71 -69
  36. data/lib/pdk/cli/test.rb +9 -8
  37. data/lib/pdk/cli/update.rb +38 -21
  38. data/lib/pdk/cli/util/command_redirector.rb +13 -3
  39. data/lib/pdk/cli/util/interview.rb +25 -9
  40. data/lib/pdk/cli/util/option_normalizer.rb +6 -6
  41. data/lib/pdk/cli/util/option_validator.rb +19 -9
  42. data/lib/pdk/cli/util/spinner.rb +13 -0
  43. data/lib/pdk/cli/util/update_manager_printer.rb +82 -0
  44. data/lib/pdk/cli/util.rb +105 -48
  45. data/lib/pdk/cli/validate.rb +96 -111
  46. data/lib/pdk/cli.rb +134 -87
  47. data/lib/pdk/config/errors.rb +5 -0
  48. data/lib/pdk/config/ini_file.rb +184 -0
  49. data/lib/pdk/config/ini_file_setting.rb +35 -0
  50. data/lib/pdk/config/json.rb +35 -0
  51. data/lib/pdk/config/json_schema_namespace.rb +137 -0
  52. data/lib/pdk/config/json_schema_setting.rb +51 -0
  53. data/lib/pdk/config/json_with_schema.rb +47 -0
  54. data/lib/pdk/config/namespace.rb +362 -0
  55. data/lib/pdk/config/setting.rb +134 -0
  56. data/lib/pdk/config/task_schema.json +116 -0
  57. data/lib/pdk/config/validator.rb +31 -0
  58. data/lib/pdk/config/yaml.rb +41 -0
  59. data/lib/pdk/config/yaml_with_schema.rb +51 -0
  60. data/lib/pdk/config.rb +304 -0
  61. data/lib/pdk/context/control_repo.rb +61 -0
  62. data/lib/pdk/context/module.rb +28 -0
  63. data/lib/pdk/context/none.rb +22 -0
  64. data/lib/pdk/context.rb +98 -0
  65. data/lib/pdk/control_repo.rb +89 -0
  66. data/lib/pdk/generate/defined_type.rb +27 -33
  67. data/lib/pdk/generate/fact.rb +26 -0
  68. data/lib/pdk/generate/function.rb +49 -0
  69. data/lib/pdk/generate/module.rb +160 -153
  70. data/lib/pdk/generate/provider.rb +16 -69
  71. data/lib/pdk/generate/puppet_class.rb +27 -32
  72. data/lib/pdk/generate/puppet_object.rb +100 -159
  73. data/lib/pdk/generate/task.rb +34 -51
  74. data/lib/pdk/generate/transport.rb +34 -0
  75. data/lib/pdk/generate.rb +21 -8
  76. data/lib/pdk/logger.rb +24 -6
  77. data/lib/pdk/module/build.rb +125 -37
  78. data/lib/pdk/module/convert.rb +146 -65
  79. data/lib/pdk/module/metadata.rb +72 -71
  80. data/lib/pdk/module/release.rb +255 -0
  81. data/lib/pdk/module/update.rb +48 -37
  82. data/lib/pdk/module/update_manager.rb +75 -39
  83. data/lib/pdk/module.rb +10 -2
  84. data/lib/pdk/monkey_patches.rb +268 -0
  85. data/lib/pdk/report/event.rb +36 -48
  86. data/lib/pdk/report.rb +35 -22
  87. data/lib/pdk/template/fetcher/git.rb +84 -0
  88. data/lib/pdk/template/fetcher/local.rb +29 -0
  89. data/lib/pdk/template/fetcher.rb +100 -0
  90. data/lib/pdk/template/renderer/v1/legacy_template_dir.rb +108 -0
  91. data/lib/pdk/template/renderer/v1/renderer.rb +131 -0
  92. data/lib/pdk/template/renderer/v1/template_file.rb +100 -0
  93. data/lib/pdk/template/renderer/v1.rb +25 -0
  94. data/lib/pdk/template/renderer.rb +97 -0
  95. data/lib/pdk/template/template_dir.rb +67 -0
  96. data/lib/pdk/template.rb +52 -0
  97. data/lib/pdk/tests/unit.rb +101 -51
  98. data/lib/pdk/util/bundler.rb +44 -42
  99. data/lib/pdk/util/changelog_generator.rb +138 -0
  100. data/lib/pdk/util/env.rb +48 -0
  101. data/lib/pdk/util/filesystem.rb +139 -2
  102. data/lib/pdk/util/git.rb +108 -8
  103. data/lib/pdk/util/json_finder.rb +86 -0
  104. data/lib/pdk/util/puppet_strings.rb +125 -0
  105. data/lib/pdk/util/puppet_version.rb +71 -87
  106. data/lib/pdk/util/ruby_version.rb +49 -25
  107. data/lib/pdk/util/template_uri.rb +283 -0
  108. data/lib/pdk/util/vendored_file.rb +34 -42
  109. data/lib/pdk/util/version.rb +11 -10
  110. data/lib/pdk/util/windows/api_types.rb +74 -44
  111. data/lib/pdk/util/windows/file.rb +31 -27
  112. data/lib/pdk/util/windows/process.rb +74 -0
  113. data/lib/pdk/util/windows/string.rb +19 -12
  114. data/lib/pdk/util/windows.rb +2 -0
  115. data/lib/pdk/util.rb +111 -124
  116. data/lib/pdk/validate/control_repo/control_repo_validator_group.rb +23 -0
  117. data/lib/pdk/validate/control_repo/environment_conf_validator.rb +98 -0
  118. data/lib/pdk/validate/external_command_validator.rb +213 -0
  119. data/lib/pdk/validate/internal_ruby_validator.rb +101 -0
  120. data/lib/pdk/validate/invokable_validator.rb +238 -0
  121. data/lib/pdk/validate/metadata/metadata_json_lint_validator.rb +84 -0
  122. data/lib/pdk/validate/metadata/metadata_syntax_validator.rb +76 -0
  123. data/lib/pdk/validate/metadata/metadata_validator_group.rb +20 -0
  124. data/lib/pdk/validate/puppet/puppet_epp_validator.rb +131 -0
  125. data/lib/pdk/validate/puppet/puppet_lint_validator.rb +66 -0
  126. data/lib/pdk/validate/puppet/puppet_plan_syntax_validator.rb +38 -0
  127. data/lib/pdk/validate/puppet/puppet_syntax_validator.rb +135 -0
  128. data/lib/pdk/validate/puppet/puppet_validator_group.rb +22 -0
  129. data/lib/pdk/validate/ruby/ruby_rubocop_validator.rb +79 -0
  130. data/lib/pdk/validate/ruby/ruby_validator_group.rb +19 -0
  131. data/lib/pdk/validate/tasks/tasks_metadata_lint_validator.rb +83 -0
  132. data/lib/pdk/validate/tasks/tasks_name_validator.rb +45 -0
  133. data/lib/pdk/validate/tasks/tasks_validator_group.rb +20 -0
  134. data/lib/pdk/validate/validator.rb +120 -0
  135. data/lib/pdk/validate/validator_group.rb +107 -0
  136. data/lib/pdk/validate/yaml/yaml_syntax_validator.rb +86 -0
  137. data/lib/pdk/validate/yaml/yaml_validator_group.rb +19 -0
  138. data/lib/pdk/validate.rb +86 -12
  139. data/lib/pdk/version.rb +2 -2
  140. data/lib/pdk.rb +60 -10
  141. metadata +138 -100
  142. data/lib/pdk/cli/module/build.rb +0 -14
  143. data/lib/pdk/cli/module/generate.rb +0 -45
  144. data/lib/pdk/cli/module.rb +0 -14
  145. data/lib/pdk/i18n.rb +0 -4
  146. data/lib/pdk/module/templatedir.rb +0 -321
  147. data/lib/pdk/template_file.rb +0 -95
  148. data/lib/pdk/validate/base_validator.rb +0 -215
  149. data/lib/pdk/validate/metadata/metadata_json_lint.rb +0 -86
  150. data/lib/pdk/validate/metadata/metadata_syntax.rb +0 -109
  151. data/lib/pdk/validate/metadata_validator.rb +0 -30
  152. data/lib/pdk/validate/puppet/puppet_lint.rb +0 -67
  153. data/lib/pdk/validate/puppet/puppet_syntax.rb +0 -112
  154. data/lib/pdk/validate/puppet_validator.rb +0 -30
  155. data/lib/pdk/validate/ruby/rubocop.rb +0 -77
  156. data/lib/pdk/validate/ruby_validator.rb +0 -29
  157. data/lib/pdk/validate/tasks/metadata_lint.rb +0 -126
  158. data/lib/pdk/validate/tasks/name.rb +0 -88
  159. data/lib/pdk/validate/tasks_validator.rb +0 -33
  160. data/lib/pdk/validate/yaml/syntax.rb +0 -109
  161. data/lib/pdk/validate/yaml_validator.rb +0 -31
  162. data/locales/config.yaml +0 -21
  163. data/locales/pdk.pot +0 -1291
@@ -1,9 +1,4 @@
1
- require 'diff/lcs'
2
- require 'diff/lcs/hunk'
3
- require 'English'
4
- require 'fileutils'
5
- require 'set'
6
- require 'pdk/util/filesystem'
1
+ require 'pdk'
7
2
 
8
3
  module PDK
9
4
  module Module
@@ -11,9 +6,12 @@ module PDK
11
6
  # Initialises a blank UpdateManager object, which is used to store and
12
7
  # process file additions/removals/modifications.
13
8
  def initialize
9
+ require 'set'
10
+
14
11
  @modified_files = Set.new
15
12
  @added_files = Set.new
16
13
  @removed_files = Set.new
14
+ @executable_files = Set.new
17
15
  @diff_cache = {}
18
16
  end
19
17
 
@@ -40,17 +38,27 @@ module PDK
40
38
  @removed_files << path
41
39
  end
42
40
 
41
+ # Store a pending file execute mode change.
42
+ #
43
+ # @param path [String] The path to the file to be made executable.
44
+ def make_file_executable(path)
45
+ @executable_files << path
46
+ end
47
+
43
48
  # Generate a summary of the changes that will be applied to the module.
44
49
  #
45
50
  # @raise (see #calculate_diffs)
46
51
  # @return [Hash{Symbol => Set,Hash}] the summary of the pending changes.
47
52
  def changes
53
+ require 'pdk/util/filesystem'
54
+
48
55
  calculate_diffs
49
56
 
50
57
  {
51
- added: @added_files,
52
- removed: @removed_files.select { |f| File.exist?(f) },
53
- modified: @diff_cache.reject { |_, value| value.nil? },
58
+ added: @added_files,
59
+ removed: @removed_files.select { |f| PDK::Util::Filesystem.exist?(f) },
60
+ modified: @diff_cache.compact,
61
+ 'made executable': @executable_files
54
62
  }
55
63
  end
56
64
 
@@ -61,7 +69,8 @@ module PDK
61
69
  def changes?
62
70
  !changes[:added].empty? ||
63
71
  !changes[:removed].empty? ||
64
- changes[:modified].any? { |_, value| !value.nil? }
72
+ changes[:modified].any? { |_, value| !value.nil? } ||
73
+ !changes[:'made executable'].empty?
65
74
  end
66
75
 
67
76
  # Check if the update manager will change the specified file upon sync.
@@ -73,7 +82,16 @@ module PDK
73
82
  def changed?(path)
74
83
  changes[:added].any? { |add| add[:path] == path } ||
75
84
  changes[:removed].include?(path) ||
76
- changes[:modified].keys.include?(path)
85
+ changes[:modified].key?(path) ||
86
+ changes[:'made executable'].include?(path)
87
+ end
88
+
89
+ def clear!
90
+ @modified_files.clear
91
+ @added_files.clear
92
+ @removed_files.clear
93
+ @executable_files.clear
94
+ nil
77
95
  end
78
96
 
79
97
  # Apply any pending changes stored in the UpdateManager to the module.
@@ -94,6 +112,10 @@ module PDK
94
112
  files_to_write.each do |file|
95
113
  write_file(file[:path], file[:content])
96
114
  end
115
+
116
+ @executable_files.each do |file|
117
+ update_execute_bits(file)
118
+ end
97
119
  end
98
120
 
99
121
  # Remove a file from disk.
@@ -106,17 +128,16 @@ module PDK
106
128
  #
107
129
  # @raise [PDK::CLI::ExitWithError] if the file could not be removed.
108
130
  def unlink_file(path)
109
- if File.file?(path)
110
- PDK.logger.debug(_("unlinking '%{path}'") % { path: path })
111
- FileUtils.rm(path)
131
+ require 'pdk/util/filesystem'
132
+
133
+ if PDK::Util::Filesystem.file?(path)
134
+ PDK.logger.debug(format("unlinking '%{path}'", path: path))
135
+ PDK::Util::Filesystem.rm(path)
112
136
  else
113
- PDK.logger.debug(_("'%{path}': already gone") % { path: path })
137
+ PDK.logger.debug(format("'%{path}': already gone", path: path))
114
138
  end
115
- rescue => e
116
- raise PDK::CLI::ExitWithError, _("Unable to remove '%{path}': %{message}") % {
117
- path: path,
118
- message: e.message,
119
- }
139
+ rescue StandardError => e
140
+ raise PDK::CLI::ExitWithError, format("Unable to remove '%{path}': %{message}", path: path, message: e.message)
120
141
  end
121
142
 
122
143
  private
@@ -127,14 +148,14 @@ module PDK
127
148
  # @raise [PDK::CLI::ExitWithError] if a file being modified isn't
128
149
  # readable.
129
150
  def calculate_diffs
151
+ require 'pdk/util/filesystem'
152
+
130
153
  @modified_files.each do |file|
131
154
  next if @diff_cache.key?(file[:path])
132
155
 
133
- unless File.readable?(file[:path])
134
- raise PDK::CLI::ExitWithError, _("Unable to open '%{path}' for reading") % { path: file[:path] }
135
- end
156
+ raise PDK::CLI::ExitWithError, format("Unable to open '%{path}' for reading", path: file[:path]) unless PDK::Util::Filesystem.readable?(file[:path])
136
157
 
137
- old_content = File.read(file[:path])
158
+ old_content = PDK::Util::Filesystem.read_file(file[:path])
138
159
  file_diff = unified_diff(file[:path], old_content, file[:content])
139
160
  @diff_cache[file[:path]] = file_diff
140
161
  end
@@ -147,11 +168,13 @@ module PDK
147
168
  #
148
169
  # @raise [PDK::CLI::ExitWithError] if the file is not writeable.
149
170
  def write_file(path, content)
150
- FileUtils.mkdir_p(File.dirname(path))
151
- PDK.logger.debug(_("writing '%{path}'") % { path: path })
171
+ require 'pdk/util/filesystem'
172
+
173
+ PDK::Util::Filesystem.mkdir_p(File.dirname(path))
174
+ PDK.logger.debug(format("writing '%{path}'", path: path))
152
175
  PDK::Util::Filesystem.write_file(path, content)
153
176
  rescue Errno::EACCES
154
- raise PDK::CLI::ExitWithError, _("You do not have permission to write to '%{path}'") % { path: path }
177
+ raise PDK::CLI::ExitWithError, format("You do not have permission to write to '%{path}'", path: path)
155
178
  end
156
179
 
157
180
  # Generate a unified diff of the changes to be made to a file.
@@ -167,6 +190,9 @@ module PDK
167
190
  #
168
191
  # @return [String] The unified diff of the pending changes to the file.
169
192
  def unified_diff(path, old_content, new_content, lines_of_context = 3)
193
+ require 'diff/lcs'
194
+ require 'English'
195
+
170
196
  output = []
171
197
 
172
198
  old_lines = old_content.split($INPUT_RECORD_SEPARATOR).map(&:chomp)
@@ -174,9 +200,11 @@ module PDK
174
200
 
175
201
  diffs = Diff::LCS.diff(old_lines, new_lines)
176
202
 
177
- return nil if diffs.empty?
203
+ return if diffs.empty?
204
+
205
+ require 'diff/lcs/hunk'
178
206
 
179
- file_mtime = File.stat(path).mtime.localtime.strftime('%Y-%m-%d %H:%M:%S.%N %z')
207
+ file_mtime = PDK::Util::Filesystem.stat(path).mtime.localtime.strftime('%Y-%m-%d %H:%M:%S.%N %z')
180
208
  now = Time.now.localtime.strftime('%Y-%m-%d %H:%M:%S.%N %z')
181
209
 
182
210
  output << "--- #{path}\t#{file_mtime}"
@@ -186,25 +214,33 @@ module PDK
186
214
  file_length_difference = 0
187
215
 
188
216
  diffs.each do |piece|
189
- begin
190
- hunk = Diff::LCS::Hunk.new(old_lines, new_lines, piece, lines_of_context, file_length_difference)
191
- file_length_difference = hunk.file_length_difference
217
+ hunk = Diff::LCS::Hunk.new(old_lines, new_lines, piece, lines_of_context, file_length_difference)
218
+ file_length_difference = hunk.file_length_difference
192
219
 
193
- next unless oldhunk
220
+ next unless oldhunk
194
221
 
195
- # If the hunk overlaps with the oldhunk, merge them.
196
- next if lines_of_context > 0 && hunk.merge(oldhunk)
222
+ # If the hunk overlaps with the oldhunk, merge them.
223
+ next if lines_of_context.positive? && hunk.merge(oldhunk)
197
224
 
198
- output << oldhunk.diff(:unified)
199
- ensure
200
- oldhunk = hunk
201
- end
225
+ output << oldhunk.diff(:unified)
226
+ ensure
227
+ oldhunk = hunk
202
228
  end
203
229
 
204
230
  output << oldhunk.diff(:unified)
205
231
 
206
232
  output.join($INPUT_RECORD_SEPARATOR)
207
233
  end
234
+
235
+ # Set the execute bits on a file
236
+ def update_execute_bits(path)
237
+ require 'pdk/util/filesystem'
238
+
239
+ PDK.logger.debug(format("making '%{path}' executable", path: path))
240
+ PDK::Util::Filesystem.make_executable(path)
241
+ rescue Errno::EACCES
242
+ raise PDK::CLI::ExitWithError, format("You do not have permission to make '%{path}' executable", path: path)
243
+ end
208
244
  end
209
245
  end
210
246
  end
data/lib/pdk/module.rb CHANGED
@@ -1,7 +1,12 @@
1
- require 'pathspec'
2
-
3
1
  module PDK
4
2
  module Module
3
+ autoload :Build, 'pdk/module/build'
4
+ autoload :Convert, 'pdk/module/convert'
5
+ autoload :Metadata, 'pdk/module/metadata'
6
+ autoload :Release, 'pdk/module/release'
7
+ autoload :UpdateManager, 'pdk/module/update_manager'
8
+ autoload :Update, 'pdk/module/update'
9
+
5
10
  DEFAULT_IGNORED = [
6
11
  '/pkg/',
7
12
  '~*',
@@ -10,9 +15,12 @@ module PDK
10
15
  '/REVISION',
11
16
  '/spec/fixtures/modules/',
12
17
  '/vendor/',
18
+ '.DS_Store'
13
19
  ].freeze
14
20
 
15
21
  def default_ignored_pathspec(ignore_dotfiles = true)
22
+ require 'pathspec'
23
+
16
24
  PathSpec.new(DEFAULT_IGNORED).tap do |ps|
17
25
  ps.add('.*') if ignore_dotfiles
18
26
  end
@@ -0,0 +1,268 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OS
4
+ # Os detection: Are we on Windows?
5
+ def self.windows?
6
+ (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
7
+ end
8
+ end
9
+
10
+ # Patch childprocess so that it is Ruby 3 compliant.
11
+ # This could be removed if the following PR is ever merged
12
+ # and released:
13
+ # https://github.com/enkessler/childprocess/pull/185
14
+ module ChildProcess
15
+ class << self
16
+ def build(*args)
17
+ case os
18
+ when :macosx, :linux, :solaris, :bsd, :cygwin, :aix
19
+ if posix_spawn?
20
+ Unix::PosixSpawnProcess.new(*args)
21
+ elsif jruby?
22
+ JRuby::Process.new(*args)
23
+ else
24
+ Unix::ForkExecProcess.new(*args)
25
+ end
26
+ when :windows
27
+ Windows::Process.new(*args)
28
+ else
29
+ raise Error, "unsupported platform #{platform_name.inspect}"
30
+ end
31
+ end
32
+ end
33
+
34
+ class AbstractProcess
35
+ def initialize(*args)
36
+ raise ArgumentError, "all arguments must be String: #{args.inspect}" unless args.all?(String)
37
+
38
+ @args = args
39
+ @started = false
40
+ @exit_code = nil
41
+ @io = nil
42
+ @cwd = nil
43
+ @detach = false
44
+ @duplex = false
45
+ @leader = false
46
+ @environment = {}
47
+ end
48
+ end
49
+
50
+ if OS.windows?
51
+ module Windows
52
+ module Lib
53
+ extend FFI::Library
54
+ def self.msvcrt_name
55
+ RbConfig::CONFIG['RUBY_SO_NAME'][/msvc\w+/] || 'ucrtbase'
56
+ end
57
+
58
+ ffi_lib 'kernel32', msvcrt_name
59
+ ffi_convention :stdcall
60
+
61
+ # We have to redefine the function declarations so that they are available
62
+ # with the patched ffi_lib.
63
+ enum :wait_status, [
64
+ :wait_object_0, 0, # rubocop:disable Naming/VariableNumber
65
+ :wait_timeout, 0x102,
66
+ :wait_abandoned, 0x80,
67
+ :wait_failed, 0xFFFFFFFF
68
+ ]
69
+
70
+ #
71
+ # BOOL WINAPI CreateProcess(
72
+ # __in_opt LPCTSTR lpApplicationName,
73
+ # __inout_opt LPTSTR lpCommandLine,
74
+ # __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes,
75
+ # __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
76
+ # __in BOOL bInheritHandles,
77
+ # __in DWORD dwCreationFlags,
78
+ # __in_opt LPVOID lpEnvironment,
79
+ # __in_opt LPCTSTR lpCurrentDirectory,
80
+ # __in LPSTARTUPINFO lpStartupInfo,
81
+ # __out LPPROCESS_INFORMATION lpProcessInformation
82
+ # );
83
+ #
84
+
85
+ attach_function :create_process, :CreateProcessW, [
86
+ :pointer,
87
+ :buffer_inout,
88
+ :pointer,
89
+ :pointer,
90
+ :bool,
91
+ :ulong,
92
+ :pointer,
93
+ :pointer,
94
+ :pointer,
95
+ :pointer
96
+ ], :bool
97
+
98
+ #
99
+ # DWORD WINAPI FormatMessage(
100
+ # __in DWORD dwFlags,
101
+ # __in_opt LPCVOID lpSource,
102
+ # __in DWORD dwMessageId,
103
+ # __in DWORD dwLanguageId,
104
+ # __out LPTSTR lpBuffer,
105
+ # __in DWORD nSize,
106
+ # __in_opt va_list *Arguments
107
+ # );
108
+ #
109
+
110
+ attach_function :format_message, :FormatMessageA, [
111
+ :ulong,
112
+ :pointer,
113
+ :ulong,
114
+ :ulong,
115
+ :pointer,
116
+ :ulong,
117
+ :pointer
118
+ ], :ulong
119
+
120
+ attach_function :close_handle, :CloseHandle, [:pointer], :bool
121
+
122
+ #
123
+ # HANDLE WINAPI OpenProcess(
124
+ # __in DWORD dwDesiredAccess,
125
+ # __in BOOL bInheritHandle,
126
+ # __in DWORD dwProcessId
127
+ # );
128
+ #
129
+
130
+ attach_function :open_process, :OpenProcess, [:ulong, :bool, :ulong], :pointer
131
+
132
+ #
133
+ # HANDLE WINAPI CreateJobObject(
134
+ # _In_opt_ LPSECURITY_ATTRIBUTES lpJobAttributes,
135
+ # _In_opt_ LPCTSTR lpName
136
+ # );
137
+ #
138
+
139
+ attach_function :create_job_object, :CreateJobObjectA, [:pointer, :pointer], :pointer
140
+
141
+ #
142
+ # BOOL WINAPI AssignProcessToJobObject(
143
+ # _In_ HANDLE hJob,
144
+ # _In_ HANDLE hProcess
145
+ # );
146
+
147
+ attach_function :assign_process_to_job_object, :AssignProcessToJobObject, [:pointer, :pointer], :bool
148
+
149
+ #
150
+ # BOOL WINAPI SetInformationJobObject(
151
+ # _In_ HANDLE hJob,
152
+ # _In_ JOBOBJECTINFOCLASS JobObjectInfoClass,
153
+ # _In_ LPVOID lpJobObjectInfo,
154
+ # _In_ DWORD cbJobObjectInfoLength
155
+ # );
156
+ #
157
+
158
+ attach_function :set_information_job_object, :SetInformationJobObject, [:pointer, :int, :pointer, :ulong], :bool
159
+
160
+ #
161
+ #
162
+ # DWORD WINAPI WaitForSingleObject(
163
+ # __in HANDLE hHandle,
164
+ # __in DWORD dwMilliseconds
165
+ # );
166
+ #
167
+
168
+ attach_function :wait_for_single_object, :WaitForSingleObject, [:pointer, :ulong], :wait_status, blocking: true
169
+
170
+ #
171
+ # BOOL WINAPI GetExitCodeProcess(
172
+ # __in HANDLE hProcess,
173
+ # __out LPDWORD lpExitCode
174
+ # );
175
+ #
176
+
177
+ attach_function :get_exit_code, :GetExitCodeProcess, [:pointer, :pointer], :bool
178
+
179
+ #
180
+ # BOOL WINAPI GenerateConsoleCtrlEvent(
181
+ # __in DWORD dwCtrlEvent,
182
+ # __in DWORD dwProcessGroupId
183
+ # );
184
+ #
185
+
186
+ attach_function :generate_console_ctrl_event, :GenerateConsoleCtrlEvent, [:ulong, :ulong], :bool
187
+
188
+ #
189
+ # BOOL WINAPI TerminateProcess(
190
+ # __in HANDLE hProcess,
191
+ # __in UINT uExitCode
192
+ # );
193
+ #
194
+
195
+ attach_function :terminate_process, :TerminateProcess, [:pointer, :uint], :bool
196
+
197
+ #
198
+ # intptr_t _get_osfhandle(
199
+ # int fd
200
+ # );
201
+ #
202
+
203
+ attach_function :get_osfhandle, :_get_osfhandle, [:int], :intptr_t
204
+
205
+ #
206
+ # int _open_osfhandle (
207
+ # intptr_t osfhandle,
208
+ # int flags
209
+ # );
210
+ #
211
+
212
+ attach_function :open_osfhandle, :_open_osfhandle, [:pointer, :int], :int
213
+
214
+ # BOOL WINAPI SetHandleInformation(
215
+ # __in HANDLE hObject,
216
+ # __in DWORD dwMask,
217
+ # __in DWORD dwFlags
218
+ # );
219
+
220
+ attach_function :set_handle_information, :SetHandleInformation, [:pointer, :ulong, :ulong], :bool
221
+
222
+ # BOOL WINAPI GetHandleInformation(
223
+ # __in HANDLE hObject,
224
+ # __out LPDWORD lpdwFlags
225
+ # );
226
+
227
+ attach_function :get_handle_information, :GetHandleInformation, [:pointer, :pointer], :bool
228
+
229
+ # BOOL WINAPI CreatePipe(
230
+ # __out PHANDLE hReadPipe,
231
+ # __out PHANDLE hWritePipe,
232
+ # __in_opt LPSECURITY_ATTRIBUTES lpPipeAttributes,
233
+ # __in DWORD nSize
234
+ # );
235
+
236
+ attach_function :create_pipe, :CreatePipe, [:pointer, :pointer, :pointer, :ulong], :bool
237
+
238
+ #
239
+ # HANDLE WINAPI GetCurrentProcess(void);
240
+ #
241
+
242
+ attach_function :current_process, :GetCurrentProcess, [], :pointer
243
+
244
+ #
245
+ # BOOL WINAPI DuplicateHandle(
246
+ # __in HANDLE hSourceProcessHandle,
247
+ # __in HANDLE hSourceHandle,
248
+ # __in HANDLE hTargetProcessHandle,
249
+ # __out LPHANDLE lpTargetHandle,
250
+ # __in DWORD dwDesiredAccess,
251
+ # __in BOOL bInheritHandle,
252
+ # __in DWORD dwOptions
253
+ # );
254
+ #
255
+
256
+ attach_function :_duplicate_handle, :DuplicateHandle, [
257
+ :pointer,
258
+ :pointer,
259
+ :pointer,
260
+ :pointer,
261
+ :ulong,
262
+ :bool,
263
+ :ulong
264
+ ], :bool
265
+ end
266
+ end
267
+ end
268
+ end