train 3.2.14 → 3.2.20
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- metadata +29 -149
- data/LICENSE +0 -201
- data/lib/train.rb +0 -193
- data/lib/train/errors.rb +0 -44
- data/lib/train/extras.rb +0 -11
- data/lib/train/extras/command_wrapper.rb +0 -201
- data/lib/train/extras/stat.rb +0 -136
- data/lib/train/file.rb +0 -212
- data/lib/train/file/local.rb +0 -82
- data/lib/train/file/local/unix.rb +0 -96
- data/lib/train/file/local/windows.rb +0 -68
- data/lib/train/file/remote.rb +0 -40
- data/lib/train/file/remote/aix.rb +0 -29
- data/lib/train/file/remote/linux.rb +0 -21
- data/lib/train/file/remote/qnx.rb +0 -41
- data/lib/train/file/remote/unix.rb +0 -110
- data/lib/train/file/remote/windows.rb +0 -110
- data/lib/train/globals.rb +0 -5
- data/lib/train/options.rb +0 -81
- data/lib/train/platforms.rb +0 -102
- data/lib/train/platforms/common.rb +0 -34
- data/lib/train/platforms/detect.rb +0 -12
- data/lib/train/platforms/detect/helpers/os_common.rb +0 -160
- data/lib/train/platforms/detect/helpers/os_linux.rb +0 -80
- data/lib/train/platforms/detect/helpers/os_windows.rb +0 -142
- data/lib/train/platforms/detect/scanner.rb +0 -85
- data/lib/train/platforms/detect/specifications/api.rb +0 -20
- data/lib/train/platforms/detect/specifications/os.rb +0 -629
- data/lib/train/platforms/detect/uuid.rb +0 -32
- data/lib/train/platforms/family.rb +0 -31
- data/lib/train/platforms/platform.rb +0 -109
- data/lib/train/plugin_test_helper.rb +0 -51
- data/lib/train/plugins.rb +0 -40
- data/lib/train/plugins/base_connection.rb +0 -198
- data/lib/train/plugins/transport.rb +0 -49
- data/lib/train/transports/cisco_ios_connection.rb +0 -133
- data/lib/train/transports/local.rb +0 -240
- data/lib/train/transports/mock.rb +0 -183
- data/lib/train/transports/ssh.rb +0 -271
- data/lib/train/transports/ssh_connection.rb +0 -342
- data/lib/train/version.rb +0 -7
data/lib/train/platforms.rb
DELETED
@@ -1,102 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require_relative "platforms/common"
|
4
|
-
require_relative "platforms/detect"
|
5
|
-
require_relative "platforms/detect/scanner"
|
6
|
-
require_relative "platforms/detect/specifications/os"
|
7
|
-
require_relative "platforms/detect/specifications/api"
|
8
|
-
require_relative "platforms/detect/uuid"
|
9
|
-
require_relative "platforms/family"
|
10
|
-
require_relative "platforms/platform"
|
11
|
-
|
12
|
-
module Train::Platforms
|
13
|
-
# Retrieve the current platform list
|
14
|
-
#
|
15
|
-
# @return [Hash] map with platform names and their objects
|
16
|
-
def self.list
|
17
|
-
@list ||= {}
|
18
|
-
end
|
19
|
-
|
20
|
-
# Retrieve the current family list
|
21
|
-
#
|
22
|
-
# @return [Hash] map with family names and their objects
|
23
|
-
def self.families
|
24
|
-
@families ||= {}
|
25
|
-
end
|
26
|
-
|
27
|
-
# Clear all platform settings. Only used for testing.
|
28
|
-
def self.__reset
|
29
|
-
@list = {}
|
30
|
-
@families = {}
|
31
|
-
end
|
32
|
-
|
33
|
-
# Create or update a platform
|
34
|
-
#
|
35
|
-
# @return Train::Platform
|
36
|
-
def self.name(name, condition = {})
|
37
|
-
# TODO: refactor this against family. They're stupidly similar
|
38
|
-
# Check the list to see if one is already created
|
39
|
-
plat = list[name]
|
40
|
-
unless plat.nil?
|
41
|
-
# Pass the condition incase we are adding a family relationship
|
42
|
-
plat.condition = condition unless condition.nil?
|
43
|
-
return plat
|
44
|
-
end
|
45
|
-
|
46
|
-
Train::Platforms::Platform.new(name, condition)
|
47
|
-
end
|
48
|
-
|
49
|
-
# Create or update a family
|
50
|
-
#
|
51
|
-
# @return Train::Platforms::Family
|
52
|
-
def self.family(name, condition = {})
|
53
|
-
# Check the families to see if one is already created
|
54
|
-
family = families[name]
|
55
|
-
unless family.nil?
|
56
|
-
# Pass the condition incase we are adding a family relationship
|
57
|
-
family.condition = condition unless condition.nil?
|
58
|
-
return family
|
59
|
-
end
|
60
|
-
|
61
|
-
Train::Platforms::Family.new(name, condition)
|
62
|
-
end
|
63
|
-
|
64
|
-
# Find the families or top level platforms
|
65
|
-
#
|
66
|
-
# @return [Hash] with top level family and platforms
|
67
|
-
def self.top_platforms
|
68
|
-
empty_list = list.select { |_key, value| value.families.empty? }
|
69
|
-
empty_fams = families.select { |_key, value| value.families.empty? }
|
70
|
-
|
71
|
-
empty_list.merge empty_fams
|
72
|
-
end
|
73
|
-
|
74
|
-
# List all platforms and families in a readable output
|
75
|
-
def self.list_all
|
76
|
-
top_platforms = self.top_platforms
|
77
|
-
top_platforms.each_value do |platform|
|
78
|
-
puts platform.title
|
79
|
-
print_children(platform) if defined?(platform.children)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def self.print_children(parent, pad = 2)
|
84
|
-
parent.children.each do |key, value|
|
85
|
-
obj = key
|
86
|
-
puts "#{" " * pad}-> #{obj.title}#{value unless value.empty?}"
|
87
|
-
print_children(obj, pad + 2) if defined?(obj.children) && !obj.children.nil?
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def self.export
|
92
|
-
export = []
|
93
|
-
list.each do |name, platform|
|
94
|
-
platform.find_family_hierarchy
|
95
|
-
export << {
|
96
|
-
name: name,
|
97
|
-
families: platform.family_hierarchy,
|
98
|
-
}
|
99
|
-
end
|
100
|
-
export.sort_by { |platform| platform[:name] }
|
101
|
-
end
|
102
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module Train::Platforms
|
4
|
-
module Common
|
5
|
-
# Add a family connection. This will create a family
|
6
|
-
# if it does not exist and add a child relationship.
|
7
|
-
def in_family(family)
|
8
|
-
if self.class == Train::Platforms::Family && @name == family
|
9
|
-
raise "Unable to add family #{@name} to itself: '#{@name}.in_family(#{family})'"
|
10
|
-
end
|
11
|
-
|
12
|
-
# add family to the family list
|
13
|
-
family = Train::Platforms.family(family)
|
14
|
-
family.children[self] = @condition
|
15
|
-
|
16
|
-
@families[family] = @condition
|
17
|
-
@condition = nil
|
18
|
-
self
|
19
|
-
end
|
20
|
-
|
21
|
-
def detect(&block)
|
22
|
-
if block_given?
|
23
|
-
@detect = block
|
24
|
-
self
|
25
|
-
elsif @detect.nil?
|
26
|
-
# we are returning a block that just returns false here
|
27
|
-
# to skip the family/platform evaluation if detect is not set
|
28
|
-
->(_) { false }
|
29
|
-
else
|
30
|
-
@detect
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,160 +0,0 @@
|
|
1
|
-
require_relative "os_linux"
|
2
|
-
require_relative "os_windows"
|
3
|
-
require "rbconfig"
|
4
|
-
|
5
|
-
module Train::Platforms::Detect::Helpers
|
6
|
-
module OSCommon
|
7
|
-
include Train::Platforms::Detect::Helpers::Linux
|
8
|
-
include Train::Platforms::Detect::Helpers::Windows
|
9
|
-
|
10
|
-
def ruby_host_os(regex)
|
11
|
-
::RbConfig::CONFIG["host_os"] =~ regex
|
12
|
-
end
|
13
|
-
|
14
|
-
def winrm?
|
15
|
-
backend_name == "TrainPlugins::WinRM::Connection"
|
16
|
-
end
|
17
|
-
|
18
|
-
def backend_name
|
19
|
-
@backend.class.name
|
20
|
-
end
|
21
|
-
|
22
|
-
def unix_file_contents(path)
|
23
|
-
# keep a log of files incase multiple checks call the same one
|
24
|
-
return @files[path] if @files.key?(path)
|
25
|
-
|
26
|
-
res = @backend.run_command("test -f #{path} && cat #{path}")
|
27
|
-
# ignore files that can't be read
|
28
|
-
@files[path] = res.exit_status == 0 ? res.stdout : nil
|
29
|
-
@files[path]
|
30
|
-
end
|
31
|
-
|
32
|
-
def unix_file_exist?(path)
|
33
|
-
@backend.run_command("test -f #{path}").exit_status == 0
|
34
|
-
end
|
35
|
-
|
36
|
-
def command_output(cmd)
|
37
|
-
res = @backend.run_command(cmd).stdout
|
38
|
-
# When you try to execute command using ssh connction as root user and you have provided ssh user identity file
|
39
|
-
# it gives standard output to login as authorised user other than root. To show this standard ouput as an error
|
40
|
-
# to user we are matching the string of stdout and raising the error here so that user gets exact information.
|
41
|
-
if @backend.class.to_s == "Train::Transports::SSH::Connection" && res =~ /Please login as the user/
|
42
|
-
raise Train::UserError, "SSH failed: #{res}"
|
43
|
-
end
|
44
|
-
|
45
|
-
res.strip! unless res.nil?
|
46
|
-
res
|
47
|
-
end
|
48
|
-
|
49
|
-
def unix_uname_s
|
50
|
-
return @uname[:s] if @uname.key?(:s)
|
51
|
-
|
52
|
-
@uname[:s] = command_output("uname -s")
|
53
|
-
end
|
54
|
-
|
55
|
-
def unix_uname_r
|
56
|
-
return @uname[:r] if @uname.key?(:r)
|
57
|
-
|
58
|
-
@uname[:r] = command_output("uname -r")
|
59
|
-
end
|
60
|
-
|
61
|
-
def unix_uname_m
|
62
|
-
return @uname[:m] if @uname.key?(:m)
|
63
|
-
|
64
|
-
@uname[:m] = command_output("uname -m")
|
65
|
-
end
|
66
|
-
|
67
|
-
def brocade_version
|
68
|
-
return @cache[:brocade] if @cache.key?(:brocade)
|
69
|
-
|
70
|
-
res = command_output("version")
|
71
|
-
|
72
|
-
m = res.match(/^Fabric OS:\s+v(\S+)$/)
|
73
|
-
unless m.nil?
|
74
|
-
return @cache[:brocade] = { version: m[1], type: "fos" }
|
75
|
-
end
|
76
|
-
|
77
|
-
@cache[:brocade] = nil
|
78
|
-
end
|
79
|
-
|
80
|
-
def cisco_show_version
|
81
|
-
return @cache[:cisco] if @cache.key?(:cisco)
|
82
|
-
|
83
|
-
res = command_output("show version")
|
84
|
-
|
85
|
-
m = res.match(/Cisco IOS Software, [^,]+? \(([^,]+?)\), Version (\d+\.\d+)/)
|
86
|
-
unless m.nil?
|
87
|
-
return @cache[:cisco] = { version: m[2], model: m[1], type: "ios" }
|
88
|
-
end
|
89
|
-
|
90
|
-
m = res.match(/Cisco IOS Software, IOS-XE Software, [^,]+? \(([^,]+?)\), Version (\d+\.\d+\.\d+[A-Z]*)/)
|
91
|
-
unless m.nil?
|
92
|
-
return @cache[:cisco] = { version: m[2], model: m[1], type: "ios-xe" }
|
93
|
-
end
|
94
|
-
|
95
|
-
m = res.match(/Cisco Nexus Operating System \(NX-OS\) Software/)
|
96
|
-
unless m.nil?
|
97
|
-
v = res[/^\s*system:\s+version (\d+\.\d+)/, 1]
|
98
|
-
return @cache[:cisco] = { version: v, type: "nexus" }
|
99
|
-
end
|
100
|
-
|
101
|
-
@cache[:cisco] = nil
|
102
|
-
end
|
103
|
-
|
104
|
-
def unix_uuid
|
105
|
-
(unix_uuid_from_chef ||
|
106
|
-
unix_uuid_from_machine_file ||
|
107
|
-
uuid_from_command ||
|
108
|
-
raise(Train::TransportError, "Cannot find a UUID for your node."))
|
109
|
-
end
|
110
|
-
|
111
|
-
def unix_uuid_from_chef
|
112
|
-
file = @backend.file("/var/chef/cache/data_collector_metadata.json")
|
113
|
-
if file.exist? && file.size != 0
|
114
|
-
json = ::JSON.parse(file.content)
|
115
|
-
return json["node_uuid"] if json["node_uuid"]
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
def unix_uuid_from_machine_file
|
120
|
-
# require 'pry';binding.pry
|
121
|
-
%W{
|
122
|
-
/etc/chef/chef_guid
|
123
|
-
#{ENV["HOME"]}/.chef/chef_guid
|
124
|
-
/etc/machine-id
|
125
|
-
/var/lib/dbus/machine-id
|
126
|
-
/var/db/dbus/machine-id
|
127
|
-
}.each do |path|
|
128
|
-
file = @backend.file(path)
|
129
|
-
next unless file.exist? && file.size != 0
|
130
|
-
return file.content.chomp if path =~ /guid/
|
131
|
-
|
132
|
-
return uuid_from_string(file.content.chomp)
|
133
|
-
end
|
134
|
-
nil
|
135
|
-
end
|
136
|
-
|
137
|
-
# This takes a command from the platform detect block to run.
|
138
|
-
# We expect the command to return a unique identifier which
|
139
|
-
# we turn into a UUID.
|
140
|
-
def uuid_from_command
|
141
|
-
return unless @platform[:uuid_command]
|
142
|
-
|
143
|
-
result = @backend.run_command(@platform[:uuid_command])
|
144
|
-
uuid_from_string(result.stdout.chomp) if result.exit_status == 0 && !result.stdout.empty?
|
145
|
-
end
|
146
|
-
|
147
|
-
# This hashes the passed string into SHA1.
|
148
|
-
# Then it downgrades the 160bit SHA1 to a 128bit
|
149
|
-
# then we format it as a valid UUIDv5.
|
150
|
-
def uuid_from_string(string)
|
151
|
-
hash = Digest::SHA1.new
|
152
|
-
hash.update(string)
|
153
|
-
ary = hash.digest.unpack("NnnnnN")
|
154
|
-
ary[2] = (ary[2] & 0x0FFF) | (5 << 12)
|
155
|
-
ary[3] = (ary[3] & 0x3FFF) | 0x8000
|
156
|
-
# rubocop:disable Style/FormatString
|
157
|
-
"%08x-%04x-%04x-%04x-%04x%08x" % ary
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
@@ -1,80 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module Train::Platforms::Detect::Helpers
|
4
|
-
module Linux
|
5
|
-
def redhatish_platform(conf)
|
6
|
-
conf =~ /^red hat/i ? "redhat" : /(\w+)/i.match(conf)[1].downcase
|
7
|
-
end
|
8
|
-
|
9
|
-
def redhatish_version(conf)
|
10
|
-
case conf
|
11
|
-
when /rawhide/i
|
12
|
-
/((\d+) \(Rawhide\))/i.match(conf)[1].downcase
|
13
|
-
when /Amazon Linux/i
|
14
|
-
/([\d\.]+)/.match(conf)[1]
|
15
|
-
when /derived from .*linux|amazon/i
|
16
|
-
/Linux ((\d+|\.)+)/i.match(conf)[1]
|
17
|
-
else
|
18
|
-
/release ([\d\.]+)/.match(conf)[1]
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def linux_os_release
|
23
|
-
data = unix_file_contents("/etc/os-release")
|
24
|
-
return if data.nil?
|
25
|
-
|
26
|
-
os_info = parse_os_release_info(data)
|
27
|
-
cisco_info_file = os_info["CISCO_RELEASE_INFO"]
|
28
|
-
if cisco_info_file
|
29
|
-
os_info.merge!(parse_os_release_info(unix_file_contents(cisco_info_file)))
|
30
|
-
end
|
31
|
-
|
32
|
-
os_info
|
33
|
-
end
|
34
|
-
|
35
|
-
def parse_os_release_info(raw)
|
36
|
-
return {} if raw.nil?
|
37
|
-
|
38
|
-
raw.lines.each_with_object({}) do |line, memo|
|
39
|
-
line.strip!
|
40
|
-
next if line.nil? || line.empty?
|
41
|
-
next if line.start_with?("#")
|
42
|
-
|
43
|
-
key, value = line.split("=", 2)
|
44
|
-
memo[key] = value.gsub(/\A"|"\Z/, "") unless value.nil? || value.empty?
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def lsb_config(content)
|
49
|
-
id = /^DISTRIB_ID=["']?(.+?)["']?$/.match(content)
|
50
|
-
release = /^DISTRIB_RELEASE=["']?(.+?)["']?$/.match(content)
|
51
|
-
codename = /^DISTRIB_CODENAME=["']?(.+?)["']?$/.match(content)
|
52
|
-
{
|
53
|
-
id: id.nil? ? nil : id[1],
|
54
|
-
release: release.nil? ? nil : release[1],
|
55
|
-
codename: codename.nil? ? nil : codename[1],
|
56
|
-
}
|
57
|
-
end
|
58
|
-
|
59
|
-
def lsb_release(content)
|
60
|
-
id = /^Distributor ID:\s+(.+)$/.match(content)
|
61
|
-
release = /^Release:\s+(.+)$/.match(content)
|
62
|
-
codename = /^Codename:\s+(.+)$/.match(content)
|
63
|
-
{
|
64
|
-
id: id.nil? ? nil : id[1],
|
65
|
-
release: release.nil? ? nil : release[1],
|
66
|
-
codename: codename.nil? ? nil : codename[1],
|
67
|
-
}
|
68
|
-
end
|
69
|
-
|
70
|
-
def read_linux_lsb
|
71
|
-
return @lsb unless @lsb.empty?
|
72
|
-
|
73
|
-
if !(raw = unix_file_contents("/etc/lsb-release")).nil?
|
74
|
-
@lsb = lsb_config(raw)
|
75
|
-
elsif !(raw = unix_file_contents("/usr/bin/lsb-release")).nil?
|
76
|
-
@lsb = lsb_release(raw)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
@@ -1,142 +0,0 @@
|
|
1
|
-
module Train::Platforms::Detect::Helpers
|
2
|
-
module Windows
|
3
|
-
def detect_windows
|
4
|
-
check_cmd || check_powershell
|
5
|
-
end
|
6
|
-
|
7
|
-
def check_cmd
|
8
|
-
# try to detect windows, use cmd.exe to also support Microsoft OpenSSH
|
9
|
-
res = @backend.run_command("cmd.exe /c ver")
|
10
|
-
|
11
|
-
return false if (res.exit_status != 0) || res.stdout.empty?
|
12
|
-
|
13
|
-
# if the ver contains `Windows`, we know its a Windows system
|
14
|
-
version = res.stdout.strip
|
15
|
-
return false unless version.downcase =~ /windows/
|
16
|
-
|
17
|
-
@platform[:family] = "windows"
|
18
|
-
|
19
|
-
# try to extract release from eg. `Microsoft Windows [Version 6.3.9600]`
|
20
|
-
release = /\[(?<name>.*)\]/.match(version)
|
21
|
-
if release[:name]
|
22
|
-
# release is 6.3.9600 now
|
23
|
-
@platform[:release] = release[:name].downcase.gsub("version", "").strip
|
24
|
-
# fallback, if we are not able to extract the name from wmic later
|
25
|
-
@platform[:name] = "Windows #{@platform[:release]}"
|
26
|
-
end
|
27
|
-
|
28
|
-
read_wmic
|
29
|
-
true
|
30
|
-
end
|
31
|
-
|
32
|
-
def check_powershell
|
33
|
-
command = @backend.run_command(
|
34
|
-
"Get-WmiObject Win32_OperatingSystem | Select Caption,Version | ConvertTo-Json"
|
35
|
-
)
|
36
|
-
return false if (command.exit_status != 0) || command.stdout.empty?
|
37
|
-
|
38
|
-
payload = JSON.parse(command.stdout)
|
39
|
-
@platform[:family] = "windows"
|
40
|
-
@platform[:release] = payload["Version"]
|
41
|
-
@platform[:name] = payload["Caption"]
|
42
|
-
|
43
|
-
read_wmic
|
44
|
-
true
|
45
|
-
end
|
46
|
-
|
47
|
-
# reads os name and version from wmic
|
48
|
-
# @see https://msdn.microsoft.com/en-us/library/bb742610.aspx#EEAA
|
49
|
-
# Thanks to Matt Wrock (https://github.com/mwrock) for this hint
|
50
|
-
def read_wmic
|
51
|
-
res = @backend.run_command("wmic os get * /format:list")
|
52
|
-
if res.exit_status == 0
|
53
|
-
sys_info = {}
|
54
|
-
res.stdout.lines.each do |line|
|
55
|
-
m = /^\s*([^=]*?)\s*=\s*(.*?)\s*$/.match(line)
|
56
|
-
sys_info[m[1].to_sym] = m[2] unless m.nil? || m[1].nil?
|
57
|
-
end
|
58
|
-
|
59
|
-
@platform[:release] = sys_info[:Version]
|
60
|
-
# additional info on windows
|
61
|
-
@platform[:build] = sys_info[:BuildNumber]
|
62
|
-
@platform[:name] = sys_info[:Caption]
|
63
|
-
@platform[:name] = @platform[:name].gsub("Microsoft", "").strip unless @platform[:name].empty?
|
64
|
-
@platform[:arch] = read_wmic_cpu
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
# `OSArchitecture` from `read_wmic` does not match a normal standard
|
69
|
-
# For example, `x86_64` shows as `64-bit`
|
70
|
-
def read_wmic_cpu
|
71
|
-
res = @backend.run_command("wmic cpu get architecture /format:list")
|
72
|
-
if res.exit_status == 0
|
73
|
-
sys_info = {}
|
74
|
-
res.stdout.lines.each do |line|
|
75
|
-
m = /^\s*([^=]*?)\s*=\s*(.*?)\s*$/.match(line)
|
76
|
-
sys_info[m[1].to_sym] = m[2] unless m.nil? || m[1].nil?
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
# This converts `wmic os get architecture` output to a normal standard
|
81
|
-
# https://msdn.microsoft.com/en-us/library/aa394373(VS.85).aspx
|
82
|
-
arch_map = {
|
83
|
-
0 => "i386",
|
84
|
-
1 => "mips",
|
85
|
-
2 => "alpha",
|
86
|
-
3 => "powerpc",
|
87
|
-
5 => "arm",
|
88
|
-
6 => "ia64",
|
89
|
-
9 => "x86_64",
|
90
|
-
}
|
91
|
-
|
92
|
-
# The value of `wmic cpu get architecture` is always a number between 0-9
|
93
|
-
arch_number = sys_info[:Architecture].to_i
|
94
|
-
arch_map[arch_number]
|
95
|
-
end
|
96
|
-
|
97
|
-
# This method scans the target os for a unique uuid to use
|
98
|
-
def windows_uuid
|
99
|
-
uuid = windows_uuid_from_chef
|
100
|
-
uuid = windows_uuid_from_machine_file if uuid.nil?
|
101
|
-
uuid = windows_uuid_from_wmic if uuid.nil?
|
102
|
-
uuid = windows_uuid_from_registry if uuid.nil?
|
103
|
-
raise Train::TransportError, "Cannot find a UUID for your node." if uuid.nil?
|
104
|
-
|
105
|
-
uuid
|
106
|
-
end
|
107
|
-
|
108
|
-
def windows_uuid_from_machine_file
|
109
|
-
%W{
|
110
|
-
#{ENV["SYSTEMDRIVE"]}\\chef\\chef_guid
|
111
|
-
#{ENV["HOMEDRIVE"]}#{ENV["HOMEPATH"]}\\.chef\\chef_guid
|
112
|
-
}.each do |path|
|
113
|
-
file = @backend.file(path)
|
114
|
-
return file.content.chomp if file.exist? && file.size != 0
|
115
|
-
end
|
116
|
-
nil
|
117
|
-
end
|
118
|
-
|
119
|
-
def windows_uuid_from_chef
|
120
|
-
file = @backend.file("#{ENV["SYSTEMDRIVE"]}\\chef\\cache\\data_collector_metadata.json")
|
121
|
-
return if !file.exist? || file.size == 0
|
122
|
-
|
123
|
-
json = JSON.parse(file.content)
|
124
|
-
json["node_uuid"] if json["node_uuid"]
|
125
|
-
end
|
126
|
-
|
127
|
-
def windows_uuid_from_wmic
|
128
|
-
result = @backend.run_command("wmic csproduct get UUID")
|
129
|
-
return unless result.exit_status == 0
|
130
|
-
|
131
|
-
result.stdout.split("\r\n")[-1].strip
|
132
|
-
end
|
133
|
-
|
134
|
-
def windows_uuid_from_registry
|
135
|
-
cmd = '(Get-ItemProperty "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography" -Name "MachineGuid")."MachineGuid"'
|
136
|
-
result = @backend.run_command(cmd)
|
137
|
-
return unless result.exit_status == 0
|
138
|
-
|
139
|
-
result.stdout.chomp
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|