Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/archinstall/lib
diff options
context:
space:
mode:
authorAnton Hvornum <anton@hvornum.se>2021-04-03 16:28:40 +0200
committerAnton Hvornum <anton@hvornum.se>2021-04-03 16:28:40 +0200
commit9bd829c0e26f168e674bc01e8a9ee23f961fe77b (patch)
treec0e4277ebbc0d87d3474217e989904bb6ef8407b /archinstall/lib
parentf61c61305e95c564f22120bebbb861eddd7dee45 (diff)
parentcba30b9e26bccaf3679d82a255dfe43c64a38386 (diff)
Merging in latest changes from master.
Diffstat (limited to 'archinstall/lib')
-rw-r--r--archinstall/lib/disk.py28
-rw-r--r--archinstall/lib/installer.py14
-rw-r--r--archinstall/lib/luks.py2
-rw-r--r--archinstall/lib/user_interaction.py13
4 files changed, 39 insertions, 18 deletions
diff --git a/archinstall/lib/disk.py b/archinstall/lib/disk.py
index 6c6908b3..31e8e007 100644
--- a/archinstall/lib/disk.py
+++ b/archinstall/lib/disk.py
@@ -79,10 +79,15 @@ class BlockDevice():
return drive['back-file']
elif self.info['type'] == 'disk':
return self.path
+ elif self.info['type'][:4] == 'raid':
+ # This should catch /dev/md## raid devices
+ return self.path
elif self.info['type'] == 'crypt':
if 'pkname' not in self.info:
raise DiskError(f'A crypt device ({self.path}) without a parent kernel device name.')
return f"/dev/{self.info['pkname']}"
+ else:
+ log(f"Unknown blockdevice type for {self.path}: {self.info['type']}", level=LOG_LEVELS.Debug)
# if not stat.S_ISBLK(os.stat(full_path).st_mode):
# raise DiskError(f'Selected disk "{full_path}" is not a block device.')
@@ -187,6 +192,17 @@ class Partition():
return f'Partition(path={self.path}, fs={self.filesystem}{mount_repr})'
@property
+ def uuid(self) -> str:
+ """
+ Returns the PARTUUID as returned by lsblk.
+ This is more reliable than relying on /dev/disk/by-partuuid as
+ it doesn't seam to be able to detect md raid partitions.
+ """
+ lsblk = b''.join(sys_command(f'lsblk -J {self.path}'))
+ for partition in json.loads(lsblk.decode('UTF-8'))['blockdevices']:
+ return partition['partuuid']
+
+ @property
def encrypted(self):
return self._encrypted
@@ -241,9 +257,15 @@ class Partition():
if self.allow_formatting is False:
log(f"Partition {self} is not marked for formatting.", level=LOG_LEVELS.Debug)
return False
- elif self.target_mountpoint == '/boot' and self.has_content():
- log(f"Partition {self} is a boot partition and has content inside.", level=LOG_LEVELS.Debug)
- return False
+ elif self.target_mountpoint == '/boot':
+ try:
+ if self.has_content():
+ log(f"Partition {self} is a boot partition and has content inside.", level=LOG_LEVELS.Debug)
+ return False
+ except SysCallError as err:
+ log(err.message, LOG_LEVELS.Debug)
+ log(f"Partition {self} was identified as /boot but we could not mount to check for content, continuing!", level=LOG_LEVELS.Debug)
+ pass
return True
diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py
index 2ffcb007..c0323c61 100644
--- a/archinstall/lib/installer.py
+++ b/archinstall/lib/installer.py
@@ -392,18 +392,10 @@ class Installer():
break
else:
log(f"Identifying root partition by PART-UUID on {self.partition}, looking for '{os.path.basename(self.partition.path)}'.", level=LOG_LEVELS.Debug)
- for root, folders, uids in os.walk('/dev/disk/by-partuuid'):
- for uid in uids:
- real_path = os.path.realpath(os.path.join(root, uid))
-
- log(f"Checking root partition match {os.path.basename(real_path)} against {os.path.basename(self.partition.path)}: {os.path.basename(real_path) == os.path.basename(self.partition.path)}", level=LOG_LEVELS.Debug)
- if not os.path.basename(real_path) == os.path.basename(self.partition.path): continue
-
- entry.write(f'options root=PARTUUID={uid} rw intel_pstate=no_hwp\n')
+ entry.write(f'options root=PARTUUID={self.partition.uuid} rw intel_pstate=no_hwp\n')
- self.helper_flags['bootloader'] = bootloader
- return True
- break
+ self.helper_flags['bootloader'] = bootloader
+ return True
raise RequirementError(f"Could not identify the UUID of {self.partition}, there for {self.mountpoint}/boot/loader/entries/arch.conf will be broken until fixed.")
elif bootloader == "grub-install":
diff --git a/archinstall/lib/luks.py b/archinstall/lib/luks.py
index f36a25ab..62067ec1 100644
--- a/archinstall/lib/luks.py
+++ b/archinstall/lib/luks.py
@@ -109,7 +109,7 @@ class luks2():
else:
raise err
- if b'Command successful.' not in (cmd_output := b''.join(cmd_handle)):
+ if cmd_handle.exit_code != 0:
raise DiskError(f'Could not encrypt volume "{partition.path}": {cmd_output}')
return key_file
diff --git a/archinstall/lib/user_interaction.py b/archinstall/lib/user_interaction.py
index 80db7be1..630862ee 100644
--- a/archinstall/lib/user_interaction.py
+++ b/archinstall/lib/user_interaction.py
@@ -272,9 +272,16 @@ def select_language(options, show_only_country_codes=True):
print(' -- You can enter ? or help to search for more languages --')
selected_language = input('Select one of the above keyboard languages (by number or full name): ')
if selected_language.lower() in ('?', 'help'):
- filter_string = input('Search for layout containing (example: "sv-"): ')
- new_options = search_keyboard_layout(filter_string)
- return select_language(new_options, show_only_country_codes=False)
+ while True:
+ filter_string = input('Search for layout containing (example: "sv-"): ')
+ new_options = list(search_keyboard_layout(filter_string))
+
+ if len(new_options) <= 0:
+ log(f"Search string '{filter_string}' yielded no results, please try another search or Ctrl+D to abort.", fg='yellow')
+ continue
+
+ return select_language(new_options, show_only_country_codes=False)
+
elif selected_language.isdigit() and (pos := int(selected_language)) <= len(languages)-1:
selected_language = languages[pos]
# I'm leaving "options" on purpose here.