Module: Train::Platforms::Detect::Helpers::OSCommon
Instance Method Summary
collapse
Methods included from Windows
#detect_windows, #read_wmic, #read_wmic_cpu, #windows_uuid, #windows_uuid_from_chef, #windows_uuid_from_machine_file, #windows_uuid_from_registry, #windows_uuid_from_wmic
Methods included from Linux
#linux_os_release, #lsb_config, #lsb_release, #parse_os_release_info, #read_linux_lsb, #redhatish_platform, #redhatish_version
Instance Method Details
#backend_name ⇒ Object
18
19
20
|
# File 'lib/train/platforms/detect/helpers/os_common.rb', line 18
def backend_name
@backend.class.name
end
|
#brocade_version ⇒ Object
67
68
69
70
71
72
73
74
75
76
77
78
|
# File 'lib/train/platforms/detect/helpers/os_common.rb', line 67
def brocade_version
return @cache[:brocade] if @cache.key?(:brocade)
res = command_output("version")
m = res.match(/^Fabric OS:\s+v(\S+)$/)
unless m.nil?
return @cache[:brocade] = { version: m[1], type: "fos" }
end
@cache[:brocade] = nil
end
|
#cisco_show_version ⇒ Object
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
# File 'lib/train/platforms/detect/helpers/os_common.rb', line 80
def cisco_show_version
return @cache[:cisco] if @cache.key?(:cisco)
res = command_output("show version")
m = res.match(/Cisco IOS Software, [^,]+? \(([^,]+?)\), Version (\d+\.\d+)/)
unless m.nil?
return @cache[:cisco] = { version: m[2], model: m[1], type: "ios" }
end
m = res.match(/Cisco IOS Software, IOS-XE Software, [^,]+? \(([^,]+?)\), Version (\d+\.\d+\.\d+[A-Z]*)/)
unless m.nil?
return @cache[:cisco] = { version: m[2], model: m[1], type: "ios-xe" }
end
m = res.match(/Cisco Nexus Operating System \(NX-OS\) Software/)
unless m.nil?
v = res[/^\s*system:\s+version (\d+\.\d+)/, 1]
return @cache[:cisco] = { version: v, type: "nexus" }
end
@cache[:cisco] = nil
end
|
#command_output(cmd) ⇒ Object
36
37
38
39
40
41
42
43
44
45
46
47
|
# File 'lib/train/platforms/detect/helpers/os_common.rb', line 36
def command_output(cmd)
res = @backend.run_command(cmd).stdout
if @backend.class.to_s == "Train::Transports::SSH::Connection" && res =~ /Please login as the user/
raise Train::UserError, "SSH failed: #{res}"
end
res.strip! unless res.nil?
res
end
|
#ruby_host_os(regex) ⇒ Object
10
11
12
|
# File 'lib/train/platforms/detect/helpers/os_common.rb', line 10
def ruby_host_os(regex)
::RbConfig::CONFIG["host_os"] =~ regex
end
|
#unix_file_contents(path) ⇒ Object
22
23
24
25
26
27
28
29
30
|
# File 'lib/train/platforms/detect/helpers/os_common.rb', line 22
def unix_file_contents(path)
return @files[path] if @files.key?(path)
res = @backend.run_command("test -f #{path} && cat #{path}")
@files[path] = res.exit_status == 0 ? res.stdout : nil
@files[path]
end
|
#unix_file_exist?(path) ⇒ Boolean
32
33
34
|
# File 'lib/train/platforms/detect/helpers/os_common.rb', line 32
def unix_file_exist?(path)
@backend.run_command("test -f #{path}").exit_status == 0
end
|
#unix_uname_m ⇒ Object
61
62
63
64
65
|
# File 'lib/train/platforms/detect/helpers/os_common.rb', line 61
def unix_uname_m
return @uname[:m] if @uname.key?(:m)
@uname[:m] = command_output("uname -m")
end
|
#unix_uname_r ⇒ Object
55
56
57
58
59
|
# File 'lib/train/platforms/detect/helpers/os_common.rb', line 55
def unix_uname_r
return @uname[:r] if @uname.key?(:r)
@uname[:r] = command_output("uname -r")
end
|
#unix_uname_s ⇒ Object
49
50
51
52
53
|
# File 'lib/train/platforms/detect/helpers/os_common.rb', line 49
def unix_uname_s
return @uname[:s] if @uname.key?(:s)
@uname[:s] = command_output("uname -s")
end
|
#unix_uuid ⇒ Object
104
105
106
107
108
109
|
# File 'lib/train/platforms/detect/helpers/os_common.rb', line 104
def unix_uuid
(unix_uuid_from_chef ||
unix_uuid_from_machine_file ||
uuid_from_command ||
raise(Train::TransportError, "Cannot find a UUID for your node."))
end
|
#unix_uuid_from_chef ⇒ Object
111
112
113
114
115
116
117
|
# File 'lib/train/platforms/detect/helpers/os_common.rb', line 111
def unix_uuid_from_chef
file = @backend.file("/var/chef/cache/data_collector_metadata.json")
if file.exist? && file.size != 0
json = ::JSON.parse(file.content)
return json["node_uuid"] if json["node_uuid"]
end
end
|
#unix_uuid_from_machine_file ⇒ Object
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
# File 'lib/train/platforms/detect/helpers/os_common.rb', line 119
def unix_uuid_from_machine_file
%W{
/etc/chef/chef_guid
#{ENV["HOME"]}/.chef/chef_guid
/etc/machine-id
/var/lib/dbus/machine-id
/var/db/dbus/machine-id
}.each do |path|
file = @backend.file(path)
next unless file.exist? && file.size != 0
return file.content.chomp if path =~ /guid/
return uuid_from_string(file.content.chomp)
end
nil
end
|
#uuid_from_command ⇒ Object
This takes a command from the platform detect block to run. We expect the command to return a unique identifier which we turn into a UUID.
140
141
142
143
144
145
|
# File 'lib/train/platforms/detect/helpers/os_common.rb', line 140
def uuid_from_command
return unless @platform[:uuid_command]
result = @backend.run_command(@platform[:uuid_command])
uuid_from_string(result.stdout.chomp) if result.exit_status == 0 && !result.stdout.empty?
end
|
#uuid_from_string(string) ⇒ Object
This hashes the passed string into SHA1. Then it downgrades the 160bit SHA1 to a 128bit then we format it as a valid UUIDv5.
150
151
152
153
154
155
156
157
158
|
# File 'lib/train/platforms/detect/helpers/os_common.rb', line 150
def uuid_from_string(string)
hash = Digest::SHA1.new
hash.update(string)
ary = hash.digest.unpack("NnnnnN")
ary[2] = (ary[2] & 0x0FFF) | (5 << 12)
ary[3] = (ary[3] & 0x3FFF) | 0x8000
"%08x-%04x-%04x-%04x-%04x%08x" % ary
end
|
#winrm? ⇒ Boolean
14
15
16
|
# File 'lib/train/platforms/detect/helpers/os_common.rb', line 14
def winrm?
backend_name == "TrainPlugins::WinRM::Connection"
end
|