Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Girtler <blackrabbit256@gmail.com>2023-07-25 19:19:14 +1000
committerGitHub <noreply@github.com>2023-07-25 11:19:14 +0200
commita548d7df70102252a557214edc74b77f4859f031 (patch)
tree34fafdea7186d97bcb3043945ee259aa0565eae0
parent439bb5428bb6a6f512f695a83ee6b3b8f6537598 (diff)
Fix 1916 (#1920)
* Do not stdout when menu is active * Handle missing libfido2 gracefully * Update --------- Co-authored-by: Daniel Girtler <girtler.daniel@gmail.com>
-rw-r--r--archinstall/lib/disk/encryption_menu.py25
-rw-r--r--archinstall/lib/disk/fido.py9
-rw-r--r--archinstall/lib/menu/menu.py9
-rw-r--r--archinstall/lib/output.py14
4 files changed, 44 insertions, 13 deletions
diff --git a/archinstall/lib/disk/encryption_menu.py b/archinstall/lib/disk/encryption_menu.py
index 89eade2b..234e3b03 100644
--- a/archinstall/lib/disk/encryption_menu.py
+++ b/archinstall/lib/disk/encryption_menu.py
@@ -71,6 +71,7 @@ class DiskEncryptionMenu(AbstractSubMenu):
description=_('Use HSM to unlock encrypted drive'),
func=lambda preset: select_hsm(preset),
display_func=lambda x: self._display_hsm(x),
+ preview_func=self._prev_hsm,
dependencies=['encryption_password'],
default=self._preset.hsm_device,
enabled=True
@@ -93,8 +94,6 @@ class DiskEncryptionMenu(AbstractSubMenu):
if device:
return device.manufacturer
- if not Fido2.get_fido2_devices():
- return str(_('No HSM devices available'))
return None
def _prev_disk_layouts(self) -> Optional[str]:
@@ -106,6 +105,22 @@ class DiskEncryptionMenu(AbstractSubMenu):
return None
+ def _prev_hsm(self) -> Optional[str]:
+ try:
+ Fido2.get_fido2_devices()
+ except ValueError:
+ return str(_('Unable to determine fido2 devices. Is libfido2 installed?'))
+
+ fido_device: Optional[Fido2Device] = self._menu_options['HSM'].current_selection
+
+ if fido_device:
+ output = '{}: {}'.format(str(_('Path')), fido_device.path)
+ output += '{}: {}'.format(str(_('Manufacturer')), fido_device.manufacturer)
+ output += '{}: {}'.format(str(_('Product')), fido_device.product)
+ return output
+
+ return None
+
def select_encryption_type(preset: EncryptionType) -> Optional[EncryptionType]:
title = str(_('Select disk encryption option'))
@@ -130,7 +145,11 @@ def select_encrypted_password() -> Optional[str]:
def select_hsm(preset: Optional[Fido2Device] = None) -> Optional[Fido2Device]:
title = _('Select a FIDO2 device to use for HSM')
- fido_devices = Fido2.get_fido2_devices()
+
+ try:
+ fido_devices = Fido2.get_fido2_devices()
+ except ValueError:
+ return None
if fido_devices:
choice = TableMenu(title, data=fido_devices).run()
diff --git a/archinstall/lib/disk/fido.py b/archinstall/lib/disk/fido.py
index d8c8fd3c..96a74991 100644
--- a/archinstall/lib/disk/fido.py
+++ b/archinstall/lib/disk/fido.py
@@ -7,6 +7,7 @@ from typing import List, Optional
from .device_model import PartitionModification, Fido2Device
from ..general import SysCommand, SysCommandWorker, clear_vt100_escape_codes
from ..output import error, info
+from ..exceptions import SysCallError
class Fido2:
@@ -36,13 +37,13 @@ class Fido2:
# to prevent continous reloading which will slow
# down moving the cursor in the menu
if not cls._loaded or reload:
- ret: Optional[str] = None
try:
- ret = SysCommand("systemd-cryptenroll --fido2-device=list").decode('UTF-8')
- except:
+ ret: Optional[str] = SysCommand("systemd-cryptenroll --fido2-device=list").decode('UTF-8')
+ except SysCallError:
error('fido2 support is most likely not installed')
+ raise ValueError('HSM devices can not be detected, is libfido2 installed?')
+
if not ret:
- error('Unable to retrieve fido2 devices')
return []
fido_devices: str = clear_vt100_escape_codes(ret) # type: ignore
diff --git a/archinstall/lib/menu/menu.py b/archinstall/lib/menu/menu.py
index 768dfe55..358ba5e4 100644
--- a/archinstall/lib/menu/menu.py
+++ b/archinstall/lib/menu/menu.py
@@ -34,6 +34,11 @@ class MenuSelection:
class Menu(TerminalMenu):
+ _menu_is_active: bool = False
+
+ @staticmethod
+ def is_menu_active() -> bool:
+ return Menu._menu_is_active
@classmethod
def back(cls) -> str:
@@ -260,6 +265,8 @@ class Menu(TerminalMenu):
return MenuSelection(type_=MenuSelectionType.Skip)
def run(self) -> MenuSelection:
+ Menu._menu_is_active = True
+
selection = self._show()
if selection.type_ == MenuSelectionType.Reset:
@@ -277,6 +284,8 @@ class Menu(TerminalMenu):
selection.type_ = MenuSelectionType.Skip
selection.value = None
+ Menu._menu_is_active = False
+
return selection
def set_cursor_pos(self,pos :int):
diff --git a/archinstall/lib/output.py b/archinstall/lib/output.py
index d1c95ec5..9f2a2ae3 100644
--- a/archinstall/lib/output.py
+++ b/archinstall/lib/output.py
@@ -318,9 +318,11 @@ def log(
Journald.log(text, level=level)
- # Finally, print the log unless we skipped it based on level.
- # We use sys.stdout.write()+flush() instead of print() to try and
- # fix issue #94
- if level != logging.DEBUG or storage.get('arguments', {}).get('verbose', False):
- sys.stdout.write(f"{text}\n")
- sys.stdout.flush()
+ from .menu import Menu
+ if not Menu.is_menu_active():
+ # Finally, print the log unless we skipped it based on level.
+ # We use sys.stdout.write()+flush() instead of print() to try and
+ # fix issue #94
+ if level != logging.DEBUG or storage.get('arguments', {}).get('verbose', False):
+ sys.stdout.write(f"{text}\n")
+ sys.stdout.flush()