train 2.1.13 → 2.1.19
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 +4 -4
- data/lib/train.rb +5 -3
- data/lib/train/extras/command_wrapper.rb +2 -0
- data/lib/train/extras/stat.rb +5 -1
- data/lib/train/file/local.rb +2 -0
- data/lib/train/file/local/windows.rb +8 -3
- data/lib/train/file/remote.rb +4 -0
- data/lib/train/file/remote/aix.rb +2 -0
- data/lib/train/file/remote/linux.rb +2 -0
- data/lib/train/file/remote/unix.rb +3 -1
- data/lib/train/file/remote/windows.rb +17 -5
- data/lib/train/options.rb +6 -5
- data/lib/train/platforms.rb +22 -22
- data/lib/train/platforms/detect/helpers/os_common.rb +9 -1
- data/lib/train/platforms/detect/helpers/os_linux.rb +2 -0
- data/lib/train/platforms/detect/helpers/os_windows.rb +8 -3
- data/lib/train/platforms/detect/scanner.rb +1 -0
- data/lib/train/platforms/detect/specifications/os.rb +395 -391
- data/lib/train/platforms/family.rb +5 -0
- data/lib/train/platforms/platform.rb +8 -6
- data/lib/train/plugins.rb +3 -3
- data/lib/train/plugins/base_connection.rb +6 -0
- data/lib/train/transports/cisco_ios_connection.rb +2 -0
- data/lib/train/transports/docker.rb +2 -1
- data/lib/train/transports/gcp.rb +1 -0
- data/lib/train/transports/helpers/azure/file_credentials.rb +1 -0
- data/lib/train/transports/local.rb +1 -1
- data/lib/train/transports/mock.rb +5 -3
- data/lib/train/transports/ssh.rb +1 -1
- data/lib/train/transports/ssh_connection.rb +2 -0
- data/lib/train/transports/winrm.rb +1 -1
- data/lib/train/transports/winrm_connection.rb +4 -2
- data/lib/train/version.rb +1 -1
- metadata +2 -2
@@ -39,6 +39,7 @@ module Train::Platforms::Detect::Helpers
|
|
39
39
|
line.strip!
|
40
40
|
next if line.start_with?("#")
|
41
41
|
next if line.empty?
|
42
|
+
|
42
43
|
key, value = line.split("=", 2)
|
43
44
|
memo[key] = value.gsub(/\A"|"\Z/, "") unless value.empty?
|
44
45
|
end
|
@@ -68,6 +69,7 @@ module Train::Platforms::Detect::Helpers
|
|
68
69
|
|
69
70
|
def read_linux_lsb
|
70
71
|
return @lsb unless @lsb.empty?
|
72
|
+
|
71
73
|
if !(raw = unix_file_contents("/etc/lsb-release")).nil?
|
72
74
|
@lsb = lsb_config(raw)
|
73
75
|
elsif !(raw = unix_file_contents("/usr/bin/lsb-release")).nil?
|
@@ -8,6 +8,7 @@ module Train::Platforms::Detect::Helpers
|
|
8
8
|
# if the ver contains `Windows`, we know its a Windows system
|
9
9
|
version = res.stdout.strip
|
10
10
|
return false unless version.downcase =~ /windows/
|
11
|
+
|
11
12
|
@platform[:family] = "windows"
|
12
13
|
|
13
14
|
# try to extract release from eg. `Microsoft Windows [Version 6.3.9600]`
|
@@ -82,13 +83,14 @@ module Train::Platforms::Detect::Helpers
|
|
82
83
|
uuid = windows_uuid_from_wmic if uuid.nil?
|
83
84
|
uuid = windows_uuid_from_registry if uuid.nil?
|
84
85
|
raise Train::TransportError, "Cannot find a UUID for your node." if uuid.nil?
|
86
|
+
|
85
87
|
uuid
|
86
88
|
end
|
87
89
|
|
88
90
|
def windows_uuid_from_machine_file
|
89
91
|
%W{
|
90
|
-
#{ENV[
|
91
|
-
#{ENV[
|
92
|
+
#{ENV["SYSTEMDRIVE"]}\\chef\\chef_guid
|
93
|
+
#{ENV["HOMEDRIVE"]}#{ENV["HOMEPATH"]}\\.chef\\chef_guid
|
92
94
|
}.each do |path|
|
93
95
|
file = @backend.file(path)
|
94
96
|
return file.content.chomp if file.exist? && file.size != 0
|
@@ -97,8 +99,9 @@ module Train::Platforms::Detect::Helpers
|
|
97
99
|
end
|
98
100
|
|
99
101
|
def windows_uuid_from_chef
|
100
|
-
file = @backend.file("#{ENV[
|
102
|
+
file = @backend.file("#{ENV["SYSTEMDRIVE"]}\\chef\\cache\\data_collector_metadata.json")
|
101
103
|
return if !file.exist? || file.size == 0
|
104
|
+
|
102
105
|
json = JSON.parse(file.content)
|
103
106
|
json["node_uuid"] if json["node_uuid"]
|
104
107
|
end
|
@@ -106,6 +109,7 @@ module Train::Platforms::Detect::Helpers
|
|
106
109
|
def windows_uuid_from_wmic
|
107
110
|
result = @backend.run_command("wmic csproduct get UUID")
|
108
111
|
return unless result.exit_status == 0
|
112
|
+
|
109
113
|
result.stdout.split("\r\n")[-1].strip
|
110
114
|
end
|
111
115
|
|
@@ -113,6 +117,7 @@ module Train::Platforms::Detect::Helpers
|
|
113
117
|
cmd = '(Get-ItemProperty "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography" -Name "MachineGuid")."MachineGuid"'
|
114
118
|
result = @backend.run_command(cmd)
|
115
119
|
return unless result.exit_status == 0
|
120
|
+
|
116
121
|
result.stdout.chomp
|
117
122
|
end
|
118
123
|
end
|
@@ -16,576 +16,580 @@ module Train::Platforms::Detect::Specifications
|
|
16
16
|
plat.family("os").detect { true }
|
17
17
|
|
18
18
|
plat.family("windows").in_family("os")
|
19
|
-
|
19
|
+
.detect do
|
20
20
|
# Can't return from a `proc` thus the `is_windows` shenanigans
|
21
|
-
|
22
|
-
|
21
|
+
is_windows = false
|
22
|
+
is_windows = true if winrm?
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
if @backend.class.to_s == "Train::Transports::Local::Connection"
|
25
|
+
is_windows = true if ruby_host_os(/mswin|mingw32|windows/)
|
26
|
+
end
|
27
27
|
|
28
28
|
# Try to detect windows even for ssh transport
|
29
|
-
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
is_windows
|
29
|
+
if !is_windows && detect_windows == true
|
30
|
+
is_windows = true
|
34
31
|
end
|
32
|
+
|
33
|
+
is_windows
|
34
|
+
end
|
35
35
|
# windows platform
|
36
36
|
plat.name("windows").in_family("windows")
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
.detect do
|
38
|
+
true if detect_windows == true
|
39
|
+
end
|
40
40
|
|
41
41
|
# unix master family
|
42
42
|
plat.family("unix").in_family("os")
|
43
|
-
|
43
|
+
.detect do
|
44
44
|
# we want to catch a special case here where cisco commands
|
45
45
|
# don't return an exit status and still print to stdout
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
end
|
46
|
+
if unix_uname_s =~ /./ && !unix_uname_s.start_with?("Line has invalid autocommand ") && !unix_uname_s.start_with?("The command you have entered")
|
47
|
+
@platform[:arch] = unix_uname_m
|
48
|
+
true
|
50
49
|
end
|
50
|
+
end
|
51
51
|
|
52
52
|
# linux master family
|
53
53
|
plat.family("linux").in_family("unix")
|
54
|
-
|
55
|
-
|
56
|
-
|
54
|
+
.detect do
|
55
|
+
true if unix_uname_s =~ /linux/i
|
56
|
+
end
|
57
57
|
|
58
58
|
# debian family
|
59
59
|
plat.family("debian").in_family("linux")
|
60
|
-
|
61
|
-
|
62
|
-
|
60
|
+
.detect do
|
61
|
+
true unless unix_file_contents("/etc/debian_version").nil?
|
62
|
+
end
|
63
63
|
plat.name("ubuntu").title("Ubuntu Linux").in_family("debian")
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
end
|
64
|
+
.detect do
|
65
|
+
lsb = read_linux_lsb
|
66
|
+
if lsb && lsb[:id] =~ /ubuntu/i
|
67
|
+
@platform[:release] = lsb[:release]
|
68
|
+
true
|
70
69
|
end
|
70
|
+
end
|
71
71
|
plat.name("linuxmint").title("LinuxMint").in_family("debian")
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
end
|
72
|
+
.detect do
|
73
|
+
lsb = read_linux_lsb
|
74
|
+
if lsb && lsb[:id] =~ /linuxmint/i
|
75
|
+
@platform[:release] = lsb[:release]
|
76
|
+
true
|
78
77
|
end
|
78
|
+
end
|
79
79
|
plat.name("raspbian").title("Raspbian Linux").in_family("debian")
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
end
|
80
|
+
.detect do
|
81
|
+
if (linux_os_release && linux_os_release["NAME"] =~ /raspbian/i) || \
|
82
|
+
unix_file_exist?("/usr/bin/raspi-config")
|
83
|
+
@platform[:release] = unix_file_contents("/etc/debian_version").chomp
|
84
|
+
true
|
86
85
|
end
|
86
|
+
end
|
87
87
|
plat.name("debian").title("Debian Linux").in_family("debian")
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
true
|
93
|
-
end
|
94
|
-
|
95
|
-
# if we get this far we have to be some type of debian
|
96
|
-
@platform[:release] = unix_file_contents("/etc/debian_version").chomp
|
88
|
+
.detect do
|
89
|
+
lsb = read_linux_lsb
|
90
|
+
if lsb && lsb[:id] =~ /debian/i
|
91
|
+
@platform[:release] = lsb[:release]
|
97
92
|
true
|
98
93
|
end
|
99
94
|
|
95
|
+
# if we get this far we have to be some type of debian
|
96
|
+
@platform[:release] = unix_file_contents("/etc/debian_version").chomp
|
97
|
+
true
|
98
|
+
end
|
99
|
+
|
100
100
|
# fedora family
|
101
101
|
plat.family("fedora").in_family("linux")
|
102
|
-
|
103
|
-
|
104
|
-
|
102
|
+
.detect do
|
103
|
+
true if linux_os_release && linux_os_release["NAME"] =~ /fedora/i
|
104
|
+
end
|
105
105
|
plat.name("fedora").title("Fedora").in_family("fedora")
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
106
|
+
.detect do
|
107
|
+
@platform[:release] = linux_os_release["VERSION_ID"]
|
108
|
+
true
|
109
|
+
end
|
110
110
|
|
111
111
|
# arista_eos family
|
112
112
|
# this checks for the arista bash shell
|
113
113
|
# must come before redhat as it uses fedora under the hood
|
114
114
|
plat.family("arista_eos").title("Arista EOS Family").in_family("linux")
|
115
|
-
|
116
|
-
|
117
|
-
|
115
|
+
.detect do
|
116
|
+
true
|
117
|
+
end
|
118
118
|
plat.name("arista_eos_bash").title("Arista EOS Bash Shell").in_family("arista_eos")
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
end
|
119
|
+
.detect do
|
120
|
+
if unix_file_exist?("/usr/bin/FastCli")
|
121
|
+
cmd = @backend.run_command('FastCli -p 15 -c "show version | json"')
|
122
|
+
if cmd.exit_status == 0 && !cmd.stdout.empty?
|
123
|
+
require "json"
|
124
|
+
begin
|
125
|
+
eos_ver = JSON.parse(cmd.stdout)
|
126
|
+
@platform[:release] = eos_ver["version"]
|
127
|
+
@platform[:arch] = eos_ver["architecture"]
|
128
|
+
true
|
129
|
+
rescue JSON::ParserError
|
130
|
+
nil
|
132
131
|
end
|
133
132
|
end
|
134
133
|
end
|
134
|
+
end
|
135
135
|
|
136
136
|
# redhat family
|
137
137
|
plat.family("redhat").in_family("linux")
|
138
|
-
|
138
|
+
.detect do
|
139
139
|
# I am not sure this returns true for all redhats in this family
|
140
140
|
# for now we are going to just try each platform
|
141
141
|
# return true unless unix_file_contents('/etc/redhat-release').nil?
|
142
142
|
|
143
|
-
|
144
|
-
|
143
|
+
true
|
144
|
+
end
|
145
145
|
plat.name("centos").title("Centos Linux").in_family("redhat")
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
end
|
146
|
+
.detect do
|
147
|
+
lsb = read_linux_lsb
|
148
|
+
if lsb && lsb[:id] =~ /centos/i
|
149
|
+
@platform[:release] = lsb[:release]
|
150
|
+
true
|
151
|
+
elsif linux_os_release && linux_os_release["NAME"] =~ /centos/i
|
152
|
+
@platform[:release] = redhatish_version(unix_file_contents("/etc/redhat-release"))
|
153
|
+
true
|
155
154
|
end
|
155
|
+
end
|
156
156
|
plat.name("oracle").title("Oracle Linux").in_family("redhat")
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
end
|
157
|
+
.detect do
|
158
|
+
if !(raw = unix_file_contents("/etc/oracle-release")).nil?
|
159
|
+
@platform[:release] = redhatish_version(raw)
|
160
|
+
true
|
161
|
+
elsif !(raw = unix_file_contents("/etc/enterprise-release")).nil?
|
162
|
+
@platform[:release] = redhatish_version(raw)
|
163
|
+
true
|
165
164
|
end
|
165
|
+
end
|
166
166
|
plat.name("scientific").title("Scientific Linux").in_family("redhat")
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
end
|
167
|
+
.detect do
|
168
|
+
lsb = read_linux_lsb
|
169
|
+
if lsb && lsb[:id] =~ /scientific/i
|
170
|
+
@platform[:release] = lsb[:release]
|
171
|
+
true
|
173
172
|
end
|
173
|
+
end
|
174
174
|
plat.name("xenserver").title("Xenserer Linux").in_family("redhat")
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
end
|
175
|
+
.detect do
|
176
|
+
lsb = read_linux_lsb
|
177
|
+
if lsb && lsb[:id] =~ /xenserver/i
|
178
|
+
@platform[:release] = lsb[:release]
|
179
|
+
true
|
181
180
|
end
|
181
|
+
end
|
182
182
|
plat.name("parallels-release").title("Parallels Linux").in_family("redhat")
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
end
|
183
|
+
.detect do
|
184
|
+
unless (raw = unix_file_contents("/etc/parallels-release")).nil?
|
185
|
+
@platform[:name] = redhatish_platform(raw)
|
186
|
+
@platform[:release] = raw[/(\d\.\d\.\d)/, 1]
|
187
|
+
true
|
189
188
|
end
|
189
|
+
end
|
190
190
|
plat.name("wrlinux").title("Wind River Linux").in_family("redhat")
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
end
|
191
|
+
.detect do
|
192
|
+
if linux_os_release && linux_os_release["ID_LIKE"] =~ /wrlinux/i
|
193
|
+
@platform[:release] = linux_os_release["VERSION"]
|
194
|
+
true
|
196
195
|
end
|
196
|
+
end
|
197
197
|
plat.name("amazon").title("Amazon Linux").in_family("redhat")
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
end
|
198
|
+
.detect do
|
199
|
+
lsb = read_linux_lsb
|
200
|
+
if lsb && lsb[:id] =~ /amazon/i
|
201
|
+
@platform[:release] = lsb[:release]
|
202
|
+
true
|
203
|
+
elsif (raw = unix_file_contents("/etc/system-release")) =~ /amazon/i
|
204
|
+
@platform[:name] = redhatish_platform(raw)
|
205
|
+
@platform[:release] = redhatish_version(raw)
|
206
|
+
true
|
208
207
|
end
|
208
|
+
end
|
209
209
|
plat.name("cloudlinux").title("CloudLinux").in_family("redhat")
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
end
|
210
|
+
.detect do
|
211
|
+
lsb = read_linux_lsb
|
212
|
+
if lsb && lsb[:id] =~ /cloudlinux/i
|
213
|
+
@platform[:release] = lsb[:release]
|
214
|
+
true
|
215
|
+
elsif (raw = unix_file_contents("/etc/redhat-release")) =~ /cloudlinux/i
|
216
|
+
@platform[:name] = redhatish_platform(raw)
|
217
|
+
@platform[:release] = redhatish_version(raw)
|
218
|
+
true
|
220
219
|
end
|
220
|
+
end
|
221
221
|
# keep redhat at the end as a fallback for anything with a redhat-release
|
222
222
|
plat.name("redhat").title("Red Hat Linux").in_family("redhat")
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
end
|
223
|
+
.detect do
|
224
|
+
lsb = read_linux_lsb
|
225
|
+
if lsb && lsb[:id] =~ /redhat/i
|
226
|
+
@platform[:release] = lsb[:release]
|
227
|
+
true
|
228
|
+
elsif !(raw = unix_file_contents("/etc/redhat-release")).nil?
|
229
|
+
# must be some type of redhat
|
230
|
+
@platform[:name] = redhatish_platform(raw)
|
231
|
+
@platform[:release] = redhatish_version(raw)
|
232
|
+
true
|
234
233
|
end
|
234
|
+
end
|
235
235
|
|
236
236
|
# suse family
|
237
237
|
plat.family("suse").in_family("linux")
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
end
|
238
|
+
.detect do
|
239
|
+
unless (suse = unix_file_contents("/etc/SuSE-release")).nil?
|
240
|
+
# https://rubular.com/r/UKaYWolCYFMfp1
|
241
|
+
version = suse.scan(/VERSION = (\d+)\nPATCHLEVEL = (\d+)/).flatten.join(".")
|
242
|
+
# https://rubular.com/r/b5PN3hZDxa5amV
|
243
|
+
version = suse[/VERSION\s?=\s?"?([\d\.]{2,})"?/, 1] if version == ""
|
244
|
+
@platform[:release] = version
|
245
|
+
true
|
247
246
|
end
|
247
|
+
end
|
248
248
|
plat.name("opensuse").title("OpenSUSE Linux").in_family("suse")
|
249
|
-
|
250
|
-
|
251
|
-
|
249
|
+
.detect do
|
250
|
+
true if unix_file_contents("/etc/SuSE-release") =~ /^opensuse/i
|
251
|
+
end
|
252
252
|
plat.name("suse").title("Suse Linux").in_family("suse")
|
253
|
-
|
254
|
-
|
255
|
-
|
253
|
+
.detect do
|
254
|
+
true if unix_file_contents("/etc/SuSE-release") =~ /suse/i
|
255
|
+
end
|
256
256
|
|
257
257
|
# arch
|
258
258
|
plat.name("arch").title("Arch Linux").in_family("linux")
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
end
|
259
|
+
.detect do
|
260
|
+
unless unix_file_contents("/etc/arch-release").nil?
|
261
|
+
# Because this is a rolling release distribution,
|
262
|
+
# use the kernel release, ex. 4.1.6-1-ARCH
|
263
|
+
@platform[:release] = unix_uname_r
|
264
|
+
true
|
266
265
|
end
|
266
|
+
end
|
267
267
|
|
268
268
|
# slackware
|
269
269
|
plat.name("slackware").title("Slackware Linux").in_family("linux")
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
end
|
270
|
+
.detect do
|
271
|
+
unless (raw = unix_file_contents("/etc/slackware-version")).nil?
|
272
|
+
@platform[:release] = raw.scan(/(\d+|\.+)/).join
|
273
|
+
true
|
275
274
|
end
|
275
|
+
end
|
276
276
|
|
277
277
|
# gentoo
|
278
278
|
plat.name("gentoo").title("Gentoo Linux").in_family("linux")
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
end
|
279
|
+
.detect do
|
280
|
+
unless (raw = unix_file_contents("/etc/gentoo-release")).nil?
|
281
|
+
@platform[:release] = raw.scan(/(\d+|\.+)/).join
|
282
|
+
true
|
284
283
|
end
|
284
|
+
end
|
285
285
|
|
286
286
|
# exherbo
|
287
287
|
plat.name("exherbo").title("Exherbo Linux").in_family("linux")
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
end
|
288
|
+
.detect do
|
289
|
+
unless unix_file_contents("/etc/exherbo-release").nil?
|
290
|
+
# Because this is a rolling release distribution,
|
291
|
+
# use the kernel release, ex. 4.1.6
|
292
|
+
@platform[:release] = unix_uname_r
|
293
|
+
true
|
295
294
|
end
|
295
|
+
end
|
296
296
|
|
297
297
|
# alpine
|
298
298
|
plat.name("alpine").title("Alpine Linux").in_family("linux")
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
end
|
299
|
+
.detect do
|
300
|
+
unless (raw = unix_file_contents("/etc/alpine-release")).nil?
|
301
|
+
@platform[:release] = raw.strip
|
302
|
+
true
|
304
303
|
end
|
304
|
+
end
|
305
305
|
|
306
306
|
# coreos
|
307
307
|
plat.name("coreos").title("CoreOS Linux").in_family("linux")
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
end
|
308
|
+
.detect do
|
309
|
+
unless unix_file_contents("/etc/coreos/update.conf").nil?
|
310
|
+
lsb = read_linux_lsb
|
311
|
+
@platform[:release] = lsb[:release]
|
312
|
+
true
|
314
313
|
end
|
314
|
+
end
|
315
315
|
|
316
316
|
# brocade family detected here if device responds to 'uname' command,
|
317
317
|
# happens when logging in as root
|
318
318
|
plat.family("brocade").title("Brocade Family").in_family("linux")
|
319
|
-
|
320
|
-
|
321
|
-
|
319
|
+
.detect do
|
320
|
+
!brocade_version.nil?
|
321
|
+
end
|
322
322
|
|
323
323
|
# genaric linux
|
324
324
|
# this should always be last in the linux family list
|
325
325
|
plat.name("linux").title("Genaric Linux").in_family("linux")
|
326
|
-
|
327
|
-
|
328
|
-
|
326
|
+
.detect do
|
327
|
+
true
|
328
|
+
end
|
329
329
|
|
330
330
|
# openvms
|
331
331
|
plat.name("openvms").title("OpenVMS").in_family("unix")
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
end
|
332
|
+
.detect do
|
333
|
+
if unix_uname_s =~ /unrecognized command verb/i
|
334
|
+
cmd = @backend.run_command("show system/noprocess")
|
335
|
+
unless cmd.exit_status != 0 || cmd.stdout.empty?
|
336
|
+
@platform[:name] = cmd.stdout.downcase.split(" ")[0]
|
337
|
+
cmd = @backend.run_command('write sys$output f$getsyi("VERSION")')
|
338
|
+
@platform[:release] = cmd.stdout.downcase.split("\n")[1][1..-1]
|
339
|
+
cmd = @backend.run_command('write sys$output f$getsyi("ARCH_NAME")')
|
340
|
+
@platform[:arch] = cmd.stdout.downcase.split("\n")[1]
|
341
|
+
true
|
343
342
|
end
|
344
343
|
end
|
344
|
+
end
|
345
345
|
|
346
346
|
# aix
|
347
347
|
plat.family("aix").in_family("unix")
|
348
|
-
|
349
|
-
|
350
|
-
|
348
|
+
.detect do
|
349
|
+
true if unix_uname_s =~ /aix/i
|
350
|
+
end
|
351
351
|
plat.name("aix").title("Aix").in_family("aix")
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
end
|
359
|
-
true
|
352
|
+
.detect do
|
353
|
+
out = @backend.run_command("uname -rvp").stdout
|
354
|
+
m = out.match(/(\d+)\s+(\d+)\s+(.*)/)
|
355
|
+
unless m.nil?
|
356
|
+
@platform[:release] = "#{m[2]}.#{m[1]}"
|
357
|
+
@platform[:arch] = m[3].to_s
|
360
358
|
end
|
359
|
+
true
|
360
|
+
end
|
361
361
|
|
362
362
|
# solaris family
|
363
363
|
plat.family("solaris").in_family("unix")
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
end
|
369
|
-
|
370
|
-
arch = @backend.run_command("uname -p")
|
371
|
-
@platform[:arch] = arch.stdout.chomp if arch.exit_status == 0
|
372
|
-
true
|
364
|
+
.detect do
|
365
|
+
if unix_uname_s =~ /sunos/i
|
366
|
+
unless (version = /^5\.(?<release>\d+)$/.match(unix_uname_r)).nil?
|
367
|
+
@platform[:release] = version["release"]
|
373
368
|
end
|
369
|
+
|
370
|
+
arch = @backend.run_command("uname -p")
|
371
|
+
@platform[:arch] = arch.stdout.chomp if arch.exit_status == 0
|
372
|
+
true
|
374
373
|
end
|
374
|
+
end
|
375
375
|
plat.name("smartos").title("SmartOS").in_family("solaris")
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
end
|
376
|
+
.detect do
|
377
|
+
rel = unix_file_contents("/etc/release")
|
378
|
+
if /^.*(SmartOS).*$/ =~ rel
|
379
|
+
true
|
381
380
|
end
|
381
|
+
end
|
382
382
|
plat.name("omnios").title("Omnios").in_family("solaris")
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
end
|
383
|
+
.detect do
|
384
|
+
rel = unix_file_contents("/etc/release")
|
385
|
+
unless (m = /^\s*(OmniOS).*r(\d+).*$/.match(rel)).nil?
|
386
|
+
@platform[:release] = m[2]
|
387
|
+
true
|
389
388
|
end
|
389
|
+
end
|
390
390
|
plat.name("openindiana").title("Openindiana").in_family("solaris")
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
end
|
391
|
+
.detect do
|
392
|
+
rel = unix_file_contents("/etc/release")
|
393
|
+
unless (m = /^\s*(OpenIndiana).*oi_(\d+).*$/.match(rel)).nil?
|
394
|
+
@platform[:release] = m[2]
|
395
|
+
true
|
397
396
|
end
|
397
|
+
end
|
398
398
|
plat.name("opensolaris").title("Open Solaris").in_family("solaris")
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
end
|
399
|
+
.detect do
|
400
|
+
rel = unix_file_contents("/etc/release")
|
401
|
+
unless (m = /^\s*(OpenSolaris).*snv_(\d+).*$/.match(rel)).nil?
|
402
|
+
@platform[:release] = m[2]
|
403
|
+
true
|
405
404
|
end
|
405
|
+
end
|
406
406
|
plat.name("nexentacore").title("Nexentacore").in_family("solaris")
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
end
|
407
|
+
.detect do
|
408
|
+
rel = unix_file_contents("/etc/release")
|
409
|
+
if /^\s*(NexentaCore)\s.*$/ =~ rel
|
410
|
+
true
|
412
411
|
end
|
412
|
+
end
|
413
413
|
plat.name("solaris").title("Solaris").in_family("solaris")
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
true
|
422
|
-
end
|
423
|
-
|
424
|
-
# must be some unknown solaris
|
414
|
+
.detect do
|
415
|
+
rel = unix_file_contents("/etc/release")
|
416
|
+
if !(m = /Oracle Solaris (\d+)/.match(rel)).nil?
|
417
|
+
# TODO: should be string!
|
418
|
+
@platform[:release] = m[1]
|
419
|
+
true
|
420
|
+
elsif /^\s*(Solaris)\s.*$/ =~ rel
|
425
421
|
true
|
426
422
|
end
|
427
423
|
|
424
|
+
# must be some unknown solaris
|
425
|
+
true
|
426
|
+
end
|
427
|
+
|
428
428
|
# hpux
|
429
429
|
plat.family("hpux").in_family("unix")
|
430
|
-
|
431
|
-
|
432
|
-
|
430
|
+
.detect do
|
431
|
+
true if unix_uname_s =~ /hp-ux/i
|
432
|
+
end
|
433
433
|
plat.name("hpux").title("Hpux").in_family("hpux")
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
434
|
+
.detect do
|
435
|
+
@platform[:release] = unix_uname_r.lines[0].chomp
|
436
|
+
true
|
437
|
+
end
|
438
438
|
|
439
439
|
# qnx
|
440
440
|
plat.family("qnx").in_family("unix")
|
441
|
-
|
442
|
-
|
443
|
-
|
441
|
+
.detect do
|
442
|
+
true if unix_uname_s =~ /qnx/i
|
443
|
+
end
|
444
444
|
plat.name("qnx").title("QNX").in_family("qnx")
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
445
|
+
.detect do
|
446
|
+
@platform[:name] = unix_uname_s.lines[0].chomp.downcase
|
447
|
+
@platform[:release] = unix_uname_r.lines[0].chomp
|
448
|
+
@platform[:arch] = unix_uname_m
|
449
|
+
true
|
450
|
+
end
|
451
451
|
|
452
452
|
# bsd family
|
453
453
|
plat.family("bsd").in_family("unix")
|
454
|
-
|
454
|
+
.detect do
|
455
455
|
# we need a better way to determin this family
|
456
456
|
# for now we are going to just try each platform
|
457
|
-
|
458
|
-
|
457
|
+
true
|
458
|
+
end
|
459
459
|
plat.family("darwin").in_family("bsd")
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
end
|
460
|
+
.detect do
|
461
|
+
if unix_uname_s =~ /darwin/i
|
462
|
+
cmd = unix_file_contents("/usr/bin/sw_vers")
|
463
|
+
unless cmd.nil?
|
464
|
+
m = cmd.match(/^ProductVersion:\s+(.+)$/)
|
465
|
+
@platform[:release] = m.nil? ? nil : m[1]
|
466
|
+
m = cmd.match(/^BuildVersion:\s+(.+)$/)
|
467
|
+
@platform[:build] = m.nil? ? nil : m[1]
|
468
|
+
end
|
469
|
+
@platform[:release] = unix_uname_r.lines[0].chomp if @platform[:release].nil?
|
470
|
+
@platform[:arch] = unix_uname_m
|
471
|
+
true
|
473
472
|
end
|
473
|
+
end
|
474
474
|
plat.name("mac_os_x").title("macOS X").in_family("darwin")
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
475
|
+
.detect do
|
476
|
+
cmd = unix_file_contents("/System/Library/CoreServices/SystemVersion.plist")
|
477
|
+
@platform[:uuid_command] = "system_profiler SPHardwareDataType | awk '/UUID/ { print $3; }'"
|
478
|
+
true if cmd =~ /Mac OS X/i
|
479
|
+
end
|
480
480
|
plat.name("darwin").title("Darwin").in_family("darwin")
|
481
|
-
|
481
|
+
.detect do
|
482
482
|
# must be some other type of darwin
|
483
|
+
@platform[:name] = unix_uname_s.lines[0].chomp
|
484
|
+
true
|
485
|
+
end
|
486
|
+
plat.name("freebsd").title("Freebsd").in_family("bsd")
|
487
|
+
.detect do
|
488
|
+
if unix_uname_s =~ /freebsd/i
|
483
489
|
@platform[:name] = unix_uname_s.lines[0].chomp
|
490
|
+
@platform[:release] = unix_uname_r.lines[0].chomp
|
484
491
|
true
|
485
492
|
end
|
486
|
-
|
487
|
-
.detect do
|
488
|
-
if unix_uname_s =~ /freebsd/i
|
489
|
-
@platform[:name] = unix_uname_s.lines[0].chomp
|
490
|
-
@platform[:release] = unix_uname_r.lines[0].chomp
|
491
|
-
true
|
492
|
-
end
|
493
|
-
end
|
493
|
+
end
|
494
494
|
plat.name("openbsd").title("Openbsd").in_family("bsd")
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
end
|
495
|
+
.detect do
|
496
|
+
if unix_uname_s =~ /openbsd/i
|
497
|
+
@platform[:name] = unix_uname_s.lines[0].chomp
|
498
|
+
@platform[:release] = unix_uname_r.lines[0].chomp
|
499
|
+
true
|
501
500
|
end
|
501
|
+
end
|
502
502
|
plat.name("netbsd").title("Netbsd").in_family("bsd")
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
end
|
503
|
+
.detect do
|
504
|
+
if unix_uname_s =~ /netbsd/i
|
505
|
+
@platform[:name] = unix_uname_s.lines[0].chomp
|
506
|
+
@platform[:release] = unix_uname_r.lines[0].chomp
|
507
|
+
true
|
509
508
|
end
|
509
|
+
end
|
510
510
|
|
511
511
|
# arista_eos family
|
512
512
|
plat.family("arista_eos").title("Arista EOS Family").in_family("os")
|
513
|
-
|
514
|
-
|
515
|
-
|
513
|
+
.detect do
|
514
|
+
true
|
515
|
+
end
|
516
516
|
plat.name("arista_eos").title("Arista EOS").in_family("arista_eos")
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
end
|
517
|
+
.detect do
|
518
|
+
cmd = @backend.run_command("show version | json")
|
519
|
+
if cmd.exit_status == 0 && !cmd.stdout.empty?
|
520
|
+
require "json"
|
521
|
+
begin
|
522
|
+
eos_ver = JSON.parse(cmd.stdout)
|
523
|
+
@platform[:release] = eos_ver["version"]
|
524
|
+
@platform[:arch] = eos_ver["architecture"]
|
525
|
+
true
|
526
|
+
rescue JSON::ParserError
|
527
|
+
nil
|
529
528
|
end
|
530
529
|
end
|
530
|
+
end
|
531
531
|
|
532
532
|
# esx
|
533
533
|
plat.family("esx").title("ESXi Family").in_family("os")
|
534
|
-
|
535
|
-
|
536
|
-
|
534
|
+
.detect do
|
535
|
+
true if unix_uname_s =~ /vmkernel/i
|
536
|
+
end
|
537
537
|
plat.name("vmkernel").in_family("esx")
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
538
|
+
.detect do
|
539
|
+
@platform[:name] = unix_uname_s.lines[0].chomp
|
540
|
+
@platform[:release] = unix_uname_r.lines[0].chomp
|
541
|
+
true
|
542
|
+
end
|
543
543
|
|
544
544
|
# cisco_ios family
|
545
545
|
plat.family("cisco").title("Cisco Family").in_family("os")
|
546
|
-
|
547
|
-
|
548
|
-
|
546
|
+
.detect do
|
547
|
+
!cisco_show_version.nil?
|
548
|
+
end
|
549
549
|
plat.name("cisco_ios").title("Cisco IOS").in_family("cisco")
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
550
|
+
.detect do
|
551
|
+
v = cisco_show_version
|
552
|
+
next unless v[:type] == "ios"
|
553
|
+
|
554
|
+
@platform[:release] = v[:version]
|
555
|
+
@platform[:arch] = nil
|
556
|
+
true
|
557
|
+
end
|
557
558
|
plat.name("cisco_ios_xe").title("Cisco IOS XE").in_family("cisco")
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
559
|
+
.detect do
|
560
|
+
v = cisco_show_version
|
561
|
+
next unless v[:type] == "ios-xe"
|
562
|
+
|
563
|
+
@platform[:release] = v[:version]
|
564
|
+
@platform[:arch] = nil
|
565
|
+
true
|
566
|
+
end
|
565
567
|
plat.name("cisco_nexus").title("Cisco Nexus").in_family("cisco")
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
568
|
+
.detect do
|
569
|
+
v = cisco_show_version
|
570
|
+
next unless v[:type] == "nexus"
|
571
|
+
|
572
|
+
@platform[:release] = v[:version]
|
573
|
+
@platform[:arch] = nil
|
574
|
+
@platform[:uuid_command] = "show version | include Processor"
|
575
|
+
true
|
576
|
+
end
|
574
577
|
|
575
578
|
# brocade family
|
576
579
|
plat.family("brocade").title("Brocade Family").in_family("os")
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
+
.detect do
|
581
|
+
!brocade_version.nil?
|
582
|
+
end
|
580
583
|
|
581
584
|
plat.name("brocade_fos").title("Brocade FOS").in_family("brocade")
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
585
|
+
.detect do
|
586
|
+
v = brocade_version
|
587
|
+
next unless v[:type] == "fos"
|
588
|
+
|
589
|
+
@platform[:release] = v[:version]
|
590
|
+
@platform[:arch] = nil
|
591
|
+
true
|
592
|
+
end
|
589
593
|
end
|
590
594
|
end
|
591
595
|
end
|