-
-
Notifications
You must be signed in to change notification settings - Fork 741
Expand file tree
/
Copy pathinteractive_installation.py
More file actions
195 lines (148 loc) · 5.74 KB
/
interactive_installation.py
File metadata and controls
195 lines (148 loc) · 5.74 KB
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
import os
from pathlib import Path
from archinstall import SysInfo, debug, error, info
from archinstall.lib.args import arch_config_handler
from archinstall.lib.configuration import ConfigurationOutput
from archinstall.lib.disk.filesystem import FilesystemHandler
from archinstall.lib.disk.utils import disk_layouts
from archinstall.lib.global_menu import GlobalMenu
from archinstall.lib.installer import Installer, accessibility_tools_in_use, run_custom_user_commands
from archinstall.lib.interactions.general_conf import PostInstallationAction, ask_post_installation
from archinstall.lib.models import Bootloader
from archinstall.lib.models.device_model import (
DiskLayoutType,
EncryptionType,
)
from archinstall.lib.models.users import User
from archinstall.lib.profile.profiles_handler import profile_handler
from archinstall.tui import Tui
def ask_user_questions() -> None:
"""
First, we'll ask the user for a bunch of user input.
Not until we're satisfied with what we want to install
will we continue with the actual installation steps.
"""
with Tui():
global_menu = GlobalMenu(arch_config_handler.config)
if not arch_config_handler.args.advanced:
global_menu.set_enabled("parallel_downloads", False)
global_menu.run()
def perform_installation(mountpoint: Path) -> None:
"""
Performs the installation steps on a block device.
Only requirement is that the block devices are
formatted and setup prior to entering this function.
"""
info("Starting installation...")
config = arch_config_handler.config
if not config.disk_config:
error("No disk configuration provided")
return
disk_config = config.disk_config
run_mkinitcpio = not config.uki
locale_config = config.locale_config
disk_encryption = config.disk_encryption
optional_repositories = config.mirror_config.optional_repositories if config.mirror_config else []
mountpoint = disk_config.mountpoint if disk_config.mountpoint else mountpoint
with Installer(
mountpoint,
disk_config,
disk_encryption=disk_encryption,
kernels=config.kernels,
) as installation:
# Mount all the drives to the desired mountpoint
if disk_config.config_type != DiskLayoutType.Pre_mount:
installation.mount_ordered_layout()
installation.sanity_check()
if disk_config.config_type != DiskLayoutType.Pre_mount:
if disk_encryption and disk_encryption.encryption_type != EncryptionType.NoEncryption:
# generate encryption key files for the mounted luks devices
installation.generate_key_files()
if mirror_config := config.mirror_config:
installation.set_mirrors(mirror_config, on_target=False)
installation.minimal_installation(
optional_repositories=optional_repositories,
mkinitcpio=run_mkinitcpio,
hostname=arch_config_handler.config.hostname,
locale_config=locale_config,
)
if mirror_config := config.mirror_config:
installation.set_mirrors(mirror_config, on_target=True)
if config.swap:
installation.setup_swap("zram")
if config.bootloader == Bootloader.Grub and SysInfo.has_uefi():
installation.add_additional_packages("grub")
installation.add_bootloader(config.bootloader, config.uki)
# If user selected to copy the current ISO network configuration
# Perform a copy of the config
network_config = config.network_config
if network_config:
network_config.install_network_config(
installation,
config.profile_config,
)
if users := config.users:
installation.create_users(users)
audio_config = config.audio_config
if audio_config:
audio_config.install_audio_config(installation)
else:
info("No audio server will be installed")
if config.packages and config.packages[0] != "":
installation.add_additional_packages(config.packages)
if profile_config := config.profile_config:
profile_handler.install_profile_config(installation, profile_config)
if timezone := config.timezone:
installation.set_timezone(timezone)
if config.ntp:
installation.activate_time_synchronization()
if accessibility_tools_in_use():
installation.enable_espeakup()
if root_pw := config.root_enc_password:
root_user = User("root", root_pw, False)
installation.set_user_password(root_user)
if (profile_config := config.profile_config) and profile_config.profile:
profile_config.profile.post_install(installation)
# If the user provided a list of services to be enabled, pass the list to the enable_service function.
# Note that while it's called enable_service, it can actually take a list of services and iterate it.
if servies := config.services:
installation.enable_service(servies)
# If the user provided custom commands to be run post-installation, execute them now.
if cc := config.custom_commands:
run_custom_user_commands(cc, installation)
installation.genfstab()
debug(f"Disk states after installing:\n{disk_layouts()}")
if not arch_config_handler.args.silent:
with Tui():
action = ask_post_installation()
match action:
case PostInstallationAction.EXIT:
pass
case PostInstallationAction.REBOOT:
os.system("reboot")
case PostInstallationAction.CHROOT:
try:
installation.drop_to_shell()
except Exception:
pass
def guided() -> None:
if not arch_config_handler.args.silent:
ask_user_questions()
config = ConfigurationOutput(arch_config_handler.config)
config.write_debug()
config.save()
if arch_config_handler.args.dry_run:
exit(0)
if not arch_config_handler.args.silent:
with Tui():
if not config.confirm_config():
debug("Installation aborted")
guided()
if arch_config_handler.config.disk_config:
fs_handler = FilesystemHandler(
arch_config_handler.config.disk_config,
arch_config_handler.config.disk_encryption,
)
fs_handler.perform_filesystem_operations()
perform_installation(arch_config_handler.args.mountpoint)
guided()