ohai 18.2.6 → 19.0.3

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 (169) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +28 -28
  3. data/LICENSE +201 -201
  4. data/bin/ohai +25 -25
  5. data/lib/ohai/application.rb +189 -189
  6. data/lib/ohai/common/dmi.rb +167 -167
  7. data/lib/ohai/config.rb +51 -51
  8. data/lib/ohai/dsl/plugin/versionvii.rb +203 -203
  9. data/lib/ohai/dsl/plugin.rb +232 -232
  10. data/lib/ohai/dsl.rb +22 -22
  11. data/lib/ohai/exception.rb +36 -36
  12. data/lib/ohai/hints.rb +68 -68
  13. data/lib/ohai/loader.rb +178 -178
  14. data/lib/ohai/log.rb +34 -34
  15. data/lib/ohai/mash.rb +22 -22
  16. data/lib/ohai/mixin/alibaba_metadata.rb +83 -83
  17. data/lib/ohai/mixin/azure_metadata.rb +105 -105
  18. data/lib/ohai/mixin/chef_utils_wiring.rb +52 -52
  19. data/lib/ohai/mixin/command.rb +4 -4
  20. data/lib/ohai/mixin/constant_helper.rb +55 -55
  21. data/lib/ohai/mixin/dmi_decode.rb +54 -54
  22. data/lib/ohai/mixin/do_metadata.rb +48 -48
  23. data/lib/ohai/mixin/ec2_metadata.rb +264 -270
  24. data/lib/ohai/mixin/gce_metadata.rb +79 -79
  25. data/lib/ohai/mixin/http_helper.rb +64 -64
  26. data/lib/ohai/mixin/json_helper.rb +36 -36
  27. data/lib/ohai/mixin/network_helper.rb +92 -92
  28. data/lib/ohai/mixin/oci_metadata.rb +60 -60
  29. data/lib/ohai/mixin/os.rb +128 -128
  30. data/lib/ohai/mixin/scaleway_metadata.rb +51 -51
  31. data/lib/ohai/mixin/seconds_to_human.rb +52 -52
  32. data/lib/ohai/mixin/shell_out.rb +51 -51
  33. data/lib/ohai/mixin/softlayer_metadata.rb +74 -74
  34. data/lib/ohai/mixin/string.rb +31 -31
  35. data/lib/ohai/mixin/train_helpers.rb +36 -36
  36. data/lib/ohai/mixin/which.rb +39 -39
  37. data/lib/ohai/plugin_config.rb +47 -47
  38. data/lib/ohai/plugins/aix/kernel.rb +50 -50
  39. data/lib/ohai/plugins/aix/memory.rb +37 -37
  40. data/lib/ohai/plugins/aix/network.rb +142 -142
  41. data/lib/ohai/plugins/aix/platform.rb +30 -30
  42. data/lib/ohai/plugins/aix/uptime.rb +54 -54
  43. data/lib/ohai/plugins/aix/virtualization.rb +154 -154
  44. data/lib/ohai/plugins/alibaba.rb +72 -72
  45. data/lib/ohai/plugins/azure.rb +154 -154
  46. data/lib/ohai/plugins/bsd/virtualization.rb +121 -121
  47. data/lib/ohai/plugins/c.rb +178 -178
  48. data/lib/ohai/plugins/chef.rb +50 -50
  49. data/lib/ohai/plugins/cloud.rb +379 -379
  50. data/lib/ohai/plugins/command.rb +26 -26
  51. data/lib/ohai/plugins/cpu.rb +642 -642
  52. data/lib/ohai/plugins/darwin/hardware.rb +99 -99
  53. data/lib/ohai/plugins/darwin/memory.rb +62 -62
  54. data/lib/ohai/plugins/darwin/network.rb +207 -207
  55. data/lib/ohai/plugins/darwin/platform.rb +40 -40
  56. data/lib/ohai/plugins/darwin/virtualization.rb +104 -104
  57. data/lib/ohai/plugins/digital_ocean.rb +67 -67
  58. data/lib/ohai/plugins/dmi.rb +134 -134
  59. data/lib/ohai/plugins/docker.rb +58 -58
  60. data/lib/ohai/plugins/dragonflybsd/memory.rb +60 -60
  61. data/lib/ohai/plugins/dragonflybsd/network.rb +128 -128
  62. data/lib/ohai/plugins/dragonflybsd/platform.rb +28 -28
  63. data/lib/ohai/plugins/ec2.rb +148 -148
  64. data/lib/ohai/plugins/elixir.rb +36 -36
  65. data/lib/ohai/plugins/erlang.rb +60 -60
  66. data/lib/ohai/plugins/eucalyptus.rb +86 -86
  67. data/lib/ohai/plugins/filesystem.rb +753 -753
  68. data/lib/ohai/plugins/fips.rb +36 -36
  69. data/lib/ohai/plugins/freebsd/memory.rb +60 -60
  70. data/lib/ohai/plugins/freebsd/network.rb +128 -128
  71. data/lib/ohai/plugins/freebsd/platform.rb +28 -28
  72. data/lib/ohai/plugins/gce.rb +89 -89
  73. data/lib/ohai/plugins/go.rb +34 -34
  74. data/lib/ohai/plugins/groovy.rb +38 -38
  75. data/lib/ohai/plugins/grub2.rb +40 -40
  76. data/lib/ohai/plugins/habitat.rb +73 -73
  77. data/lib/ohai/plugins/haskell.rb +96 -96
  78. data/lib/ohai/plugins/hostname.rb +133 -133
  79. data/lib/ohai/plugins/init_package.rb +26 -26
  80. data/lib/ohai/plugins/java.rb +78 -78
  81. data/lib/ohai/plugins/kernel.rb +292 -292
  82. data/lib/ohai/plugins/keys.rb +27 -27
  83. data/lib/ohai/plugins/languages.rb +26 -26
  84. data/lib/ohai/plugins/libvirt.rb +114 -114
  85. data/lib/ohai/plugins/linode.rb +73 -73
  86. data/lib/ohai/plugins/linux/block_device.rb +48 -48
  87. data/lib/ohai/plugins/linux/hostnamectl.rb +34 -34
  88. data/lib/ohai/plugins/linux/interrupts.rb +84 -83
  89. data/lib/ohai/plugins/linux/ipc.rb +52 -52
  90. data/lib/ohai/plugins/linux/livepatch.rb +38 -38
  91. data/lib/ohai/plugins/linux/lsb.rb +46 -46
  92. data/lib/ohai/plugins/linux/lspci.rb +80 -80
  93. data/lib/ohai/plugins/linux/machineid.rb +36 -36
  94. data/lib/ohai/plugins/linux/mdadm.rb +120 -120
  95. data/lib/ohai/plugins/linux/memory.rb +106 -106
  96. data/lib/ohai/plugins/linux/network.rb +879 -879
  97. data/lib/ohai/plugins/linux/os_release.rb +38 -38
  98. data/lib/ohai/plugins/linux/platform.rb +314 -314
  99. data/lib/ohai/plugins/linux/selinux.rb +69 -69
  100. data/lib/ohai/plugins/linux/sessions.rb +54 -54
  101. data/lib/ohai/plugins/linux/sysctl.rb +39 -39
  102. data/lib/ohai/plugins/linux/systemd_paths.rb +36 -36
  103. data/lib/ohai/plugins/linux/tc.rb +61 -61
  104. data/lib/ohai/plugins/linux/virtualization.rb +300 -300
  105. data/lib/ohai/plugins/lua.rb +39 -39
  106. data/lib/ohai/plugins/mono.rb +50 -50
  107. data/lib/ohai/plugins/netbsd/memory.rb +99 -99
  108. data/lib/ohai/plugins/netbsd/network.rb +122 -122
  109. data/lib/ohai/plugins/netbsd/platform.rb +28 -28
  110. data/lib/ohai/plugins/network.rb +186 -186
  111. data/lib/ohai/plugins/nodejs.rb +40 -40
  112. data/lib/ohai/plugins/oci.rb +94 -94
  113. data/lib/ohai/plugins/ohai.rb +29 -29
  114. data/lib/ohai/plugins/ohai_time.rb +26 -26
  115. data/lib/ohai/plugins/openbsd/memory.rb +99 -99
  116. data/lib/ohai/plugins/openbsd/network.rb +122 -122
  117. data/lib/ohai/plugins/openbsd/platform.rb +28 -28
  118. data/lib/ohai/plugins/openstack.rb +84 -84
  119. data/lib/ohai/plugins/os.rb +55 -55
  120. data/lib/ohai/plugins/packages.rb +234 -234
  121. data/lib/ohai/plugins/passwd.rb +104 -104
  122. data/lib/ohai/plugins/perl.rb +45 -45
  123. data/lib/ohai/plugins/php.rb +52 -52
  124. data/lib/ohai/plugins/platform.rb +41 -41
  125. data/lib/ohai/plugins/powershell.rb +82 -82
  126. data/lib/ohai/plugins/ps.rb +35 -35
  127. data/lib/ohai/plugins/python.rb +43 -43
  128. data/lib/ohai/plugins/rackspace.rb +177 -177
  129. data/lib/ohai/plugins/root_group.rb +41 -41
  130. data/lib/ohai/plugins/rpm.rb +121 -121
  131. data/lib/ohai/plugins/ruby.rb +66 -66
  132. data/lib/ohai/plugins/rust.rb +34 -34
  133. data/lib/ohai/plugins/scala.rb +38 -38
  134. data/lib/ohai/plugins/scaleway.rb +58 -58
  135. data/lib/ohai/plugins/scsi.rb +52 -52
  136. data/lib/ohai/plugins/shard.rb +142 -142
  137. data/lib/ohai/plugins/shells.rb +32 -32
  138. data/lib/ohai/plugins/softlayer.rb +48 -48
  139. data/lib/ohai/plugins/solaris2/dmi.rb +191 -191
  140. data/lib/ohai/plugins/solaris2/memory.rb +32 -32
  141. data/lib/ohai/plugins/solaris2/network.rb +192 -192
  142. data/lib/ohai/plugins/solaris2/platform.rb +58 -58
  143. data/lib/ohai/plugins/solaris2/virtualization.rb +90 -90
  144. data/lib/ohai/plugins/ssh_host_key.rb +84 -84
  145. data/lib/ohai/plugins/sysconf.rb +46 -46
  146. data/lib/ohai/plugins/timezone.rb +45 -45
  147. data/lib/ohai/plugins/train.rb +35 -35
  148. data/lib/ohai/plugins/uptime.rb +95 -95
  149. data/lib/ohai/plugins/virtualbox.rb +197 -197
  150. data/lib/ohai/plugins/vmware.rb +109 -109
  151. data/lib/ohai/plugins/windows/dmi.rb +95 -95
  152. data/lib/ohai/plugins/windows/drivers.rb +52 -52
  153. data/lib/ohai/plugins/windows/memory.rb +39 -39
  154. data/lib/ohai/plugins/windows/network.rb +222 -222
  155. data/lib/ohai/plugins/windows/platform.rb +34 -34
  156. data/lib/ohai/plugins/windows/system_enclosure.rb +29 -29
  157. data/lib/ohai/plugins/windows/virtualization.rb +45 -45
  158. data/lib/ohai/plugins/zpools.rb +94 -94
  159. data/lib/ohai/provides_map.rb +208 -208
  160. data/lib/ohai/runner.rb +128 -126
  161. data/lib/ohai/system.rb +258 -258
  162. data/lib/ohai/train_transport.rb +29 -29
  163. data/lib/ohai/util/file_helper.rb +6 -6
  164. data/lib/ohai/util/ip_helper.rb +56 -56
  165. data/lib/ohai/util/win32.rb +47 -47
  166. data/lib/ohai/version.rb +23 -23
  167. data/lib/ohai.rb +23 -23
  168. data/ohai.gemspec +35 -35
  169. metadata +9 -15
@@ -1,314 +1,314 @@
1
- # frozen_string_literal: true
2
- #
3
- # Author:: Adam Jacob (<adam@chef.io>)
4
- # Copyright:: Copyright (c) Chef Software Inc.
5
- # License:: Apache License, Version 2.0
6
- #
7
- # Licensed under the Apache License, Version 2.0 (the "License");
8
- # you may not use this file except in compliance with the License.
9
- # You may obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing, software
14
- # distributed under the License is distributed on an "AS IS" BASIS,
15
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- # See the License for the specific language governing permissions and
17
- # limitations under the License.
18
- #
19
-
20
- Ohai.plugin(:Platform) do
21
- provides "platform", "platform_version", "platform_family"
22
- depends "lsb"
23
-
24
- # @deprecated
25
- def get_redhatish_platform(contents)
26
- contents[/^Red Hat/i] ? "redhat" : contents[/(\w+)/i, 1].downcase
27
- end
28
-
29
- # See https://rubular.com/r/78c1yXYa7zDhdV for example matches
30
- #
31
- # @param contents [String] the contents of /etc/redhat-release
32
- #
33
- # @returns [String] the version string
34
- #
35
- def get_redhatish_version(contents)
36
- contents[/(release)? ([\d\.]+)/, 2]
37
- end
38
-
39
- #
40
- # Reads an os-release-info file and parse it into a hash
41
- #
42
- # @param file [String] the filename to read (e.g. '/etc/os-release')
43
- #
44
- # @returns [Hash] the file parsed into a Hash or nil
45
- #
46
- def read_os_release_info(file)
47
- return nil unless file_exist?(file)
48
-
49
- file_read(file).split.inject({}) do |map, line|
50
- key, value = line.split("=")
51
- map[key] = value.gsub(/\A"|"\Z/, "") if value
52
- map
53
- end
54
- end
55
-
56
- #
57
- # Cached /etc/os-release info Hash. Also has logic for Cisco Nexus
58
- # switches that pulls the chained CISCO_RELEASE_INFO file into the Hash (other
59
- # distros can also reuse this method safely).
60
- #
61
- # @returns [Hash] the canonical, cached Hash of /etc/os-release info or nil
62
- #
63
- def os_release_info
64
- @os_release_info ||=
65
- begin
66
- os_release_info = read_os_release_info("/etc/os-release")
67
- cisco_release_info = os_release_info["CISCO_RELEASE_INFO"] if os_release_info
68
- if cisco_release_info && file_exist?(cisco_release_info)
69
- os_release_info.merge!(read_os_release_info(cisco_release_info))
70
- end
71
- os_release_info
72
- end
73
- end
74
-
75
- #
76
- # If /etc/os-release indicates we are Cisco based
77
- #
78
- # @returns [Boolean] if we are Cisco according to /etc/os-release
79
- #
80
- def os_release_file_is_cisco?
81
- file_exist?("/etc/os-release") && os_release_info["CISCO_RELEASE_INFO"]
82
- end
83
-
84
- #
85
- # Determines the platform version for F5 Big-IP systems
86
- #
87
- # @deprecated
88
- #
89
- # @returns [String] bigip Linux version from /etc/f5-release
90
- #
91
- def bigip_version
92
- release_contents = file_read("/etc/f5-release")
93
- release_contents.match(/BIG-IP release (\S*)/)[1] # http://rubular.com/r/O8nlrBVqSb
94
- rescue NoMethodError, Errno::ENOENT, Errno::EACCES # rescue regex failure, file missing, or permission denied
95
- logger.warn("Detected F5 Big-IP, but /etc/f5-release could not be parsed to determine platform_version")
96
- nil
97
- end
98
-
99
- # our platform names don't match os-release. given a time machine they would but ohai
100
- # came before the os-release file. This method remaps the os-release names to
101
- # the ohai names
102
- #
103
- # @param id [String] the platform ID from /etc/os-release
104
- #
105
- # @returns [String] the platform name to use in Ohai
106
- #
107
- def platform_id_remap(id)
108
- # this catches the centos guest shell in the nexus switch which identifies itself as centos
109
- return "nexus_centos" if id == "centos" && os_release_file_is_cisco?
110
-
111
- # the platform mappings between the 'ID' field in /etc/os-release and the value
112
- # ohai uses. If you're adding a new platform here and you want to change the name
113
- # you'll want to add it here and then add a spec for the platform_id_remap method
114
- {
115
- "alinux" => "alibabalinux",
116
- "amzn" => "amazon",
117
- "archarm" => "arch",
118
- "cumulus-linux" => "cumulus",
119
- "ol" => "oracle",
120
- "opensuse-leap" => "opensuseleap",
121
- "rhel" => "redhat",
122
- "sles_sap" => "suse",
123
- "sles" => "suse",
124
- "xenenterprise" => "xenserver",
125
- }[id.downcase] || id.downcase
126
- end
127
-
128
- #
129
- # Determines the platform_family based on the platform
130
- #
131
- # @param plat [String] the platform name
132
- #
133
- # @returns [String] platform_family value
134
- #
135
- def platform_family_from_platform(plat)
136
- case plat
137
- when /ubuntu/, /debian/, /linuxmint/, /raspbian/, /cumulus/, /kali/, /pop/
138
- # apt-get+dpkg almost certainly goes here
139
- "debian"
140
- when /centos/, /redhat/, /oracle/, /almalinux/, /rocky/, /scientific/, /enterpriseenterprise/, /xenserver/, /xcp-ng/, /cloudlinux/, /alibabalinux/, /sangoma/, /clearos/, /parallels/, /ibm_powerkvm/, /nexus_centos/, /bigip/, /virtuozzo/ # Note that 'enterpriseenterprise' is oracle's LSB "distributor ID"
141
- # NOTE: "rhel" should be reserved exclusively for recompiled rhel versions that are nearly perfectly compatible down to the platform_version.
142
- # The operating systems that are "rhel" should all be as compatible as rhel7 = centos7 = oracle7 = scientific7 (98%-ish core RPM version compatibility
143
- # and the version numbers MUST track the upstream). The appropriate EPEL version repo should work nearly perfectly. Some variation like the
144
- # oracle kernel version differences and tuning and extra packages are clearly acceptable. Almost certainly some distros above (xenserver?)
145
- # should not be in this list. Please use fedora, below, instead. Also note that this is the only platform_family with this strict of a rule,
146
- # see the example of the debian platform family for how the rest of the platform_family designations should be used.
147
- #
148
- # TODO: when XCP-NG 7.4 support ends we can remove the xcp-ng match. 7.5+ reports as xenenterprise which we remap to xenserver
149
- "rhel"
150
- when /amazon/
151
- "amazon"
152
- # suse matches opensuse, suse-* opensuse-*, etc. sle[sd\-_] intends to match sles, sled, sle-*, sle_*
153
- when /suse/, /sle[sd\-_]/
154
- "suse"
155
- when /fedora/, /arista_eos/
156
- # In the broadest sense: RPM-based, fedora-derived distributions which are not strictly re-compiled RHEL (if it uses RPMs, and smells more like redhat and less like
157
- # SuSE it probably goes here).
158
- "fedora"
159
- when /nexus/, /ios_xr/
160
- "wrlinux"
161
- when /gentoo/
162
- "gentoo"
163
- when /arch/, /manjaro/
164
- "arch"
165
- when /exherbo/
166
- "exherbo"
167
- when /alpine/
168
- "alpine"
169
- when /clearlinux/
170
- "clearlinux"
171
- when /mangeia/
172
- "mandriva"
173
- when /slackware/
174
- "slackware"
175
- end
176
- end
177
-
178
- # modern linux distros include a /etc/os-release file, which we now rely on for
179
- # OS detection. For older distros that do not include that file we fall back to
180
- # our pre-Ohai 15 detection logic, which is the method below. No new functionality
181
- # should be added to this logic.
182
- #
183
- # @deprecated
184
- def legacy_platform_detection
185
- # platform [ and platform_version ? ] should be lower case to avoid dealing with RedHat/Redhat/redhat matching
186
- if file_exist?("/etc/oracle-release")
187
- contents = file_read("/etc/oracle-release").chomp
188
- platform "oracle"
189
- platform_version get_redhatish_version(contents)
190
- elsif file_exist?("/etc/enterprise-release")
191
- contents = file_read("/etc/enterprise-release").chomp
192
- platform "oracle"
193
- platform_version get_redhatish_version(contents)
194
- elsif file_exist?("/etc/f5-release")
195
- platform "bigip"
196
- platform_version bigip_version
197
- elsif file_exist?("/etc/debian_version")
198
- # Ubuntu and Debian both have /etc/debian_version
199
- # Ubuntu should always have a working lsb, debian does not by default
200
- if /Ubuntu/i.match?(lsb[:id])
201
- platform "ubuntu"
202
- platform_version lsb[:release]
203
- else
204
- platform "debian"
205
- platform_version file_read("/etc/debian_version").chomp
206
- end
207
- elsif file_exist?("/etc/parallels-release")
208
- contents = file_read("/etc/parallels-release").chomp
209
- platform get_redhatish_platform(contents)
210
- platform_version contents.match(/(\d\.\d\.\d)/)[0]
211
- elsif file_exist?("/etc/Eos-release")
212
- platform "arista_eos"
213
- platform_version file_read("/etc/Eos-release").strip.split[-1]
214
- elsif file_exist?("/etc/redhat-release")
215
- contents = file_read("/etc/redhat-release").chomp
216
- platform get_redhatish_platform(contents)
217
- platform_version get_redhatish_version(contents)
218
- elsif file_exist?("/etc/system-release")
219
- contents = file_read("/etc/system-release").chomp
220
- platform get_redhatish_platform(contents)
221
- platform_version get_redhatish_version(contents)
222
- elsif file_exist?("/etc/SuSE-release")
223
- suse_release = file_read("/etc/SuSE-release")
224
- suse_version = suse_release.scan(/VERSION = (\d+)\nPATCHLEVEL = (\d+)/).flatten.join(".")
225
- suse_version = suse_release[/VERSION = ([\d\.]{2,})/, 1] if suse_version == ""
226
- platform_version suse_version
227
- if /^openSUSE/.match?(suse_release)
228
- # opensuse releases >= 42 are openSUSE Leap
229
- if platform_version.to_i < 42
230
- platform "opensuse"
231
- else
232
- platform "opensuseleap"
233
- end
234
- else
235
- platform "suse"
236
- end
237
- elsif os_release_file_is_cisco?
238
- raise "unknown Cisco /etc/os-release or /etc/cisco-release ID_LIKE field" if
239
- os_release_info["ID_LIKE"].nil? || !os_release_info["ID_LIKE"].include?("wrlinux")
240
-
241
- case os_release_info["ID"]
242
- when "nexus"
243
- platform "nexus"
244
- when "ios_xr"
245
- platform "ios_xr"
246
- else
247
- raise "unknown Cisco /etc/os-release or /etc/cisco-release ID field"
248
- end
249
-
250
- platform_version os_release_info["VERSION"]
251
- elsif file_exist?("/etc/slackware-version")
252
- platform "slackware"
253
- platform_version file_read("/etc/slackware-version").scan(/(\d+|\.+)/).join
254
- elsif file_exist?("/etc/exherbo-release")
255
- platform "exherbo"
256
- # no way to determine platform_version in a rolling release distribution
257
- # kernel release will be used - ex. 3.13
258
- platform_version shell_out("/bin/uname -r").stdout.strip
259
- elsif file_exist?("/usr/lib/os-release")
260
- contents = file_read("/usr/lib/os-release")
261
- if contents.include?("clear-linux-os") # Clear Linux https://clearlinux.org/
262
- platform "clearlinux"
263
- platform_version contents[/VERSION_ID=(\d+)/, 1]
264
- end
265
- elsif /RedHat/i.match?(lsb[:id])
266
- platform "redhat"
267
- platform_version lsb[:release]
268
- elsif /Amazon/i.match?(lsb[:id])
269
- platform "amazon"
270
- platform_version lsb[:release]
271
- elsif /ScientificSL/i.match?(lsb[:id])
272
- platform "scientific"
273
- platform_version lsb[:release]
274
- elsif /XenServer/i.match?(lsb[:id])
275
- platform "xenserver"
276
- platform_version lsb[:release]
277
- elsif lsb[:id] # LSB can provide odd data that changes between releases, so we currently fall back on it rather than dealing with its subtleties
278
- platform lsb[:id].downcase
279
- platform_version lsb[:release]
280
- end
281
- end
282
-
283
- # Grab the version from the VERSION_ID field and use the kernel release if that's not
284
- # available. It should be there for everything, but rolling releases like arch / gentoo
285
- # where we've traditionally used the kernel as the version
286
- # @return String the OS version
287
- def determine_os_version
288
- # centos only includes the major version in os-release for some reason
289
- if os_release_info["ID"] == "centos"
290
- get_redhatish_version(file_read("/etc/redhat-release").chomp)
291
- # debian testing and unstable don't have VERSION_ID set
292
- elsif os_release_info["ID"] == "debian"
293
- os_release_info["VERSION_ID"] || file_read("/etc/debian_version").chomp
294
- else
295
- os_release_info["VERSION_ID"] || shell_out("/bin/uname -r").stdout.strip
296
- end
297
- end
298
-
299
- collect_data(:linux) do
300
- if file_exist?("/etc/os-release")
301
- logger.trace("Plugin platform: Using /etc/os-release for platform detection")
302
-
303
- # fixup os-release names to ohai platform names
304
- platform platform_id_remap(os_release_info["ID"])
305
-
306
- platform_version determine_os_version
307
- else # we're on an old Linux distro
308
- legacy_platform_detection
309
- end
310
-
311
- # unless we set it in a specific way with the platform logic above set based on platform data
312
- platform_family platform_family_from_platform(platform) if platform_family.nil?
313
- end
314
- end
1
+ # frozen_string_literal: true
2
+ #
3
+ # Author:: Adam Jacob (<adam@chef.io>)
4
+ # Copyright:: Copyright (c) Chef Software Inc.
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ Ohai.plugin(:Platform) do
21
+ provides "platform", "platform_version", "platform_family"
22
+ depends "lsb"
23
+
24
+ # @deprecated
25
+ def get_redhatish_platform(contents)
26
+ contents[/^Red Hat/i] ? "redhat" : contents[/(\w+)/i, 1].downcase
27
+ end
28
+
29
+ # See https://rubular.com/r/78c1yXYa7zDhdV for example matches
30
+ #
31
+ # @param contents [String] the contents of /etc/redhat-release
32
+ #
33
+ # @returns [String] the version string
34
+ #
35
+ def get_redhatish_version(contents)
36
+ contents[/(release)? ([\d\.]+)/, 2]
37
+ end
38
+
39
+ #
40
+ # Reads an os-release-info file and parse it into a hash
41
+ #
42
+ # @param file [String] the filename to read (e.g. '/etc/os-release')
43
+ #
44
+ # @returns [Hash] the file parsed into a Hash or nil
45
+ #
46
+ def read_os_release_info(file)
47
+ return nil unless file_exist?(file)
48
+
49
+ file_read(file).split.inject({}) do |map, line|
50
+ key, value = line.split("=")
51
+ map[key] = value.gsub(/\A"|"\Z/, "") if value
52
+ map
53
+ end
54
+ end
55
+
56
+ #
57
+ # Cached /etc/os-release info Hash. Also has logic for Cisco Nexus
58
+ # switches that pulls the chained CISCO_RELEASE_INFO file into the Hash (other
59
+ # distros can also reuse this method safely).
60
+ #
61
+ # @returns [Hash] the canonical, cached Hash of /etc/os-release info or nil
62
+ #
63
+ def os_release_info
64
+ @os_release_info ||=
65
+ begin
66
+ os_release_info = read_os_release_info("/etc/os-release")
67
+ cisco_release_info = os_release_info["CISCO_RELEASE_INFO"] if os_release_info
68
+ if cisco_release_info && file_exist?(cisco_release_info)
69
+ os_release_info.merge!(read_os_release_info(cisco_release_info))
70
+ end
71
+ os_release_info
72
+ end
73
+ end
74
+
75
+ #
76
+ # If /etc/os-release indicates we are Cisco based
77
+ #
78
+ # @returns [Boolean] if we are Cisco according to /etc/os-release
79
+ #
80
+ def os_release_file_is_cisco?
81
+ file_exist?("/etc/os-release") && os_release_info["CISCO_RELEASE_INFO"]
82
+ end
83
+
84
+ #
85
+ # Determines the platform version for F5 Big-IP systems
86
+ #
87
+ # @deprecated
88
+ #
89
+ # @returns [String] bigip Linux version from /etc/f5-release
90
+ #
91
+ def bigip_version
92
+ release_contents = file_read("/etc/f5-release")
93
+ release_contents.match(/BIG-IP release (\S*)/)[1] # http://rubular.com/r/O8nlrBVqSb
94
+ rescue NoMethodError, Errno::ENOENT, Errno::EACCES # rescue regex failure, file missing, or permission denied
95
+ logger.warn("Detected F5 Big-IP, but /etc/f5-release could not be parsed to determine platform_version")
96
+ nil
97
+ end
98
+
99
+ # our platform names don't match os-release. given a time machine they would but ohai
100
+ # came before the os-release file. This method remaps the os-release names to
101
+ # the ohai names
102
+ #
103
+ # @param id [String] the platform ID from /etc/os-release
104
+ #
105
+ # @returns [String] the platform name to use in Ohai
106
+ #
107
+ def platform_id_remap(id)
108
+ # this catches the centos guest shell in the nexus switch which identifies itself as centos
109
+ return "nexus_centos" if id == "centos" && os_release_file_is_cisco?
110
+
111
+ # the platform mappings between the 'ID' field in /etc/os-release and the value
112
+ # ohai uses. If you're adding a new platform here and you want to change the name
113
+ # you'll want to add it here and then add a spec for the platform_id_remap method
114
+ {
115
+ "alinux" => "alibabalinux",
116
+ "amzn" => "amazon",
117
+ "archarm" => "arch",
118
+ "cumulus-linux" => "cumulus",
119
+ "ol" => "oracle",
120
+ "opensuse-leap" => "opensuseleap",
121
+ "rhel" => "redhat",
122
+ "sles_sap" => "suse",
123
+ "sles" => "suse",
124
+ "xenenterprise" => "xenserver",
125
+ }[id.downcase] || id.downcase
126
+ end
127
+
128
+ #
129
+ # Determines the platform_family based on the platform
130
+ #
131
+ # @param plat [String] the platform name
132
+ #
133
+ # @returns [String] platform_family value
134
+ #
135
+ def platform_family_from_platform(plat)
136
+ case plat
137
+ when /ubuntu/, /debian/, /linuxmint/, /raspbian/, /cumulus/, /kali/, /pop/
138
+ # apt-get+dpkg almost certainly goes here
139
+ "debian"
140
+ when /centos/, /redhat/, /oracle/, /almalinux/, /rocky/, /scientific/, /enterpriseenterprise/, /xenserver/, /xcp-ng/, /cloudlinux/, /alibabalinux/, /sangoma/, /clearos/, /parallels/, /ibm_powerkvm/, /nexus_centos/, /bigip/, /virtuozzo/ # Note that 'enterpriseenterprise' is oracle's LSB "distributor ID"
141
+ # NOTE: "rhel" should be reserved exclusively for recompiled rhel versions that are nearly perfectly compatible down to the platform_version.
142
+ # The operating systems that are "rhel" should all be as compatible as rhel7 = centos7 = oracle7 = scientific7 (98%-ish core RPM version compatibility
143
+ # and the version numbers MUST track the upstream). The appropriate EPEL version repo should work nearly perfectly. Some variation like the
144
+ # oracle kernel version differences and tuning and extra packages are clearly acceptable. Almost certainly some distros above (xenserver?)
145
+ # should not be in this list. Please use fedora, below, instead. Also note that this is the only platform_family with this strict of a rule,
146
+ # see the example of the debian platform family for how the rest of the platform_family designations should be used.
147
+ #
148
+ # TODO: when XCP-NG 7.4 support ends we can remove the xcp-ng match. 7.5+ reports as xenenterprise which we remap to xenserver
149
+ "rhel"
150
+ when /amazon/
151
+ "amazon"
152
+ # suse matches opensuse, suse-* opensuse-*, etc. sle[sd\-_] intends to match sles, sled, sle-*, sle_*
153
+ when /suse/, /sle[sd\-_]/
154
+ "suse"
155
+ when /fedora/, /arista_eos/
156
+ # In the broadest sense: RPM-based, fedora-derived distributions which are not strictly re-compiled RHEL (if it uses RPMs, and smells more like redhat and less like
157
+ # SuSE it probably goes here).
158
+ "fedora"
159
+ when /nexus/, /ios_xr/
160
+ "wrlinux"
161
+ when /gentoo/
162
+ "gentoo"
163
+ when /arch/, /manjaro/
164
+ "arch"
165
+ when /exherbo/
166
+ "exherbo"
167
+ when /alpine/
168
+ "alpine"
169
+ when /clearlinux/
170
+ "clearlinux"
171
+ when /mangeia/
172
+ "mandriva"
173
+ when /slackware/
174
+ "slackware"
175
+ end
176
+ end
177
+
178
+ # modern linux distros include a /etc/os-release file, which we now rely on for
179
+ # OS detection. For older distros that do not include that file we fall back to
180
+ # our pre-Ohai 15 detection logic, which is the method below. No new functionality
181
+ # should be added to this logic.
182
+ #
183
+ # @deprecated
184
+ def legacy_platform_detection
185
+ # platform [ and platform_version ? ] should be lower case to avoid dealing with RedHat/Redhat/redhat matching
186
+ if file_exist?("/etc/oracle-release")
187
+ contents = file_read("/etc/oracle-release").chomp
188
+ platform "oracle"
189
+ platform_version get_redhatish_version(contents)
190
+ elsif file_exist?("/etc/enterprise-release")
191
+ contents = file_read("/etc/enterprise-release").chomp
192
+ platform "oracle"
193
+ platform_version get_redhatish_version(contents)
194
+ elsif file_exist?("/etc/f5-release")
195
+ platform "bigip"
196
+ platform_version bigip_version
197
+ elsif file_exist?("/etc/debian_version")
198
+ # Ubuntu and Debian both have /etc/debian_version
199
+ # Ubuntu should always have a working lsb, debian does not by default
200
+ if /Ubuntu/i.match?(lsb[:id])
201
+ platform "ubuntu"
202
+ platform_version lsb[:release]
203
+ else
204
+ platform "debian"
205
+ platform_version file_read("/etc/debian_version").chomp
206
+ end
207
+ elsif file_exist?("/etc/parallels-release")
208
+ contents = file_read("/etc/parallels-release").chomp
209
+ platform get_redhatish_platform(contents)
210
+ platform_version contents.match(/(\d\.\d\.\d)/)[0]
211
+ elsif file_exist?("/etc/Eos-release")
212
+ platform "arista_eos"
213
+ platform_version file_read("/etc/Eos-release").strip.split[-1]
214
+ elsif file_exist?("/etc/redhat-release")
215
+ contents = file_read("/etc/redhat-release").chomp
216
+ platform get_redhatish_platform(contents)
217
+ platform_version get_redhatish_version(contents)
218
+ elsif file_exist?("/etc/system-release")
219
+ contents = file_read("/etc/system-release").chomp
220
+ platform get_redhatish_platform(contents)
221
+ platform_version get_redhatish_version(contents)
222
+ elsif file_exist?("/etc/SuSE-release")
223
+ suse_release = file_read("/etc/SuSE-release")
224
+ suse_version = suse_release.scan(/VERSION = (\d+)\nPATCHLEVEL = (\d+)/).flatten.join(".")
225
+ suse_version = suse_release[/VERSION = ([\d\.]{2,})/, 1] if suse_version == ""
226
+ platform_version suse_version
227
+ if /^openSUSE/.match?(suse_release)
228
+ # opensuse releases >= 42 are openSUSE Leap
229
+ if platform_version.to_i < 42
230
+ platform "opensuse"
231
+ else
232
+ platform "opensuseleap"
233
+ end
234
+ else
235
+ platform "suse"
236
+ end
237
+ elsif os_release_file_is_cisco?
238
+ raise "unknown Cisco /etc/os-release or /etc/cisco-release ID_LIKE field" if
239
+ os_release_info["ID_LIKE"].nil? || !os_release_info["ID_LIKE"].include?("wrlinux")
240
+
241
+ case os_release_info["ID"]
242
+ when "nexus"
243
+ platform "nexus"
244
+ when "ios_xr"
245
+ platform "ios_xr"
246
+ else
247
+ raise "unknown Cisco /etc/os-release or /etc/cisco-release ID field"
248
+ end
249
+
250
+ platform_version os_release_info["VERSION"]
251
+ elsif file_exist?("/etc/slackware-version")
252
+ platform "slackware"
253
+ platform_version file_read("/etc/slackware-version").scan(/(\d+|\.+)/).join
254
+ elsif file_exist?("/etc/exherbo-release")
255
+ platform "exherbo"
256
+ # no way to determine platform_version in a rolling release distribution
257
+ # kernel release will be used - ex. 3.13
258
+ platform_version shell_out("/bin/uname -r").stdout.strip
259
+ elsif file_exist?("/usr/lib/os-release")
260
+ contents = file_read("/usr/lib/os-release")
261
+ if contents.include?("clear-linux-os") # Clear Linux https://clearlinux.org/
262
+ platform "clearlinux"
263
+ platform_version contents[/VERSION_ID=(\d+)/, 1]
264
+ end
265
+ elsif /RedHat/i.match?(lsb[:id])
266
+ platform "redhat"
267
+ platform_version lsb[:release]
268
+ elsif /Amazon/i.match?(lsb[:id])
269
+ platform "amazon"
270
+ platform_version lsb[:release]
271
+ elsif /ScientificSL/i.match?(lsb[:id])
272
+ platform "scientific"
273
+ platform_version lsb[:release]
274
+ elsif /XenServer/i.match?(lsb[:id])
275
+ platform "xenserver"
276
+ platform_version lsb[:release]
277
+ elsif lsb[:id] # LSB can provide odd data that changes between releases, so we currently fall back on it rather than dealing with its subtleties
278
+ platform lsb[:id].downcase
279
+ platform_version lsb[:release]
280
+ end
281
+ end
282
+
283
+ # Grab the version from the VERSION_ID field and use the kernel release if that's not
284
+ # available. It should be there for everything, but rolling releases like arch / gentoo
285
+ # where we've traditionally used the kernel as the version
286
+ # @return String the OS version
287
+ def determine_os_version
288
+ # centos only includes the major version in os-release for some reason
289
+ if os_release_info["ID"] == "centos"
290
+ get_redhatish_version(file_read("/etc/redhat-release").chomp)
291
+ # debian testing and unstable don't have VERSION_ID set
292
+ elsif os_release_info["ID"] == "debian"
293
+ os_release_info["VERSION_ID"] || file_read("/etc/debian_version").chomp
294
+ else
295
+ os_release_info["VERSION_ID"] || shell_out("/bin/uname -r").stdout.strip
296
+ end
297
+ end
298
+
299
+ collect_data(:linux) do
300
+ if file_exist?("/etc/os-release")
301
+ logger.trace("Plugin platform: Using /etc/os-release for platform detection")
302
+
303
+ # fixup os-release names to ohai platform names
304
+ platform platform_id_remap(os_release_info["ID"])
305
+
306
+ platform_version determine_os_version
307
+ else # we're on an old Linux distro
308
+ legacy_platform_detection
309
+ end
310
+
311
+ # unless we set it in a specific way with the platform logic above set based on platform data
312
+ platform_family platform_family_from_platform(platform) if platform_family.nil?
313
+ end
314
+ end