forked from osbuild/osbuild
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathorg.osbuild.grub2.iso
executable file
·108 lines (90 loc) · 2.98 KB
/
org.osbuild.grub2.iso
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
#!/usr/bin/python3
import os
import shutil
import string
import sys
import osbuild.api
# The main grub2 configuration file template. Used for UEFI.
GRUB2_EFI_CFG_TEMPLATE = """
function load_video {
insmod efi_gop
insmod efi_uga
insmod video_bochs
insmod video_cirrus
insmod all_video
}
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
set timeout=${timeout}
### END /etc/grub.d/00_header ###
search --no-floppy --set=root -l '${isolabel}'
### BEGIN /etc/grub.d/10_linux ###
menuentry 'Install ${product} ${version}' --class fedora --class gnu-linux --class gnu --class os {
linux ${kernelpath} ${root} quiet
initrd ${initrdpath}
}
menuentry 'Test this media & install ${product} ${version}' --class fedora --class gnu-linux --class gnu --class os {
linux ${kernelpath} ${root} rd.live.check quiet
initrd ${initrdpath}
}
submenu 'Troubleshooting -->' {
menuentry 'Install ${product} ${version} in basic graphics mode' --class fedora --class gnu-linux --class gnu --class os {
linux ${kernelpath} ${root} nomodeset quiet
initrd ${initrdpath}
}
menuentry 'Rescue a ${product} system' --class fedora --class gnu-linux --class gnu --class os {
linux ${kernelpath} ${root} inst.rescue quiet
initrd ${initrdpath}
}
}
"""
def main(root, options):
name = options["product"]["name"]
version = options["product"]["version"]
isolabel = options["isolabel"]
architectures = options["architectures"]
vendor = options["vendor"]
kdir = options["kernel"].get("dir", "/images/pxeboot")
kopts = options["kernel"].get("opts")
cfg = options.get("config", {})
timeout = cfg.get("timeout", 60)
efidir = os.path.join(root, "EFI", "BOOT")
os.makedirs(efidir)
# arch related data
for arch in architectures:
arch = arch.lower()
targets = [
(f"shim{arch}.efi", f"BOOT{arch}.EFI".upper()),
(f"mm{arch}.efi", f"mm{arch}.efi"),
(f"gcd{arch}.efi", f"grub{arch}.efi")
]
for src, dst in targets:
shutil.copy2(os.path.join("/boot/efi/EFI/", vendor, src),
os.path.join(efidir, dst))
# the font
fontdir = os.path.join(efidir, "fonts")
os.makedirs(fontdir, exist_ok=True)
shutil.copy2("/usr/share/grub/unicode.pf2", fontdir)
print(f"kernel dir at {kdir}")
tplt = string.Template(GRUB2_EFI_CFG_TEMPLATE)
data = tplt.safe_substitute({
"version": version,
"product": name,
"kernelpath": os.path.join(kdir, "vmlinuz"),
"initrdpath": os.path.join(kdir, "initrd.img"),
"isolabel": isolabel,
"root": " ".join(kopts),
"timeout": timeout
})
config = os.path.join(efidir, "grub.cfg")
with open(config, "w", encoding="utf8") as cfg:
cfg.write(data)
if "IA32" in architectures:
shutil.copy2(config, os.path.join(efidir, "BOOT.cfg"))
if __name__ == '__main__':
args = osbuild.api.arguments()
ret = main(args["tree"], args["options"])
sys.exit(ret)