train 3.5.2 → 3.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8533f5c6b2ed8cb7c4898c3a98acac69aedebcdb22dfc6b66a47690ab281a5dd
4
- data.tar.gz: 17e47f9f6803277c7b3734bdc2baa355e802dee4a96f08669a83a62f27c77dcd
3
+ metadata.gz: e4e68414986172e73763ef89b9bfcac8903567fa2715e05ab11164960b00d3fc
4
+ data.tar.gz: e7643f6ada520f214fcd4f8656aca9a67fa88cabf313493d72ba04322b9267b8
5
5
  SHA512:
6
- metadata.gz: be9577575746afe918255fbdbfd9540ee73283ed473f4d2e9d3cf2371d38d574796f1837b8a1b5307d00b1484b184623d0c2b4392a9407e13d6590233c0bd669
7
- data.tar.gz: 0b6ac44728ea213d45c8b0436e5d5ef1f7e06e8b4b1be429b4a957d7e032b77b8f6a158bbf9535ea328b8ebbd9fadc13d2129df16d689370250bb336182658fc
6
+ metadata.gz: 3a12e33786c1bf058923e3a07c15b98e878ed0c2957f08e00175a509e001a5ebd8067e0c1fd46480e37e973cddbef5dda484cdb6247994ffb2b54498a2bed167
7
+ data.tar.gz: 2d21149eeef299ea18afcc68ec2c99a3bec2c3fce9d2e532aa6c4b44f294376da4b0692780f0f67b7605fe263e5750d7ff337ab4fbffb5dcdf4dfb4fceff52ea
@@ -6,6 +6,7 @@ module Train::Transports
6
6
 
7
7
  include_options Train::Extras::CommandWrapper
8
8
  option :host, required: true
9
+ option :docker_url, required: false
9
10
 
10
11
  def connection(state = {}, &block)
11
12
  opts = merge_options(options, state || {})
@@ -53,10 +54,21 @@ class Train::Transports::Docker
53
54
  def initialize(conf)
54
55
  super(conf)
55
56
  @id = options[:host]
57
+
58
+ docker_url = options[:docker_url]
59
+ if RUBY_PLATFORM =~ /windows|mswin|msys|mingw|cygwin/
60
+ # Docker Desktop for windows. Must override socket location.
61
+ # https://docs.docker.com/desktop/faqs/#how-do-i-connect-to-the-remote-docker-engine-api
62
+ # docker_socket ||= "npipe:////./pipe/docker_engine" # # Doesn't require a settings change, but also doesn't work
63
+ docker_url ||= "tcp://localhost:2375"
64
+ end
65
+ Docker.url = docker_url if docker_url
66
+
56
67
  @container = ::Docker::Container.get(@id) ||
57
68
  raise("Can't find Docker container #{@id}")
58
69
  @cmd_wrapper = nil
59
70
  @cmd_wrapper = CommandWrapper.load(self, @options)
71
+ @probably_windows = nil
60
72
  end
61
73
 
62
74
  def close
@@ -78,6 +90,8 @@ class Train::Transports::Docker
78
90
  Train::File::Remote::Aix.new(self, path)
79
91
  elsif os.solaris?
80
92
  Train::File::Remote::Unix.new(self, path)
93
+ elsif os.windows?
94
+ Train::File::Remote::Windows.new(self, path)
81
95
  else
82
96
  Train::File::Remote::Linux.new(self, path)
83
97
  end
@@ -85,10 +99,16 @@ class Train::Transports::Docker
85
99
 
86
100
  def run_command_via_connection(cmd, &_data_handler)
87
101
  cmd = @cmd_wrapper.run(cmd) unless @cmd_wrapper.nil?
102
+
103
+ # Cannot use os.windows? here because it calls run_command_via_connection,
104
+ # causing infinite recursion during initial platform detection
105
+ if sniff_for_windows?
106
+ invocation = cmd_run_command(cmd)
107
+ else
108
+ invocation = sh_run_command(cmd)
109
+ end
88
110
  stdout, stderr, exit_status = @container.exec(
89
- [
90
- "/bin/sh", "-c", cmd
91
- ]
111
+ invocation, user: @options[:user]
92
112
  )
93
113
  CommandResult.new(stdout.join, stderr.join, exit_status)
94
114
  rescue ::Docker::Error::DockerError => _
@@ -97,5 +117,23 @@ class Train::Transports::Docker
97
117
  # @TODO: differentiate any other error
98
118
  raise
99
119
  end
120
+
121
+ def sh_run_command(cmd)
122
+ ["/bin/sh", "-c", cmd]
123
+ end
124
+
125
+ def cmd_run_command(cmd)
126
+ ["cmd.exe", "/s", "/c", cmd]
127
+ end
128
+
129
+ def sniff_for_windows?
130
+ return @probably_windows unless @probably_windows.nil?
131
+
132
+ # Run a command using /bin/sh, which should fail under Windows
133
+ stdout, _stderr, _exit_status = @container.exec(
134
+ sh_run_command("true"), user: @options[:user]
135
+ )
136
+ @probably_windows = !!stdout.detect { |l| l.include? "failure in a Windows system call" }
137
+ end
100
138
  end
101
139
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: train
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.2
4
+ version: 3.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chef InSpec Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-22 00:00:00.000000000 Z
11
+ date: 2021-04-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: train-core
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 3.5.2
19
+ version: 3.7.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 3.5.2
26
+ version: 3.7.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: train-winrm
29
29
  requirement: !ruby/object:Gem::Requirement