train 1.4.22 → 1.4.24

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 455f5a9ff1827140f4f890be1b536a30261120db86836ee266b15eb418fe2900
4
- data.tar.gz: e4d8c9dba2799532849ed9699cf11e813ec44669abc519f5e52de9ec9c5bd507
3
+ metadata.gz: 6ecda8bbe5e6b070ad719dbdaa0fd84f7711951331006dca61073f7c466ecf62
4
+ data.tar.gz: 0c3bf400d8f4feb0c36b5cc0ef1b51b50ed61e2a75a7725197c510652958c0fb
5
5
  SHA512:
6
- metadata.gz: 8403b5941b3596a6aff77c830332e21f4b9a878eeb65b39c84fc598467060dae99b69c7968f9697379534d2fd5867b990343783a971658b257a21110ceeca044
7
- data.tar.gz: 0dd9693a229a54b80c6bdaf9fe91f9d80ef3809bd2d860f5fa77ca7438f349df3d6951a0516057672651942251fa1eea432570774172b2b9afe3b49f100b973b
6
+ metadata.gz: 9d0108b3647bedda9f7b1d7c85ef5ebbd40498b23ea17a6c625b978262328cdb76db8ee3d5e38409d743f95a34bb6f78b6fb5dc22da5eb325a2bb75bc1b5db81
7
+ data.tar.gz: aadc074f3ce261c4b9d410691e8d6e6e2203ac83ddd297107c2852a24f017800f9465b8b9e9e5eb59aeadefc9270c546a5b95a3c128177630c7c92f3abee9cbc
@@ -1,24 +1,30 @@
1
- <!-- latest_release 1.4.22 -->
2
- ## [v1.4.22](https://github.com/inspec/train/tree/v1.4.22) (2018-07-12)
1
+ <!-- latest_release 1.4.24 -->
2
+ ## [v1.4.24](https://github.com/inspec/train/tree/v1.4.24) (2018-07-26)
3
3
 
4
4
  #### Merged Pull Requests
5
- - Add VMware transport [#321](https://github.com/inspec/train/pull/321) ([jerryaldrichiii](https://github.com/jerryaldrichiii))
5
+ - Retry SSH command on IOError (Cisco IOS specific) [#326](https://github.com/inspec/train/pull/326) ([jerryaldrichiii](https://github.com/jerryaldrichiii))
6
6
  <!-- latest_release -->
7
7
 
8
- <!-- release_rollup since=1.4.21 -->
9
- ### Changes since 1.4.21 release
8
+ <!-- release_rollup since=1.4.22 -->
9
+ ### Changes since 1.4.22 release
10
10
 
11
11
  #### Merged Pull Requests
12
- - Add VMware transport [#321](https://github.com/inspec/train/pull/321) ([jerryaldrichiii](https://github.com/jerryaldrichiii)) <!-- 1.4.22 -->
12
+ - Retry SSH command on IOError (Cisco IOS specific) [#326](https://github.com/inspec/train/pull/326) ([jerryaldrichiii](https://github.com/jerryaldrichiii)) <!-- 1.4.24 -->
13
+ - Add shallow_link_path to inspect symlink direct link [#309](https://github.com/inspec/train/pull/309) ([ColinHebert](https://github.com/ColinHebert)) <!-- 1.4.23 -->
13
14
  <!-- release_rollup -->
14
15
 
15
16
  <!-- latest_stable_release -->
17
+ ## [v1.4.22](https://github.com/inspec/train/tree/v1.4.22) (2018-07-16)
18
+
19
+ #### Merged Pull Requests
20
+ - Add VMware transport [#321](https://github.com/inspec/train/pull/321) ([jerryaldrichiii](https://github.com/jerryaldrichiii))
21
+ <!-- latest_stable_release -->
22
+
16
23
  ## [v1.4.21](https://github.com/inspec/train/tree/v1.4.21) (2018-07-05)
17
24
 
18
25
  #### Merged Pull Requests
19
26
  - Remove the delivery cookbook [#317](https://github.com/inspec/train/pull/317) ([tas50](https://github.com/tas50))
20
27
  - Modify `WindowsPipeRunner` stderr to use String [#320](https://github.com/inspec/train/pull/320) ([jerryaldrichiii](https://github.com/jerryaldrichiii))
21
- <!-- latest_stable_release -->
22
28
 
23
29
  ## [v1.4.19](https://github.com/inspec/train/tree/v1.4.19) (2018-06-29)
24
30
 
@@ -27,6 +27,11 @@ module Train
27
27
  end
28
28
  end
29
29
 
30
+ def shallow_link_path
31
+ return nil unless symlink?
32
+ @link_path ||= ::File.readlink(@path)
33
+ end
34
+
30
35
  def block_device?
31
36
  ::File.blockdev?(@path)
32
37
  end
@@ -12,6 +12,12 @@ module Train
12
12
  @backend.run_command("perl -e 'print readlink shift' #{@spath}").stdout.chomp
13
13
  end
14
14
 
15
+ def shallow_link_path
16
+ return nil unless symlink?
17
+ @shallow_link_path ||=
18
+ @backend.run_command("perl -e 'print readlink shift' #{@spath}").stdout.chomp
19
+ end
20
+
15
21
  def mounted
16
22
  @mounted ||= @backend.run_command("lsfs -c #{@spath}")
17
23
  end
@@ -60,6 +60,11 @@ module Train
60
60
  symlink? ? path : nil
61
61
  end
62
62
 
63
+ def shallow_link_path
64
+ return nil unless symlink?
65
+ @shallow_link_path ||= ::File.readlink(@path)
66
+ end
67
+
63
68
  def unix_mode_mask(owner, type)
64
69
  o = UNIX_MODE_OWNERS[owner.to_sym]
65
70
  return nil if o.nil?
@@ -77,6 +77,10 @@ module Train
77
77
  nil
78
78
  end
79
79
 
80
+ def shallow_link_path
81
+ nil
82
+ end
83
+
80
84
  def mounted
81
85
  nil
82
86
  end
@@ -32,6 +32,9 @@ class Train::Transports::SSH
32
32
  class Connection < BaseConnection # rubocop:disable Metrics/ClassLength
33
33
  attr_reader :hostname
34
34
  def initialize(options)
35
+ # Track IOS command retries to prevent infinite loop on IOError. This must
36
+ # be done before `super()` because the parent runs detection commands.
37
+ @ios_cmd_retries = 0
35
38
  super(options)
36
39
  @username = @options.delete(:username)
37
40
  @hostname = @options.delete(:hostname)
@@ -203,7 +206,7 @@ class Train::Transports::SSH
203
206
  end
204
207
  end
205
208
 
206
- def run_command_via_connection(cmd)
209
+ def run_command_via_connection(cmd) # rubocop:disable AbcSize
207
210
  stdout = stderr = ''
208
211
  exit_status = nil
209
212
  cmd.dup.force_encoding('binary') if cmd.respond_to?(:force_encoding)
@@ -242,9 +245,25 @@ class Train::Transports::SSH
242
245
  end
243
246
  @session.loop
244
247
 
248
+ # Since `@session.loop` succeeded, reset the IOS command retry counter
249
+ @ios_cmd_retries = 0
250
+
245
251
  CommandResult.new(stdout, stderr, exit_status)
246
252
  rescue Net::SSH::Exception => ex
247
253
  raise Train::Transports::SSHFailed, "SSH command failed (#{ex.message})"
254
+ rescue IOError
255
+ # Cisco IOS occasionally closes the stream prematurely while we are
256
+ # running commands to detect if we need to switch to the Cisco IOS
257
+ # transport. This retries the command if this is the case.
258
+ # See:
259
+ # https://github.com/inspec/train/pull/271
260
+ logger.debug('[SSH] Possible Cisco IOS race condition, retrying command')
261
+
262
+ # Only attempt retry up to 5 times to avoid infinite loop
263
+ @ios_cmd_retries += 1
264
+ raise if @ios_cmd_retries >= 5
265
+
266
+ retry
248
267
  end
249
268
 
250
269
  # Returns a connection session, or establishes one when invoked the
@@ -3,5 +3,5 @@
3
3
  # Author:: Dominik Richter (<dominik.richter@gmail.com>)
4
4
 
5
5
  module Train
6
- VERSION = '1.4.22'.freeze
6
+ VERSION = '1.4.24'.freeze
7
7
  end
@@ -10,7 +10,7 @@ describe Train::File::Local do
10
10
  File.stub :read, res do
11
11
  connection.file(rand.to_s).content.must_equal(res)
12
12
  end
13
- end
13
+ end
14
14
 
15
15
  {
16
16
  exist?: :exist?,
@@ -33,13 +33,13 @@ describe Train::File::Local do
33
33
  it 'returns the type block_device if it is block device' do
34
34
  File.stub :ftype, "blockSpecial" do
35
35
  connection.file(rand.to_s).type.must_equal :block_device
36
- end
36
+ end
37
37
  end
38
38
 
39
39
  it 'returns the type character_device if it is character device' do
40
40
  File.stub :ftype, "characterSpecial" do
41
41
  connection.file(rand.to_s).type.must_equal :character_device
42
- end
42
+ end
43
43
  end
44
44
 
45
45
  it 'returns the type symlink if it is symlink' do
@@ -77,7 +77,7 @@ describe Train::File::Local do
77
77
  connection.file(rand.to_s).type.must_equal :unknown
78
78
  end
79
79
  end
80
- end
80
+ end
81
81
 
82
82
  describe '#path' do
83
83
  it 'returns the path if it is not a symlink' do
@@ -107,4 +107,15 @@ describe Train::File::Local do
107
107
  end
108
108
  end
109
109
  end
110
- end
110
+
111
+ describe '#shallow_shlink_path' do
112
+ it 'returns file\'s direct link path' do
113
+ out = rand.to_s
114
+ File.stub :readlink, out do
115
+ File.stub :symlink?, true do
116
+ connection.file(rand.to_s).shallow_link_path.must_equal out
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -23,4 +23,11 @@ describe Train::File::Remote::Aix do
23
23
  backend.mock_command("perl -e 'print readlink shift' path", 'our_link_path')
24
24
  file.link_path.must_equal 'our_link_path'
25
25
  end
26
+
27
+ it 'returns a correct shallow_link_path' do
28
+ file = cls.new(backend, 'path')
29
+ file.stubs(:symlink?).returns(true)
30
+ backend.mock_command("perl -e 'print readlink shift' path", 'our_link_path')
31
+ file.link_path.must_equal 'our_link_path'
32
+ end
26
33
  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: 1.4.22
4
+ version: 1.4.24
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dominik Richter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-12 00:00:00.000000000 Z
11
+ date: 2018-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json