diff --git a/.bin/Scripts/functions/common.py b/.bin/Scripts/functions/common.py index bc5ed3f3..4e4d6437 100644 --- a/.bin/Scripts/functions/common.py +++ b/.bin/Scripts/functions/common.py @@ -18,6 +18,12 @@ from settings.main import * from settings.tools import * from settings.windows_builds import * from subprocess import CalledProcessError +try: + from termios import tcflush, TCIOFLUSH +except ImportError: + if os.name == 'posix': + # Not worried about this under Windows + raise # Global variables @@ -98,6 +104,27 @@ class WindowsUnsupportedError(Exception): pass +# Backported functions +def input_text(prompt): + """Get input and avoid EOFErrors, returns str.""" + prompt = str(prompt) + response = None + if prompt[-1:] != ' ': + prompt += ' ' + + while response is None: + if os.name == 'posix': + # Flush input to (hopefully) avoid EOFError + tcflush(sys.stdin, TCIOFLUSH) + try: + response = input(prompt) + except EOFError: + # Ignore and try again + print('', flush=True) + + return response + + # General functions def abort(show_prompt=True): """Abort script.""" @@ -113,7 +140,7 @@ def ask(prompt='Kotaero!'): answer = None prompt = '{} [Y/N]: '.format(prompt) while answer is None: - tmp = input(prompt) + tmp = input_text(prompt) if re.search(r'^y(es|)$', tmp, re.IGNORECASE): answer = True elif re.search(r'^n(o|ope|)$', tmp, re.IGNORECASE): @@ -145,7 +172,7 @@ def choice(choices, prompt='Kotaero!'): # Get user's choice while answer is None: - tmp = input(prompt) + tmp = input_text(prompt) if re.search(regex, tmp, re.IGNORECASE): answer = tmp @@ -264,7 +291,7 @@ def get_simple_string(prompt='Enter string'): """Get string from user (restricted character set), returns str.""" simple_string = None while simple_string is None: - _input = input('{}: '.format(prompt)) + _input = input_text('{}: '.format(prompt)) if re.match(r"^(\w|-| |\.|')+$", _input, re.ASCII): simple_string = _input.strip() return simple_string @@ -276,7 +303,7 @@ def get_ticket_number(): return None ticket_number = None while ticket_number is None: - _input = input('Enter ticket number: ') + _input = input_text('Enter ticket number: ') if re.match(r'^([0-9]+([-_]?\w+|))$', _input): ticket_number = _input out_file = r'{}\TicketNumber'.format(global_vars['LogDir']) @@ -421,7 +448,7 @@ def menu_select( while (answer.upper() not in valid_answers): clear_screen() print(menu_splash) - answer = input('{}: '.format(prompt)) + answer = input_text('{}: '.format(prompt)) return answer.upper() @@ -441,7 +468,7 @@ def pause(prompt='Press Enter to continue... '): """Simple pause implementation.""" if prompt[-1] != ' ': prompt += ' ' - input(prompt) + input_text(prompt) def ping(addr='google.com'): diff --git a/.bin/Scripts/functions/ddrescue.py b/.bin/Scripts/functions/ddrescue.py index ff843d06..08862413 100644 --- a/.bin/Scripts/functions/ddrescue.py +++ b/.bin/Scripts/functions/ddrescue.py @@ -1414,7 +1414,7 @@ def select_path(skip_device=None): elif path_options[index]['Name'] == 'Enter manually': # Manual entry while not selected_path: - manual_path = input('Please enter path: ').strip() + manual_path = input_text('Please enter path: ').strip() if manual_path and pathlib.Path(manual_path).is_dir(): selected_path = DirObj(manual_path) elif manual_path and pathlib.Path(manual_path).is_file(): diff --git a/.bin/Scripts/functions/osticket.py b/.bin/Scripts/functions/osticket.py index c2301c37..09141ab7 100644 --- a/.bin/Scripts/functions/osticket.py +++ b/.bin/Scripts/functions/osticket.py @@ -434,7 +434,7 @@ class osTicket(): # Main loop while ticket_number is None: print_standard(' ') - _ticket_id = input('Enter ticket number (or leave blank to disable): ') + _ticket_id = input_text('Enter ticket number (or leave blank to disable): ') _ticket_id = _ticket_id.strip() # No ticket ID entered