/
y2erb.rb
119 lines (103 loc) · 3.4 KB
/
y2erb.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
require "yast"
require "erb"
module Y2Autoinstallation
class Y2ERB
def self.render(path)
env = TemplateEnvironment.new
template = ERB.new(File.read(path))
template.result(env.public_bindings) # intentional send as it is private method
end
class TemplateEnvironment
include Yast::Logger
def hardware
@hardware ||= Yast::SCR.Read(Yast::Path.new(".probe"))
end
# @return [Array<Hash>] list of info about disks. Info contain:
# `:vendor` of disk
# `:device` kernel name of device
# `:udev_names` list of udev names for given disk
# `:model` model name from sysfs
# `:serial` serial number of disk
# `:size` disk size in bytes [Integer]
def disks
return @disks if @disks
@disks = []
hardware["disk"].each do |disk|
dev_name = ::File.basename(disk["dev_name"])
result = {
vendor: disk["vendor"],
device: dev_name,
udev_names: disk["dev_names"]
}
result[:model] = sys_block_value(dev_name, "device/model") || "Unknown"
result[:serial] = sys_block_value(dev_name, "serial") || "Unknown"
result[:size] = (sys_block_value(dev_name, "size") || "-1").to_i
@disks << result
end
@disks
end
# @return [Array<Hash>] list of info about network cards. Info contain:
# `:vendor` of card
# `:device` name of device
# `:mac` mac address of card
# `:active` if card io is active [Boolean]
# `:link` if card link is up [Boolean]
def network_cards
return @network_cards if @network_cards
@network_cards = []
hardware["netcard"].each do |card|
resource = card["resource"]
mac = begin
resource["hwaddr"].first["addr"]
rescue StandardError
""
end
active = begin
resource["io"].first["active"]
rescue StandardError
false
end
link = begin
resource["link"].first["state"]
rescue StandardError
false
end
result = {
vendor: card["vendor"],
device: card["dev_name"],
mac: mac,
active: active,
link: link
}
@network_cards << result
end
@network_cards
end
# @return [Hash] list of info about OS release. Info contain:
# `:name` human readable name of OS like `"openSUSE Tumbleweed"` or `"SLES"`
# `:version` of release like `"20200727"` or `"12.5"`
# `:id` id of OS like `"opensuse-tumbleweed"` or `"sles"`
def os_release
return @os_release if @os_release
Yast.import "OSRelease"
@os_release = {
name: Yast::OSRelease.ReleaseName,
version: Yast::OSRelease.ReleaseVersion,
id: Yast::OSRelease.id
}
end
# allow to use env bindings
def public_bindings
binding
end
private
def sys_block_value(device, path)
sys_path = "/sys/block/#{device}/"
::File.read(sys_path + path).strip
rescue StandardError => e
log.warn "read of #{sys_path + path} failed with #{e}"
nil
end
end
end
end