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,222 +1,222 @@
1
- # frozen_string_literal: true
2
- #
3
- # Author:: James Gartrell (<jgartrel@gmail.com>)
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(:Network) do
21
- provides "network", "network/interfaces"
22
- provides "counters/network", "counters/network/interfaces"
23
-
24
- def windows_encaps_lookup(encap)
25
- return "Ethernet" if encap.eql?("Ethernet 802.3")
26
-
27
- encap
28
- end
29
-
30
- def mac_addresses(iface)
31
- prop = iface[:configuration][:mac_address] || iface[:instance][:network_addresses]
32
- [prop].flatten.map { |addr| addr.include?(":") ? addr : addr.scan(/.{1,2}/).join(":") }
33
- end
34
-
35
- def network_data
36
- @network_data ||= begin
37
- data = {}
38
- wmi = WmiLite::Wmi.new
39
- data[:addresses] = wmi.instances_of("Win32_NetworkAdapterConfiguration")
40
-
41
- # If we are running on windows nano or another operating system from the future
42
- # that does not populate the deprecated win32_* WMI classes, then we should
43
- # grab data from the newer MSFT_* classes
44
- return msft_adapter_data if data[:addresses].count == 0
45
-
46
- data[:adapters] = wmi.instances_of("Win32_NetworkAdapter")
47
- data
48
- end
49
- end
50
-
51
- def msft_adapter_data
52
- data = {}
53
- wmi = WmiLite::Wmi.new("ROOT/StandardCimv2")
54
- data[:addresses] = wmi.instances_of("MSFT_NetIPAddress")
55
- data[:adapters] = wmi.instances_of("MSFT_NetAdapter")
56
- data
57
- end
58
-
59
- # Returns interface code for an interface
60
- #
61
- # Interface Index (if present, Index otherwise) will be converted in hexadecimal format
62
- #
63
- # @param int_idx [String or nil] the interface index of interface
64
- # @param idx [String] the index of interface
65
- #
66
- # @return [String]
67
- #
68
- # @example Interface Code when interface index is present
69
- # plugin.interface_code("1", "1") #=> "ox1"
70
- # @example Interface Code when interface index is not present
71
- # plugin.interface_code(nil, "2") #=> "ox2"
72
- #
73
- def interface_code(int_idx, idx)
74
- sprintf("0x%x", (int_idx || idx)).downcase
75
- end
76
-
77
- # Returns IPV4 address from list of addresses containing IPV4 and IPV6 formats
78
- #
79
- # @param addresses [Array<String>] List of addresses
80
- #
81
- # @return [String]
82
- #
83
- # @example When list contains both IPV4 and IPV6 formats
84
- # plugin.prefer_ipv4([IPV4, IPV6]) #=> "IPV4"
85
- # @example When list contains only IPV6 format
86
- # plugin.prefer_ipv4([IPV6]) #=> "IPV6"
87
- #
88
- def prefer_ipv4(addresses)
89
- return nil unless addresses.is_a?(Array)
90
-
91
- addresses.find { |ip| IPAddress.valid_ipv4?(ip) } ||
92
- addresses.find { |ip| IPAddress.valid_ipv6?(ip) }
93
- end
94
-
95
- # Selects default interface and returns its information
96
- #
97
- # @note Interface with least metric value should be preferred as default_route
98
- #
99
- # @param configuration [Mash] Configuration of interfaces as iface_config
100
- # [<interface_index> => {<interface_configurations>}]
101
- #
102
- # @return [Hash<:index, :interface_index, :default_ip_gateway, :ip_connection_metric>]
103
- #
104
- def favored_default_route_windows(configuration)
105
- return nil unless configuration.is_a?(Hash)
106
-
107
- config = configuration.dup
108
-
109
- config.inject([]) do |arr, (k, v)|
110
- if v["default_ip_gateway"]
111
- arr << { index: v["index"],
112
- interface_index: v["interface_index"],
113
- default_ip_gateway: prefer_ipv4(v["default_ip_gateway"]),
114
- ip_connection_metric: v["ip_connection_metric"] }
115
- end
116
- arr
117
- end.min_by { |r| r[:ip_connection_metric] }
118
- end
119
-
120
- collect_data(:windows) do
121
- require "ipaddress" unless defined?(IPAddress)
122
- require "wmi-lite/wmi" unless defined?(WmiLite::Wmi)
123
-
124
- iface = Mash.new
125
- iface_config = Mash.new
126
- iface_instance = Mash.new
127
- network Mash.new unless network
128
- network[:interfaces] ||= Mash.new
129
- counters Mash.new unless counters
130
- counters[:network] ||= Mash.new
131
-
132
- network_data[:addresses].each do |adapter|
133
- i = adapter["index"] || adapter["InterfaceIndex"]
134
- iface_config[i] ||= Mash.new
135
- iface_config[i][:ip_address] ||= []
136
- iface_config[i][:ip_address] << adapter["IPAddress"]
137
-
138
- adapter.wmi_ole_object.properties_.each do |p|
139
- if iface_config[i][p.name.wmi_underscore.to_sym].nil?
140
- iface_config[i][p.name.wmi_underscore.to_sym] = adapter[p.name.downcase]
141
- end
142
- end
143
- end
144
-
145
- network_data[:adapters].each do |adapter|
146
- i = adapter["index"] || adapter["InterfaceIndex"]
147
- iface_instance[i] = Mash.new
148
- adapter.wmi_ole_object.properties_.each do |p|
149
- # skip wmi class name fields which make no sense in ohai
150
- next if %w{creation_class_name system_creation_class_name}.include?(p.name.wmi_underscore)
151
-
152
- iface_instance[i][p.name.wmi_underscore.to_sym] = adapter[p.name.downcase]
153
- end
154
- end
155
-
156
- iface_instance.each_key do |i|
157
- if iface_instance[i][:name] && iface_config[i] && iface_config[i][:ip_address][0]
158
- cint = interface_code(iface_instance[i][:interface_index], iface_instance[i][:index])
159
- iface[cint] = Mash.new
160
- iface[cint][:configuration] = iface_config[i]
161
- iface[cint][:instance] = iface_instance[i]
162
-
163
- iface[cint][:counters] = Mash.new
164
- iface[cint][:addresses] = Mash.new
165
- iface[cint][:configuration][:ip_address] = iface[cint][:configuration][:ip_address].flatten
166
-
167
- iface[cint][:configuration][:ip_address].each_index do |ip_index|
168
- ip = iface[cint][:configuration][:ip_address][ip_index]
169
- ip_and_subnet = ip.dup
170
- ip_and_subnet << "/#{iface[cint][:configuration][:ip_subnet][ip_index]}" if iface[cint][:configuration][:ip_subnet]
171
- ip2 = IPAddress(ip_and_subnet)
172
- iface[cint][:addresses][ip] = Mash.new(prefixlen: ip2.prefix)
173
- if ip2.ipv6?
174
- iface[cint][:addresses][ip][:family] = "inet6"
175
- iface[cint][:addresses][ip][:scope] = "Link" if /^fe80/i.match?(ip)
176
- else
177
- if iface[cint][:configuration][:ip_subnet]
178
- iface[cint][:addresses][ip][:netmask] = ip2.netmask.to_s
179
- if iface[cint][:configuration][:ip_use_zero_broadcast]
180
- iface[cint][:addresses][ip][:broadcast] = ip2.network.to_s
181
- else
182
- iface[cint][:addresses][ip][:broadcast] = ip2.broadcast.to_s
183
- end
184
- end
185
- iface[cint][:addresses][ip][:family] = "inet"
186
- end
187
- end
188
- mac_addresses(iface[cint]).each do |mac_addr|
189
- iface[cint][:addresses][mac_addr] = {
190
- "family" => "lladdr",
191
- }
192
- end
193
- iface[cint][:mtu] = iface[cint][:configuration][:mtu] if iface[cint][:configuration].key?(:mtu)
194
- iface[cint][:type] = iface[cint][:instance][:adapter_type] if iface[cint][:instance][:adapter_type]
195
- iface[cint][:arp] = {}
196
- iface[cint][:encapsulation] = windows_encaps_lookup(iface[cint][:instance][:adapter_type]) if iface[cint][:instance][:adapter_type]
197
- end
198
- end
199
-
200
- if (route = favored_default_route_windows(iface_config))
201
- network[:default_gateway] = route[:default_ip_gateway]
202
- network[:default_interface] = interface_code(route[:interface_index], route[:index])
203
- end
204
-
205
- cint = nil
206
- so = shell_out("arp -a")
207
- if so.exitstatus == 0
208
- so.stdout.lines do |line|
209
- if line =~ /^Interface:\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+-+\s+(0x\S+)/
210
- cint = $2.downcase
211
- end
212
- next unless iface[cint]
213
-
214
- if line =~ /^\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+([a-fA-F0-9\:-]+)/
215
- iface[cint][:arp][$1] = $2.tr("-", ":").downcase
216
- end
217
- end
218
- end
219
-
220
- network["interfaces"] = iface
221
- end
222
- end
1
+ # frozen_string_literal: true
2
+ #
3
+ # Author:: James Gartrell (<jgartrel@gmail.com>)
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(:Network) do
21
+ provides "network", "network/interfaces"
22
+ provides "counters/network", "counters/network/interfaces"
23
+
24
+ def windows_encaps_lookup(encap)
25
+ return "Ethernet" if encap.eql?("Ethernet 802.3")
26
+
27
+ encap
28
+ end
29
+
30
+ def mac_addresses(iface)
31
+ prop = iface[:configuration][:mac_address] || iface[:instance][:network_addresses]
32
+ [prop].flatten.map { |addr| addr.include?(":") ? addr : addr.scan(/.{1,2}/).join(":") }
33
+ end
34
+
35
+ def network_data
36
+ @network_data ||= begin
37
+ data = {}
38
+ wmi = WmiLite::Wmi.new
39
+ data[:addresses] = wmi.instances_of("Win32_NetworkAdapterConfiguration")
40
+
41
+ # If we are running on windows nano or another operating system from the future
42
+ # that does not populate the deprecated win32_* WMI classes, then we should
43
+ # grab data from the newer MSFT_* classes
44
+ return msft_adapter_data if data[:addresses].count == 0
45
+
46
+ data[:adapters] = wmi.instances_of("Win32_NetworkAdapter")
47
+ data
48
+ end
49
+ end
50
+
51
+ def msft_adapter_data
52
+ data = {}
53
+ wmi = WmiLite::Wmi.new("ROOT/StandardCimv2")
54
+ data[:addresses] = wmi.instances_of("MSFT_NetIPAddress")
55
+ data[:adapters] = wmi.instances_of("MSFT_NetAdapter")
56
+ data
57
+ end
58
+
59
+ # Returns interface code for an interface
60
+ #
61
+ # Interface Index (if present, Index otherwise) will be converted in hexadecimal format
62
+ #
63
+ # @param int_idx [String or nil] the interface index of interface
64
+ # @param idx [String] the index of interface
65
+ #
66
+ # @return [String]
67
+ #
68
+ # @example Interface Code when interface index is present
69
+ # plugin.interface_code("1", "1") #=> "ox1"
70
+ # @example Interface Code when interface index is not present
71
+ # plugin.interface_code(nil, "2") #=> "ox2"
72
+ #
73
+ def interface_code(int_idx, idx)
74
+ sprintf("0x%x", (int_idx || idx)).downcase
75
+ end
76
+
77
+ # Returns IPV4 address from list of addresses containing IPV4 and IPV6 formats
78
+ #
79
+ # @param addresses [Array<String>] List of addresses
80
+ #
81
+ # @return [String]
82
+ #
83
+ # @example When list contains both IPV4 and IPV6 formats
84
+ # plugin.prefer_ipv4([IPV4, IPV6]) #=> "IPV4"
85
+ # @example When list contains only IPV6 format
86
+ # plugin.prefer_ipv4([IPV6]) #=> "IPV6"
87
+ #
88
+ def prefer_ipv4(addresses)
89
+ return nil unless addresses.is_a?(Array)
90
+
91
+ addresses.find { |ip| IPAddress.valid_ipv4?(ip) } ||
92
+ addresses.find { |ip| IPAddress.valid_ipv6?(ip) }
93
+ end
94
+
95
+ # Selects default interface and returns its information
96
+ #
97
+ # @note Interface with least metric value should be preferred as default_route
98
+ #
99
+ # @param configuration [Mash] Configuration of interfaces as iface_config
100
+ # [<interface_index> => {<interface_configurations>}]
101
+ #
102
+ # @return [Hash<:index, :interface_index, :default_ip_gateway, :ip_connection_metric>]
103
+ #
104
+ def favored_default_route_windows(configuration)
105
+ return nil unless configuration.is_a?(Hash)
106
+
107
+ config = configuration.dup
108
+
109
+ config.inject([]) do |arr, (k, v)|
110
+ if v["default_ip_gateway"]
111
+ arr << { index: v["index"],
112
+ interface_index: v["interface_index"],
113
+ default_ip_gateway: prefer_ipv4(v["default_ip_gateway"]),
114
+ ip_connection_metric: v["ip_connection_metric"] }
115
+ end
116
+ arr
117
+ end.min_by { |r| r[:ip_connection_metric] }
118
+ end
119
+
120
+ collect_data(:windows) do
121
+ require "ipaddress" unless defined?(IPAddress)
122
+ require "wmi-lite/wmi" unless defined?(WmiLite::Wmi)
123
+
124
+ iface = Mash.new
125
+ iface_config = Mash.new
126
+ iface_instance = Mash.new
127
+ network Mash.new unless network
128
+ network[:interfaces] ||= Mash.new
129
+ counters Mash.new unless counters
130
+ counters[:network] ||= Mash.new
131
+
132
+ network_data[:addresses].each do |adapter|
133
+ i = adapter["index"] || adapter["InterfaceIndex"]
134
+ iface_config[i] ||= Mash.new
135
+ iface_config[i][:ip_address] ||= []
136
+ iface_config[i][:ip_address] << adapter["IPAddress"]
137
+
138
+ adapter.wmi_ole_object.properties_.each do |p|
139
+ if iface_config[i][p.name.wmi_underscore.to_sym].nil?
140
+ iface_config[i][p.name.wmi_underscore.to_sym] = adapter[p.name.downcase]
141
+ end
142
+ end
143
+ end
144
+
145
+ network_data[:adapters].each do |adapter|
146
+ i = adapter["index"] || adapter["InterfaceIndex"]
147
+ iface_instance[i] = Mash.new
148
+ adapter.wmi_ole_object.properties_.each do |p|
149
+ # skip wmi class name fields which make no sense in ohai
150
+ next if %w{creation_class_name system_creation_class_name}.include?(p.name.wmi_underscore)
151
+
152
+ iface_instance[i][p.name.wmi_underscore.to_sym] = adapter[p.name.downcase]
153
+ end
154
+ end
155
+
156
+ iface_instance.each_key do |i|
157
+ if iface_instance[i][:name] && iface_config[i] && iface_config[i][:ip_address][0]
158
+ cint = interface_code(iface_instance[i][:interface_index], iface_instance[i][:index])
159
+ iface[cint] = Mash.new
160
+ iface[cint][:configuration] = iface_config[i]
161
+ iface[cint][:instance] = iface_instance[i]
162
+
163
+ iface[cint][:counters] = Mash.new
164
+ iface[cint][:addresses] = Mash.new
165
+ iface[cint][:configuration][:ip_address] = iface[cint][:configuration][:ip_address].flatten
166
+
167
+ iface[cint][:configuration][:ip_address].each_index do |ip_index|
168
+ ip = iface[cint][:configuration][:ip_address][ip_index]
169
+ ip_and_subnet = ip.dup
170
+ ip_and_subnet << "/#{iface[cint][:configuration][:ip_subnet][ip_index]}" if iface[cint][:configuration][:ip_subnet]
171
+ ip2 = IPAddress(ip_and_subnet)
172
+ iface[cint][:addresses][ip] = Mash.new(prefixlen: ip2.prefix)
173
+ if ip2.ipv6?
174
+ iface[cint][:addresses][ip][:family] = "inet6"
175
+ iface[cint][:addresses][ip][:scope] = "Link" if /^fe80/i.match?(ip)
176
+ else
177
+ if iface[cint][:configuration][:ip_subnet]
178
+ iface[cint][:addresses][ip][:netmask] = ip2.netmask.to_s
179
+ if iface[cint][:configuration][:ip_use_zero_broadcast]
180
+ iface[cint][:addresses][ip][:broadcast] = ip2.network.to_s
181
+ else
182
+ iface[cint][:addresses][ip][:broadcast] = ip2.broadcast.to_s
183
+ end
184
+ end
185
+ iface[cint][:addresses][ip][:family] = "inet"
186
+ end
187
+ end
188
+ mac_addresses(iface[cint]).each do |mac_addr|
189
+ iface[cint][:addresses][mac_addr] = {
190
+ "family" => "lladdr",
191
+ }
192
+ end
193
+ iface[cint][:mtu] = iface[cint][:configuration][:mtu] if iface[cint][:configuration].key?(:mtu)
194
+ iface[cint][:type] = iface[cint][:instance][:adapter_type] if iface[cint][:instance][:adapter_type]
195
+ iface[cint][:arp] = {}
196
+ iface[cint][:encapsulation] = windows_encaps_lookup(iface[cint][:instance][:adapter_type]) if iface[cint][:instance][:adapter_type]
197
+ end
198
+ end
199
+
200
+ if (route = favored_default_route_windows(iface_config))
201
+ network[:default_gateway] = route[:default_ip_gateway]
202
+ network[:default_interface] = interface_code(route[:interface_index], route[:index])
203
+ end
204
+
205
+ cint = nil
206
+ so = shell_out("arp -a")
207
+ if so.exitstatus == 0
208
+ so.stdout.lines do |line|
209
+ if line =~ /^Interface:\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+-+\s+(0x\S+)/
210
+ cint = $2.downcase
211
+ end
212
+ next unless iface[cint]
213
+
214
+ if line =~ /^\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+([a-fA-F0-9\:-]+)/
215
+ iface[cint][:arp][$1] = $2.tr("-", ":").downcase
216
+ end
217
+ end
218
+ end
219
+
220
+ network["interfaces"] = iface
221
+ end
222
+ end
@@ -1,34 +1,34 @@
1
- # frozen_string_literal: true
2
- #
3
- # Author:: James Gartrell (<jgartrel@gmail.com>)
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
- # After long discussion in IRC the "powers that be" have come to a consensus
21
- # that there is no other Windows platforms exist that were not based on the
22
- # Windows_NT kernel, so we herby decree that "windows" will refer to all
23
- # platforms built upon the Windows_NT kernel and have access to win32 or win64
24
- # subsystems.
25
-
26
- Ohai.plugin(:Platform) do
27
- provides "platform", "platform_version", "platform_family"
28
-
29
- collect_data(:windows) do
30
- platform os
31
- platform_version kernel["release"]
32
- platform_family "windows"
33
- end
34
- end
1
+ # frozen_string_literal: true
2
+ #
3
+ # Author:: James Gartrell (<jgartrel@gmail.com>)
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
+ # After long discussion in IRC the "powers that be" have come to a consensus
21
+ # that there is no other Windows platforms exist that were not based on the
22
+ # Windows_NT kernel, so we herby decree that "windows" will refer to all
23
+ # platforms built upon the Windows_NT kernel and have access to win32 or win64
24
+ # subsystems.
25
+
26
+ Ohai.plugin(:Platform) do
27
+ provides "platform", "platform_version", "platform_family"
28
+
29
+ collect_data(:windows) do
30
+ platform os
31
+ platform_version kernel["release"]
32
+ platform_family "windows"
33
+ end
34
+ end
@@ -1,29 +1,29 @@
1
- # frozen_string_literal: true
2
- #
3
- # Author:: Stuart Preston (<stuart@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 :SystemEnclosure do
21
- provides "system_enclosure"
22
- depends "dmi"
23
-
24
- collect_data(:windows) do
25
- system_enclosure Mash.new
26
- system_enclosure[:manufacturer] = get_attribute(:dmi, :chassis, :manufacturer)
27
- system_enclosure[:serialnumber] = get_attribute(:dmi, :chassis, :serial_number)
28
- end
29
- end
1
+ # frozen_string_literal: true
2
+ #
3
+ # Author:: Stuart Preston (<stuart@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 :SystemEnclosure do
21
+ provides "system_enclosure"
22
+ depends "dmi"
23
+
24
+ collect_data(:windows) do
25
+ system_enclosure Mash.new
26
+ system_enclosure[:manufacturer] = get_attribute(:dmi, :chassis, :manufacturer)
27
+ system_enclosure[:serialnumber] = get_attribute(:dmi, :chassis, :serial_number)
28
+ end
29
+ end
@@ -1,45 +1,45 @@
1
- # frozen_string_literal: true
2
- #
3
- # Author:: Pavel Yudin (<pyudin@parallels.com>)
4
- # Author:: Tim Smith (<tsmith@chef.io>)
5
- # Copyright:: Copyright (c) 2015 Pavel Yudin
6
- # Copyright:: Copyright (c) Chef Software Inc.
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(:Virtualization) do
23
- provides "virtualization"
24
- require_relative "../../mixin/dmi_decode"
25
- include Ohai::Mixin::DmiDecode
26
-
27
- collect_data(:windows) do
28
- require "wmi-lite/wmi" unless defined?(WmiLite::Wmi)
29
-
30
- virtualization Mash.new unless virtualization
31
- virtualization[:systems] ||= Mash.new
32
-
33
- # Grab system DMI data from WMI to determine vendor information
34
- wmi = WmiLite::Wmi.new
35
- dmi = wmi.first_of("Win32_ComputerSystemProduct")
36
-
37
- guest = guest_from_dmi_data(dmi["vendor"], dmi["name"], dmi["version"])
38
- if guest
39
- logger.trace("Plugin Virtualization: DMI data in Win32_ComputerSystemProduct indicates #{guest} guest")
40
- virtualization[:system] = guest
41
- virtualization[:role] = "guest"
42
- virtualization[:systems][guest.to_sym] = "guest"
43
- end
44
- end
45
- end
1
+ # frozen_string_literal: true
2
+ #
3
+ # Author:: Pavel Yudin (<pyudin@parallels.com>)
4
+ # Author:: Tim Smith (<tsmith@chef.io>)
5
+ # Copyright:: Copyright (c) 2015 Pavel Yudin
6
+ # Copyright:: Copyright (c) Chef Software Inc.
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(:Virtualization) do
23
+ provides "virtualization"
24
+ require_relative "../../mixin/dmi_decode"
25
+ include Ohai::Mixin::DmiDecode
26
+
27
+ collect_data(:windows) do
28
+ require "wmi-lite/wmi" unless defined?(WmiLite::Wmi)
29
+
30
+ virtualization Mash.new unless virtualization
31
+ virtualization[:systems] ||= Mash.new
32
+
33
+ # Grab system DMI data from WMI to determine vendor information
34
+ wmi = WmiLite::Wmi.new
35
+ dmi = wmi.first_of("Win32_ComputerSystemProduct")
36
+
37
+ guest = guest_from_dmi_data(dmi["vendor"], dmi["name"], dmi["version"])
38
+ if guest
39
+ logger.trace("Plugin Virtualization: DMI data in Win32_ComputerSystemProduct indicates #{guest} guest")
40
+ virtualization[:system] = guest
41
+ virtualization[:role] = "guest"
42
+ virtualization[:systems][guest.to_sym] = "guest"
43
+ end
44
+ end
45
+ end