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,95 +1,95 @@
1
- # frozen_string_literal: true
2
- #
3
- # Author:: Adam Jacob (<adam@chef.io>)
4
- # Author:: Bryan McLellan (<btm@loftninjas.org>)
5
- # Author:: Claire McQuin (<claire@chef.io>)
6
- # Author:: Doug MacEachern (<dougm@vmware.com>)
7
- # Author:: Kurt Yoder (<ktyopscode@yoderhome.com>)
8
- # Author:: Paul Mooring (<paul@chef.io>)
9
- # Copyright:: Copyright (c) Chef Software Inc.
10
- # Copyright:: Copyright (c) 2009 Bryan McLellan
11
- # Copyright:: Copyright (c) 2010 VMware, Inc.
12
- # License:: Apache License, Version 2.0
13
- #
14
- # Licensed under the Apache License, Version 2.0 (the "License");
15
- # you may not use this file except in compliance with the License.
16
- # You may obtain a copy of the License at
17
- #
18
- # http://www.apache.org/licenses/LICENSE-2.0
19
- #
20
- # Unless required by applicable law or agreed to in writing, software
21
- # distributed under the License is distributed on an "AS IS" BASIS,
22
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
23
- # implied.
24
- # See the License for the specific language governing permissions and
25
- # limitations under the License.
26
- #
27
-
28
- Ohai.plugin(:Uptime) do
29
- require_relative "../mixin/seconds_to_human"
30
- provides "uptime", "uptime_seconds"
31
- provides "idletime", "idletime_seconds" # linux only
32
-
33
- def collect_uptime(path)
34
- # kern.boottime: { sec = 1232765114, usec = 823118 } Fri Jan 23 18:45:14 2009
35
- so = shell_out("#{Ohai.abs_path(path)} kern.boottime")
36
- so.stdout.lines do |line|
37
- if line =~ /kern.boottime:\D+(\d+)/
38
- usec = Time.new.to_i - $1.to_i
39
- return [usec, seconds_to_human(usec)]
40
- end
41
- end
42
- [nil, nil]
43
- end
44
-
45
- collect_data(:darwin) do
46
- data = collect_uptime("/usr/sbin/sysctl")
47
- uptime_seconds data.first
48
- uptime data.last
49
- end
50
-
51
- collect_data(:freebsd, :netbsd, :dragonflybsd) do
52
- data = collect_uptime("/sbin/sysctl")
53
- uptime_seconds data.first
54
- uptime data.last
55
- end
56
-
57
- collect_data(:linux) do
58
- uptime, idletime = file_open("/proc/uptime").gets.split
59
- uptime_seconds uptime.to_i
60
- uptime seconds_to_human(uptime.to_i)
61
- idletime_seconds idletime.to_i
62
- idletime seconds_to_human(idletime.to_i)
63
- end
64
-
65
- collect_data(:openbsd) do
66
- # kern.boottime=Tue Nov 1 14:45:52 2011
67
- so = shell_out("#{Ohai.abs_path( "/sbin/sysctl" )} #kern.boottime")
68
- so.stdout.lines do |line|
69
- if line =~ /kern.boottime=(.+)/
70
- uptime_seconds Time.new.to_i - Time.parse($1).to_i
71
- uptime seconds_to_human(uptime_seconds)
72
- end
73
- end
74
- end
75
-
76
- collect_data(:solaris2) do
77
- so = shell_out("kstat -p unix:0:system_misc:boot_time")
78
- # unix:0:system_misc:boot_time 1343860543
79
- so.stdout.lines do |line|
80
- if line =~ /unix:0:system_misc:boot_time\s+(\d+)/
81
- uptime_seconds Time.new.to_i - $1.to_i
82
- uptime seconds_to_human(uptime_seconds)
83
- end
84
- end
85
- end
86
-
87
- collect_data(:windows) do
88
- require "wmi-lite/wmi" unless defined?(WmiLite::Wmi)
89
- wmi = WmiLite::Wmi.new
90
- last_boot_up_time = wmi.first_of("Win32_OperatingSystem")["lastbootuptime"]
91
- uptime_seconds Time.new.to_i - Time.parse(last_boot_up_time).to_i
92
- uptime seconds_to_human(uptime_seconds)
93
- end
94
-
95
- end
1
+ # frozen_string_literal: true
2
+ #
3
+ # Author:: Adam Jacob (<adam@chef.io>)
4
+ # Author:: Bryan McLellan (<btm@loftninjas.org>)
5
+ # Author:: Claire McQuin (<claire@chef.io>)
6
+ # Author:: Doug MacEachern (<dougm@vmware.com>)
7
+ # Author:: Kurt Yoder (<ktyopscode@yoderhome.com>)
8
+ # Author:: Paul Mooring (<paul@chef.io>)
9
+ # Copyright:: Copyright (c) Chef Software Inc.
10
+ # Copyright:: Copyright (c) 2009 Bryan McLellan
11
+ # Copyright:: Copyright (c) 2010 VMware, Inc.
12
+ # License:: Apache License, Version 2.0
13
+ #
14
+ # Licensed under the Apache License, Version 2.0 (the "License");
15
+ # you may not use this file except in compliance with the License.
16
+ # You may obtain a copy of the License at
17
+ #
18
+ # http://www.apache.org/licenses/LICENSE-2.0
19
+ #
20
+ # Unless required by applicable law or agreed to in writing, software
21
+ # distributed under the License is distributed on an "AS IS" BASIS,
22
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
23
+ # implied.
24
+ # See the License for the specific language governing permissions and
25
+ # limitations under the License.
26
+ #
27
+
28
+ Ohai.plugin(:Uptime) do
29
+ require_relative "../mixin/seconds_to_human"
30
+ provides "uptime", "uptime_seconds"
31
+ provides "idletime", "idletime_seconds" # linux only
32
+
33
+ def collect_uptime(path)
34
+ # kern.boottime: { sec = 1232765114, usec = 823118 } Fri Jan 23 18:45:14 2009
35
+ so = shell_out("#{Ohai.abs_path(path)} kern.boottime")
36
+ so.stdout.lines do |line|
37
+ if line =~ /kern.boottime:\D+(\d+)/
38
+ usec = Time.new.to_i - $1.to_i
39
+ return [usec, seconds_to_human(usec)]
40
+ end
41
+ end
42
+ [nil, nil]
43
+ end
44
+
45
+ collect_data(:darwin) do
46
+ data = collect_uptime("/usr/sbin/sysctl")
47
+ uptime_seconds data.first
48
+ uptime data.last
49
+ end
50
+
51
+ collect_data(:freebsd, :netbsd, :dragonflybsd) do
52
+ data = collect_uptime("/sbin/sysctl")
53
+ uptime_seconds data.first
54
+ uptime data.last
55
+ end
56
+
57
+ collect_data(:linux) do
58
+ uptime, idletime = file_open("/proc/uptime").gets.split
59
+ uptime_seconds uptime.to_i
60
+ uptime seconds_to_human(uptime.to_i)
61
+ idletime_seconds idletime.to_i
62
+ idletime seconds_to_human(idletime.to_i)
63
+ end
64
+
65
+ collect_data(:openbsd) do
66
+ # kern.boottime=Tue Nov 1 14:45:52 2011
67
+ so = shell_out("#{Ohai.abs_path( "/sbin/sysctl" )} #kern.boottime")
68
+ so.stdout.lines do |line|
69
+ if line =~ /kern.boottime=(.+)/
70
+ uptime_seconds Time.new.to_i - Time.parse($1).to_i
71
+ uptime seconds_to_human(uptime_seconds)
72
+ end
73
+ end
74
+ end
75
+
76
+ collect_data(:solaris2) do
77
+ so = shell_out("kstat -p unix:0:system_misc:boot_time")
78
+ # unix:0:system_misc:boot_time 1343860543
79
+ so.stdout.lines do |line|
80
+ if line =~ /unix:0:system_misc:boot_time\s+(\d+)/
81
+ uptime_seconds Time.new.to_i - $1.to_i
82
+ uptime seconds_to_human(uptime_seconds)
83
+ end
84
+ end
85
+ end
86
+
87
+ collect_data(:windows) do
88
+ require "wmi-lite/wmi" unless defined?(WmiLite::Wmi)
89
+ wmi = WmiLite::Wmi.new
90
+ last_boot_up_time = wmi.first_of("Win32_OperatingSystem")["lastbootuptime"]
91
+ uptime_seconds Time.new.to_i - Time.parse(last_boot_up_time).to_i
92
+ uptime seconds_to_human(uptime_seconds)
93
+ end
94
+
95
+ end
@@ -1,197 +1,197 @@
1
- # frozen_string_literal: true
2
- #
3
- # Author:: Tim Smith <tsmith@chef.io>
4
- # Author:: Joshua Colson <joshua.colson@gmail.com>
5
- # Copyright:: Copyright (c) Chef Software Inc.
6
- # Copyright:: 2019 Joshua Colson
7
- # License:: Apache License, Version 2.0
8
- #
9
- # Licensed under the Apache License, Version 2.0 (the "License");
10
- # you may not use this file except in compliance with the License.
11
- # You may obtain a copy of the License at
12
- #
13
- # http://www.apache.org/licenses/LICENSE-2.0
14
- #
15
- # Unless required by applicable law or agreed to in writing, software
16
- # distributed under the License is distributed on an "AS IS" BASIS,
17
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
- # See the License for the specific language governing permissions and
19
- # limitations under the License.
20
- #
21
-
22
- Ohai.plugin(:Virtualbox) do
23
- depends "virtualization"
24
- provides "virtualbox"
25
-
26
- # query virtualbox for each configured vm, as well as
27
- # each guest's individual configuration settings
28
- def vboxmanage_list_vms
29
- vms = Mash.new
30
- so_cmd = "VBoxManage list --sorted vms"
31
- logger.trace(so_cmd)
32
- so = shell_out(so_cmd)
33
-
34
- if so.exitstatus == 0
35
- # parse the output
36
- so.stdout.lines.each do |line|
37
- case line
38
- when /^"(\S*)" \{(\S*)\}$/
39
- name = Regexp.last_match(1)
40
- uuid = Regexp.last_match(2)
41
- vms[name] = vboxmanage_vminfo(uuid)
42
- end
43
- end
44
- end
45
- vms
46
- rescue Ohai::Exceptions::Exec
47
- logger.trace("Plugin VboxHost: Could not run 'VBoxManage list --sorted vms'. Skipping data")
48
- end
49
-
50
- # query the vminfo for particular guest instance, normalizing
51
- # the fields so that they're not enclosed in double-quotes (")
52
- def vboxmanage_vminfo(machine_id)
53
- vm = Mash.new
54
-
55
- so_cmd = "VBoxManage showvminfo #{machine_id} --machinereadable"
56
- logger.trace(so_cmd)
57
- so = shell_out(so_cmd)
58
-
59
- if so.exitstatus == 0
60
- so.stdout.lines.each do |line|
61
- line.chomp!
62
- left, right = line.split("=")
63
-
64
- # remove enclosing quotes, if needed
65
- key = left.delete_prefix('"').delete_suffix('"')
66
-
67
- # skip the name attribute since that is the parent key
68
- next if key == "name"
69
-
70
- vm[key.downcase] = right.delete_prefix('"').delete_suffix('"')
71
- end
72
- end
73
- vm
74
- rescue Ohai::Exceptions::Exec
75
- logger.trace("Plugin VboxHost: Could not run '#{so_cmd}'. Skipping data")
76
- end
77
-
78
- # query virtualbox for a list of #{query_type} items
79
- # these queries return a result set that is delimited by
80
- # multiple successive newlines, with each block containing
81
- # key/value pairs delimited by a colon (:) and column aligned
82
- #
83
- # the keys of each k/v pair are normalized to lowercase
84
- def vboxmanage_list_blocks(query_type, name_key)
85
- # ignore unrecognized query type
86
- supported_queries = %w{
87
- bridgedifs dhcpservers dvds hdds hostdvds
88
- hostfloppies hostonlyifs natnets
89
- }
90
- return nil unless supported_queries.include? query_type
91
-
92
- results = Mash.new
93
-
94
- so_cmd = "VBoxManage list --sorted #{query_type}"
95
- logger.trace(so_cmd)
96
- so = shell_out(so_cmd)
97
- # raise an exception if the command fails
98
- # so.error!
99
-
100
- if so.exitstatus == 0
101
- # break the result into paragraph blocks, on successive newlines
102
- so.stdout.each_line("") do |blk|
103
- # remove the multiple newlines of each record
104
- blk.chomp!.chomp!
105
- # initialize a blank record hash
106
- record = Mash.new
107
- # parse the record block into key/value pairs
108
- blk.each_line do |line|
109
- next unless line.include? ":"
110
-
111
- # split the line into key/value pair
112
- key, right = line.split(":", 2)
113
-
114
- # strip the leading/trailing whitespace if the value is not nil
115
- value = right.nil? ? "" : right.strip
116
- record[key.downcase] = value
117
- end
118
-
119
- # insert the record into the list of results
120
- if record.key? name_key.downcase
121
- name = record.delete(name_key.downcase)
122
- results[name] = record
123
- end
124
- end
125
- end
126
- results
127
- rescue Ohai::Exceptions::Exec
128
- logger.trace("Plugin VboxHost: Could not run '#{so_cmd}'. Skipping data")
129
- end
130
-
131
- collect_data(:windows, :linux, :solaris2, :darwin) do
132
- case virtualization.dig("systems", "vbox")
133
- when "guest"
134
- logger.trace("Plugin Virtualbox: Node detected as vbox guest. Collecting guest data.")
135
- begin
136
- so = shell_out("VBoxControl guestproperty enumerate")
137
-
138
- if so.exitstatus == 0
139
- virtualbox Mash.new
140
- virtualbox[:host] = Mash.new
141
- virtualbox[:guest] = Mash.new
142
- so.stdout.lines.each do |line|
143
- case line
144
- when /LanguageID, value: (\S*),/
145
- virtualbox[:host][:language] = Regexp.last_match(1)
146
- when /VBoxVer, value: (\S*),/
147
- virtualbox[:host][:version] = Regexp.last_match(1)
148
- when /VBoxRev, value: (\S*),/
149
- virtualbox[:host][:revision] = Regexp.last_match(1)
150
- when %r{GuestAdd/VersionExt, value: (\S*),}
151
- virtualbox[:guest][:guest_additions_version] = Regexp.last_match(1)
152
- when %r{GuestAdd/Revision, value: (\S*),}
153
- virtualbox[:guest][:guest_additions_revision] = Regexp.last_match(1)
154
- end
155
- end
156
- end
157
- rescue Ohai::Exceptions::Exec
158
- logger.trace('Plugin Virtualbox: Could not execute "VBoxControl guestproperty enumerate". Skipping data collection.')
159
- end
160
- when "host"
161
- logger.trace("Plugin Virtualbox: Node detected as vbox host. Collecting host data.")
162
- virtualbox Mash.new
163
- begin
164
- # get a list of virtualbox guest vms
165
- virtualbox["guests"] = vboxmanage_list_vms
166
-
167
- # get a list of virtualbox virtual hard disk drives
168
- virtualbox["hdds"] = vboxmanage_list_blocks("hdds", "Location")
169
-
170
- # get a list of virtualbox virtual dvd drives
171
- virtualbox["dvds"] = vboxmanage_list_blocks("dvds", "Location")
172
-
173
- # get a list of virtualbox host dvd drives
174
- virtualbox["hostdvds"] = vboxmanage_list_blocks("hostdvds", "Name")
175
-
176
- # get a list of virtualbox host floppy drives
177
- virtualbox["hostfloppies"] = vboxmanage_list_blocks("hostfloppies", "Name")
178
-
179
- # get a list of virtualbox hostonly network interfaces
180
- virtualbox["hostonlyifs"] = vboxmanage_list_blocks("hostonlyifs", "Name")
181
-
182
- # get a list of virtualbox bridged network interfaces
183
- virtualbox["bridgedifs"] = vboxmanage_list_blocks("bridgedifs", "Name")
184
-
185
- # get a list of virtualbox dhcp servers
186
- virtualbox["dhcpservers"] = vboxmanage_list_blocks("dhcpservers", "NetworkName")
187
-
188
- # get a list of virtualbox nat networks
189
- virtualbox["natnets"] = vboxmanage_list_blocks("natnets", "NetworkName")
190
- rescue Ohai::Exceptions::Exec
191
- logger.trace("Plugin VboxHost: Could not collect data for VirtualBox host. Skipping data")
192
- end
193
- else
194
- logger.trace("Plugin Virtualbox: Not on a Virtualbox host or guest. Skipping plugin.")
195
- end
196
- end
197
- end
1
+ # frozen_string_literal: true
2
+ #
3
+ # Author:: Tim Smith <tsmith@chef.io>
4
+ # Author:: Joshua Colson <joshua.colson@gmail.com>
5
+ # Copyright:: Copyright (c) Chef Software Inc.
6
+ # Copyright:: 2019 Joshua Colson
7
+ # License:: Apache License, Version 2.0
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+
22
+ Ohai.plugin(:Virtualbox) do
23
+ depends "virtualization"
24
+ provides "virtualbox"
25
+
26
+ # query virtualbox for each configured vm, as well as
27
+ # each guest's individual configuration settings
28
+ def vboxmanage_list_vms
29
+ vms = Mash.new
30
+ so_cmd = "VBoxManage list --sorted vms"
31
+ logger.trace(so_cmd)
32
+ so = shell_out(so_cmd)
33
+
34
+ if so.exitstatus == 0
35
+ # parse the output
36
+ so.stdout.lines.each do |line|
37
+ case line
38
+ when /^"(\S*)" \{(\S*)\}$/
39
+ name = Regexp.last_match(1)
40
+ uuid = Regexp.last_match(2)
41
+ vms[name] = vboxmanage_vminfo(uuid)
42
+ end
43
+ end
44
+ end
45
+ vms
46
+ rescue Ohai::Exceptions::Exec
47
+ logger.trace("Plugin VboxHost: Could not run 'VBoxManage list --sorted vms'. Skipping data")
48
+ end
49
+
50
+ # query the vminfo for particular guest instance, normalizing
51
+ # the fields so that they're not enclosed in double-quotes (")
52
+ def vboxmanage_vminfo(machine_id)
53
+ vm = Mash.new
54
+
55
+ so_cmd = "VBoxManage showvminfo #{machine_id} --machinereadable"
56
+ logger.trace(so_cmd)
57
+ so = shell_out(so_cmd)
58
+
59
+ if so.exitstatus == 0
60
+ so.stdout.lines.each do |line|
61
+ line.chomp!
62
+ left, right = line.split("=")
63
+
64
+ # remove enclosing quotes, if needed
65
+ key = left.delete_prefix('"').delete_suffix('"')
66
+
67
+ # skip the name attribute since that is the parent key
68
+ next if key == "name"
69
+
70
+ vm[key.downcase] = right.delete_prefix('"').delete_suffix('"')
71
+ end
72
+ end
73
+ vm
74
+ rescue Ohai::Exceptions::Exec
75
+ logger.trace("Plugin VboxHost: Could not run '#{so_cmd}'. Skipping data")
76
+ end
77
+
78
+ # query virtualbox for a list of #{query_type} items
79
+ # these queries return a result set that is delimited by
80
+ # multiple successive newlines, with each block containing
81
+ # key/value pairs delimited by a colon (:) and column aligned
82
+ #
83
+ # the keys of each k/v pair are normalized to lowercase
84
+ def vboxmanage_list_blocks(query_type, name_key)
85
+ # ignore unrecognized query type
86
+ supported_queries = %w{
87
+ bridgedifs dhcpservers dvds hdds hostdvds
88
+ hostfloppies hostonlyifs natnets
89
+ }
90
+ return nil unless supported_queries.include? query_type
91
+
92
+ results = Mash.new
93
+
94
+ so_cmd = "VBoxManage list --sorted #{query_type}"
95
+ logger.trace(so_cmd)
96
+ so = shell_out(so_cmd)
97
+ # raise an exception if the command fails
98
+ # so.error!
99
+
100
+ if so.exitstatus == 0
101
+ # break the result into paragraph blocks, on successive newlines
102
+ so.stdout.each_line("") do |blk|
103
+ # remove the multiple newlines of each record
104
+ blk.chomp!.chomp!
105
+ # initialize a blank record hash
106
+ record = Mash.new
107
+ # parse the record block into key/value pairs
108
+ blk.each_line do |line|
109
+ next unless line.include? ":"
110
+
111
+ # split the line into key/value pair
112
+ key, right = line.split(":", 2)
113
+
114
+ # strip the leading/trailing whitespace if the value is not nil
115
+ value = right.nil? ? "" : right.strip
116
+ record[key.downcase] = value
117
+ end
118
+
119
+ # insert the record into the list of results
120
+ if record.key? name_key.downcase
121
+ name = record.delete(name_key.downcase)
122
+ results[name] = record
123
+ end
124
+ end
125
+ end
126
+ results
127
+ rescue Ohai::Exceptions::Exec
128
+ logger.trace("Plugin VboxHost: Could not run '#{so_cmd}'. Skipping data")
129
+ end
130
+
131
+ collect_data(:windows, :linux, :solaris2, :darwin) do
132
+ case virtualization.dig("systems", "vbox")
133
+ when "guest"
134
+ logger.trace("Plugin Virtualbox: Node detected as vbox guest. Collecting guest data.")
135
+ begin
136
+ so = shell_out("VBoxControl guestproperty enumerate")
137
+
138
+ if so.exitstatus == 0
139
+ virtualbox Mash.new
140
+ virtualbox[:host] = Mash.new
141
+ virtualbox[:guest] = Mash.new
142
+ so.stdout.lines.each do |line|
143
+ case line
144
+ when /LanguageID, value: (\S*),/
145
+ virtualbox[:host][:language] = Regexp.last_match(1)
146
+ when /VBoxVer, value: (\S*),/
147
+ virtualbox[:host][:version] = Regexp.last_match(1)
148
+ when /VBoxRev, value: (\S*),/
149
+ virtualbox[:host][:revision] = Regexp.last_match(1)
150
+ when %r{GuestAdd/VersionExt, value: (\S*),}
151
+ virtualbox[:guest][:guest_additions_version] = Regexp.last_match(1)
152
+ when %r{GuestAdd/Revision, value: (\S*),}
153
+ virtualbox[:guest][:guest_additions_revision] = Regexp.last_match(1)
154
+ end
155
+ end
156
+ end
157
+ rescue Ohai::Exceptions::Exec
158
+ logger.trace('Plugin Virtualbox: Could not execute "VBoxControl guestproperty enumerate". Skipping data collection.')
159
+ end
160
+ when "host"
161
+ logger.trace("Plugin Virtualbox: Node detected as vbox host. Collecting host data.")
162
+ virtualbox Mash.new
163
+ begin
164
+ # get a list of virtualbox guest vms
165
+ virtualbox["guests"] = vboxmanage_list_vms
166
+
167
+ # get a list of virtualbox virtual hard disk drives
168
+ virtualbox["hdds"] = vboxmanage_list_blocks("hdds", "Location")
169
+
170
+ # get a list of virtualbox virtual dvd drives
171
+ virtualbox["dvds"] = vboxmanage_list_blocks("dvds", "Location")
172
+
173
+ # get a list of virtualbox host dvd drives
174
+ virtualbox["hostdvds"] = vboxmanage_list_blocks("hostdvds", "Name")
175
+
176
+ # get a list of virtualbox host floppy drives
177
+ virtualbox["hostfloppies"] = vboxmanage_list_blocks("hostfloppies", "Name")
178
+
179
+ # get a list of virtualbox hostonly network interfaces
180
+ virtualbox["hostonlyifs"] = vboxmanage_list_blocks("hostonlyifs", "Name")
181
+
182
+ # get a list of virtualbox bridged network interfaces
183
+ virtualbox["bridgedifs"] = vboxmanage_list_blocks("bridgedifs", "Name")
184
+
185
+ # get a list of virtualbox dhcp servers
186
+ virtualbox["dhcpservers"] = vboxmanage_list_blocks("dhcpservers", "NetworkName")
187
+
188
+ # get a list of virtualbox nat networks
189
+ virtualbox["natnets"] = vboxmanage_list_blocks("natnets", "NetworkName")
190
+ rescue Ohai::Exceptions::Exec
191
+ logger.trace("Plugin VboxHost: Could not collect data for VirtualBox host. Skipping data")
192
+ end
193
+ else
194
+ logger.trace("Plugin Virtualbox: Not on a Virtualbox host or guest. Skipping plugin.")
195
+ end
196
+ end
197
+ end