train 3.2.14 → 3.2.20

Sign up to get free protection for your applications and to get access to all the features.
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