Add handling of signal interrupt and EOF at input prompts (#2154)

This commit is contained in:
codefiles 2023-10-10 04:00:22 -04:00 committed by GitHub
parent dc69acd4b4
commit 5e59acf937
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 34 additions and 12 deletions

View File

@ -177,5 +177,5 @@ def save_config(config: Dict):
case "all": case "all":
config_output.save(dest_path) config_output.save(dest_path)
except KeyboardInterrupt: except (KeyboardInterrupt, EOFError):
return return

View File

@ -134,7 +134,10 @@ def select_disk_config(
output = "You will use whatever drive-setup is mounted at the specified directory\n" 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" 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) mods = disk.device_handler.detect_pre_mounted_mods(path)
return disk.DiskLayoutConfiguration( return disk.DiskLayoutConfiguration(

View File

@ -28,14 +28,15 @@ def ask_ntp(preset: bool = True) -> bool:
def ask_hostname(preset: str = '') -> str: def ask_hostname(preset: str = '') -> str:
while True: hostname = TextInput(
hostname = TextInput( str(_('Desired hostname for the installation: ')),
str(_('Desired hostname for the installation: ')), preset
preset ).run().strip()
).run().strip()
if hostname: if not hostname:
return hostname return preset
return hostname
def ask_for_a_timezone(preset: Optional[str] = None) -> Optional[str]: def ask_for_a_timezone(preset: Optional[str] = None) -> Optional[str]:

View File

@ -75,7 +75,11 @@ class UserList(ListManager):
prompt = '\n\n' + str(_('Enter username (leave blank to skip): ')) prompt = '\n\n' + str(_('Enter username (leave blank to skip): '))
while True: while True:
username = input(prompt).strip(' ') try:
username = input(prompt).strip(' ')
except (KeyboardInterrupt, EOFError):
return None
if not username: if not username:
return None return None
if not self._check_for_correct_username(username): if not self._check_for_correct_username(username):

View File

@ -17,7 +17,12 @@ def get_password(prompt: str = '') -> Optional[str]:
if not prompt: if not prompt:
prompt = _("Enter a password: ") 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: if len(password.strip()) <= 0:
break break

View File

@ -1,4 +1,5 @@
import readline import readline
import sys
class TextInput: class TextInput:
@ -12,6 +13,14 @@ class TextInput:
def run(self) -> str: def run(self) -> str:
readline.set_pre_input_hook(self._hook) 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() readline.set_pre_input_hook()
return result return result