ohai 18.0.26 → 18.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) 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 +86 -86
  17. data/lib/ohai/mixin/azure_metadata.rb +111 -111
  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 +256 -256
  24. data/lib/ohai/mixin/gce_metadata.rb +83 -83
  25. data/lib/ohai/mixin/http_helper.rb +64 -64
  26. data/lib/ohai/mixin/network_helper.rb +65 -65
  27. data/lib/ohai/mixin/oci_metadata.rb +69 -0
  28. data/lib/ohai/mixin/os.rb +128 -128
  29. data/lib/ohai/mixin/scaleway_metadata.rb +51 -51
  30. data/lib/ohai/mixin/seconds_to_human.rb +52 -52
  31. data/lib/ohai/mixin/shell_out.rb +51 -51
  32. data/lib/ohai/mixin/softlayer_metadata.rb +74 -74
  33. data/lib/ohai/mixin/string.rb +31 -31
  34. data/lib/ohai/mixin/train_helpers.rb +36 -36
  35. data/lib/ohai/mixin/which.rb +39 -39
  36. data/lib/ohai/plugin_config.rb +47 -47
  37. data/lib/ohai/plugins/aix/kernel.rb +50 -50
  38. data/lib/ohai/plugins/aix/memory.rb +37 -37
  39. data/lib/ohai/plugins/aix/network.rb +142 -142
  40. data/lib/ohai/plugins/aix/platform.rb +30 -30
  41. data/lib/ohai/plugins/aix/uptime.rb +54 -54
  42. data/lib/ohai/plugins/aix/virtualization.rb +154 -154
  43. data/lib/ohai/plugins/alibaba.rb +72 -72
  44. data/lib/ohai/plugins/azure.rb +154 -154
  45. data/lib/ohai/plugins/bsd/virtualization.rb +121 -121
  46. data/lib/ohai/plugins/c.rb +178 -178
  47. data/lib/ohai/plugins/chef.rb +50 -50
  48. data/lib/ohai/plugins/cloud.rb +379 -357
  49. data/lib/ohai/plugins/command.rb +26 -26
  50. data/lib/ohai/plugins/cpu.rb +635 -635
  51. data/lib/ohai/plugins/darwin/hardware.rb +99 -99
  52. data/lib/ohai/plugins/darwin/memory.rb +62 -62
  53. data/lib/ohai/plugins/darwin/network.rb +207 -207
  54. data/lib/ohai/plugins/darwin/platform.rb +38 -38
  55. data/lib/ohai/plugins/darwin/virtualization.rb +90 -93
  56. data/lib/ohai/plugins/digital_ocean.rb +67 -67
  57. data/lib/ohai/plugins/dmi.rb +134 -134
  58. data/lib/ohai/plugins/docker.rb +58 -58
  59. data/lib/ohai/plugins/dragonflybsd/memory.rb +60 -60
  60. data/lib/ohai/plugins/dragonflybsd/network.rb +128 -128
  61. data/lib/ohai/plugins/dragonflybsd/platform.rb +28 -28
  62. data/lib/ohai/plugins/ec2.rb +148 -148
  63. data/lib/ohai/plugins/elixir.rb +36 -36
  64. data/lib/ohai/plugins/erlang.rb +60 -60
  65. data/lib/ohai/plugins/eucalyptus.rb +86 -86
  66. data/lib/ohai/plugins/filesystem.rb +751 -751
  67. data/lib/ohai/plugins/fips.rb +36 -36
  68. data/lib/ohai/plugins/freebsd/memory.rb +60 -60
  69. data/lib/ohai/plugins/freebsd/network.rb +128 -128
  70. data/lib/ohai/plugins/freebsd/platform.rb +28 -28
  71. data/lib/ohai/plugins/gce.rb +89 -89
  72. data/lib/ohai/plugins/go.rb +34 -34
  73. data/lib/ohai/plugins/groovy.rb +38 -38
  74. data/lib/ohai/plugins/grub2.rb +40 -40
  75. data/lib/ohai/plugins/habitat.rb +73 -73
  76. data/lib/ohai/plugins/haskell.rb +96 -96
  77. data/lib/ohai/plugins/hostname.rb +133 -133
  78. data/lib/ohai/plugins/init_package.rb +26 -26
  79. data/lib/ohai/plugins/java.rb +78 -78
  80. data/lib/ohai/plugins/kernel.rb +292 -292
  81. data/lib/ohai/plugins/keys.rb +27 -27
  82. data/lib/ohai/plugins/languages.rb +26 -26
  83. data/lib/ohai/plugins/libvirt.rb +114 -114
  84. data/lib/ohai/plugins/linode.rb +73 -73
  85. data/lib/ohai/plugins/linux/block_device.rb +48 -48
  86. data/lib/ohai/plugins/linux/hostnamectl.rb +34 -34
  87. data/lib/ohai/plugins/linux/interrupts.rb +84 -84
  88. data/lib/ohai/plugins/linux/ipc.rb +52 -52
  89. data/lib/ohai/plugins/linux/livepatch.rb +38 -38
  90. data/lib/ohai/plugins/linux/lsb.rb +46 -46
  91. data/lib/ohai/plugins/linux/lspci.rb +76 -76
  92. data/lib/ohai/plugins/linux/machineid.rb +36 -36
  93. data/lib/ohai/plugins/linux/mdadm.rb +120 -120
  94. data/lib/ohai/plugins/linux/memory.rb +106 -106
  95. data/lib/ohai/plugins/linux/network.rb +879 -879
  96. data/lib/ohai/plugins/linux/os_release.rb +38 -38
  97. data/lib/ohai/plugins/linux/platform.rb +314 -314
  98. data/lib/ohai/plugins/linux/selinux.rb +69 -69
  99. data/lib/ohai/plugins/linux/sessions.rb +54 -54
  100. data/lib/ohai/plugins/linux/sysctl.rb +39 -39
  101. data/lib/ohai/plugins/linux/systemd_paths.rb +36 -36
  102. data/lib/ohai/plugins/linux/tc.rb +61 -61
  103. data/lib/ohai/plugins/linux/virtualization.rb +300 -300
  104. data/lib/ohai/plugins/lua.rb +39 -39
  105. data/lib/ohai/plugins/mono.rb +50 -50
  106. data/lib/ohai/plugins/netbsd/memory.rb +99 -99
  107. data/lib/ohai/plugins/netbsd/network.rb +122 -122
  108. data/lib/ohai/plugins/netbsd/platform.rb +28 -28
  109. data/lib/ohai/plugins/network.rb +186 -186
  110. data/lib/ohai/plugins/nodejs.rb +40 -40
  111. data/lib/ohai/plugins/oci.rb +94 -0
  112. data/lib/ohai/plugins/ohai.rb +29 -29
  113. data/lib/ohai/plugins/ohai_time.rb +26 -26
  114. data/lib/ohai/plugins/openbsd/memory.rb +99 -99
  115. data/lib/ohai/plugins/openbsd/network.rb +122 -122
  116. data/lib/ohai/plugins/openbsd/platform.rb +28 -28
  117. data/lib/ohai/plugins/openstack.rb +84 -84
  118. data/lib/ohai/plugins/os.rb +55 -55
  119. data/lib/ohai/plugins/packages.rb +234 -234
  120. data/lib/ohai/plugins/passwd.rb +104 -104
  121. data/lib/ohai/plugins/perl.rb +45 -45
  122. data/lib/ohai/plugins/php.rb +52 -52
  123. data/lib/ohai/plugins/platform.rb +29 -29
  124. data/lib/ohai/plugins/powershell.rb +82 -82
  125. data/lib/ohai/plugins/ps.rb +35 -35
  126. data/lib/ohai/plugins/python.rb +43 -43
  127. data/lib/ohai/plugins/rackspace.rb +177 -177
  128. data/lib/ohai/plugins/root_group.rb +41 -41
  129. data/lib/ohai/plugins/rpm.rb +121 -121
  130. data/lib/ohai/plugins/ruby.rb +66 -66
  131. data/lib/ohai/plugins/rust.rb +34 -34
  132. data/lib/ohai/plugins/scala.rb +38 -38
  133. data/lib/ohai/plugins/scaleway.rb +58 -58
  134. data/lib/ohai/plugins/scsi.rb +52 -52
  135. data/lib/ohai/plugins/shard.rb +142 -142
  136. data/lib/ohai/plugins/shells.rb +32 -32
  137. data/lib/ohai/plugins/softlayer.rb +48 -48
  138. data/lib/ohai/plugins/solaris2/dmi.rb +191 -191
  139. data/lib/ohai/plugins/solaris2/memory.rb +32 -32
  140. data/lib/ohai/plugins/solaris2/network.rb +192 -192
  141. data/lib/ohai/plugins/solaris2/platform.rb +58 -58
  142. data/lib/ohai/plugins/solaris2/virtualization.rb +90 -90
  143. data/lib/ohai/plugins/ssh_host_key.rb +84 -84
  144. data/lib/ohai/plugins/sysconf.rb +46 -46
  145. data/lib/ohai/plugins/timezone.rb +45 -25
  146. data/lib/ohai/plugins/train.rb +35 -35
  147. data/lib/ohai/plugins/uptime.rb +95 -95
  148. data/lib/ohai/plugins/virtualbox.rb +197 -197
  149. data/lib/ohai/plugins/vmware.rb +109 -94
  150. data/lib/ohai/plugins/windows/dmi.rb +95 -95
  151. data/lib/ohai/plugins/windows/drivers.rb +52 -52
  152. data/lib/ohai/plugins/windows/memory.rb +39 -39
  153. data/lib/ohai/plugins/windows/network.rb +222 -222
  154. data/lib/ohai/plugins/windows/platform.rb +34 -34
  155. data/lib/ohai/plugins/windows/system_enclosure.rb +29 -29
  156. data/lib/ohai/plugins/windows/virtualization.rb +45 -45
  157. data/lib/ohai/plugins/zpools.rb +94 -94
  158. data/lib/ohai/provides_map.rb +208 -208
  159. data/lib/ohai/runner.rb +128 -128
  160. data/lib/ohai/system.rb +258 -258
  161. data/lib/ohai/train_transport.rb +29 -29
  162. data/lib/ohai/util/file_helper.rb +6 -6
  163. data/lib/ohai/util/ip_helper.rb +56 -56
  164. data/lib/ohai/util/win32.rb +47 -47
  165. data/lib/ohai/version.rb +23 -23
  166. data/lib/ohai.rb +23 -23
  167. data/ohai.gemspec +35 -35
  168. metadata +5 -3
@@ -1,300 +1,300 @@
1
- # frozen_string_literal: true
2
- #
3
- # Author:: Thom May (<thom@clearairturbulence.org>)
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(:Virtualization) do
21
- provides "virtualization"
22
- depends "dmi"
23
- depends "cpu"
24
- require_relative "../../mixin/dmi_decode"
25
- include Ohai::Mixin::DmiDecode
26
-
27
- def lxc_version_exists?
28
- which("lxc-version") || which("lxc-start")
29
- end
30
-
31
- def nova_exists?
32
- which("nova")
33
- end
34
-
35
- def docker_exists?
36
- which("docker")
37
- end
38
-
39
- def podman_exists?
40
- which("podman")
41
- end
42
-
43
- collect_data(:linux) do
44
- virtualization Mash.new unless virtualization
45
- virtualization[:systems] ||= Mash.new
46
-
47
- # Docker hosts
48
- if docker_exists?
49
- virtualization[:system] = "docker"
50
- virtualization[:role] = "host"
51
- virtualization[:systems][:docker] = "host"
52
- end
53
-
54
- # Podman hosts
55
- if podman_exists?
56
- virtualization[:system] = "podman"
57
- virtualization[:role] = "host"
58
- virtualization[:systems][:podman] = "host"
59
- end
60
-
61
- # Xen Notes:
62
- # - /proc/xen is an empty dir for EL6 + Linode Guests + Paravirt EC2 instances
63
- # - cpuid of guests, if we could get it, would also be a clue
64
- # - may be able to determine if under paravirt from /dev/xen/evtchn (See OHAI-253)
65
- # - Additional edge cases likely should not change the above assumptions
66
- # but rather be additive - btm
67
- if file_exist?("/proc/xen")
68
- virtualization[:system] = "xen"
69
- # Assume guest
70
- virtualization[:role] = "guest"
71
- virtualization[:systems][:xen] = "guest"
72
-
73
- # This file should exist on most Xen systems, normally empty for guests
74
- if file_exist?("/proc/xen/capabilities")
75
- if /control_d/i.match?(file_read("/proc/xen/capabilities"))
76
- logger.trace("Plugin Virtualization: /proc/xen/capabilities contains control_d. Detecting as Xen host")
77
- virtualization[:role] = "host"
78
- virtualization[:systems][:xen] = "host"
79
- end
80
- end
81
- end
82
-
83
- # Detect Virtualbox from kernel module
84
- if file_exist?("/proc/modules")
85
- modules = file_read("/proc/modules")
86
- if /^vboxdrv/.match?(modules)
87
- logger.trace("Plugin Virtualization: /proc/modules contains vboxdrv. Detecting as vbox host")
88
- virtualization[:system] = "vbox"
89
- virtualization[:role] = "host"
90
- virtualization[:systems][:vbox] = "host"
91
- elsif /^vboxguest/.match?(modules)
92
- logger.trace("Plugin Virtualization: /proc/modules contains vboxguest. Detecting as vbox guest")
93
- virtualization[:system] = "vbox"
94
- virtualization[:role] = "guest"
95
- virtualization[:systems][:vbox] = "guest"
96
- end
97
- end
98
-
99
- # if nova binary is present we're on an openstack host
100
- if nova_exists?
101
- logger.trace("Plugin Virtualization: nova command exists. Detecting as openstack host")
102
- virtualization[:system] = "openstack"
103
- virtualization[:role] = "host"
104
- virtualization[:systems][:openstack] = "host"
105
- end
106
-
107
- # Detect paravirt KVM/QEMU from cpuinfo, report as KVM
108
- if file_exist?("/proc/cpuinfo")
109
- if /QEMU Virtual CPU|Common KVM processor|Common 32-bit KVM processor/.match?(file_read("/proc/cpuinfo"))
110
- logger.trace("Plugin Virtualization: /proc/cpuinfo lists a KVM paravirt CPU string. Detecting as kvm guest")
111
- virtualization[:system] = "kvm"
112
- virtualization[:role] = "guest"
113
- virtualization[:systems][:kvm] = "guest"
114
- end
115
- end
116
-
117
- # Detect KVM systems via /sys
118
- # guests will have the hypervisor cpu feature that hosts don't have
119
- if file_exist?("/sys/devices/virtual/misc/kvm")
120
- virtualization[:system] = "kvm"
121
- if /hypervisor/.match?(file_read("/proc/cpuinfo"))
122
- logger.trace("Plugin Virtualization: /sys/devices/virtual/misc/kvm present and /proc/cpuinfo lists the hypervisor feature. Detecting as kvm guest")
123
- virtualization[:role] = "guest"
124
- virtualization[:systems][:kvm] = "guest"
125
- else
126
- logger.trace("Plugin Virtualization: /sys/devices/virtual/misc/kvm present and /proc/cpuinfo does not list the hypervisor feature. Detecting as kvm host")
127
- virtualization[:role] = "host"
128
- virtualization[:systems][:kvm] = "host"
129
- end
130
- elsif get_attribute(:cpu, :hypervisor_vendor)
131
- if get_attribute(:cpu, :hypervisor_vendor) == "KVM"
132
- virtualization[:system] = "kvm"
133
- if /(para|full)/.match?(get_attribute(:cpu, :virtualization_type))
134
- virtualization[:role] = "guest"
135
- virtualization[:systems][:kvm] = "guest"
136
- end
137
- end
138
- end
139
-
140
- # parse dmi to discover various virtualization guests
141
- # we do this *after* the kvm detection so that OpenStack isn't detected as KVM
142
- logger.trace("Looking up DMI data manufacturer: '#{get_attribute(:dmi, :system, :manufacturer)}' product_name: '#{get_attribute(:dmi, :system, :product_name)}' version: '#{get_attribute(:dmi, :system, :version)}'")
143
- guest = guest_from_dmi_data(get_attribute(:dmi, :system, :manufacturer), get_attribute(:dmi, :system, :product_name), get_attribute(:dmi, :system, :version))
144
- if guest
145
- logger.trace("Plugin Virtualization: DMI data indicates #{guest} guest")
146
- virtualization[:system] = guest
147
- virtualization[:role] = "guest"
148
- virtualization[:systems][guest.to_sym] = "guest"
149
- end
150
-
151
- # Detect OpenVZ / Virtuozzo.
152
- # http://wiki.openvz.org/BC_proc_entries
153
- if file_exist?("/proc/bc/0")
154
- logger.trace("Plugin Virtualization: /proc/bc/0 exists. Detecting as openvz host")
155
- virtualization[:system] = "openvz"
156
- virtualization[:role] = "host"
157
- virtualization[:systems][:openvz] = "host"
158
- elsif file_exist?("/proc/vz")
159
- logger.trace("Plugin Virtualization: /proc/vz exists. Detecting as openvz guest")
160
- virtualization[:system] = "openvz"
161
- virtualization[:role] = "guest"
162
- virtualization[:systems][:openvz] = "guest"
163
- end
164
-
165
- # Detect Hyper-V guest and the hostname of the host
166
- if file_exist?("/var/lib/hyperv/.kvp_pool_3")
167
- logger.trace("Plugin Virtualization: /var/lib/hyperv/.kvp_pool_3 contains string indicating Hyper-V guest")
168
- data = file_read("/var/lib/hyperv/.kvp_pool_3")
169
- hyperv_host = data[/\HostName(.*?)HostingSystemEditionId/, 1].scan(/[[:print:]]/).join.downcase
170
- virtualization[:system] = "hyperv"
171
- virtualization[:role] = "guest"
172
- virtualization[:systems][:hyperv] = "guest"
173
- virtualization[:hypervisor_host] = hyperv_host
174
- end
175
-
176
- # Detect Linux-VServer
177
- if file_exist?("/proc/self/status")
178
- proc_self_status = file_read("/proc/self/status")
179
- vxid = proc_self_status.match(/^(s_context|VxID):\s*(\d+)$/)
180
- if vxid && vxid[2]
181
- virtualization[:system] = "linux-vserver"
182
- if vxid[2] == "0"
183
- logger.trace("Plugin Virtualization: /proc/self/status contains 's_context' or 'VxID' with a value of 0. Detecting as linux-vserver host")
184
- virtualization[:role] = "host"
185
- virtualization[:systems]["linux-vserver"] = "host"
186
- else
187
- logger.trace("Plugin Virtualization: /proc/self/status contains 's_context' or 'VxID' with a non-0 value. Detecting as linux-vserver guest")
188
- virtualization[:role] = "guest"
189
- virtualization[:systems]["linux-vserver"] = "guest"
190
- end
191
- end
192
- end
193
-
194
- # Detect LXC/Docker/Nspawn
195
- #
196
- # /proc/self/cgroup will look like this inside a docker container:
197
- # <index #>:<subsystem>:/lxc/<hexadecimal container id>
198
- #
199
- # /proc/self/cgroup could have a name including alpha/digit/dashes
200
- # <index #>:<subsystem>:/lxc/<named container id>
201
- #
202
- # /proc/self/cgroup could have a non-lxc cgroup name indicating other uses
203
- # of cgroups. This is probably not LXC/Docker.
204
- # <index #>:<subsystem>:/Charlie
205
- #
206
- # A host which supports cgroups, and has capacity to host lxc containers,
207
- # will show the subsystems and root (/) namespace.
208
- # <index #>:<subsystem>:/
209
- #
210
- # Full notes, https://tickets.opscode.com/browse/OHAI-551
211
- # Kernel docs, https://web.archive.org/web/20100514070914/http://www.kernel.org/doc/Documentation/cgroups/
212
- if file_exist?("/proc/self/cgroup")
213
- cgroup_content = file_read("/proc/self/cgroup")
214
- # These two REs catch many different examples. Here's a specific one
215
- # from when it is docker and there is no subsystem name.
216
- # https://rubular.com/r/dV13hiU9KxmiWB
217
- if cgroup_content =~ %r{^\d+:[^:]*:/(lxc|docker)/.+$} ||
218
- cgroup_content =~ %r{^\d+:[^:]*:/[^/]+/(lxc|docker)-?.+$}
219
- logger.trace("Plugin Virtualization: /proc/self/cgroup indicates #{$1} container. Detecting as #{$1} guest")
220
- virtualization[:system] = $1
221
- virtualization[:role] = "guest"
222
- virtualization[:systems][$1.to_sym] = "guest"
223
- elsif /container=lxc/.match?(file_read("/proc/1/environ"))
224
- logger.trace("Plugin Virtualization: /proc/1/environ indicates lxc container. Detecting as lxc guest")
225
- virtualization[:system] = "lxc"
226
- virtualization[:role] = "guest"
227
- virtualization[:systems][:lxc] = "guest"
228
- elsif /container=systemd-nspawn/.match?(file_read("/proc/1/environ"))
229
- logger.trace("Plugin Virtualization: /proc/1/environ indicates nspawn container. Detecting as nspawn guest")
230
- virtualization[:system] = "nspawn"
231
- virtualization[:role] = "guest"
232
- virtualization[:systems][:nspawn] = "guest"
233
- elsif /container=podman/.match?(file_read("/proc/1/environ"))
234
- logger.trace("Plugin Virtualization: /proc/1/environ indicates podman container. Detecting as podman guest")
235
- virtualization[:system] = "podman"
236
- virtualization[:role] = "guest"
237
- virtualization[:systems][:podman] = "guest"
238
- # Detect any containers that appear to be using docker such as those running on Github Actions virtual machines
239
- # but aren't triggered by the cgroup regex above. It's pretty safe to assume if the cgroup contains containerd,
240
- # it's likely using docker.
241
- # https://rubular.com/r/qhSmV113cPmEBT
242
- elsif %r{^\d+:[^:]*:/[^/]+/(containerd)-?.+$}.match?(cgroup_content)
243
- logger.trace("Plugin Virtualization: /proc/self/cgroup indicates docker container. Detecting as docker guest")
244
- virtualization[:system] = "docker"
245
- virtualization[:role] = "guest"
246
- virtualization[:systems][:docker] = "guest"
247
- elsif lxc_version_exists? && file_read("/proc/self/cgroup") =~ %r{\d:[^:]+:/$}
248
- # lxc-version shouldn't be installed by default
249
- # Even so, it is likely we are on an LXC capable host that is not being used as such
250
- # So we're cautious here to not overwrite other existing values (OHAI-573)
251
- unless virtualization[:system] && virtualization[:role]
252
- logger.trace("Plugin Virtualization: /proc/self/cgroup and lxc-version command exist. Detecting as lxc host")
253
- virtualization[:system] = "lxc"
254
- virtualization[:role] = "host"
255
- virtualization[:systems][:lxc] = "host"
256
- end
257
- # In general, the 'systems' framework from OHAI-182 is less susceptible to conflicts
258
- # But, this could overwrite virtualization[:systems][:lxc] = "guest"
259
- # If so, we may need to look further for a differentiator (OHAI-573)
260
- virtualization[:systems][:lxc] = "host"
261
- end
262
- end
263
-
264
- # regardless of what we found above, if we're a docker container inside
265
- # of the above, lets report as a docker container
266
- if file_exist?("/.dockerenv") || file_exist?("/.dockerinit")
267
- logger.trace("Plugin Virtualization: .dockerenv or .dockerinit exist. Detecting as docker guest")
268
- virtualization[:system] = "docker"
269
- virtualization[:role] = "guest"
270
- virtualization[:systems][:docker] = "guest"
271
- end
272
-
273
- # Detect LXD
274
- # See https://github.com/lxc/lxd/blob/master/doc/dev-lxd.md
275
- if file_exist?("/dev/lxd/sock")
276
- logger.trace("Plugin Virtualization: /dev/lxd/sock exists. Detecting as lxd guest")
277
- virtualization[:system] = "lxd"
278
- virtualization[:role] = "guest"
279
- virtualization[:systems][:lxd] = "guest"
280
- else
281
- # 'How' LXD is installed dictates the runtime data location
282
- #
283
- # Installations of LXD from a .deb (Ubuntu's main and backports repos) utilize '/var/lib/lxd/' for runtime data
284
- # - used by stable releases 2.0.x in trusty/xenial, and 3.0.x in bionic
285
- # - xenial-backports includes versions 2.1 through 2.21
286
- #
287
- # Snap based installations utilize '/var/snap/lxd/common/lxd/'
288
- # - includes all future releases starting with 2.21, and will be the only source of 3.1+ feature releases post-bionic
289
- ["/var/lib/lxd/devlxd", "/var/snap/lxd/common/lxd/devlxd"].each do |devlxd|
290
- if file_exist?(devlxd)
291
- logger.trace("Plugin Virtualization: #{devlxd} exists. Detecting as lxd host")
292
- virtualization[:system] = "lxd"
293
- virtualization[:role] = "host"
294
- virtualization[:systems][:lxd] = "host"
295
- break
296
- end
297
- end
298
- end
299
- end
300
- end
1
+ # frozen_string_literal: true
2
+ #
3
+ # Author:: Thom May (<thom@clearairturbulence.org>)
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(:Virtualization) do
21
+ provides "virtualization"
22
+ depends "dmi"
23
+ depends "cpu"
24
+ require_relative "../../mixin/dmi_decode"
25
+ include Ohai::Mixin::DmiDecode
26
+
27
+ def lxc_version_exists?
28
+ which("lxc-version") || which("lxc-start")
29
+ end
30
+
31
+ def nova_exists?
32
+ which("nova")
33
+ end
34
+
35
+ def docker_exists?
36
+ which("docker")
37
+ end
38
+
39
+ def podman_exists?
40
+ which("podman")
41
+ end
42
+
43
+ collect_data(:linux) do
44
+ virtualization Mash.new unless virtualization
45
+ virtualization[:systems] ||= Mash.new
46
+
47
+ # Docker hosts
48
+ if docker_exists?
49
+ virtualization[:system] = "docker"
50
+ virtualization[:role] = "host"
51
+ virtualization[:systems][:docker] = "host"
52
+ end
53
+
54
+ # Podman hosts
55
+ if podman_exists?
56
+ virtualization[:system] = "podman"
57
+ virtualization[:role] = "host"
58
+ virtualization[:systems][:podman] = "host"
59
+ end
60
+
61
+ # Xen Notes:
62
+ # - /proc/xen is an empty dir for EL6 + Linode Guests + Paravirt EC2 instances
63
+ # - cpuid of guests, if we could get it, would also be a clue
64
+ # - may be able to determine if under paravirt from /dev/xen/evtchn (See OHAI-253)
65
+ # - Additional edge cases likely should not change the above assumptions
66
+ # but rather be additive - btm
67
+ if file_exist?("/proc/xen")
68
+ virtualization[:system] = "xen"
69
+ # Assume guest
70
+ virtualization[:role] = "guest"
71
+ virtualization[:systems][:xen] = "guest"
72
+
73
+ # This file should exist on most Xen systems, normally empty for guests
74
+ if file_exist?("/proc/xen/capabilities")
75
+ if /control_d/i.match?(file_read("/proc/xen/capabilities"))
76
+ logger.trace("Plugin Virtualization: /proc/xen/capabilities contains control_d. Detecting as Xen host")
77
+ virtualization[:role] = "host"
78
+ virtualization[:systems][:xen] = "host"
79
+ end
80
+ end
81
+ end
82
+
83
+ # Detect Virtualbox from kernel module
84
+ if file_exist?("/proc/modules")
85
+ modules = file_read("/proc/modules")
86
+ if /^vboxdrv/.match?(modules)
87
+ logger.trace("Plugin Virtualization: /proc/modules contains vboxdrv. Detecting as vbox host")
88
+ virtualization[:system] = "vbox"
89
+ virtualization[:role] = "host"
90
+ virtualization[:systems][:vbox] = "host"
91
+ elsif /^vboxguest/.match?(modules)
92
+ logger.trace("Plugin Virtualization: /proc/modules contains vboxguest. Detecting as vbox guest")
93
+ virtualization[:system] = "vbox"
94
+ virtualization[:role] = "guest"
95
+ virtualization[:systems][:vbox] = "guest"
96
+ end
97
+ end
98
+
99
+ # if nova binary is present we're on an openstack host
100
+ if nova_exists?
101
+ logger.trace("Plugin Virtualization: nova command exists. Detecting as openstack host")
102
+ virtualization[:system] = "openstack"
103
+ virtualization[:role] = "host"
104
+ virtualization[:systems][:openstack] = "host"
105
+ end
106
+
107
+ # Detect paravirt KVM/QEMU from cpuinfo, report as KVM
108
+ if file_exist?("/proc/cpuinfo")
109
+ if /QEMU Virtual CPU|Common KVM processor|Common 32-bit KVM processor/.match?(file_read("/proc/cpuinfo"))
110
+ logger.trace("Plugin Virtualization: /proc/cpuinfo lists a KVM paravirt CPU string. Detecting as kvm guest")
111
+ virtualization[:system] = "kvm"
112
+ virtualization[:role] = "guest"
113
+ virtualization[:systems][:kvm] = "guest"
114
+ end
115
+ end
116
+
117
+ # Detect KVM systems via /sys
118
+ # guests will have the hypervisor cpu feature that hosts don't have
119
+ if file_exist?("/sys/devices/virtual/misc/kvm")
120
+ virtualization[:system] = "kvm"
121
+ if file_read("/proc/cpuinfo").include?("hypervisor")
122
+ logger.trace("Plugin Virtualization: /sys/devices/virtual/misc/kvm present and /proc/cpuinfo lists the hypervisor feature. Detecting as kvm guest")
123
+ virtualization[:role] = "guest"
124
+ virtualization[:systems][:kvm] = "guest"
125
+ else
126
+ logger.trace("Plugin Virtualization: /sys/devices/virtual/misc/kvm present and /proc/cpuinfo does not list the hypervisor feature. Detecting as kvm host")
127
+ virtualization[:role] = "host"
128
+ virtualization[:systems][:kvm] = "host"
129
+ end
130
+ elsif get_attribute(:cpu, :hypervisor_vendor)
131
+ if get_attribute(:cpu, :hypervisor_vendor) == "KVM"
132
+ virtualization[:system] = "kvm"
133
+ if /(para|full)/.match?(get_attribute(:cpu, :virtualization_type))
134
+ virtualization[:role] = "guest"
135
+ virtualization[:systems][:kvm] = "guest"
136
+ end
137
+ end
138
+ end
139
+
140
+ # parse dmi to discover various virtualization guests
141
+ # we do this *after* the kvm detection so that OpenStack isn't detected as KVM
142
+ logger.trace("Looking up DMI data manufacturer: '#{get_attribute(:dmi, :system, :manufacturer)}' product_name: '#{get_attribute(:dmi, :system, :product_name)}' version: '#{get_attribute(:dmi, :system, :version)}'")
143
+ guest = guest_from_dmi_data(get_attribute(:dmi, :system, :manufacturer), get_attribute(:dmi, :system, :product_name), get_attribute(:dmi, :system, :version))
144
+ if guest
145
+ logger.trace("Plugin Virtualization: DMI data indicates #{guest} guest")
146
+ virtualization[:system] = guest
147
+ virtualization[:role] = "guest"
148
+ virtualization[:systems][guest.to_sym] = "guest"
149
+ end
150
+
151
+ # Detect OpenVZ / Virtuozzo.
152
+ # http://wiki.openvz.org/BC_proc_entries
153
+ if file_exist?("/proc/bc/0")
154
+ logger.trace("Plugin Virtualization: /proc/bc/0 exists. Detecting as openvz host")
155
+ virtualization[:system] = "openvz"
156
+ virtualization[:role] = "host"
157
+ virtualization[:systems][:openvz] = "host"
158
+ elsif file_exist?("/proc/vz")
159
+ logger.trace("Plugin Virtualization: /proc/vz exists. Detecting as openvz guest")
160
+ virtualization[:system] = "openvz"
161
+ virtualization[:role] = "guest"
162
+ virtualization[:systems][:openvz] = "guest"
163
+ end
164
+
165
+ # Detect Hyper-V guest and the hostname of the host
166
+ if file_exist?("/var/lib/hyperv/.kvp_pool_3")
167
+ logger.trace("Plugin Virtualization: /var/lib/hyperv/.kvp_pool_3 contains string indicating Hyper-V guest")
168
+ data = file_read("/var/lib/hyperv/.kvp_pool_3")
169
+ hyperv_host = data[/\HostName(.*?)HostingSystemEditionId/, 1].scan(/[[:print:]]/).join.downcase
170
+ virtualization[:system] = "hyperv"
171
+ virtualization[:role] = "guest"
172
+ virtualization[:systems][:hyperv] = "guest"
173
+ virtualization[:hypervisor_host] = hyperv_host
174
+ end
175
+
176
+ # Detect Linux-VServer
177
+ if file_exist?("/proc/self/status")
178
+ proc_self_status = file_read("/proc/self/status")
179
+ vxid = proc_self_status.match(/^(s_context|VxID):\s*(\d+)$/)
180
+ if vxid && vxid[2]
181
+ virtualization[:system] = "linux-vserver"
182
+ if vxid[2] == "0"
183
+ logger.trace("Plugin Virtualization: /proc/self/status contains 's_context' or 'VxID' with a value of 0. Detecting as linux-vserver host")
184
+ virtualization[:role] = "host"
185
+ virtualization[:systems]["linux-vserver"] = "host"
186
+ else
187
+ logger.trace("Plugin Virtualization: /proc/self/status contains 's_context' or 'VxID' with a non-0 value. Detecting as linux-vserver guest")
188
+ virtualization[:role] = "guest"
189
+ virtualization[:systems]["linux-vserver"] = "guest"
190
+ end
191
+ end
192
+ end
193
+
194
+ # Detect LXC/Docker/Nspawn
195
+ #
196
+ # /proc/self/cgroup will look like this inside a docker container:
197
+ # <index #>:<subsystem>:/lxc/<hexadecimal container id>
198
+ #
199
+ # /proc/self/cgroup could have a name including alpha/digit/dashes
200
+ # <index #>:<subsystem>:/lxc/<named container id>
201
+ #
202
+ # /proc/self/cgroup could have a non-lxc cgroup name indicating other uses
203
+ # of cgroups. This is probably not LXC/Docker.
204
+ # <index #>:<subsystem>:/Charlie
205
+ #
206
+ # A host which supports cgroups, and has capacity to host lxc containers,
207
+ # will show the subsystems and root (/) namespace.
208
+ # <index #>:<subsystem>:/
209
+ #
210
+ # Full notes, https://tickets.opscode.com/browse/OHAI-551
211
+ # Kernel docs, https://web.archive.org/web/20100514070914/http://www.kernel.org/doc/Documentation/cgroups/
212
+ if file_exist?("/proc/self/cgroup")
213
+ cgroup_content = file_read("/proc/self/cgroup")
214
+ # These two REs catch many different examples. Here's a specific one
215
+ # from when it is docker and there is no subsystem name.
216
+ # https://rubular.com/r/dV13hiU9KxmiWB
217
+ if cgroup_content =~ %r{^\d+:[^:]*:/(lxc|docker)/.+$} ||
218
+ cgroup_content =~ %r{^\d+:[^:]*:/[^/]+/(lxc|docker)-?.+$}
219
+ logger.trace("Plugin Virtualization: /proc/self/cgroup indicates #{$1} container. Detecting as #{$1} guest")
220
+ virtualization[:system] = $1
221
+ virtualization[:role] = "guest"
222
+ virtualization[:systems][$1.to_sym] = "guest"
223
+ elsif file_read("/proc/1/environ").include?("container=lxc")
224
+ logger.trace("Plugin Virtualization: /proc/1/environ indicates lxc container. Detecting as lxc guest")
225
+ virtualization[:system] = "lxc"
226
+ virtualization[:role] = "guest"
227
+ virtualization[:systems][:lxc] = "guest"
228
+ elsif file_read("/proc/1/environ").include?("container=systemd-nspawn")
229
+ logger.trace("Plugin Virtualization: /proc/1/environ indicates nspawn container. Detecting as nspawn guest")
230
+ virtualization[:system] = "nspawn"
231
+ virtualization[:role] = "guest"
232
+ virtualization[:systems][:nspawn] = "guest"
233
+ elsif file_read("/proc/1/environ").include?("container=podman")
234
+ logger.trace("Plugin Virtualization: /proc/1/environ indicates podman container. Detecting as podman guest")
235
+ virtualization[:system] = "podman"
236
+ virtualization[:role] = "guest"
237
+ virtualization[:systems][:podman] = "guest"
238
+ # Detect any containers that appear to be using docker such as those running on Github Actions virtual machines
239
+ # but aren't triggered by the cgroup regex above. It's pretty safe to assume if the cgroup contains containerd,
240
+ # it's likely using docker.
241
+ # https://rubular.com/r/qhSmV113cPmEBT
242
+ elsif %r{^\d+:[^:]*:/[^/]+/(containerd)-?.+$}.match?(cgroup_content)
243
+ logger.trace("Plugin Virtualization: /proc/self/cgroup indicates docker container. Detecting as docker guest")
244
+ virtualization[:system] = "docker"
245
+ virtualization[:role] = "guest"
246
+ virtualization[:systems][:docker] = "guest"
247
+ elsif lxc_version_exists? && file_read("/proc/self/cgroup") =~ %r{\d:[^:]+:/$}
248
+ # lxc-version shouldn't be installed by default
249
+ # Even so, it is likely we are on an LXC capable host that is not being used as such
250
+ # So we're cautious here to not overwrite other existing values (OHAI-573)
251
+ unless virtualization[:system] && virtualization[:role]
252
+ logger.trace("Plugin Virtualization: /proc/self/cgroup and lxc-version command exist. Detecting as lxc host")
253
+ virtualization[:system] = "lxc"
254
+ virtualization[:role] = "host"
255
+ virtualization[:systems][:lxc] = "host"
256
+ end
257
+ # In general, the 'systems' framework from OHAI-182 is less susceptible to conflicts
258
+ # But, this could overwrite virtualization[:systems][:lxc] = "guest"
259
+ # If so, we may need to look further for a differentiator (OHAI-573)
260
+ virtualization[:systems][:lxc] = "host"
261
+ end
262
+ end
263
+
264
+ # regardless of what we found above, if we're a docker container inside
265
+ # of the above, lets report as a docker container
266
+ if file_exist?("/.dockerenv") || file_exist?("/.dockerinit")
267
+ logger.trace("Plugin Virtualization: .dockerenv or .dockerinit exist. Detecting as docker guest")
268
+ virtualization[:system] = "docker"
269
+ virtualization[:role] = "guest"
270
+ virtualization[:systems][:docker] = "guest"
271
+ end
272
+
273
+ # Detect LXD
274
+ # See https://github.com/lxc/lxd/blob/master/doc/dev-lxd.md
275
+ if file_exist?("/dev/lxd/sock")
276
+ logger.trace("Plugin Virtualization: /dev/lxd/sock exists. Detecting as lxd guest")
277
+ virtualization[:system] = "lxd"
278
+ virtualization[:role] = "guest"
279
+ virtualization[:systems][:lxd] = "guest"
280
+ else
281
+ # 'How' LXD is installed dictates the runtime data location
282
+ #
283
+ # Installations of LXD from a .deb (Ubuntu's main and backports repos) utilize '/var/lib/lxd/' for runtime data
284
+ # - used by stable releases 2.0.x in trusty/xenial, and 3.0.x in bionic
285
+ # - xenial-backports includes versions 2.1 through 2.21
286
+ #
287
+ # Snap based installations utilize '/var/snap/lxd/common/lxd/'
288
+ # - includes all future releases starting with 2.21, and will be the only source of 3.1+ feature releases post-bionic
289
+ ["/var/lib/lxd/devlxd", "/var/snap/lxd/common/lxd/devlxd"].each do |devlxd|
290
+ if file_exist?(devlxd)
291
+ logger.trace("Plugin Virtualization: #{devlxd} exists. Detecting as lxd host")
292
+ virtualization[:system] = "lxd"
293
+ virtualization[:role] = "host"
294
+ virtualization[:systems][:lxd] = "host"
295
+ break
296
+ end
297
+ end
298
+ end
299
+ end
300
+ end