train 3.2.14 → 3.2.20

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 (42) hide show
  1. checksums.yaml +4 -4
  2. metadata +29 -149
  3. data/LICENSE +0 -201
  4. data/lib/train.rb +0 -193
  5. data/lib/train/errors.rb +0 -44
  6. data/lib/train/extras.rb +0 -11
  7. data/lib/train/extras/command_wrapper.rb +0 -201
  8. data/lib/train/extras/stat.rb +0 -136
  9. data/lib/train/file.rb +0 -212
  10. data/lib/train/file/local.rb +0 -82
  11. data/lib/train/file/local/unix.rb +0 -96
  12. data/lib/train/file/local/windows.rb +0 -68
  13. data/lib/train/file/remote.rb +0 -40
  14. data/lib/train/file/remote/aix.rb +0 -29
  15. data/lib/train/file/remote/linux.rb +0 -21
  16. data/lib/train/file/remote/qnx.rb +0 -41
  17. data/lib/train/file/remote/unix.rb +0 -110
  18. data/lib/train/file/remote/windows.rb +0 -110
  19. data/lib/train/globals.rb +0 -5
  20. data/lib/train/options.rb +0 -81
  21. data/lib/train/platforms.rb +0 -102
  22. data/lib/train/platforms/common.rb +0 -34
  23. data/lib/train/platforms/detect.rb +0 -12
  24. data/lib/train/platforms/detect/helpers/os_common.rb +0 -160
  25. data/lib/train/platforms/detect/helpers/os_linux.rb +0 -80
  26. data/lib/train/platforms/detect/helpers/os_windows.rb +0 -142
  27. data/lib/train/platforms/detect/scanner.rb +0 -85
  28. data/lib/train/platforms/detect/specifications/api.rb +0 -20
  29. data/lib/train/platforms/detect/specifications/os.rb +0 -629
  30. data/lib/train/platforms/detect/uuid.rb +0 -32
  31. data/lib/train/platforms/family.rb +0 -31
  32. data/lib/train/platforms/platform.rb +0 -109
  33. data/lib/train/plugin_test_helper.rb +0 -51
  34. data/lib/train/plugins.rb +0 -40
  35. data/lib/train/plugins/base_connection.rb +0 -198
  36. data/lib/train/plugins/transport.rb +0 -49
  37. data/lib/train/transports/cisco_ios_connection.rb +0 -133
  38. data/lib/train/transports/local.rb +0 -240
  39. data/lib/train/transports/mock.rb +0 -183
  40. data/lib/train/transports/ssh.rb +0 -271
  41. data/lib/train/transports/ssh_connection.rb +0 -342
  42. data/lib/train/version.rb +0 -7
@@ -1,68 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Train
4
- class File
5
- class Local
6
- class Windows < Train::File::Local
7
- # Ensures we do not use invalid characters for file names
8
- # @see https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#naming_conventions
9
- def sanitize_filename(path)
10
- return if path.nil?
11
-
12
- # we do not filter :, backslash and forward slash, since they are part of the path
13
- @spath = path.gsub(/[<>"|?*]/, "")
14
- end
15
-
16
- def product_version
17
- @product_version ||= @backend.run_command(
18
- "[System.Diagnostics.FileVersionInfo]::GetVersionInfo(\"#{@spath}\").ProductVersion"
19
- ).stdout.chomp
20
- end
21
-
22
- def file_version
23
- @file_version ||= @backend.run_command(
24
- "[System.Diagnostics.FileVersionInfo]::GetVersionInfo(\"#{@spath}\").FileVersion"
25
- ).stdout.chomp
26
- end
27
-
28
- def owner
29
- owner = @backend.run_command(
30
- "Get-Acl \"#{@spath}\" | select -expand Owner"
31
- ).stdout.strip
32
- return if owner.empty?
33
-
34
- owner
35
- end
36
-
37
- def stat
38
- return @stat if defined?(@stat)
39
-
40
- begin
41
- file_stat =
42
- if @follow_symlink
43
- ::File.stat(@path)
44
- else
45
- ::File.lstat(@path)
46
- end
47
- rescue StandardError => _err
48
- return @stat = {}
49
- end
50
-
51
- @stat = {
52
- type: type,
53
- mode: file_stat.mode,
54
- mtime: file_stat.mtime.to_i,
55
- size: file_stat.size,
56
- owner: owner,
57
- uid: file_stat.uid,
58
- group: nil,
59
- gid: file_stat.gid,
60
- selinux_label: nil,
61
- }
62
-
63
- @stat
64
- end
65
- end
66
- end
67
- end
68
- end
@@ -1,40 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Train
4
- class File
5
- class Remote < Train::File
6
- def basename(suffix = nil, sep = "/")
7
- raise "Not yet supported: Suffix in file.basename" unless suffix.nil?
8
-
9
- @basename ||= detect_filename(path, sep || "/")
10
- end
11
-
12
- def stat
13
- return @stat if defined?(@stat)
14
-
15
- @stat = Train::Extras::Stat.stat(@spath, @backend, @follow_symlink)
16
- end
17
-
18
- # helper methods provided to any implementing class
19
- private
20
-
21
- def detect_filename(path, sep)
22
- idx = path.rindex(sep)
23
- return path if idx.nil?
24
-
25
- idx += 1
26
- return detect_filename(path[0..-2], sep) if idx == path.length
27
-
28
- path[idx..-1]
29
- end
30
- end
31
- end
32
- end
33
-
34
- # subclass requires are loaded after Train::File::Remote is defined
35
- # to avoid superclass mismatch errors
36
- require_relative "remote/aix"
37
- require_relative "remote/linux"
38
- require_relative "remote/qnx"
39
- require_relative "remote/unix"
40
- require_relative "remote/windows"
@@ -1,29 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require_relative "unix"
4
-
5
- module Train
6
- class File
7
- class Remote
8
- class Aix < Train::File::Remote::Unix
9
- def link_path
10
- return nil unless symlink?
11
-
12
- @link_path ||=
13
- @backend.run_command("perl -e 'print readlink shift' #{@spath}").stdout.chomp
14
- end
15
-
16
- def shallow_link_path
17
- return nil unless symlink?
18
-
19
- @shallow_link_path ||=
20
- @backend.run_command("perl -e 'print readlink shift' #{@spath}").stdout.chomp
21
- end
22
-
23
- def mounted
24
- @mounted ||= @backend.run_command("lsfs -c #{@spath}")
25
- end
26
- end
27
- end
28
- end
29
- end
@@ -1,21 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require_relative "unix"
4
-
5
- module Train
6
- class File
7
- class Remote
8
- class Linux < Train::File::Remote::Unix
9
- def content
10
- return @content if defined?(@content)
11
-
12
- @content = @backend.run_command("cat #{@spath} || echo -n").stdout
13
- return @content unless @content.empty?
14
-
15
- @content = nil if directory? || size.nil? || (size > 0)
16
- @content
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,41 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # author: Christoph Hartmann
4
- # author: Dominik Richter
5
-
6
- require_relative "unix"
7
-
8
- module Train
9
- class File
10
- class Remote
11
- class Qnx < Train::File::Remote::Unix
12
- def content
13
- cat = "cat"
14
- cat = "/proc/boot/cat" if @backend.os[:release].to_i >= 7
15
- @content ||= case
16
- when !exist?
17
- nil
18
- else
19
- @backend.run_command("#{cat} #{@spath}").stdout || ""
20
- end
21
- end
22
-
23
- def type
24
- if @backend.run_command("file #{@spath}").stdout.include?("directory")
25
- :directory
26
- else
27
- :file
28
- end
29
- end
30
-
31
- %w{
32
- mode owner group uid gid mtime size selinux_label link_path mounted stat
33
- }.each do |field|
34
- define_method field.to_sym do
35
- raise NotImplementedError, "QNX does not implement the #{field}() method yet."
36
- end
37
- end
38
- end
39
- end
40
- end
41
- end
@@ -1,110 +0,0 @@
1
- require "shellwords"
2
-
3
- module Train
4
- class File
5
- class Remote
6
- class Unix < Train::File::Remote
7
- def sanitize_filename(path)
8
- @spath = Shellwords.escape(path) || @path
9
- end
10
-
11
- def content
12
- @content ||=
13
- if !exist? || directory?
14
- nil
15
- elsif size.nil? || size == 0
16
- ""
17
- else
18
- @backend.run_command("cat #{@spath}").stdout || ""
19
- end
20
- end
21
-
22
- def exist?
23
- @exist ||= begin
24
- f = @follow_symlink ? "" : " || test -L #{@spath}"
25
- @backend.run_command("test -e #{@spath}" + f)
26
- .exit_status == 0
27
- end
28
- end
29
-
30
- def mounted
31
- @mounted ||=
32
- @backend.run_command("mount | grep -- ' on #{@path} '")
33
- end
34
-
35
- %w{
36
- type mode owner group uid gid mtime size selinux_label
37
- }.each do |field|
38
- define_method field.to_sym do
39
- stat[field.to_sym]
40
- end
41
- end
42
-
43
- def mode?(sth)
44
- mode == sth
45
- end
46
-
47
- def grouped_into?(sth)
48
- group == sth
49
- end
50
-
51
- def linked_to?(dst)
52
- link_path == dst
53
- end
54
-
55
- def link_path
56
- symlink? ? path : nil
57
- end
58
-
59
- def shallow_link_path
60
- return nil unless symlink?
61
-
62
- @shallow_link_path ||=
63
- @backend.run_command("readlink #{@spath}").stdout.chomp
64
- end
65
-
66
- def unix_mode_mask(owner, type)
67
- o = UNIX_MODE_OWNERS[owner.to_sym]
68
- return nil if o.nil?
69
-
70
- t = UNIX_MODE_TYPES[type.to_sym]
71
- return nil if t.nil?
72
-
73
- t & o
74
- end
75
-
76
- def path
77
- return @path unless @follow_symlink && symlink?
78
-
79
- @link_path ||= read_target_path
80
- end
81
-
82
- private
83
-
84
- # Returns full path of a symlink target(real dest) or '' on symlink loop
85
- def read_target_path
86
- full_path = @backend.run_command("readlink -n #{@spath} -f").stdout
87
- # Needed for some OSes like OSX that returns relative path
88
- # when the link and target are in the same directory
89
- if !full_path.start_with?("/") && full_path != ""
90
- full_path = ::File.expand_path("../#{full_path}", @spath)
91
- end
92
- full_path
93
- end
94
-
95
- UNIX_MODE_OWNERS = {
96
- all: 00777,
97
- owner: 00700,
98
- group: 00070,
99
- other: 00007,
100
- }.freeze
101
-
102
- UNIX_MODE_TYPES = {
103
- r: 00444,
104
- w: 00222,
105
- x: 00111,
106
- }.freeze
107
- end
108
- end
109
- end
110
- end
@@ -1,110 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Train
4
- class File
5
- class Remote
6
- class Windows < Train::File::Remote
7
- attr_reader :path
8
- # Ensures we do not use invalid characters for file names
9
- # @see https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#naming_conventions
10
- def sanitize_filename(path)
11
- return if path.nil?
12
-
13
- # we do not filter :, backslash and forward slash, since they are part of the path
14
- @spath = path.gsub(/[<>"|?*]/, "")
15
- end
16
-
17
- def basename(suffix = nil, sep = '\\')
18
- super(suffix, sep)
19
- end
20
-
21
- def content
22
- return @content if defined?(@content)
23
-
24
- @content = @backend.run_command("Get-Content(\"#{@spath}\") | Out-String").stdout
25
- return @content unless @content.empty?
26
-
27
- @content = nil if directory? # or size.nil? or size > 0
28
- @content
29
- end
30
-
31
- def exist?
32
- return @exist if defined?(@exist)
33
-
34
- @exist = @backend.run_command(
35
- "(Test-Path -Path \"#{@spath}\").ToString()"
36
- ).stdout.chomp == "True"
37
- end
38
-
39
- def owner
40
- owner = @backend.run_command(
41
- "Get-Acl \"#{@spath}\" | select -expand Owner"
42
- ).stdout.strip
43
- return if owner.empty?
44
-
45
- owner
46
- end
47
-
48
- def type
49
- if attributes.include?("Archive") && !attributes.include?("Directory")
50
- return :file
51
- elsif attributes.include?("ReparsePoint")
52
- return :symlink
53
- elsif attributes.include?("Directory")
54
- return :directory
55
- end
56
-
57
- :unknown
58
- end
59
-
60
- def size
61
- if file?
62
- @backend.run_command("((Get-Item '#{@spath}').Length)").stdout.strip.to_i
63
- end
64
- end
65
-
66
- def product_version
67
- @product_version ||= @backend.run_command(
68
- "[System.Diagnostics.FileVersionInfo]::GetVersionInfo(\"#{@spath}\").ProductVersion"
69
- ).stdout.chomp
70
- end
71
-
72
- def file_version
73
- @file_version ||= @backend.run_command(
74
- "[System.Diagnostics.FileVersionInfo]::GetVersionInfo(\"#{@spath}\").FileVersion"
75
- ).stdout.chomp
76
- end
77
-
78
- %w{
79
- mode group uid gid mtime selinux_label
80
- }.each do |field|
81
- define_method field.to_sym do
82
- nil
83
- end
84
- end
85
-
86
- def link_path
87
- nil
88
- end
89
-
90
- def shallow_link_path
91
- nil
92
- end
93
-
94
- def mounted
95
- nil
96
- end
97
-
98
- private
99
-
100
- def attributes
101
- return @attributes if defined?(@attributes)
102
-
103
- @attributes = @backend.run_command(
104
- "(Get-ItemProperty -Path \"#{@spath}\").attributes.ToString()"
105
- ).stdout.chomp.split(/\s*,\s*/)
106
- end
107
- end
108
- end
109
- end
110
- end
data/lib/train/globals.rb DELETED
@@ -1,5 +0,0 @@
1
- module Train
2
- def self.src_root
3
- File.expand_path(File.join(__FILE__, "..", "..", ".."))
4
- end
5
- end
data/lib/train/options.rb DELETED
@@ -1,81 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # Author:: Dominik Richter (<dominik.richter@gmail.com>)
4
- # Author:: Christoph Hartmann (<chris@lollyrock.com>)
5
-
6
- module Train
7
- module Options
8
- def self.attach(target)
9
- target.class.method(:include).call(ClassOptions)
10
- target.method(:include).call(InstanceOptions)
11
- end
12
-
13
- module ClassOptions
14
- def option(name, conf = nil, &block)
15
- d = conf || {}
16
- unless d.is_a? Hash
17
- raise Train::ClientError,
18
- "The transport plugin #{self} declared an option #{name} "\
19
- "and didn't provide a valid configuration hash."
20
- end
21
-
22
- if !conf.nil? && !conf[:default].nil? && block_given?
23
- raise Train::ClientError,
24
- "The transport plugin #{self} declared an option #{name} "\
25
- "with both a default value and block. Only use one of these."
26
- end
27
-
28
- d[:default] = block if block_given?
29
-
30
- default_options[name] = d
31
- end
32
-
33
- def default_options
34
- @default_options = {} unless defined? @default_options
35
- @default_options
36
- end
37
-
38
- def include_options(other)
39
- unless other.respond_to?(:default_options)
40
- raise "Trying to include options from module #{other.inspect}, "\
41
- "which doesn't seem to support options."
42
- end
43
- default_options.merge!(other.default_options)
44
- end
45
- end
46
-
47
- module InstanceOptions
48
- # @return [Hash] options, which created this Transport
49
- attr_reader :options
50
-
51
- def default_options
52
- self.class.default_options
53
- end
54
-
55
- def merge_options(base, opts)
56
- res = base.merge(opts || {})
57
- default_options.each do |field, hm|
58
- next unless res[field].nil? && hm.key?(:default)
59
-
60
- default = hm[:default]
61
- if default.is_a? Proc
62
- res[field] = default.call(res)
63
- else
64
- res[field] = default
65
- end
66
- end
67
- res
68
- end
69
-
70
- def validate_options(opts)
71
- default_options.each do |field, hm|
72
- if opts[field].nil? && hm[:required]
73
- raise Train::ClientError,
74
- "You must provide a value for #{field.to_s.inspect}."
75
- end
76
- end
77
- opts
78
- end
79
- end
80
- end
81
- end