Skip to content

Commit f13b9c2

Browse files
committed
disk: validate config
1 parent edb34fc commit f13b9c2

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

archinstall/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,11 @@ def post_process_arguments(args: dict[str, Any]) -> None:
274274
path = args['plugin']
275275
load_plugin(path)
276276

277-
load_config()
277+
try:
278+
load_config()
279+
except ValueError as err:
280+
warn(str(err))
281+
exit(1)
278282

279283

280284
define_arguments()

archinstall/lib/disk/device_model.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
from ..exceptions import DiskError, SysCallError
1515
from ..general import SysCommand
16+
from ..hardware import SysInfo
1617
from ..output import debug
1718
from ..storage import storage
1819

@@ -148,6 +149,43 @@ def parse_arg(cls, disk_config: _DiskLayoutConfigurationSerialization) -> DiskLa
148149
device_modification.partitions = device_partitions
149150
device_modifications.append(device_modification)
150151

152+
using_gpt = SysInfo.has_uefi()
153+
154+
for dev_mod in device_modifications:
155+
partitions = sorted(dev_mod.partitions, key=lambda p: p.start)
156+
157+
for i, current_partition in enumerate(partitions[1:], start=1):
158+
previous_partition = partitions[i - 1]
159+
if (
160+
current_partition.status == ModificationStatus.Create
161+
and current_partition.start < previous_partition.end
162+
):
163+
raise ValueError('Partitions overlap')
164+
165+
partitions = [
166+
part_mod for part_mod in dev_mod.partitions
167+
if part_mod.status == ModificationStatus.Create
168+
]
169+
170+
if not partitions:
171+
continue
172+
173+
for part in partitions:
174+
if (
175+
part.start != part.start.align()
176+
or part.length != part.length.align()
177+
):
178+
raise ValueError('Partition is misaligned')
179+
180+
total_size = dev_mod.device.device_info.total_size
181+
182+
if using_gpt:
183+
if partitions[-1].end > total_size.gpt_end():
184+
raise ValueError('Partition overlaps backup GPT header')
185+
else:
186+
if partitions[-1].end > total_size.align():
187+
raise ValueError('Partition too large for device')
188+
151189
# Parse LVM configuration from settings
152190
if (lvm_arg := disk_config.get('lvm_config', None)) is not None:
153191
config.lvm_config = LvmConfiguration.parse_arg(lvm_arg, config)

0 commit comments

Comments
 (0)