kanrisuru 0.4.1 → 0.5.0
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +13 -0
- data/lib/kanrisuru/core.rb +6 -0
- data/lib/kanrisuru/core/apt.rb +6 -6
- data/lib/kanrisuru/core/dmi.rb +533 -0
- data/lib/kanrisuru/core/socket.rb +4 -4
- data/lib/kanrisuru/core/system.rb +9 -17
- data/lib/kanrisuru/core/yum.rb +8 -8
- data/lib/kanrisuru/core/zypper.rb +1094 -0
- data/lib/kanrisuru/remote/fstab.rb +3 -3
- data/lib/kanrisuru/util.rb +1 -0
- data/lib/kanrisuru/util/bits.rb +3 -3
- data/lib/kanrisuru/util/dmi_type.rb +1366 -0
- data/lib/kanrisuru/version.rb +1 -1
- data/spec/functional/core/apt_spec.rb +97 -158
- data/spec/functional/core/dmi_spec.rb +37 -0
- data/spec/functional/core/file_spec.rb +5 -12
- data/spec/functional/core/system_spec.rb +1 -1
- data/spec/functional/core/yum_spec.rb +38 -80
- data/spec/functional/core/zypper_spec.rb +193 -0
- data/spec/functional/remote/fstab_spec.rb +1 -1
- data/spec/helper/test_hosts.rb +7 -1
- data/spec/unit/core/dmi_spec.rb +271 -0
- data/spec/unit/core/zypper_spec.rb +121 -0
- data/spec/unit/util_spec.rb +224 -0
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e7d36fe867d1049287c11431cb348332d61b0a80e16163fa6a799fcc0fc26bb
|
4
|
+
data.tar.gz: 0fef10f6eb28e176839f8b3a2995416fdb4c88fbfa8b4e24e2c36d719871237e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a96f6c7a0219c0ced7c87faa5923e2c8842dadd429787033885e89444af63943f41f7da88622224573d34940c8b5b3eb44c7fa324d20e146f9bae3e172c8b9b0
|
7
|
+
data.tar.gz: c9cd28b4caf3daba48127d522a0f3f08ac925ee40c058320267cced2b0461b223378d314d48d248e2c614dca82533e12adba761c76e96b6bce976a3021700a5f
|
data/.rubocop.yml
CHANGED
@@ -7,6 +7,19 @@ AllCops:
|
|
7
7
|
Style/Documentation:
|
8
8
|
Enabled: false
|
9
9
|
|
10
|
+
Style/WordArray:
|
11
|
+
Exclude:
|
12
|
+
- lib/kanrisuru/util/dmi_type.rb
|
13
|
+
|
14
|
+
Lint/SymbolConversion:
|
15
|
+
Exclude:
|
16
|
+
- lib/kanrisuru/util/dmi_type.rb
|
17
|
+
|
18
|
+
Naming/InclusiveLanguage:
|
19
|
+
Exclude:
|
20
|
+
- lib/kanrisuru/core/dmi.rb
|
21
|
+
- spec/unit/core/dmi_spec.rb
|
22
|
+
|
10
23
|
Metrics/AbcSize:
|
11
24
|
Enabled: false
|
12
25
|
|
data/lib/kanrisuru/core.rb
CHANGED
@@ -16,6 +16,8 @@ require_relative 'core/ip'
|
|
16
16
|
require_relative 'core/socket'
|
17
17
|
require_relative 'core/apt'
|
18
18
|
require_relative 'core/yum'
|
19
|
+
require_relative 'core/zypper'
|
20
|
+
require_relative 'core/dmi'
|
19
21
|
|
20
22
|
module Kanrisuru
|
21
23
|
module Remote
|
@@ -36,6 +38,8 @@ module Kanrisuru
|
|
36
38
|
os_include Kanrisuru::Core::Socket
|
37
39
|
os_include Kanrisuru::Core::Apt
|
38
40
|
os_include Kanrisuru::Core::Yum
|
41
|
+
os_include Kanrisuru::Core::Zypper
|
42
|
+
os_include Kanrisuru::Core::Dmi
|
39
43
|
end
|
40
44
|
|
41
45
|
class Cluster
|
@@ -54,6 +58,8 @@ module Kanrisuru
|
|
54
58
|
os_collection Kanrisuru::Core::Socket
|
55
59
|
os_collection Kanrisuru::Core::Apt
|
56
60
|
os_collection Kanrisuru::Core::Yum
|
61
|
+
os_collection Kanrisuru::Core::Zypper
|
62
|
+
os_collection Kanrisuru::Core::Dmi
|
57
63
|
end
|
58
64
|
end
|
59
65
|
end
|
data/lib/kanrisuru/core/apt.rb
CHANGED
@@ -7,9 +7,9 @@ module Kanrisuru
|
|
7
7
|
|
8
8
|
os_define :debian, :apt
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
Source = Struct.new(:url, :dist, :architecture)
|
11
|
+
PackageOverview = Struct.new(:package, :version, :suites, :architecture, :installed, :upgradeable, :automatic)
|
12
|
+
PackageDetail = Struct.new(
|
13
13
|
:package,
|
14
14
|
:version,
|
15
15
|
:priority,
|
@@ -224,7 +224,7 @@ module Kanrisuru
|
|
224
224
|
rows << current_row
|
225
225
|
end
|
226
226
|
|
227
|
-
current_row =
|
227
|
+
current_row = PackageDetail.new
|
228
228
|
current_row.package = extract_single_line(line)
|
229
229
|
when /^Version:/
|
230
230
|
current_row.version = extract_single_line(line)
|
@@ -293,7 +293,7 @@ module Kanrisuru
|
|
293
293
|
|
294
294
|
def parse_apt_sources(string)
|
295
295
|
url, dist, architecture, = string.split
|
296
|
-
|
296
|
+
Source.new(url, dist, architecture)
|
297
297
|
end
|
298
298
|
|
299
299
|
def parse_apt_line(line)
|
@@ -317,7 +317,7 @@ module Kanrisuru
|
|
317
317
|
automatic = values[3].include?('automatic')
|
318
318
|
end
|
319
319
|
|
320
|
-
|
320
|
+
PackageOverview.new(package, version, suites, architecture, installed, upgradeable, automatic)
|
321
321
|
end
|
322
322
|
end
|
323
323
|
end
|
@@ -0,0 +1,533 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kanrisuru
|
4
|
+
module Core
|
5
|
+
module Dmi
|
6
|
+
extend OsPackage::Define
|
7
|
+
|
8
|
+
os_define :linux, :dmi
|
9
|
+
|
10
|
+
## Type 0: BIOS Information
|
11
|
+
BIOS = Struct.new(
|
12
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
13
|
+
:vendor, :version, :release_date, :address, :runtime_size,
|
14
|
+
:rom_size, :characteristics, :bios_revision, :firmware_revision
|
15
|
+
)
|
16
|
+
|
17
|
+
## Type 1: Sytem Information
|
18
|
+
System = Struct.new(
|
19
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
20
|
+
:manufacturer, :product_name, :version, :serial_number,
|
21
|
+
:uuid, :wake_up_type, :sku_number, :family
|
22
|
+
)
|
23
|
+
|
24
|
+
## Type 2: Baseboard Information
|
25
|
+
Baseboard = Struct.new(
|
26
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
27
|
+
:type, :manufacturer, :product_name, :version, :serial_number, :asset_tag,
|
28
|
+
:features, :location_in_chassis, :chassis_handle, :contained_object_handles
|
29
|
+
)
|
30
|
+
|
31
|
+
## Type 3: Chassis Information
|
32
|
+
Chassis = Struct.new(
|
33
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
34
|
+
:manufacturer, :type, :lock, :version, :serial_number,
|
35
|
+
:asset_tag, :boot_up_state, :power_supply_state, :thermal_state,
|
36
|
+
:security_status, :oem_information, :height, :number_of_power_cords,
|
37
|
+
:contained_elements, :sku_number
|
38
|
+
)
|
39
|
+
|
40
|
+
## Type 4: Processor Information
|
41
|
+
Processor = Struct.new(
|
42
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
43
|
+
:socket_designation, :type, :family, :manufacturer, :id, :signature, :flags,
|
44
|
+
:version, :voltage, :external_clock, :max_speed, :current_speed,
|
45
|
+
:status, :upgrade, :l1_cache_handle, :l2_cache_handle, :l3_cache_handle,
|
46
|
+
:serial_number, :asset_tag, :part_number, :core_count, :core_enabled, :thread_count,
|
47
|
+
:characteristics
|
48
|
+
)
|
49
|
+
|
50
|
+
## Type 5: Memory Controller Information
|
51
|
+
MemoryController = Struct.new(
|
52
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
53
|
+
:error_detecting_method, :error_correcting_capabilities, :supported_interleave,
|
54
|
+
:current_interleave, :maximum_memory_module_size, :maximum_total_memory_size,
|
55
|
+
:supported_seeds, :supported_memory_types, :memory_module_voltage, :associated_memory_slots,
|
56
|
+
:enabled_error_correcting_capabilities
|
57
|
+
)
|
58
|
+
|
59
|
+
## Type 6: Memory Module Information
|
60
|
+
MemoryModule = Struct.new(
|
61
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
62
|
+
:socket_designation, :bank_connections, :current_speed, :type, :installed_size, :enabled_size,
|
63
|
+
:error_status
|
64
|
+
)
|
65
|
+
|
66
|
+
## Type 7: Cache Information
|
67
|
+
Cache = Struct.new(
|
68
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
69
|
+
:socket_designation, :configuration, :operational_mode, :location,
|
70
|
+
:installed_size, :maximum_size, :supported_sram_types, :installed_sram_type,
|
71
|
+
:speed, :error_correction_type, :system_type, :associativity
|
72
|
+
)
|
73
|
+
|
74
|
+
## Type 8: Port Connector Information
|
75
|
+
PortConnector = Struct.new(
|
76
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
77
|
+
:internal_reference_designator,
|
78
|
+
:internal_connector_type,
|
79
|
+
:external_reference_designator,
|
80
|
+
:external_connector_type,
|
81
|
+
:port_type
|
82
|
+
)
|
83
|
+
|
84
|
+
## Type 9: Sytem Slots
|
85
|
+
SystemSlots = Struct.new(
|
86
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
87
|
+
:designation, :type, :current_usage, :slot_length,
|
88
|
+
:id, :characteristics, :bus_address,
|
89
|
+
:data_bus_width, :peer_devices
|
90
|
+
)
|
91
|
+
|
92
|
+
## Type 10: On Board Device Information
|
93
|
+
OnBoardDevice = Struct.new(
|
94
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
95
|
+
:type, :status, :description
|
96
|
+
)
|
97
|
+
|
98
|
+
## Type 11: OEM Strings
|
99
|
+
OEMStrings = Struct.new(
|
100
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
101
|
+
:strings
|
102
|
+
)
|
103
|
+
|
104
|
+
## Type 12: System Configuration Options
|
105
|
+
SystemConfigurationOptions = Struct.new(
|
106
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
107
|
+
:options
|
108
|
+
)
|
109
|
+
|
110
|
+
## Type 13: BIOS Language Information
|
111
|
+
BIOSLanguage = Struct.new(
|
112
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
113
|
+
:language_description_format, :installed_languages, :currently_installed_language
|
114
|
+
)
|
115
|
+
|
116
|
+
## Type 14: Group Associations
|
117
|
+
GroupAssociation = Struct.new(
|
118
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
119
|
+
:name, :items
|
120
|
+
)
|
121
|
+
|
122
|
+
## Type 15: System Event Log
|
123
|
+
SystemEventLog = Struct.new(
|
124
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
125
|
+
:area_length, :header_start_offset, :header_length, :data_start_offset,
|
126
|
+
:access_method, :change_token, :header_format, :supported_log_type_descriptors,
|
127
|
+
:descriptors
|
128
|
+
)
|
129
|
+
|
130
|
+
## Type 16: Physical Memory Array
|
131
|
+
PhysicalMemoryArray = Struct.new(
|
132
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
133
|
+
:location, :use, :error_correction_type, :maximum_capacity,
|
134
|
+
:error_information_handle, :number_of_devices
|
135
|
+
)
|
136
|
+
|
137
|
+
## Type 17: Memory Device
|
138
|
+
MemoryDevice = Struct.new(
|
139
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
140
|
+
:array_handle, :error_information_handle, :total_width,
|
141
|
+
:data_width, :mem_size, :form_factor, :set, :locator,
|
142
|
+
:bank_locator, :type, :type_detail, :speed,
|
143
|
+
:manufacturer, :serial_number, :asset_tag,
|
144
|
+
:part_number, :rank, :configured_clock_speed,
|
145
|
+
:minimum_voltage, :maximum_voltage,
|
146
|
+
:configured_voltage, :configured_memory_speed,
|
147
|
+
:firmware_version, :model_manufacturer_id, :module_product_id,
|
148
|
+
:memory_subsystem_controller_manufacturer_id,
|
149
|
+
:memory_subsystem_controller_product_id,
|
150
|
+
:non_volatile_size, :cache_size, :logical_size
|
151
|
+
)
|
152
|
+
|
153
|
+
## Type 18: 32-bit Memory Error Information
|
154
|
+
MemoryError32Bit = Struct.new(
|
155
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
156
|
+
:type, :granularity, :operation, :vendor_syndrome, :memory_array_address,
|
157
|
+
:device_address, :resolution
|
158
|
+
)
|
159
|
+
|
160
|
+
## Type 19: Memory Array Mapped Address
|
161
|
+
MemoryArrayMappedAddress = Struct.new(
|
162
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
163
|
+
:starting_address, :ending_address, :range_size,
|
164
|
+
:physical_array_handle, :partition_width
|
165
|
+
)
|
166
|
+
|
167
|
+
## Type 20: Memory Device Mapped Address
|
168
|
+
MemoryDeviceMappedAddress = Struct.new(
|
169
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
170
|
+
:starting_address, :ending_address, :range_size,
|
171
|
+
:physical_device_handle, :memory_array_mapped_address_handle,
|
172
|
+
:partition_row_position, :interleave_position,
|
173
|
+
:interleaved_data_depth
|
174
|
+
)
|
175
|
+
|
176
|
+
## Type 21: Built-In Pointing Device
|
177
|
+
BuiltInPointingDevice = Struct.new(
|
178
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
179
|
+
:type, :inteface, :buttons
|
180
|
+
)
|
181
|
+
|
182
|
+
## Type 22: Portable Battery
|
183
|
+
PortableBattery = Struct.new(
|
184
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
185
|
+
:location, :manufacturer, :manufacture_date,
|
186
|
+
:serial_number, :name, :chemistry,
|
187
|
+
:design_capacity, :design_voltage, :maximum_error,
|
188
|
+
:sbds_version, :sbds_serial_number, :sbds_manufacturer_date,
|
189
|
+
:sbds_chemistry, :oem_specific_information
|
190
|
+
)
|
191
|
+
|
192
|
+
## Type 23: System Reset
|
193
|
+
SystemReset = Struct.new(
|
194
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
195
|
+
:status, :watchdog_timer, :boot_option,
|
196
|
+
:boot_option_on_limit, :timer_interval,
|
197
|
+
:reset_count, :reset_limit, :timeout
|
198
|
+
)
|
199
|
+
|
200
|
+
## Type 24: Hardware Security
|
201
|
+
HardwareSecurity = Struct.new(
|
202
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
203
|
+
:power_on_password_status, :keyboard_password_status,
|
204
|
+
:administrator_password_status, :front_panel_reset_status
|
205
|
+
)
|
206
|
+
|
207
|
+
## Type 25: System Power Controls
|
208
|
+
SystemPowerControls = Struct.new(
|
209
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
210
|
+
:next_scheduled_power_on
|
211
|
+
)
|
212
|
+
|
213
|
+
## Type 26: Voltage Probe
|
214
|
+
VoltageProbe = Struct.new(
|
215
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
216
|
+
:description, :location, :status, :maximum_value,
|
217
|
+
:minimum_value, :resolution, :tolerance, :accuracy,
|
218
|
+
:oem_specific_information, :nominal_value
|
219
|
+
)
|
220
|
+
|
221
|
+
## Type 27: Cooling Device
|
222
|
+
CoolingDevice = Struct.new(
|
223
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
224
|
+
:temperature_probe_handle, :type,
|
225
|
+
:status, :cooling_unit_group, :oem_specific_information,
|
226
|
+
:nominal_speed, :description
|
227
|
+
)
|
228
|
+
|
229
|
+
## Type 28: Temperature Probe
|
230
|
+
TemperatureProbe = Struct.new(
|
231
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
232
|
+
:description, :location, :status,
|
233
|
+
:maximum_value, :minimum_value, :resolution,
|
234
|
+
:tolerance, :accuracy, :oem_specific_information,
|
235
|
+
:nominal_value
|
236
|
+
)
|
237
|
+
|
238
|
+
## Type 29: Electrical Current Probe
|
239
|
+
ElectricalCurrentProbe = Struct.new(
|
240
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
241
|
+
:description, :location, :status,
|
242
|
+
:maximum_value, :minimum_value, :resolution,
|
243
|
+
:tolerance, :accuracy, :oem_specific_information,
|
244
|
+
:nominal_value
|
245
|
+
)
|
246
|
+
|
247
|
+
## Type 30: Out-of-band Remote Access
|
248
|
+
OutOfBandRemoteAccess = Struct.new(
|
249
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
250
|
+
:manufacturer_name, :inbound_connection,
|
251
|
+
:outbound_connection
|
252
|
+
)
|
253
|
+
|
254
|
+
## Type 31: Boot Integrity Services Entry Point
|
255
|
+
BootIntegrityServices = Struct.new(
|
256
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
257
|
+
:checksum,
|
258
|
+
:sixteen_bit_entry_point_address,
|
259
|
+
:thirty_two_bit_entry_point_address
|
260
|
+
)
|
261
|
+
|
262
|
+
## Type 32: System Boot
|
263
|
+
SystemBoot = Struct.new(
|
264
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
265
|
+
:status
|
266
|
+
)
|
267
|
+
|
268
|
+
## Type 33: 64-bit Memory Error
|
269
|
+
MemoryError64Bit = Struct.new(
|
270
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
271
|
+
:type, :granularity, :operation, :vendor_syndrome, :memory_array_address,
|
272
|
+
:device_address, :resolution
|
273
|
+
)
|
274
|
+
|
275
|
+
## Type 34: Management Device
|
276
|
+
ManagementDevice = Struct.new(
|
277
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
278
|
+
:description, :type, :address, :address_type
|
279
|
+
)
|
280
|
+
|
281
|
+
## Type 35: Management Device Component
|
282
|
+
ManagementDeviceComponent = Struct.new(
|
283
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
284
|
+
:description, :management_device_handle, :component_handle,
|
285
|
+
:threshold_handle
|
286
|
+
)
|
287
|
+
|
288
|
+
## Type 36: Management Device Threshold Data
|
289
|
+
ManagementDeviceThresholdData = Struct.new(
|
290
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
291
|
+
:lower_non_critical_threshold,
|
292
|
+
:upper_non_critical_threshold,
|
293
|
+
:lower_critical_threshold,
|
294
|
+
:upper_critical_threshold,
|
295
|
+
:lower_non_recoverable_threshold,
|
296
|
+
:upper_non_recoverable_threshold
|
297
|
+
)
|
298
|
+
|
299
|
+
## Type 37: Memory Channel
|
300
|
+
MemoryChannelDevice = Struct.new(
|
301
|
+
:load,
|
302
|
+
:handle
|
303
|
+
)
|
304
|
+
|
305
|
+
MemoryChannel = Struct.new(
|
306
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
307
|
+
:type, :maximal_load, :devices
|
308
|
+
)
|
309
|
+
|
310
|
+
## Type 38: IPMI Device Information
|
311
|
+
IPMIDevice = Struct.new(
|
312
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
313
|
+
:interface_type, :specification_version, :i2c_slave_address,
|
314
|
+
:nv_storage_device_address, :nv_storage_device, :base_address, :register_spacing,
|
315
|
+
:interrupt_polarity, :interrupt_trigger_mode, :interrupt_number
|
316
|
+
)
|
317
|
+
|
318
|
+
## Type 39: System Power Supply
|
319
|
+
SystemPowerSupply = Struct.new(
|
320
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
321
|
+
:power_unit_group, :location, :name,
|
322
|
+
:manufacturer, :serial_number, :asset_tag, :model_part_number,
|
323
|
+
:revision, :max_power_capacity, :status,
|
324
|
+
:type, :input_voltage_range_switching,
|
325
|
+
:plugged, :hot_replaceable,
|
326
|
+
:input_voltage_probe_handle,
|
327
|
+
:cooling_device_handle,
|
328
|
+
:input_current_probe_handle
|
329
|
+
)
|
330
|
+
|
331
|
+
## Type 40: Additional Information
|
332
|
+
AdditionalInformation = Struct.new(
|
333
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
334
|
+
:referenced_handle, :referenced_offset,
|
335
|
+
:string, :value
|
336
|
+
)
|
337
|
+
|
338
|
+
## Type 41: On Board Devices Extended Information
|
339
|
+
OnboardDevicesExtendedInformation = Struct.new(
|
340
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
341
|
+
:reference_designation, :type, :status,
|
342
|
+
:type_instance, :bus_address
|
343
|
+
)
|
344
|
+
|
345
|
+
## Type 42: Management Controller Host Interface
|
346
|
+
ProtocolRecord = Struct.new(
|
347
|
+
:protocol_id,
|
348
|
+
:protocol_type_specific_data
|
349
|
+
)
|
350
|
+
|
351
|
+
ManagementControllerHostInterface = Struct.new(
|
352
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
353
|
+
:interface_type, :vendor_id, :device_type,
|
354
|
+
:protocol_records, :host_ip_assignment_type, :host_ip_address_format
|
355
|
+
)
|
356
|
+
|
357
|
+
## Type 43: TPM Device
|
358
|
+
TPMDevice = Struct.new(
|
359
|
+
:dmi_type, :dmi_handle, :dmi_size,
|
360
|
+
:specification_version, :firmware_revision,
|
361
|
+
:description, :characteristics, :oem_specific_information
|
362
|
+
)
|
363
|
+
|
364
|
+
def dmi(opts = {})
|
365
|
+
command = Kanrisuru::Command.new('dmidecode')
|
366
|
+
dmi_type_opts(command, opts)
|
367
|
+
|
368
|
+
execute_shell(command)
|
369
|
+
|
370
|
+
Kanrisuru::Result.new(command) do |cmd|
|
371
|
+
lines = cmd.to_a
|
372
|
+
|
373
|
+
rows = []
|
374
|
+
current_struct = nil
|
375
|
+
wrapped_field_line = nil
|
376
|
+
|
377
|
+
lines.each do |line|
|
378
|
+
next if Kanrisuru::Util.blank?(line)
|
379
|
+
|
380
|
+
case line
|
381
|
+
when /^Handle/
|
382
|
+
if current_struct
|
383
|
+
rows << current_struct
|
384
|
+
|
385
|
+
current_struct = nil
|
386
|
+
wrapped_field_line = nil
|
387
|
+
end
|
388
|
+
|
389
|
+
values = line.split(', ')
|
390
|
+
handle = values[0].split('Handle ')[1]
|
391
|
+
|
392
|
+
type = values[1].split(/(\d+)/)[1].to_i
|
393
|
+
type = Kanrisuru::Util::DmiType[type]
|
394
|
+
next if Kanrisuru::Util.blank?(type)
|
395
|
+
|
396
|
+
bytes = values[2].split(/(\d+)/)[1]
|
397
|
+
|
398
|
+
current_struct = dmi_type_to_struct(type)
|
399
|
+
current_struct.dmi_handle = handle
|
400
|
+
current_struct.dmi_type = type
|
401
|
+
current_struct.dmi_size = bytes.to_i
|
402
|
+
when /:/
|
403
|
+
values = line.split(': ')
|
404
|
+
|
405
|
+
field = values[0].strip
|
406
|
+
value = values[1] ? values[1].strip : ''
|
407
|
+
|
408
|
+
dmi_append_field(current_struct, field, value)
|
409
|
+
|
410
|
+
case line
|
411
|
+
when 'Characteristics:'
|
412
|
+
current_struct.characteristics = []
|
413
|
+
wrapped_field_line = :characteristics
|
414
|
+
when 'Flags:'
|
415
|
+
current_struct.flags = []
|
416
|
+
wrapped_field_line = :flags
|
417
|
+
when 'Supported SRAM Types:'
|
418
|
+
current_struct.supported_sram_types = []
|
419
|
+
wrapped_field_line = :supported_sram_types
|
420
|
+
when 'Features:'
|
421
|
+
current_struct.features = []
|
422
|
+
wrapped_field_line = :features
|
423
|
+
when 'Strings:'
|
424
|
+
current_struct.strings = []
|
425
|
+
wrapped_field_line = :strings
|
426
|
+
end
|
427
|
+
else
|
428
|
+
current_struct[wrapped_field_line] << line.strip if wrapped_field_line
|
429
|
+
end
|
430
|
+
end
|
431
|
+
|
432
|
+
rows << current_struct if current_struct
|
433
|
+
|
434
|
+
rows
|
435
|
+
end
|
436
|
+
end
|
437
|
+
|
438
|
+
private
|
439
|
+
|
440
|
+
def dmi_append_field(struct, field, value)
|
441
|
+
field = dmi_field_translate(struct, field)
|
442
|
+
field = field.to_sym
|
443
|
+
|
444
|
+
if struct.respond_to?(field)
|
445
|
+
case struct.dmi_type
|
446
|
+
when 'OEM Strings'
|
447
|
+
if struct.strings
|
448
|
+
struct[field] << value
|
449
|
+
else
|
450
|
+
struct.strings = [value]
|
451
|
+
end
|
452
|
+
else
|
453
|
+
struct[field] = value
|
454
|
+
end
|
455
|
+
else
|
456
|
+
Kanrisuru.logger.warn("Field does not exist for: #{struct.dmi_type}: #{field} => #{value}")
|
457
|
+
end
|
458
|
+
end
|
459
|
+
|
460
|
+
def dmi_field_translate(struct, field)
|
461
|
+
field = field.downcase
|
462
|
+
field = field.gsub(/\s/, '_')
|
463
|
+
field = field.gsub('-', '_')
|
464
|
+
field = field.gsub(':', '')
|
465
|
+
|
466
|
+
case struct.dmi_type
|
467
|
+
when 'Memory Device'
|
468
|
+
case field
|
469
|
+
when 'size'
|
470
|
+
return 'mem_size'
|
471
|
+
end
|
472
|
+
when 'System Slots'
|
473
|
+
case field
|
474
|
+
when 'length'
|
475
|
+
return 'slot_length'
|
476
|
+
end
|
477
|
+
when 'OEM Strings'
|
478
|
+
case field
|
479
|
+
when /^string/
|
480
|
+
return 'strings'
|
481
|
+
end
|
482
|
+
when 'Boot Integrity Services'
|
483
|
+
case field
|
484
|
+
when '16_bit_entry_point_address'
|
485
|
+
return 'sixteen_bit_entry_point_address'
|
486
|
+
when '32_bit_entry_point_address'
|
487
|
+
return 'thirty_two_bit_entry_point_address'
|
488
|
+
end
|
489
|
+
end
|
490
|
+
|
491
|
+
field
|
492
|
+
end
|
493
|
+
|
494
|
+
def dmi_type_to_struct(type)
|
495
|
+
type =
|
496
|
+
case type
|
497
|
+
when '32-bit Memory Error'
|
498
|
+
'Memory Error 32 Bit'
|
499
|
+
when '64-bit Memory Error'
|
500
|
+
'Memory Error 64 Bit'
|
501
|
+
else
|
502
|
+
type
|
503
|
+
end
|
504
|
+
|
505
|
+
type_camelized = Kanrisuru::Util.camelize(type.gsub(/\s/, ''))
|
506
|
+
struct_class = Kanrisuru::Core::Dmi.const_get(type_camelized)
|
507
|
+
struct_class.new
|
508
|
+
end
|
509
|
+
|
510
|
+
def dmi_type_opts(command, opts)
|
511
|
+
return unless Kanrisuru::Util.present?(opts[:types])
|
512
|
+
|
513
|
+
types = opts[:types]
|
514
|
+
types = types.instance_of?(Array) ? types : [types]
|
515
|
+
|
516
|
+
types.each do |type|
|
517
|
+
type = parse_dmi_type(type)
|
518
|
+
command.append_arg('--type', type)
|
519
|
+
end
|
520
|
+
end
|
521
|
+
|
522
|
+
def parse_dmi_type(type)
|
523
|
+
raise ArgumentError, 'Invalid DMI type' unless Kanrisuru::Util::DmiType.valid?(type)
|
524
|
+
|
525
|
+
if type.instance_of?(Integer)
|
526
|
+
type
|
527
|
+
else
|
528
|
+
Kanrisuru::Util::DmiType[type]
|
529
|
+
end
|
530
|
+
end
|
531
|
+
end
|
532
|
+
end
|
533
|
+
end
|