kanrisuru 0.4.1 → 0.6.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/CHANGELOG.md +89 -0
- data/README.md +5 -0
- data/kanrisuru.gemspec +2 -1
- 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 +90 -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 +10 -4
- 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/apt_spec.rb +42 -0
- data/spec/unit/core/archive_spec.rb +11 -0
- data/spec/unit/core/disk_spec.rb +21 -0
- data/spec/unit/core/dmi_spec.rb +271 -0
- data/spec/unit/core/file_spec.rb +9 -0
- data/spec/unit/core/find_spec.rb +9 -0
- data/spec/unit/core/group_spec.rb +10 -0
- data/spec/unit/core/ip_spec.rb +59 -0
- data/spec/unit/core/path_spec.rb +16 -0
- data/spec/unit/core/socket_spec.rb +38 -0
- data/spec/unit/core/stat_spec.rb +14 -0
- data/spec/unit/core/system_spec.rb +90 -0
- data/spec/unit/core/transfer_spec.rb +15 -0
- data/spec/unit/core/user_spec.rb +11 -0
- data/spec/unit/core/yum_spec.rb +47 -0
- data/spec/unit/core/zypper_spec.rb +121 -0
- data/spec/unit/util_spec.rb +224 -0
- metadata +24 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3a02ab5fbc9ef38c054d2c336b630e9a48c209a393044056a2262dec3a00d373
|
4
|
+
data.tar.gz: 80d925b3b5b3c884a9bea23b81423607130f021da7fc55ad2bc5f8bfbb8ab245
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be886466d7bd57cf325d84dc5d254a7c7c638f3cbafe328b875426c95ceb81c6d2b38564a390d8a7f9f42831a514f9bdc5ec0c0d0201166776aed389bcab590f
|
7
|
+
data.tar.gz: f72ecffd89742fd13df20362044f1618ef45618ba3eaf58c4d688a7b0fe31682b052effd28f60d5bc6e2dbd90dbe33394827d304e456b3ccba2608a9c8d5d17e
|
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/CHANGELOG.md
CHANGED
@@ -0,0 +1,89 @@
|
|
1
|
+
## Kanrisuru 0.6.0 (August 1, 2021) ##
|
2
|
+
* Add lsof implementation in system core module
|
3
|
+
* Fix changelog formatting
|
4
|
+
* Add changelog url to gemspec
|
5
|
+
|
6
|
+
## Kanrisuru 0.5.2 (July 30, 2021) ##
|
7
|
+
* Add changelog documentation
|
8
|
+
* Update documentation table with new tested core module
|
9
|
+
* Deprecating `cpu_info` with replacement of `lscpu`. `cpu_info` will be removed in the next major release.
|
10
|
+
|
11
|
+
## Kanrisuru 0.5.1 (July 29, 2021) ##
|
12
|
+
|
13
|
+
* Unit test cases for core module structs, constants and types.
|
14
|
+
|
15
|
+
## Kanrisuru 0.5.0 (July 29, 2021) ##
|
16
|
+
* Add `zypper` package manager core module
|
17
|
+
* Add `dmi` core module. Support for getting hardware information from virtual and physical machines.
|
18
|
+
* Add only options for test_hosts to filter on which hosts to use for function style test cases. This is used within a test case and takes priority over command line `HOSTS=` and `EXCLUDE=` env variables.
|
19
|
+
* Add additional bit conversion string handling in the util module, such as kib, mib, and gib.
|
20
|
+
* Remove redudant namespacing in struct names, such as
|
21
|
+
`Kanrisuru::Core::Yum::YumPackageOverview`, to `Kanrisuru::Core::Yum::PackageOverview`.
|
22
|
+
* Fix backups test case for `cp` command with the correct filename.
|
23
|
+
* Use 0755 as expected numeric mode for all OS functional tests in the `mkdir` test case.
|
24
|
+
* Fix bug with `lscpu` regex match on cpus with more than 9 cores, ie `/cpu\d/` to `/cpu\d+/`
|
25
|
+
|
26
|
+
|
27
|
+
## Kanrisuru 0.4.1 (July 26, 2021) ##
|
28
|
+
* Add `kernel_statistics` to system core module.
|
29
|
+
|
30
|
+
## Kanrisuru 0.4.0 (July 25, 2021) ##
|
31
|
+
* Update internal exit code of command from 0, to array of accpeted exit codes, with 0 being the default value.
|
32
|
+
* Add `append_exit_code` to command, allowing additional exit codes to be considered true for `success?` return value.
|
33
|
+
* Add `@port` to `Net::SSH.start` method
|
34
|
+
* Fix test case with `host.os` return value of `opensuse_leap`.
|
35
|
+
* Add `cpu_flags` method to `cpu` module
|
36
|
+
|
37
|
+
## Kanrisuru 0.3.2 (July 23, 2021) ##
|
38
|
+
* Fix typo from `key` to `signal` in hash fetch method.
|
39
|
+
|
40
|
+
## Kanrisuru 0.3.1 (July 22, 2021) ##
|
41
|
+
* Add additional methods to `cpu` pulling from `lscpu` struct.
|
42
|
+
* Fix `address_size` in `cpu` method call.
|
43
|
+
|
44
|
+
## Kanrisuru 0.3.0 (July 22, 2021) ##
|
45
|
+
|
46
|
+
* Add `lscpu` system core module
|
47
|
+
* Replace `cpu` module internal fetching of data from `cpu_info` to `lscpu` struct.
|
48
|
+
|
49
|
+
## Kanrisuru 0.2.9 (July 20, 2021) ##
|
50
|
+
|
51
|
+
* Fix fstab entry from `entry` to `entry[:entry]` in the `for_each`iteration.
|
52
|
+
|
53
|
+
## Kanrisuru 0.2.8 (July 20, 2021) ##
|
54
|
+
|
55
|
+
* Update gem development and runtime depedencies with stricter depencies.
|
56
|
+
|
57
|
+
## Kanrisuru 0.2.7 (July 18, 2021) ##
|
58
|
+
|
59
|
+
* Set opensuse upstream to sles (Suse Enterprise Linux) in `os_family`
|
60
|
+
|
61
|
+
## Kanrisuru 0.2.6 (July 17, 2021) ##
|
62
|
+
* Force "-" to "\_" from `os-release` release name in `host.os` module.
|
63
|
+
|
64
|
+
## Kanrisuru 0.2.5 (July 16, 2021) ##
|
65
|
+
* Update gem depedencies to non-zero values
|
66
|
+
* Change summary and description fields for `apt`
|
67
|
+
* Move `normalize_size` from `apt` core module, to
|
68
|
+
`Kanrisuru::Util::Bits` class.
|
69
|
+
* Add additional test cases for `apt` core module.
|
70
|
+
* Add `-hi` to `who` command to explicility print out ip address for user.
|
71
|
+
* Update `inode?` command to execute without shell user.
|
72
|
+
* Add `yum` package manager core module
|
73
|
+
|
74
|
+
## Kanrisuru 0.2.4 (July 10, 2021) ##
|
75
|
+
* Fix error in `ip_rule` and `ip_address` sub modules with command typo.
|
76
|
+
|
77
|
+
## Kanrisuru 0.2.3 (July 07, 2021) ##
|
78
|
+
* Add `apt` package manager core module
|
79
|
+
|
80
|
+
## Kanrisuru 0.2.2 (June 16, 2021) ##
|
81
|
+
* Fix `read_file_chunk` on checking bounds for start and end line values.
|
82
|
+
|
83
|
+
## Kanrisuru 0.2.1 (June 16, 2021) ##
|
84
|
+
* Add first working release on rubygems.org
|
85
|
+
|
86
|
+
## Kanrisuru 0.2.0 (June 16, 2021) [YANKED] ##
|
87
|
+
|
88
|
+
## Kanrisuru 0.1.0 (December 12, 2020) ##
|
89
|
+
* Initialize repository, start working on project.
|
data/README.md
CHANGED
@@ -79,6 +79,10 @@ cluster.execute('uname') #=> {host: 'host1', result: 'Linux'}, {host: 'host2', r
|
|
79
79
|
|---------------------------------------|------------------|--------------------|--------|--------------------------------------|--------|--------|--------|--------|------|----------|------|
|
80
80
|
| **System** | | | | | | | | | | | |
|
81
81
|
| Get CPU Info | cpu_info | lscpu | core | https://linux.die.net/man/1/lscpu | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
|
82
|
+
| Get CPU architecture | lscpu | lscpu | core | https://linux.die.net/man/1/lscpu | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
|
83
|
+
| Get kernel stastics | kernel_statistics | cat /proc/stat | core | | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
|
84
|
+
| Get hardware BIOS info | dmi | dmidecode | core | https://linux.die.net/man/8/dmidecode | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
|
85
|
+
| Get open file details for processes | lsof | lsof | core | https://linux.die.net/man/8/lsof | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
|
82
86
|
| Get Load Average | load_average | cat /proc/load_avg | core | | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
|
83
87
|
| Get RAM Available | free | cat /proc/meminfo | core | | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
|
84
88
|
| Get list of processes | ps | ps | core | https://linux.die.net/man/1/ps | [x] | [x] | [x] | [x] | [x] | [x] | [x] |
|
@@ -149,6 +153,7 @@ cluster.execute('uname') #=> {host: 'host1', result: 'Linux'}, {host: 'host2', r
|
|
149
153
|
| **Packages** | | | | | | | | | | | |
|
150
154
|
| Apt | apt | apt | core | https://linux.die.net/man/1/apt | [x] | [x] | | | | | |
|
151
155
|
| Yum | yum | yum | core | https://linux.die.net/man/1/yum | | | [x] | [x] | [x] | | |
|
156
|
+
| Zypper | zypper | zypper | core | https://en.opensuse.org/SDB:Zypper_manual | | | | | | [x] | [x] |
|
152
157
|
|
153
158
|
## Development
|
154
159
|
|
data/kanrisuru.gemspec
CHANGED
@@ -27,6 +27,7 @@ Gem::Specification.new do |gem|
|
|
27
27
|
gem.require_paths = ['lib']
|
28
28
|
|
29
29
|
gem.metadata = {
|
30
|
-
'source_code_uri' => 'https://github.com/avamia/kanrisuru/'
|
30
|
+
'source_code_uri' => 'https://github.com/avamia/kanrisuru/',
|
31
|
+
'changelog_uri' => 'https://github.com/avamia/kanrisuru/blob/main/CHANGELOG.md'
|
31
32
|
}
|
32
33
|
end
|
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
|