Skip to content

Commit

Permalink
Add handling of signal interrupt and EOF at input prompts (#2154)
Browse files Browse the repository at this point in the history
  • Loading branch information
codefiles authored Oct 10, 2023
1 parent dc69acd commit 5e59acf
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 12 deletions.
2 changes: 1 addition & 1 deletion archinstall/lib/configuration.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,5 +177,5 @@ def preview(selection: str):
case "all":
config_output.save(dest_path)

except KeyboardInterrupt:
except (KeyboardInterrupt, EOFError):
return
5 changes: 4 additions & 1 deletion archinstall/lib/interactions/disk_conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,10 @@ def select_disk_config(
output = "You will use whatever drive-setup is mounted at the specified directory\n"
output += "WARNING: Archinstall won't check the suitability of this setup\n"

path = prompt_dir(str(_('Enter the root directory of the mounted devices: ')), output)
try:
path = prompt_dir(str(_('Enter the root directory of the mounted devices: ')), output)
except (KeyboardInterrupt, EOFError):
return preset
mods = disk.device_handler.detect_pre_mounted_mods(path)

return disk.DiskLayoutConfiguration(
Expand Down
15 changes: 8 additions & 7 deletions archinstall/lib/interactions/general_conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,15 @@ def ask_ntp(preset: bool = True) -> bool:


def ask_hostname(preset: str = '') -> str:
while True:
hostname = TextInput(
str(_('Desired hostname for the installation: ')),
preset
).run().strip()
hostname = TextInput(
str(_('Desired hostname for the installation: ')),
preset
).run().strip()

if not hostname:
return preset

if hostname:
return hostname
return hostname


def ask_for_a_timezone(preset: Optional[str] = None) -> Optional[str]:
Expand Down
6 changes: 5 additions & 1 deletion archinstall/lib/interactions/manage_users_conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,11 @@ def _add_user(self) -> Optional[User]:
prompt = '\n\n' + str(_('Enter username (leave blank to skip): '))

while True:
username = input(prompt).strip(' ')
try:
username = input(prompt).strip(' ')
except (KeyboardInterrupt, EOFError):
return None

if not username:
return None
if not self._check_for_correct_username(username):
Expand Down
7 changes: 6 additions & 1 deletion archinstall/lib/interactions/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,12 @@ def get_password(prompt: str = '') -> Optional[str]:
if not prompt:
prompt = _("Enter a password: ")

while password := getpass.getpass(prompt):
while True:
try:
password = getpass.getpass(prompt)
except (KeyboardInterrupt, EOFError):
break

if len(password.strip()) <= 0:
break

Expand Down
11 changes: 10 additions & 1 deletion archinstall/lib/menu/text_input.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import readline
import sys


class TextInput:
Expand All @@ -12,6 +13,14 @@ def _hook(self):

def run(self) -> str:
readline.set_pre_input_hook(self._hook)
result = input(self._prompt)
try:
result = input(self._prompt)
except (KeyboardInterrupt, EOFError):
# To make sure any output that may follow
# will be on the line after the prompt
sys.stdout.write('\n')
sys.stdout.flush()

result = ''
readline.set_pre_input_hook()
return result

0 comments on commit 5e59acf

Please sign in to comment.