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,234 +1,234 @@
1
- # frozen_string_literal: true
2
- # Author:: "Christian Höltje" <choltje@us.ibm.com>
3
- # Author:: "Christopher M. Luciano" <cmlucian@us.ibm.com>
4
- # Author:: Shahul Khajamohideen (<skhajamohid1@bloomberg.net>)
5
- # Copyright (C) 2015 IBM Corp.
6
- # Copyright (C) 2015 Bloomberg Finance L.P.
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(:Packages) do
23
- provides "packages"
24
- depends "platform_family"
25
-
26
- WINDOWS_ATTRIBUTE_ALIASES ||= {
27
- "DisplayVersion" => "version",
28
- "Publisher" => "publisher",
29
- "InstallDate" => "installdate",
30
- }.freeze
31
-
32
- collect_data(:linux) do
33
- packages Mash.new
34
- case platform_family
35
- when "debian"
36
- format = '${Package}\t${Version}\t${Architecture}\t${db:Status-Status}\n'
37
- so = shell_out("dpkg-query -W -f='#{format}'")
38
- pkgs = so.stdout.lines
39
-
40
- pkgs.each do |pkg|
41
- name, version, arch, status = pkg.split
42
- packages[name] = { "version" => version, "arch" => arch, "status" => status }
43
- end
44
-
45
- when "rhel", "fedora", "suse", "pld", "amazon"
46
- format = '%{NAME}\t%|EPOCH?{%{EPOCH}}:{0}|\t%{VERSION}\t%{RELEASE}\t%{INSTALLTIME}\t%{ARCH}\n'
47
- so = shell_out("rpm -qa --qf '#{format}'")
48
- pkgs = so.stdout.lines
49
-
50
- pkgs.each do |pkg|
51
- name, epoch, version, release, installdate, arch = pkg.split
52
- if packages[name]
53
- # We have more than one package with this exact name!
54
- # Create an "versions" array for tracking all versions of packages with this name.
55
- # The top-level package information will be the first one returned by rpm -qa,
56
- # all versions go in this list, with the same information they'd normally have.
57
- if packages[name]["versions"].nil?
58
- # add the data of the first package to the list, so that all versions are in the list.
59
- packages[name]["versions"] = []
60
- packages[name]["versions"] << Mash.new({ "epoch" => packages[name]["epoch"],
61
- "version" => packages[name]["version"],
62
- "release" => packages[name]["release"],
63
- "installdate" => packages[name]["installdate"],
64
- "arch" => packages[name]["arch"] })
65
- end
66
- packages[name]["versions"] << Mash.new({ "epoch" => epoch, "version" => version, "release" => release, "installdate" => installdate, "arch" => arch }) # Add this package version to the list
67
- # When this was originally written, it didn't account for multiple versions of the same package
68
- # so it just kept clobbering the package data if it encountered multiple versions
69
- # of the same package. As a result, the last duplicate returned by rpm -qa was what was present;
70
- # here we clobber that data for compatibility. Note that we can't overwrite the entire hash
71
- # without losing the versions array.
72
- packages[name]["epoch"] = epoch
73
- packages[name]["version"] = version
74
- packages[name]["release"] = release
75
- packages[name]["installdate"] = installdate
76
- packages[name]["arch"] = arch
77
- else
78
- packages[name] = { "epoch" => epoch, "version" => version, "release" => release, "installdate" => installdate, "arch" => arch }
79
- end
80
- end
81
-
82
- when "arch"
83
- require "date" unless defined?(DateTime)
84
-
85
- # Set LANG=C to force an easy to parse date format
86
- so = shell_out("LANG=C pacman -Qi")
87
-
88
- so.stdout.split("\n\n").each do |record|
89
- pacman_info = {}
90
- record.lines.each do |line|
91
- if line =~ /\A(.*?)\s+:\s(.*)\z/m
92
- key, value = Regexp.last_match[1..2]
93
- key = key.strip.downcase.gsub(/\s+/, "")
94
- pacman_info[key] = value.strip
95
- end
96
- end
97
-
98
- name = pacman_info["name"]
99
- installdate = DateTime.strptime(pacman_info["installdate"], "%Ec").strftime("%s")
100
- packages[name] = {
101
- "version" => pacman_info["version"],
102
- "installdate" => installdate,
103
- "arch" => pacman_info["architecture"],
104
- }
105
- end
106
- end
107
- end
108
-
109
- def collect_programs_from_registry_key(repo, key_path)
110
- # from http://msdn.microsoft.com/en-us/library/windows/desktop/aa384129(v=vs.85).aspx
111
- if ::RbConfig::CONFIG["target_cpu"] == "i386"
112
- reg_type = Win32::Registry::KEY_READ | 0x100
113
- elsif ::RbConfig::CONFIG["target_cpu"] == "x86_64"
114
- reg_type = Win32::Registry::KEY_READ | 0x200
115
- else
116
- reg_type = Win32::Registry::KEY_READ
117
- end
118
- repo.open(key_path, reg_type) do |reg|
119
- reg.each_key do |key, _wtime|
120
- pkg = reg.open(key)
121
- name = pkg["DisplayName"] rescue nil
122
- next if name.nil?
123
-
124
- package = packages[name] = Mash.new
125
- WINDOWS_ATTRIBUTE_ALIASES.each do |registry_attr, package_attr|
126
- value = pkg[registry_attr] rescue nil
127
- package[package_attr] = value unless value.nil?
128
- end
129
- end
130
- end
131
- end
132
-
133
- collect_data(:windows) do
134
- require "win32/registry" unless defined?(Win32::Registry)
135
- packages Mash.new
136
- collect_programs_from_registry_key(Win32::Registry::HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Uninstall')
137
- # on 64 bit systems, 32 bit programs are stored here moved before HKEY_CURRENT_USER otherwise it is not collected (impacts both ohai 16 & 17)
138
- collect_programs_from_registry_key(Win32::Registry::HKEY_LOCAL_MACHINE, 'Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall')
139
- collect_programs_from_registry_key(Win32::Registry::HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Uninstall') rescue nil
140
- end
141
-
142
- collect_data(:aix) do
143
- packages Mash.new
144
- so = shell_out("lslpp -L -q -c")
145
- pkgs = so.stdout.lines
146
-
147
- # Output format is
148
- # Package Name:Fileset:Level
149
- # On aix, filesets are packages and levels are versions
150
- pkgs.each do |pkg|
151
- name, fileset, version, _, _, _, pkg_type = pkg.split(":")
152
- if pkg_type == "R"
153
- # RPM
154
- packages[name] = { "version" => version }
155
- else
156
- # LPP
157
- packages[fileset] = { "version" => version }
158
- end
159
- end
160
- end
161
-
162
- collect_data(:freebsd) do
163
- packages Mash.new
164
- so = shell_out('pkg query -a "%n %v"')
165
- # Output format is
166
- # name version
167
- so.stdout.lines do |pkg|
168
- name, version = pkg.split
169
- packages[name] = { "version" => version }
170
- end
171
- end
172
-
173
- def collect_ips_packages
174
- so = shell_out("pkg list -H")
175
- # Output format is
176
- # NAME (PUBLISHER) VERSION IFO
177
- so.stdout.lines.each do |pkg|
178
- tokens = pkg.split
179
- if tokens.length == 3 # No publisher info
180
- name, version, = tokens
181
- else
182
- name, publisher, version, = tokens
183
- publisher = publisher[1..-2]
184
- end
185
- packages[name] = { "version" => version }
186
- packages[name]["publisher"] = publisher if publisher
187
- end
188
- end
189
-
190
- def collect_sysv_packages
191
- so = shell_out("pkginfo -l")
192
- # Each package info is separated by a blank line
193
- chunked_lines = so.stdout.lines.map(&:strip).chunk do |line|
194
- !line.empty? || nil
195
- end
196
- chunked_lines.each do |_, lines| # rubocop: disable Style/HashEachMethods
197
- package = {}
198
- lines.each do |line|
199
- key, value = line.split(":", 2)
200
- package[key.strip.downcase] = value.strip unless value.nil?
201
- end
202
- # pkginst is the installed package name
203
- packages[package["pkginst"]] = package.tap do |p|
204
- p.delete("pkginst")
205
- end
206
- end
207
- end
208
-
209
- collect_data(:solaris2) do
210
- packages Mash.new
211
- collect_ips_packages
212
- collect_sysv_packages
213
- end
214
-
215
- def collect_system_profiler_apps
216
- require "plist"
217
- sp_std = shell_out("system_profiler SPApplicationsDataType -xml")
218
- results = Plist.parse_xml(sp_std.stdout)
219
- sw_array = results[0]["_items"]
220
- sw_array.each do |pkg|
221
- packages[pkg["_name"]] = {
222
- "version" => pkg["version"],
223
- "lastmodified" => pkg["lastModified"],
224
- "source" => pkg["obtained_from"],
225
- }
226
- end
227
- end
228
-
229
- collect_data(:darwin) do
230
- packages Mash.new
231
- collect_system_profiler_apps
232
- end
233
-
234
- end
1
+ # frozen_string_literal: true
2
+ # Author:: "Christian Höltje" <choltje@us.ibm.com>
3
+ # Author:: "Christopher M. Luciano" <cmlucian@us.ibm.com>
4
+ # Author:: Shahul Khajamohideen (<skhajamohid1@bloomberg.net>)
5
+ # Copyright (C) 2015 IBM Corp.
6
+ # Copyright (C) 2015 Bloomberg Finance L.P.
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(:Packages) do
23
+ provides "packages"
24
+ depends "platform_family"
25
+
26
+ WINDOWS_ATTRIBUTE_ALIASES ||= {
27
+ "DisplayVersion" => "version",
28
+ "Publisher" => "publisher",
29
+ "InstallDate" => "installdate",
30
+ }.freeze
31
+
32
+ collect_data(:linux) do
33
+ packages Mash.new
34
+ case platform_family
35
+ when "debian"
36
+ format = '${Package}\t${Version}\t${Architecture}\t${db:Status-Status}\n'
37
+ so = shell_out("dpkg-query -W -f='#{format}'")
38
+ pkgs = so.stdout.lines
39
+
40
+ pkgs.each do |pkg|
41
+ name, version, arch, status = pkg.split
42
+ packages[name] = { "version" => version, "arch" => arch, "status" => status }
43
+ end
44
+
45
+ when "rhel", "fedora", "suse", "pld", "amazon"
46
+ format = '%{NAME}\t%|EPOCH?{%{EPOCH}}:{0}|\t%{VERSION}\t%{RELEASE}\t%{INSTALLTIME}\t%{ARCH}\n'
47
+ so = shell_out("rpm -qa --qf '#{format}'")
48
+ pkgs = so.stdout.lines
49
+
50
+ pkgs.each do |pkg|
51
+ name, epoch, version, release, installdate, arch = pkg.split
52
+ if packages[name]
53
+ # We have more than one package with this exact name!
54
+ # Create an "versions" array for tracking all versions of packages with this name.
55
+ # The top-level package information will be the first one returned by rpm -qa,
56
+ # all versions go in this list, with the same information they'd normally have.
57
+ if packages[name]["versions"].nil?
58
+ # add the data of the first package to the list, so that all versions are in the list.
59
+ packages[name]["versions"] = []
60
+ packages[name]["versions"] << Mash.new({ "epoch" => packages[name]["epoch"],
61
+ "version" => packages[name]["version"],
62
+ "release" => packages[name]["release"],
63
+ "installdate" => packages[name]["installdate"],
64
+ "arch" => packages[name]["arch"] })
65
+ end
66
+ packages[name]["versions"] << Mash.new({ "epoch" => epoch, "version" => version, "release" => release, "installdate" => installdate, "arch" => arch }) # Add this package version to the list
67
+ # When this was originally written, it didn't account for multiple versions of the same package
68
+ # so it just kept clobbering the package data if it encountered multiple versions
69
+ # of the same package. As a result, the last duplicate returned by rpm -qa was what was present;
70
+ # here we clobber that data for compatibility. Note that we can't overwrite the entire hash
71
+ # without losing the versions array.
72
+ packages[name]["epoch"] = epoch
73
+ packages[name]["version"] = version
74
+ packages[name]["release"] = release
75
+ packages[name]["installdate"] = installdate
76
+ packages[name]["arch"] = arch
77
+ else
78
+ packages[name] = { "epoch" => epoch, "version" => version, "release" => release, "installdate" => installdate, "arch" => arch }
79
+ end
80
+ end
81
+
82
+ when "arch"
83
+ require "date" unless defined?(DateTime)
84
+
85
+ # Set LANG=C to force an easy to parse date format
86
+ so = shell_out("LANG=C pacman -Qi")
87
+
88
+ so.stdout.split("\n\n").each do |record|
89
+ pacman_info = {}
90
+ record.lines.each do |line|
91
+ if line =~ /\A(.*?)\s+:\s(.*)\z/m
92
+ key, value = Regexp.last_match[1..2]
93
+ key = key.strip.downcase.gsub(/\s+/, "")
94
+ pacman_info[key] = value.strip
95
+ end
96
+ end
97
+
98
+ name = pacman_info["name"]
99
+ installdate = DateTime.strptime(pacman_info["installdate"], "%Ec").strftime("%s")
100
+ packages[name] = {
101
+ "version" => pacman_info["version"],
102
+ "installdate" => installdate,
103
+ "arch" => pacman_info["architecture"],
104
+ }
105
+ end
106
+ end
107
+ end
108
+
109
+ def collect_programs_from_registry_key(repo, key_path)
110
+ # from http://msdn.microsoft.com/en-us/library/windows/desktop/aa384129(v=vs.85).aspx
111
+ if ::RbConfig::CONFIG["target_cpu"] == "i386"
112
+ reg_type = Win32::Registry::KEY_READ | 0x100
113
+ elsif ::RbConfig::CONFIG["target_cpu"] == "x86_64"
114
+ reg_type = Win32::Registry::KEY_READ | 0x200
115
+ else
116
+ reg_type = Win32::Registry::KEY_READ
117
+ end
118
+ repo.open(key_path, reg_type) do |reg|
119
+ reg.each_key do |key, _wtime|
120
+ pkg = reg.open(key)
121
+ name = pkg["DisplayName"] rescue nil
122
+ next if name.nil?
123
+
124
+ package = packages[name] = Mash.new
125
+ WINDOWS_ATTRIBUTE_ALIASES.each do |registry_attr, package_attr|
126
+ value = pkg[registry_attr] rescue nil
127
+ package[package_attr] = value unless value.nil?
128
+ end
129
+ end
130
+ end
131
+ end
132
+
133
+ collect_data(:windows) do
134
+ require "win32/registry" unless defined?(Win32::Registry)
135
+ packages Mash.new
136
+ collect_programs_from_registry_key(Win32::Registry::HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Uninstall')
137
+ # on 64 bit systems, 32 bit programs are stored here moved before HKEY_CURRENT_USER otherwise it is not collected (impacts both ohai 16 & 17)
138
+ collect_programs_from_registry_key(Win32::Registry::HKEY_LOCAL_MACHINE, 'Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall')
139
+ collect_programs_from_registry_key(Win32::Registry::HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Uninstall') rescue nil
140
+ end
141
+
142
+ collect_data(:aix) do
143
+ packages Mash.new
144
+ so = shell_out("lslpp -L -q -c")
145
+ pkgs = so.stdout.lines
146
+
147
+ # Output format is
148
+ # Package Name:Fileset:Level
149
+ # On aix, filesets are packages and levels are versions
150
+ pkgs.each do |pkg|
151
+ name, fileset, version, _, _, _, pkg_type = pkg.split(":")
152
+ if pkg_type == "R"
153
+ # RPM
154
+ packages[name] = { "version" => version }
155
+ else
156
+ # LPP
157
+ packages[fileset] = { "version" => version }
158
+ end
159
+ end
160
+ end
161
+
162
+ collect_data(:freebsd) do
163
+ packages Mash.new
164
+ so = shell_out('pkg query -a "%n %v"')
165
+ # Output format is
166
+ # name version
167
+ so.stdout.lines do |pkg|
168
+ name, version = pkg.split
169
+ packages[name] = { "version" => version }
170
+ end
171
+ end
172
+
173
+ def collect_ips_packages
174
+ so = shell_out("pkg list -H")
175
+ # Output format is
176
+ # NAME (PUBLISHER) VERSION IFO
177
+ so.stdout.lines.each do |pkg|
178
+ tokens = pkg.split
179
+ if tokens.length == 3 # No publisher info
180
+ name, version, = tokens
181
+ else
182
+ name, publisher, version, = tokens
183
+ publisher = publisher[1..-2]
184
+ end
185
+ packages[name] = { "version" => version }
186
+ packages[name]["publisher"] = publisher if publisher
187
+ end
188
+ end
189
+
190
+ def collect_sysv_packages
191
+ so = shell_out("pkginfo -l")
192
+ # Each package info is separated by a blank line
193
+ chunked_lines = so.stdout.lines.map(&:strip).chunk do |line|
194
+ !line.empty? || nil
195
+ end
196
+ chunked_lines.each do |_, lines| # rubocop: disable Style/HashEachMethods
197
+ package = {}
198
+ lines.each do |line|
199
+ key, value = line.split(":", 2)
200
+ package[key.strip.downcase] = value.strip unless value.nil?
201
+ end
202
+ # pkginst is the installed package name
203
+ packages[package["pkginst"]] = package.tap do |p|
204
+ p.delete("pkginst")
205
+ end
206
+ end
207
+ end
208
+
209
+ collect_data(:solaris2) do
210
+ packages Mash.new
211
+ collect_ips_packages
212
+ collect_sysv_packages
213
+ end
214
+
215
+ def collect_system_profiler_apps
216
+ require "plist"
217
+ sp_std = shell_out("system_profiler SPApplicationsDataType -xml")
218
+ results = Plist.parse_xml(sp_std.stdout)
219
+ sw_array = results[0]["_items"]
220
+ sw_array.each do |pkg|
221
+ packages[pkg["_name"]] = {
222
+ "version" => pkg["version"],
223
+ "lastmodified" => pkg["lastModified"],
224
+ "source" => pkg["obtained_from"],
225
+ }
226
+ end
227
+ end
228
+
229
+ collect_data(:darwin) do
230
+ packages Mash.new
231
+ collect_system_profiler_apps
232
+ end
233
+
234
+ end